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.
PyTorch
Intégrez votre propre PyTorch modèle à l' SageMaker IA et exécutez le travail de formation avec SageMaker Training Compiler.
PyTorch Modèles avec Hugging Face Transformers
PyTorch les modèles dotés de Hugging FacePyTorch
ou de l'HuggingFace
estimateur avec la configuration SageMaker Training Compiler lorsque vous passerez à la rubrique suivante à l'adresse. Activer le compilateur SageMaker d'entraînement
Astuce
Lorsque vous créez un créateur de jetons pour un modèle NLP en utilisant le type Transformers dans votre script d'entraînement, assurez-vous que vous utilisez une forme de tenseur d'entrée statique en spécifiant padding='max_length'
. N'utilisez pas padding='longest'
car le remplissage à la séquence la plus longue du lot peut changer la forme du tenseur pour chaque lot d'entraînement. La forme dynamique des entrées peut déclencher une recompilation du modèle et augmenter le temps d'entraînement total. Pour obtenir plus d'informations sur les options de remplissage des créateurs de jetons Transformers, consultez Padding and truncation
Rubriques
Modèles linguistiques de grande taille utilisant la classe Trainer
de Hugging Face Transformers
Si vous utilisez la classe Trainer de la bibliothèque Transformers, vous n'avez pas besoin d'apporter de modifications supplémentaires à votre script d'entraînement. SageMaker Training Compiler compile automatiquement votre modèle Trainer si vous l'activez via la classe d'estimateur. Le code suivant montre la forme de base d'un script d' PyTorch entraînement avec l'API Hugging Face Trainer.
from transformers import Trainer, TrainingArguments training_args=TrainingArguments(**kwargs) trainer=Trainer(args=training_args, **kwargs)
Rubriques
Pour l'entraînement à GPU unique
Vous n'avez pas besoin de modifier votre code lorsque vous utilisez cette classe transformers.Trainer
Pour l'entraînement distribué
PyTorch v1.11.0 et versions ultérieures
Pour exécuter un entraînement distribué avec SageMaker Training Compiler, vous devez ajouter la _mp_fn()
fonction suivante dans votre script d'entraînement et l'main()
encapsuler. Il redirige les appels de _mp_fn(index)
fonction de l'environnement d'exécution distribué SageMaker AI for PyTorch (pytorchxla
) vers la main()
fonction de votre script d'entraînement.
def _mp_fn(index): main()
Cette fonction accepte l'argument index
pour indiquer le rang du GPU actuel dans le cluster pour l'entraînement distribué. Pour trouver d'autres exemples de scripts, consultez les exemples de scripts de modélisation de langage pour Hugging Face Transformers
Pour Transformers v4.17 et avant avec PyTorch v1.10.2 et avant
SageMaker Training Compiler utilise un autre mécanisme pour lancer une tâche de formation distribuée, et vous n'avez pas besoin d'apporter de modification à votre script de formation. SageMaker Training Compiler vous demande plutôt de transmettre un script de lancement d'entraînement distribué par SageMaker IA à l'entry_point
argument et de transmettre votre script d'entraînement à l'hyperparameters
argument dans l'estimateur SageMaker AI Hugging Face.
Bonnes pratiques d'utilisation du compilateur SageMaker d'entraînement avec Trainer
-
Assurez-vous d'utiliser des SyncFree optimiseurs en définissant l'
optim
argument suradamw_torch_xla
lors de la configuration des transformateurs. TrainingArgument. Voir également Optimizer (Optimiseur) dans la documentation de Hugging Face Transformers. -
Assurez-vous que le débit du pipeline de traitement des données est supérieur au débit d'entraînement. Vous pouvez modifier les
preprocessing_num_workers
argumentsdataloader_num_workers
et des transformateurs. TrainingArgumentclasse pour y parvenir. En règle générale, ceux-ci doivent être supérieurs ou égaux au nombre de GPUs mais inférieurs au nombre de CPUs.
Une fois que vous avez terminé d'adapter votre scénario d'entraînement, passez à Exécuter PyTorch des tâches de formation avec SageMaker Training Compiler.
Utilisation PyTorch directe de grands modèles linguistiques (sans l'API Hugging Face Transformers Trainer)
Si vous avez un script d'entraînement qui utilise PyTorch directement, vous devez apporter des modifications supplémentaires à votre script d' PyTorch entraînement pour implémenter PyTorch /XLA. Suivez les instructions pour modifier votre script afin de configurer correctement les primatives PyTorch /XLA.
Rubriques
Pour l'entraînement à GPU unique
-
Importez les bibliothèques d'optimisation.
import torch_xla import torch_xla.core.xla_model as xm
-
Changez le périphérique cible et sélectionnez XLA au lieu de
torch.device("cuda")
device=xm.xla_device()
-
Si vous utilisez PyTorch l'Automatic Mixed Precision
(AMP), procédez comme suit : -
Remplacez
torch.cuda.amp
par ce qui suit :import torch_xla.amp
-
Remplacez
torch.optim.SGD
ettorch.optim.Adam
par les éléments suivants :import torch_xla.amp.syncfree.Adam as adam import torch_xla.amp.syncfree.SGD as SGD
-
Remplacez
torch.cuda.amp.GradScaler
par ce qui suit :import torch_xla.amp.GradScaler as grad_scaler
-
-
Si vous n'utilisez pas AMP, remplacez
optimizer.step()
par les éléments suivants :xm.optimizer_step(optimizer)
-
Si vous utilisez un chargeur de données distribué, insérez votre chargeur de données dans la classe /XLA PyTorch :
ParallelLoader
import torch_xla.distributed.parallel_loader as pl parallel_loader=pl.ParallelLoader(dataloader, [device]).per_device_loader(device)
-
Ajoutez
mark_step
à la fin de la boucle d'entraînement lorsque vous n'utilisez pasparallel_loader
:xm.mark_step()
-
Pour vérifier votre entraînement, utilisez la méthode du point de contrôle du modèle PyTorch /XLA :
xm.save(model.state_dict(), path_to_save)
Une fois que vous avez terminé d'adapter votre scénario d'entraînement, passez à Exécuter PyTorch des tâches de formation avec SageMaker Training Compiler.
Pour l'entraînement distribué
Outre les modifications répertoriées dans la Pour l'entraînement à GPU unique section précédente, ajoutez les modifications suivantes pour répartir correctement la charge de travail GPUs.
-
Si vous utilisez AMP, ajoutez
all_reduce
aprèsscaler.scale(loss).backward()
:gradients=xm._fetch_gradients(optimizer) xm.all_reduce('sum', gradients, scale=1.0/xm.xrt_world_size())
-
Si vous devez définir des variables pour
local_ranks
etworld_size
, utilisez un code similaire à celui-ci :local_rank=xm.get_local_ordinal() world_size=xm.xrt_world_size()
-
Pour tout
world_size
(num_gpus_per_node*num_nodes
) supérieur à1
, vous devez définir un échantillonnage d'entraînement qui devrait ressembler à ce qui suit :import torch_xla.core.xla_model as xm if xm.xrt_world_size() > 1: train_sampler=torch.utils.data.distributed.DistributedSampler( train_dataset, num_replicas=xm.xrt_world_size(), rank=xm.get_ordinal(), shuffle=True ) train_loader=torch.utils.data.DataLoader( train_dataset, batch_size=args.batch_size, sampler=train_sampler, drop_last=args.drop_last, shuffle=False if train_sampler else True, num_workers=args.num_workers )
-
Apportez les modifications suivantes pour vous assurer que vous utilisez le
parallel_loader
fourni par le moduletorch_xla distributed
.import torch_xla.distributed.parallel_loader as pl train_device_loader=pl.MpDeviceLoader(train_loader, device)
Il
train_device_loader
fonctionne comme un PyTorch chargeur normal comme suit :for step, (data, target) in enumerate(train_device_loader): optimizer.zero_grad() output=model(data) loss=torch.nn.NLLLoss(output, target) loss.backward()
Avec tous ces changements, vous devriez être en mesure de lancer une formation distribuée avec n'importe quel PyTorch modèle sans l'API Transformer Trainer. Notez que ces instructions peuvent être utilisées à la fois pour le multi-GPU à nœud unique et le multi-GPU multi-nœud.
-
Pour PyTorch v1.11.0 et versions ultérieures
Pour exécuter un entraînement distribué avec SageMaker Training Compiler, vous devez ajouter la
_mp_fn()
fonction suivante dans votre script d'entraînement et l'main()
encapsuler. Il redirige les appels de_mp_fn(index)
fonction de l'environnement d'exécution distribué SageMaker AI for PyTorch (pytorchxla
) vers lamain()
fonction de votre script d'entraînement.def _mp_fn(index): main()
Cette fonction accepte l'argument
index
pour indiquer le rang du GPU actuel dans le cluster pour l'entraînement distribué. Pour trouver d'autres exemples de scripts, consultez les exemples de scripts de modélisation de langage pour Hugging Face Transformers. Pour Transformers v4.17 et avant avec PyTorch v1.10.2 et avant
SageMaker Training Compiler utilise un autre mécanisme pour lancer une tâche de formation distribuée et vous oblige à transmettre un script de lancement d'entraînement distribué par SageMaker IA à l'
entry_point
argument et à transmettre votre script d'entraînement à l'hyperparameters
argument dans l'estimateur SageMaker AI Hugging Face.
Une fois que vous avez terminé d'adapter votre scénario d'entraînement, passez à Exécuter PyTorch des tâches de formation avec SageMaker Training Compiler.
Bonnes pratiques pour utiliser le compilateur SageMaker d'entraînement avec PyTorch /XLA
Si vous souhaitez utiliser le compilateur d' SageMaker entraînement sur votre script d' PyTorch entraînement natif, vous devez d'abord vous familiariser avec PyTorch les appareils XLA
Note
Cette section consacrée aux meilleures pratiques part du principe que vous utilisez les modules PyTorch /XLA suivants :
import torch_xla.core.xla_model as xm import torch_xla.distributed.parallel_loader as pl
Comprendre le mode paresseux dans PyTorch /XLA
Une différence significative entre PyTorch /XLA et native PyTorch est que le système PyTorch /XLA s'exécute en mode paresseux tandis que le système natif s' PyTorch exécute en mode rapide. Les tenseurs en mode paresseux sont des espaces réservés pour la construction du graphe de calcul jusqu'à ce qu'ils soient matérialisés une fois la compilation et l'évaluation terminées. Le système PyTorch /XLA crée le graphe de calcul à la volée lorsque vous appelez PyTorch APIs pour créer le calcul à l'aide de tenseurs et d'opérateurs. Le graphique de calcul est compilé et exécuté lorsque xm.mark_step()
est appelé explicitement ou implicitement par pl.MpDeviceLoader/pl.ParallelLoader
, ou lorsque vous demandez explicitement la valeur d'un tenseur, par exemple en appelant loss.item()
ou print(loss)
.
Minimiser le nombre d'compilation-and-executionsutilisations pl.MpDeviceLoader/pl.ParallelLoader
et xm.step_closure
Pour de meilleures performances, vous devez garder à l'esprit les méthodes d'initialisation possibles compilation-and-executionsdécrites dans la section Comprendre le mode paresseux dans PyTorch /XLA et essayer de minimiser le nombre de compilation-and-executions. Idéalement, un seul compilation-and-execution est nécessaire par itération d'entraînement et est lancé automatiquement parpl.MpDeviceLoader/pl.ParallelLoader
. MpDeviceLoader
est optimisé pour XLA et doit toujours être utilisé si possible pour obtenir de meilleures performances. Au cours de l'entraînement, vous devrez peut-être examiner certains résultats intermédiaires tels que les valeurs de perte. Dans ce cas, l'impression des tenseurs paresseux doit être enveloppée xm.add_step_closure()
pour éviter toute utilisation inutile compilation-and-executions.
Utiliser AMP et les optimiseurs syncfree
L'entraînement en mode AMP (Automatic Mixed Precision) accélère considérablement votre vitesse d'entraînement en tirant parti des cœurs Tensor de NVIDIA GPUs. SageMaker Training Compiler fournit syncfree
des optimiseurs optimisés pour XLA afin d'améliorer les performances AMP. Actuellement, les trois optimiseurs syncfree
suivants sont disponibles et doivent être utilisés si possible pour garantir de meilleures performances.
torch_xla.amp.syncfree.SGD torch_xla.amp.syncfree.Adam torch_xla.amp.syncfree.AdamW
Ces optimiseurs syncfree
doivent être associés à torch_xla.amp.GradScaler
pour la mise à l'échelle croissante ou décroissante du gradient.
Astuce
À partir de la version PyTorch 1.13.1, SageMaker Training Compiler améliore les performances en permettant à PyTorch /XLA de remplacer automatiquement les optimiseurs (tels que SGD, Adam, AdamW) dans torch.optim
ou transformers.optimization
avec leurs versions sans synchronisation (telles que,,). torch_xla.amp.syncfree
torch_xla.amp.syncfree.SGD
torch_xla.amp.syncfree.Adam
torch_xla.amp.syncfree.AdamW
Vous n'avez pas besoin de modifier les lignes de code dans lesquelles vous définissez les optimiseurs dans votre script d'entraînement.