このリポジトリには、Pytorchでの混合精度と分散トレーニングを合理化するために、Nvidiaが維持したユーティリティが保持されています。ここのコードの一部は、最終的に上流のPytorchに含まれます。 Apexの意図は、ユーザーができるだけ早く利用できる最新のユーティリティを作成することです。
非推奨。 Pytorch Ampを使用します
apex.amp
は、スクリプトの3行のみを変更することにより、混合精度トレーニングを可能にするツールです。ユーザーは、さまざまなフラグをamp.initialize
に提供することにより、さまざまな純粋な精度トレーニングモードを簡単に実験できます。
AMPの導入ウェビナー(フラグcast_batchnorm
、 keep_batchnorm_fp32
に変更されました)。
APIドキュメント
包括的なImagenetの例
DCGANの例が近日公開予定です...
新しいアンプAPIに移動します(非推奨の「AMP」および「FP16_optimizer」APIのユーザー向け)
apex.parallel.DistributedDataParallel
非推奨です。 torch.nn.parallel.DistributedDataParallel
を使用します
apex.parallel.DistributedDataParallel
、 torch.nn.parallel.DistributedDataParallel
と同様のモジュールラッパーです。 NVIDIAのNCCL通信ライブラリ向けに最適化された便利なマルチプロセス分散トレーニングを可能にします。
APIドキュメント
Pythonソース
例/ウォークスルー
ImagENetの例は、 apex.parallel.DistributedDataParallel
とapex.amp
の使用を示しています。
非推奨。 torch.nn.SyncBatchNorm
を使用します
apex.parallel.SyncBatchNorm
torch.nn.modules.batchnorm._BatchNorm
を拡張します。マルチプロセス(分配DataParallel)トレーニング中にプロセス全体で統計を尽くします。同期BNは、小さなローカルミニバッチのみが各GPUに適合できる場合に使用されています。すべてのプロセスで、すべてのプロセスでBNレイヤーの有効バッチサイズをグローバルバッチサイズに増やします(技術的には正しい定式化です)。同期BNは、いくつかの研究モデルで収束精度を改善することが観察されています。
amp
トレーニングを適切に保存およびロードするには、すべてのloss_scalers
とそれらの対応する未xpedステップ、およびamp.load_state_dict()
を含むamp.state_dict()
)を導入して、これらの属性を復元します。
ビットワイズの精度を得るために、次のワークフローをお勧めします。
# Initialization
opt_level = 'O1'
model , optimizer = amp . initialize ( model , optimizer , opt_level = opt_level )
# Train your model
...
with amp . scale_loss ( loss , optimizer ) as scaled_loss :
scaled_loss . backward ()
...
# Save checkpoint
checkpoint = {
'model' : model . state_dict (),
'optimizer' : optimizer . state_dict (),
'amp' : amp . state_dict ()
}
torch . save ( checkpoint , 'amp_checkpoint.pt' )
...
# Restore
model = ...
optimizer = ...
checkpoint = torch . load ( 'amp_checkpoint.pt' )
model , optimizer = amp . initialize ( model , optimizer , opt_level = opt_level )
model . load_state_dict ( checkpoint [ 'model' ])
optimizer . load_state_dict ( checkpoint [ 'optimizer' ])
amp . load_state_dict ( checkpoint [ 'amp' ])
# Continue training
...
同じopt_level
使用してモデルを復元することをお勧めします。また、 amp.initialize
後にload_state_dict
メソッドを呼び出すことをお勧めします。
各apex.contrib
モジュールには、 --cpp_ext
および--cuda_ext
以外の1つ以上のインストールオプションが必要です。 Contribモジュールは、必ずしも安定したPytorchリリースをサポートしていないことに注意してください。
nvidia pytorchコンテナは、ngc:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorchで入手できます。コンテナには、現在利用可能なすべてのカスタム拡張機能が付属しています。
次のような詳細については、NGCドキュメントを参照してください。
ソースから頂点をインストールするには、https://github.com/pytorch/pytorchから入手可能な夜間のpytorchを使用することをお勧めします。
https://pytorch.orgから入手可能な最新の安定リリースも機能するはずです。
コンピレーションをより速くするために、 Ninja
をインストールすることをお勧めします。
パフォーマンスと完全な機能については、CUDAおよびC ++拡張機能を介してAPEXをインストールすることをお勧めします
git clone https://github.com/NVIDIA/apex
cd apex
# if pip >= 23.1 (ref: https://pip.pypa.io/en/stable/news/#v23-1) which supports multiple `--config-settings` with the same key...
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings " --build-option=--cpp_ext " --config-settings " --build-option=--cuda_ext " ./
# otherwise
pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --global-option= " --cpp_ext " --global-option= " --cuda_ext " ./
Apexは、Pythonのみのビルドをサポートしています
pip install -v --disable-pip-version-check --no-build-isolation --no-cache-dir ./
Pythonのみのビルド省略:
apex.optimizers.FusedAdam
使用するために必要な融合カーネル。apex.normalization.FusedLayerNorm
およびapex.normalization.FusedRMSNorm
を使用するために必要な融合カーネル。apex.parallel.SyncBatchNorm
の性能と数値の安定性を改善する融合カーネル。apex.parallel.DistributedDataParallel
とapex.amp
のパフォーマンスを改善する融合カーネル。 DistributedDataParallel
、 amp
、およびSyncBatchNorm
依然として使用可能ですが、遅くなる可能性があります。pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" .
システム上のソースからPytorchを構築できれば機能する可能性があります。 pip install -v --no-cache-dir .
動作する可能性が高くなります。
Conda環境にPytorchをインストールした場合は、同じ環境にApexをインストールしてください。
モジュールの要件が満たされていない場合、それは構築されません。
モジュール名 | オプションをインストールします | その他 |
---|---|---|
apex_C | --cpp_ext | |
amp_C | --cuda_ext | |
syncbn | --cuda_ext | |
fused_layer_norm_cuda | --cuda_ext | apex.normalization |
mlp_cuda | --cuda_ext | |
scaled_upper_triang_masked_softmax_cuda | --cuda_ext | |
generic_scaled_masked_softmax_cuda | --cuda_ext | |
scaled_masked_softmax_cuda | --cuda_ext | |
fused_weight_gradient_mlp_cuda | --cuda_ext | cuda> = 11が必要です |
permutation_search_cuda | --permutation_search | apex.contrib.sparsity |
bnp | --bnp | apex.contrib.groupbn |
xentropy | --xentropy | apex.contrib.xentropy |
focal_loss_cuda | --focal_loss | apex.contrib.focal_loss |
fused_index_mul_2d | --index_mul_2d | apex.contrib.index_mul_2d |
fused_adam_cuda | --deprecated_fused_adam | apex.contrib.optimizers |
fused_lamb_cuda | --deprecated_fused_lamb | apex.contrib.optimizers |
fast_layer_norm | --fast_layer_norm | apex.contrib.layer_norm 。 fused_layer_norm とは異なります |
fmhalib | --fmha | apex.contrib.fmha |
fast_multihead_attn | --fast_multihead_attn | apex.contrib.multihead_attn |
transducer_joint_cuda | --transducer | apex.contrib.transducer |
transducer_loss_cuda | --transducer | apex.contrib.transducer |
cudnn_gbn_lib | --cudnn_gbn | cudnn> = 8.5、 apex.contrib.cudnn_gbn が必要です |
peer_memory_cuda | --peer_memory | apex.contrib.peer_memory |
nccl_p2p_cuda | --nccl_p2p | nccl> = 2.10、 apex.contrib.nccl_p2p が必要です |
fast_bottleneck | --fast_bottleneck | peer_memory_cuda およびnccl_p2p_cuda 、 apex.contrib.bottleneck が必要です |
fused_conv_bias_relu | --fused_conv_bias_relu | cudnn> = 8.4、 apex.contrib.conv_bias_relu が必要です |