EN

Neural Network Libraries v1.32.0をリリースしました!実行パフォーマンス向上、Python 3.10サポートなど

2022年12月8日 木曜日

リリース

Posted by Takuya Yashima

Neural Network Libraries v1.32.0をリリースしました!
重要なリリースアイテムについては以下のSpotlightをご覧ください!

Spotlight

auto-forwardモードにおけるパフォーマンス向上

メモリ効率改善

以前のバージョンでは、auto-forwardモード(dyanmic-graph, define-by-run)はstaticモードよりもはるかにメモリ効率が低かったため、直感的で柔軟性があるにもかかわらず、なかなか利用することはできませんでした。
今回のリリースで、メモリ使用量を犠牲にすることなく、auto-forwardモードを利用できるようになりました。backpropagationにおける各変数の勾配計算に対する依存関係に応じて、可能な限りforward計算中に自動的にメモリを解放します。次の表は、 StyleGAN2のdiscriminator のauto-forward (動的グラフ) 実行における2倍以上のメモリ効率を示しています。
`

Static Dynamic (this version) Dynamic (previous)
3168 MB 3187 MB 8143 MB

次の例は、auto-forwardモードでのメモリ解放がどのように行われるかを示しています。

例1

x = nn.Variable()
with auto_forward():
    y = F.identity(x) # F.identity has no grad dependencies.
    # The rebinding of the python variable y
    # releases the previous y and its memory.
    y = F.identity(y)

例2

def local_scope(x):
    h = F.identity(x) # F.identity has no grad dependencies.
    y = F.identity(h)
    return y

x = nn.Variable()
with auto_forward():
    # After exiting local_scope,
    # the local Variable "h" and its memory are released.
    y = local_scope(x)

なお、nnabla.Variable はPython ガベージコレクタに次第でメモリ開放のタイミングが決まりますが、多くの場合はすぐに破棄されます。

Transpose関数におけるオーバーヘッド削減

CUDAバックエンドでのTranspose関数は、nnabla v1.30.0以降、NVIDIAのcuTensorに依存しています。以前のバージョンでは、Transpose関数を作成するたびにcuTensorハンドルを作成していたため、特にauto-forwardモードでは大きなオーバーヘッドが発生していました。
本リリースで、cuTensorハンドルはキャッシュされ、異なるtranspose呼び出しで再利用されるようになったため、オーバーヘッドが大幅に削減されます (場合によっては100倍以上の高速化) 。Transposeは、実際にはLayerNormalizationを含むいくつかの他の関数によって内部的に使用されるため、Transformersを含むさまざまなネットワークアーキテクチャでauto-forwardモードでの高速化が確認できます。

SyncBNのBackprop計算の修正 (CPU / GPU)

以前のSyncBNの定義と実装では、betaとgammaのall-reducenによる分散ワーカー間の勾配積算が通常のデータ並列トレーニングパイプラインの下で2回実行されてしまう潜在的な問題があり、その結果、パラメータの更新に使用される勾配の大きさが大きくなってしまっていました (GPU Workerの数倍) 。

# 擬似コード
with auto_forward():
  h = F.sync_batch_normalization(x, comm=comm)
# 変更前はall-reduceによる勾配積算がbetaとgammaについてbackward中に実行されてしまった
h.backward() 
grads = get_grad_arrays()
# all-reduceによる勾配積算はここでも実行されてしまう
comm.all_reduce(grads)
solver.update()

本リリースでSyncBNの定義を変更し、ベータとガンマの勾配積算をbackward中に実行しないように変更し、backward後のall-reduceでのみ実行するにすることで重複した勾配積算を避けています。

Support python3.10 (CPU / GPU)

python3.10のサポートを追加しました。これに伴い、file format converterが利用するonnxとtensorflowのバージョンもそれぞれv1.12.0とv2.8.0にアップデートされています。

nnabla

OP Layer

Bugfix

Build

Format Converter

Document

Utility

Examples