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.
Étape 1 : modifier votre propre script d'entraînement à l'aide de la bibliothèque de parallélisme de modèles distribués de SageMaker
Utilisez cette section pour découvrir comment personnaliser votre script d’entraînement afin d’utiliser les caractéristiques principales de la bibliothèque Amazon SageMaker AI de parallélisme des modèles. Pour utiliser les fonctions et paramètres de l'API spécifique à la bibliothèque, nous vous recommandons d'utiliser cette documentation conjointement avec les API de la bibliothèque de parallélisme de modèles SageMaker
Les exemples de script d'entraînement fournis dans ces sections sont simplifiés et conçus pour mettre en évidence les modifications nécessaires à l'utilisation de la bibliothèque. Pour des exemples de blocs-notes exécutables de bout en bout illustrant l'utilisation d'un script d'entraînement TensorFlow ou PyTorch avec la bibliothèque de parallélisme de modèles SageMaker, consultez Exemples de la bibliothèque Amazon SageMaker AI de parallélisme des modèles v2.
Rubriques
Fractionnement du modèle de votre script d'entraînement à l'aide de la bibliothèque de parallélisme de modèles SageMaker
Il existe deux manières de modifier votre script d'entraînement pour configurer le fractionnement des modèles : le fractionnement automatique ou le fractionnement manuel.
Fractionnement automatisé du modèle
Lorsque vous utilisez la bibliothèque de parallélisme de modèles SageMaker, vous pouvez tirer avantage de la division automatisée du modèle, également appelée partitionnement automatique du modèle. La bibliothèque utilise un algorithme de partitionnement qui équilibre la mémoire, réduit la communication entre les périphériques et optimise la performance. Vous pouvez configurer l'algorithme de partitionnement automatique de sorte à optimiser la vitesse ou la mémoire.
Vous pouvez également utiliser la division manuelle du modèle. Nous vous recommandons la division automatisée du modèle, sauf si vous connaissez très bien l'architecture du modèle et que vous savez déjà comment partitionner efficacement votre modèle.
Comment ça marche
Le partitionnement automatique intervient dès la première étape d'entraînement, lors du tout premier appel de la fonction décorée smp.step. Durant cet appel, la bibliothèque commence par créer une version du modèle sur la RAM du CPU (pour éviter les limitations de mémoire GPU), puis elle analyse le graphe du modèle et décide du partitionnement. À partir de cette décision, chaque partition de modèle est chargée sur un GPU, et ce n'est qu'alors que la première étape est exécutée. Ces étapes d'analyse et de partitionnement peuvent contribuer à allonger la première étape de l'entraînement.
Dans les deux cadres, la bibliothèque gère la communication entre les périphériques via son propre backend, qui est optimisé pour l'infrastructure AWS.
La conception de la partition automatique s'adapte aux caractéristiques du cadre, et la bibliothèque effectue le partitionnement au niveau de granularité le plus naturel dans chaque cadre. Par exemple, dans TensorFlow, chaque opération spécifique peut être affectée à un périphérique différent, alors que dans PyTorch, l'affectation se fait au niveau du module, chaque module comprenant plusieurs opérations. La section qui suit examine les spécificités de conception dans chaque cadre.
Durant la première étape d'entraînement, la bibliothèque de parallélisme de modèles exécute en interne une étape de traçage destinée à créer le graphe du modèle et à déterminer les formes du tenseur et des paramètres. Après cette étape de traçage, la bibliothèque crée un arbre, qui se compose des objets nn.Module imbriqués dans le modèle, ainsi que de données supplémentaires collectées à partir du traçage, comme la quantité de nn.Parameters stockés et le temps d'exécution de chaque nn.Module.
Ensuite, la bibliothèque traverse cet arbre depuis la racine et exécute un algorithme de partitionnement qui affecte chaque nn.Module à un périphérique, ce qui équilibre la charge de calcul (mesurée par le temps d'exécution du module) et l'utilisation de la mémoire (mesurée par la taille totale des nn.Parameter stockés et les activations). Si plusieurs nn.Modules partagent le même nn.Parameter, ces modules sont alors placés sur le même périphérique afin de ne pas conserver plusieurs versions du même paramètre. Une fois la décision de partitionnement prise, les modules et les poids affectés sont chargés sur leurs périphériques.
Pour obtenir des instructions sur l'enregistrement du décorateur smp.step dans votre script d'entraînement PyTorch, consultez Fractionnement automatisé avec PyTorch.
La bibliothèque de parallélisme de modèles analyse les tailles des variables entraînables et la structure du graphe, et utilise en interne un algorithme de partitionnement des graphes. Cet algorithme affecte un périphérique pour chaque opération afin de réduire le volume de communication nécessaire entre les périphériques, sous réserve des deux contraintes suivantes :
-
Équilibrage du nombre de variables stockées dans chaque périphérique
-
Équilibrage du nombre d'opérations exécutées dans chaque périphérique
Si vous spécifiez speed pour optimize (dans les paramètres de parallélisme de modèles dans le kit SDK Python), la bibliothèque essaie d'équilibrer le nombre d'opérations et d'objets tf.Variable dans chaque périphérique. Sinon, elle essaie d'équilibrer la taille totale de tf.Variables.
Une fois la décision de partitionnement prise, la bibliothèque crée une représentation sérialisée du sous-graphe que chaque périphérique doit exécuter et l'importe sur chaque périphérique. Lors du partitionnement, la bibliothèque place les opérations qui consomment la même tf.Variable et les opérations qui font partie de la même couche Keras sur le même périphérique. Elle respecte aussi les contraintes de colocalisation imposées par TensorFlow. Cela signifie, par exemple, que si deux couches Keras partagent une tf.Variable, toutes les opérations qui font partie de ces couches sont placées sur un seul périphérique.
Pour obtenir des instructions sur l'enregistrement du décorateur smp.step dans votre script d'entraînement PyTorch, consultez Fractionnement automatisé avec TensorFlow.
Comparaison du fractionnement automatisé du modèle entre les frameworks
Dans TensorFlow, l'unité fondamentale de calcul est une tf.Operation et TensorFlow représente le modèle sous la forme d'un graphe orienté acyclique (DAG) d'opérations tf.Operation. La bibliothèque de parallélisme de modèles partitionne donc ce DAG pour que chaque nœud aille à un périphérique. Ce qui est intéressant ici est que les objets tf.Operation sont suffisamment riches en attributs personnalisables et qu'ils sont universels, c'est-à-dire que chaque modèle comprendra obligatoirement un graphe de ces objets.
Par contre, cette notion d'opération suffisamment riche et universelle n'a pas d'équivalent dans PyTorch. L'unité de calcul la plus proche dotée de ces caractéristiques dans PyTorch est un nn.Module, qui se situe à un niveau de granularité nettement supérieur. Voilà pourquoi la bibliothèque fait le partitionnement à ce niveau dans PyTorch.
Division manuelle du modèle
Si vous voulez spécifier manuellement le partitionnement de votre modèle entre les dispositifs, utilisez le gestionnaire de contexte smp.partition. Pour obtenir des instructions sur le partitionnement manuel du gestionnaire de contexte, consultez les pages suivantes.
Pour utiliser cette option après avoir apporté des modifications, à l'étape 2, vous devez définir auto_partition sur False et définir une default_partition dans la classe d'estimateur de framework du kit SageMaker Python SDK. Toute opération non explicitement placée sur une partition à l'aide du gestionnaire de contexte de smp.partition est exécutée sur la default_partition. Dans ce cas, la logique de division automatisée est contournée et chaque opération est placée de la façon dont vous le spécifiez. En s'appuyant sur la structure de graphe ainsi obtenue, la bibliothèque de parallélisme de modèles crée automatiquement un calendrier d'exécution de pipeline.