SageMaker Training Compiler : bonnes pratiques et considérations
Important
Amazon Web Services (AWS) annonce qu’il n’y aura aucune nouvelle mise à jour ou version de SageMaker Training Compiler. Vous pouvez continuer à utiliser SageMaker Training Compiler via les AWS Deep Learning Containers (DLC) existants pour SageMaker Training. Il est important de noter que même si les DLC existants restent accessibles, ils ne recevront plus de correctifs ni de mises à jour d’AWS, conformément à la politique de support du Framework AWS Deep Learning Containers.
Passez en revue les bonnes pratiques et les considérations suivantes lors de l’utilisation de SageMaker Training Compiler.
Bonnes pratiques
Utilisez les consignes suivantes pour obtenir des résultats optimaux lorsque vous exécutez des tâches d’entraînement avec SageMaker Training Compiler.
Bonnes pratiques d’ordre général
-
Pensez à consulter Types d’instance pris en charge et Modèles testés.
-
Lorsque vous créez un générateur de jetons pour un modèle NLP en utilisant la bibliothèque des transformeurs Hugging Face dans votre script d’entraînement, veillez à utiliser une forme de tenseur d’entrée statique en spécifiant
padding='max_length'. N’utilisez paspadding='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 d’entrée dynamique peut déclencher une recompilation du modèle et augmenter la durée totale d’entraînement. Pour obtenir plus d’informations sur les options de remplissage des créateurs de jetons de transformeur, consultez Remplissage et troncaturedans la documentation des transformeurs Hugging Face. -
Mesurez l’utilisation de la mémoire du GPU pour vous assurer que vous utilisez la taille maximale de lot que peut contenir cette mémoire. Amazon SageMaker Training Compiler réduit l’empreinte mémoire de votre modèle pendant l’entraînement, ce qui vous permet généralement d’augmenter la taille du lot
batch_sizedans la mémoire du GPU. L’utilisation d’unebatch_sizeplus importante permet une meilleure utilisation du GPU et réduit la durée totale de l’entraînement.Lorsque vous ajustez la taille du lot, vous devez également ajuster
learning_ratede manière appropriée. Par exemple, si vous avez augmenté la taille du lot d’un facteur dek, vous devez procéder à un ajustement linéaire delearning_rate(simple multiplication park) ou multiplier par la racine carrée dek. Vous obtiendrez ainsi un comportement de convergence identique ou similaire avec un temps d’entraînement réduit. Pour connaître les références des tests debatch_sizepour les modèles les plus populaires, consultez Modèles testés. -
Pour déboguer la tâche d’entraînement accélérée par le compilateur, activez l’indicateur
debugdans le paramètrecompiler_config. Cela permet à SageMaker AI de placer les journaux de débogage dans les journaux des tâches d’entraînement SageMaker.huggingface_estimator=HuggingFace( ... compiler_config=TrainingCompilerConfig(debug=True) )Notez que si vous activez le débogage complet de la tâche d’entraînement avec le compilateur, cela peut ajouter une surcharge.
Bonnes pratiques pour PyTorch
-
Si vous apportez un modèle PyTorch et que vous souhaitez le vérifier, assurez-vous d’utiliser la fonction de sauvegarde du modèle de PyTorch/XLA pour vérifier correctement votre modèle. Pour plus d’informations sur la fonction, consultez
torch_xla.core.xla_model.savedans la documentation PyTorch sur les périphériques XLA. Pour savoir comment ajouter les modifications à votre script PyTorch, consultez Modèles linguistiques de grande taille utilisant directement PyTorch (sans l’API Trainer des transformeurs Hugging Face).
Pour plus d’informations sur l’application réelle de l’utilisation de la fonction d’enregistrement de modèle, consultez Checkpoint Writing and Loading
dans le billet de blog Hugging Face on PyTorch/XLA TPUs: Faster and cheaper training. -
Pour bénéficier d’une durée d’entraînement optimale pour l’entraînement distribué, considérez ce qui suit.
-
Utilisez des instances avec plusieurs GPU à la place d’instances à un seul GPU. Par exemple, une seule instance
ml.p3dn.24xlargeprésente une durée d’entraînement plus courte que 8 instancesml.p3.2xlarge. -
Utilisez des instances avec prise en charge d’EFA, telles que
ml.p3dn.24xlargeouml.p4d.24xlarge. Ces types d’instance présentent de plus grandes vitesses réseau et réduisent la durée d’entraînement. -
Réglez le paramètre
preprocessing_num_workerspour les jeux de données, afin que l’entraînement des modèles ne soit pas retardé par un prétraitement lent.
-
Considérations
Tenez compte des éléments suivants lorsque vous utilisez SageMaker Training Compiler.
Dégradation des performances en raison de la journalisation, des points de contrôle et du profilage
-
Évitez la journalisation, les points de contrôle et le profilage des tenseurs de modèles qui conduisent à des évaluations explicites. Pour comprendre ce qu’est une évaluation explicite, prenons l’exemple de compilation de code suivant.
a = b+c e = a+dUn compilateur interprète le code comme suit et réduit l’empreinte mémoire de la variable
a:e = b+c+dConsidérons maintenant le cas suivant où le code est modifié pour ajouter une fonction d’affichage de la variable
a.a = b+c e = a+d print(a)Le compilateur effectue une évaluation explicite de la variable
acomme suit.e = b+c+d a = b+c # Explicit evaluation print(a)Dans PyTorch, par exemple, évitez d’utiliser torch.tensor.items()
, qui pourrait introduire des évaluations explicites. Dans le cadre du deep learning, ces évaluations explicites peuvent entraîner une surcharge, car elles rompent les opérations fusionnées dans le graphe de compilation d’un modèle et conduisent à un nouveau calcul des tenseurs. Si vous souhaitez continuer à évaluer périodiquement le modèle au cours de l’entraînement tout en utilisant SageMaker Training Compiler, nous vous recommandons d’effectuer la journalisation et les points de contrôle à une fréquence plus faible afin de réduire la surcharge due aux évaluations explicites. Par exemple, effectuez une journalisation toutes les 10 époques plutôt qu’à chaque époque.
-
La compilation des graphes est exécutée durant les premières étapes de l’entraînement. Par conséquent, les premières étapes sont généralement très lentes. Cependant, il s’agit d’un coût de compilation unique qui peut être amorti par un entraînement de plus longue durée, car la compilation permet d’accélérer considérablement les prochaines étapes. La surcharge de compilation initiale dépend de la taille du modèle, de la taille des tenseurs d’entrée et de la distribution des formes des tenseurs d’entrée.
Utilisation incorrecte des API PyTorch/XLA lors de l’utilisation directe de PyTorch
PyTorch/XLA définit un ensemble d’API pour remplacer certaines des API d’entraînement PyTorch existantes. Leur mauvaise utilisation conduit à l’échec de l’entraînement PyTorch.
-
L’une des erreurs les plus courantes lors de la compilation d’un modèle PyTorch est due à un type de périphérique incorrect pour les opérateurs et les tenseurs. Pour compiler correctement un modèle PyTorch, assurez-vous d’utiliser des périphériques XLA (
xm.xla_device()) au lieu d’utiliser CUDA ou de mélanger des périphériques CUDA et XLA. -
mark_step()est une barrière uniquement pour XLA. Si la tâche d’entraînement n’est pas correctement définie, cela entraînera son blocage. -
PyTorch/XLA fournit des API d’entraînement distribué supplémentaires. La mauvaise programmation des API entraîne une collecte incorrecte des gradients, ce qui conduit à l’échec de la convergence de l’entraînement.
Pour configurer correctement votre script PyTorch et éviter les utilisations incorrectes de l’API susmentionnées, consultez Modèles linguistiques de grande taille utilisant directement PyTorch (sans l’API Trainer des transformeurs Hugging Face).