Étape 1 : Modifiez votre propre script d'entraînement à l'aide SageMaker de la bibliothèque parallèle de modèles distribués - Amazon SageMaker

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 : Modifiez votre propre script d'entraînement à l'aide SageMaker de la bibliothèque parallèle de modèles distribués

Utilisez cette section pour découvrir comment personnaliser votre script de formation afin d'utiliser les fonctionnalités principales de la bibliothèque de parallélisme de SageMaker modèles Amazon. Pour utiliser les fonctions et paramètres d'API spécifiques à la bibliothèque, nous vous recommandons d'utiliser cette documentation en plus des API de bibliothèques de modèles SageMaker parallèles dans la documentation du SDK SageMaker Python.

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 end-to-end exemples de blocs-notes exécutables qui montrent comment utiliser un script TensorFlow ou un script d' PyTorch apprentissage avec la bibliothèque de parallélisme des SageMaker modèles, voir. Exemples de bibliothèque SageMaker de parallélisme de modèles Amazon v2

Divisez le modèle de votre script d'entraînement à l'aide de la bibliothèque de parallélisme des SageMaker modèles

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 SageMaker la bibliothèque de parallélisme des modèles, vous pouvez tirer parti du fractionnement automatique des modèles, également appelé partitionnement automatique des modèles. 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 frameworks, la bibliothèque gère la communication entre les appareils via son propre backend, optimisé pour AWS l'infrastructure.

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 appareil différent, tandis que dans PyTorch, l'attribution est effectuée au niveau du module, où chaque module comprend 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 la façon d'enregistrer le smp.step décorateur dans votre script d' PyTorch entraînement, reportez-vous Fractionnement automatique 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. Il respecte également les contraintes de colocation 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 la façon d'enregistrer le smp.step décorateur dans votre script d' PyTorch entraînement, reportez-vous Fractionnement automatique avec TensorFlow à.

Comparaison du fractionnement automatisé du modèle entre les frameworks

Dans TensorFlow, l'unité fondamentale de calcul est atf.Operation, et TensorFlow représente le modèle sous la forme d'un graphe acyclique dirigé (DAG) de tf.Operation s. Par conséquent, la bibliothèque de parallélisme du modèle partitionne ce DAG de telle sorte que chaque nœud soit attribué à 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.

PyTorch d'autre part, n'a pas une notion de fonctionnement équivalente suffisamment riche et universelle. L'unité de calcul la plus proche présentant ces caractéristiques est unnn.Module, qui se trouve à un niveau de granularité beaucoup plus élevé, et c'est pourquoi la bibliothèque effectue le partitionnement à ce niveau dans. PyTorch 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 auto_partition définir False et définir a default_partition dans la classe d'estimateur du SDK SageMaker Python. 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.