Dieses Repository enthält NVIDIA-gepflegte Versorgungsunternehmen, um gemischte Präzision und verteiltes Training in Pytorch zu optimieren. Ein Teil des Codes hier wird schließlich in vorgelagerten Pytorch enthalten sein. Die Absicht von Apex besteht darin, die aktuellen Dienstprogramme so schnell wie möglich auf den neuesten Stand zu bringen.
Veraltet. Verwenden Sie Pytorch Amp
apex.amp
ist ein Werkzeug, mit dem gemischte Präzisionstrainings eingebracht werden kann, indem nur 3 Zeilen Ihres Skripts geändert werden. Benutzer können problemlos mit verschiedenen reinen und gemischten Präzisions -Trainingsmodi experimentieren, indem sie amp.initialize
unterschiedliche Flags liefern.
Webinar -Einführung amp (das Flag cast_batchnorm
wurde in keep_batchnorm_fp32
umbenannt).
API -Dokumentation
Umfassendes Bildnetz Beispiel
DCGAN -Beispiel kommt bald ...
Umzug in die neue AMP -API (für Benutzer des veralteten "Amp" und "fp16_optimizer" -APIs)
apex.parallel.DistributedDataParallel
ist veraltet. Verwenden Sie torch.nn.parallel.DistributedDataParallel
apex.parallel.DistributedDataParallel
ist ein Modulverpackung, ähnlich wie torch.nn.parallel.DistributedDataParallel
. Es ermöglicht ein bequemes Multiprozess -verteiltes Training, das für die NCCL -Kommunikationsbibliothek von NVIDIA optimiert ist.
API -Dokumentation
Python -Quelle
Beispiel/Walkthrough
Das Beispiel für das ImageNet zeigt die Verwendung von apex.parallel.DistributedDataParallel
zusammen mit apex.amp
.
Veraltet. Verwenden Sie torch.nn.SyncBatchNorm
apex.parallel.SyncBatchNorm
erweitert torch.nn.modules.batchnorm._BatchNorm
um synchronisierte Bn zu unterstützen. Es stellt Statistiken über Prozesse hinweg während des Multiprozess -Trainings (verteiltDataparallel) hinweg. Synchrones BN wurde in Fällen verwendet, in denen nur eine kleine lokale Minibatch auf jede GPU passen kann. Allreduzierte Statistiken erhöhen die effektive Chargengröße für die BN -Schicht auf die globale Chargengröße über alle Prozesse (was technisch gesehen die richtige Formulierung ist). Es wurde beobachtet, dass synchrones BN in einigen unserer Forschungsmodelle die konvergierte Genauigkeit verbessert.
Um Ihr amp
-Training richtig zu speichern und zu laden, stellen wir den amp.state_dict()
vor, der alle loss_scalers
und deren entsprechende, unkippte Schritte enthält, sowie amp.load_state_dict()
um diese Attribute wiederherzustellen.
Um eine bitweise Genauigkeit zu erhalten, empfehlen wir den folgenden Workflow:
# 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
...
Beachten Sie, dass wir empfehlen, das Modell mit demselben opt_level
wiederherzustellen. Beachten Sie auch, dass wir empfehlen, die Methoden load_state_dict
nach amp.initialize
aufzurufen.
Jedes apex.contrib
-Modul benötigt eine oder mehrere andere Installationsoptionen als --cpp_ext
und --cuda_ext
. Beachten Sie, dass Störungsmodule nicht unbedingt stabile Pytorch -Releases unterstützen.
Nvidia Pytorch Container sind auf NGC erhältlich: https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch. Die Container sind mit allen momentan verfügbaren benutzerdefinierten Erweiterungen ausgestattet.
Weitere Informationen finden Sie in der NGC -Dokumentation wie:
Um Apex von Source zu installieren, empfehlen wir den nächtlichen Pytorch, der von https://github.com/pytorch/pytorch erhältlich ist.
Die neueste stabile Version, die von https://pytorch.org erhältlich ist, sollte ebenfalls funktionieren.
Wir empfehlen die Installation Ninja
um die Kompilierung schneller zu gestalten.
Für die Leistung und die volle Funktionalität empfehlen wir die Installation von Apex mit CUDA- und C ++ - Erweiterungen über
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 unterstützt auch einen Python-Build über nur über
pip install -v --disable-pip-version-check --no-build-isolation --no-cache-dir ./
Ein Python-Build-Auslass:
apex.optimizers.FusedAdam
erforderlich sind.apex.normalization.FusedRMSNorm
um apex.normalization.FusedLayerNorm
zu verwenden.apex.parallel.SyncBatchNorm
verbessern.apex.parallel.DistributedDataParallel
und apex.amp
verbessern. DistributedDataParallel
, amp
und SyncBatchNorm
sind weiterhin verwendbar, können jedoch langsamer sein. 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" .
kann funktionieren, wenn Sie Pytorch aus der Quelle auf Ihrem System bauen konnten. Ein Python-Build über pip install -v --no-cache-dir .
funktioniert eher.
Wenn Sie Pytorch in einer Conda -Umgebung installiert haben, sollten Sie Apex in derselben Umgebung installieren.
Wenn eine Anforderung eines Moduls nicht erfüllt ist, wird es nicht erstellt.
Modulname | Option installieren | Miser |
---|---|---|
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 | Benötigt 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 . anders als 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 | Erfordert CUDNN> = 8.5, apex.contrib.cudnn_gbn |
peer_memory_cuda | --peer_memory | apex.contrib.peer_memory |
nccl_p2p_cuda | --nccl_p2p | Benötigt NCCL> = 2.10, apex.contrib.nccl_p2p |
fast_bottleneck | --fast_bottleneck | Benötigt peer_memory_cuda und nccl_p2p_cuda , apex.contrib.bottleneck |
fused_conv_bias_relu | --fused_conv_bias_relu | Erfordert CUDNN> = 8.4, apex.contrib.conv_bias_relu |