Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
FP16Entraînement avec le parallélisme des modèles
Pour la FP16 formation, appliquez les modifications suivantes à votre script d'entraînement et à votre estimateur.
Note
Cette fonctionnalité est disponible PyTorch dans la bibliothèque de parallélisme des SageMaker modèles v1.10.0 et versions ultérieures.
Adaptez votre script PyTorch d'entraînement
-
Enveloppez votre modèle en utilisant le gestionnaire de contexte smdistributed.modelparallel.torch.model_creation ()
. # fp16_training_script.py import torch import smdistributed.modelparallel.torch as smp with smp.model_creation( dtype=torch.float16 if args.fp16 else torch.get_default_dtype() ): model = ...
Astuce
Si vous utilisez le parallélisme des tenseurs, ajoutez
tensor_parallelism=smp.tp_size() > 1
au gestionnaire de contextesmp.model_creation
. L'ajout de cette ligne aide également à détecter automatiquement si le parallélisme des tenseurs est activé ou non.with smp.model_creation( ... , tensor_parallelism=smp.tp_size() > 1 ): model = ...
-
Lorsque vous enveloppez l'optimiseur avec
smdistributed.modelparallel.torch.DistributedOptimizer
, définissez l'argumentstatic_loss_scaling
oudynamic_loss_scaling
. Par défaut,static_loss_scaling
a la valeur de1.0
, etdynamic_loss_scaling
a la valeurFalse
. Si vous définissezdynamic_loss_scale=True
, vous pouvez introduire les options de mise à l'échelle dynamique des pertes sous forme de dictionnaire via l'argumentdynamic_loss_args
. Dans la plupart des cas, nous vous recommandons d'utiliser l'échelle dynamique de perte avec les options par défaut. Pour plus d'informations, d'options et d'exemples de la fonction wrapper de l'optimiseur, consultez le fichier smdistributed.modelparallel.torch. DistributedOptimizerAPI. Le code suivant est un exemple d'encapsulation d'un objet d'
Adadelta
optimisation avec une mise à l'échelle dynamique des pertes à des fins d'FP16entraînement.optimizer = torch.optim.Adadelta(...) optimizer = smp.DistributedOptimizer( optimizer, static_loss_scale=
None
, dynamic_loss_scale=True
, dynamic_loss_args={ "scale_window":1000
, "min_scale":1
, "delayed_shift":2
} )
Configuration d'un SageMaker PyTorch estimateur
Ajoutez le FP16 paramètre ("fp16"
) à la configuration de distribution pour le parallélisme du modèle lors de la création d'un objet SageMaker PyTorch estimateur. Pour trouver une liste complète de paramètres de configuration pour le parallélisme de modèle, consultez les paramètres pour smdistributed
from sagemaker.pytorch import PyTorch smp_options = { "enabled": True, "parameters": { "microbatches":
4
, "pipeline_parallel_degree":2
, "tensor_parallel_degree":2
, ..., "fp16":True
} } fp16_estimator = PyTorch( entry_point="fp16_training_script.py
", # Specify your train script ..., distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": {...} } ) fp16_estimator.fit(...)
Lorsque l'FP16entraînement commence, le modèle et l'optimiseur sont FP16_Optimizer
respectivement encapsulés par FP16_Module
des smdistributed
versions modifiées des utilitaires ApexFP16_Module
convertit le modèle en FP16 dtype et gère la transmission directe. FP16
Astuce
Vous pouvez appliquer un écrêtage de gradient en appelant clip_master_grads
avant optimizer.step
.
optimizer.clip_master_grads(max_norm) # max_norm(float or int): max norm of the gradients
Astuce
Lors de l'utilisation torch.optim.lr_scheduler
et de la FP16 formation, vous devez passer optimizer.optimizer
au planificateur LR plutôt qu'à l'optimiseur. Voici l'exemple de code suivant :
from torch.optim.lr_scheduler import StepLR scheduler = StepLR( optimizer.optimizer if smp.state.cfg.fp16 else optimizer, step_size=1, gamma=args.gamma )