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
- Faster LayerNormCuda::setup_impl (GN and IN as well) by removing unnecessary function creation (CPU / GPU)
Bugfix
- Avoid net[‘names’] dict is overwrite
- Fix save function for the parameters created by narrow
- Fix the timing of fill and zero evaluations in narrowed array
- fix crash problem of pipeline
- fix:skip unnecessary download
- correct index error in generate_cache_dir().
- complete setup cfg in all condition
- Use not cast but get in nan/inf check
- Fix cython build failure by missing cutensor.h in non-docker env
- Use a singleton function for cudaGetDeviceProperties to avoid slowdown
Build
- Change python version to 3.9.14 in aarch64 environment
- change pip installation method (CPU / GPU)
- Added ca-certificates to Dockerfiles (CPU / GPU)
- fix version mismatch for libarchive.so
- add python310 into lib_in_wheel
Format Converter
- python3.10 converter dependency for onnx and tensorflow
- Loose converter python packages requirements
- upgrade onnx to 1.10.0
Document
- update document for watch dog timeout setting
- Update nnabla converter document
- Add callback APIs to doc