Exécuter une tâche d'entraînement de modèles parallèles distribués SageMaker - Amazon SageMaker

Exécuter une tâche d'entraînement de modèles parallèles distribués SageMaker

Découvrez comment exécuter une tâche d'entraînement de modèles parallèles distribués à l'aide du kit SDK Python SageMaker et de votre script d'entraînement adapté avec la bibliothèque de modèles parallèles distribués de SageMaker.

SageMaker prend en charge les configurations d'environnement d'entraînement suivantes.

  1. Vous pouvez utiliser un conteneur TensorFlow ou PyTorch précréé. Cette option est recommandée pour les nouveaux utilisateurs de la bibliothèque de modèles parallèles. Elle est illustrée dans l'exemple MNIST avec PyTorch 1.6 et la bibliothèque de modèles parallèles distribués d'Amazon SageMaker.

  2. Vous pouvez étendre des conteneurs SageMaker précréés pour gérer toutes les exigences fonctionnelles supplémentaires pour votre algorithme ou modèle que l'image Docker SageMaker précréée ne prend pas en charge. Pour apprendre comment étendre un conteneur précréé, consultez Étendre un conteneur précréé.

  3. Vous pouvez adapter votre propre conteneur Docker pour qu'il fonctionne avec SageMaker à l'aide de la boîte à outils d'entraînement SageMaker. Pour obtenir un exemple, consultez Adaptation de votre propre conteneur d'entraînement.

Pour les options 2 et 3 de la liste précédente, consultez Étendre ou adapter un conteneur Docker contenant la bibliothèque de modèles parallèles distribués de SageMaker pour savoir comment installer la bibliothèque de modèles parallèles dans un conteneur Docker étendu ou personnalisé.

Dans tous les cas, vous lancez votre tâche à l'aide d'un kit SDK Python SageMaker TensorFlow ou PyTorch Estimator pour initialiser la bibliothèque et lancer une tâche d'entraînement. Pour en savoir plus, veuillez consulter la section suivante Lancer une tâche d'entraînement avec le kit SDK Python SageMaker.

Lancer une tâche d'entraînement avec le kit SDK Python SageMaker

Le kit SDK Python SageMaker prend en charge l'entraînement géré des modèles TensorFlow et PyTorch. Pour lancer une tâche d'entraînement à l'aide de l'un de ces cadres, vous pouvez définir un Estimator TensorFlow ou un Estimator PyTorch.

L'objet Estimator TensorFlow et PyTorch contient un paramètre distribution qui permet d'activer et de spécifier des paramètres pour l'initialisation de la bibliothèque de modèles parallèles distribués de SageMaker. Comme la bibliothèque utilise la MPI en interne, pour utiliser le parallélisme des modèles, la MPI doit être activée à l'aide du paramètre distribution.

Voici un exemple de la façon dont vous pouvez lancer une nouvelle tâche d'entraînement PyTorch avec la bibliothèque.

import sagemaker sagemaker_session = sagemaker.session.Session(boto_session=session) smp_options = { "enabled":True, "parameters": { "partitions": 2, "microbatches": 4, "placement_strategy": "spread", "pipeline": "interleaved", "optimize": "speed", "ddp": True, } } mpi_options = { "enabled" : True, "processes_per_host" : 8, # "custom_mpi_options" : "--mca btl_vader_single_copy_mechanism none" } smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=role, instance_type='ml.p3.16xlarge', sagemaker_session=sagemaker_session, framework_version='1.8.1', # You must set py_version to py36 py_version='py36', instance_count=1, distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="SMD-MP-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

Pour activer la bibliothèque, vous devez transmettre des dictionnaires pour les clés "mpi" et "smdistributed" à l'argument distribution des constructeurs de l'estimateur dans le kit SDK Python SageMaker.

  • Pour la clé "smdistributed", transmettez un dictionnaire avec la clé "modelparallel" et les dictionnaires internes suivants.

    Note

    L'utilisation de "modelparallel" et "dataparallel" dans la même tâche d'entraînement n'est pas pris en charge.

    • "enabled" (obligatoire) : pour activer le parallélisme des modèles, définissez "enabled": True.

    • "parameters" (obligatoire) : spécifiez un ensemble de paramètres pour le parallélisme des modèles répertoriés dans smdistributed Parameters (Paramètres smdistributed). Parmi les paramètres, la clé "partitions" est requise pour spécifier combien de partitions de modèle doivent être demandées pour une tâche d'entraînement.

  • Pour la clé "mpi", transmettez un dictionnaire contenant les éléments suivants :

    • "enabled" (obligatoire) : True pour lancer la tâche d'entraînement avec la MPI.

    • "processes_per_host" (obligatoire) : spécifiez le nombre de processus que la MPI doit lancer sur chaque hôte. Dans SageMaker, un hôte est une Instance ml Amazon EC2 unique. Le kit SDK Python SageMaker gère un mappage biunivoque entre les processus et les GPU via le parallélisme des modèles et des données. Autrement dit, SageMaker planifie chaque processus sur un GPU unique et distinct, et chaque GPU ne contient qu'un seul processus. Si vous utilisez PyTorch, vous devez restreindre chaque processus à son propre périphérique via torch.cuda.set_device(smp.local_rank()). Pour en savoir plus, consultez PyTorch.

      Important

      process_per_host ne doit pas être supérieur au nombre de GPU par instance. Généralement, il est égal à ce nombre.

      Par exemple, si vous utilisez une instance avec un parallélisme des modèles à 4 voies et un parallélisme des données à 2 voies, alors processes_per_host devrait être 2 x 4 = 8. Vous devez donc choisir une instance qui a au moins 8 GPU, ml.p3.16xlarge par exemple.

      L'image suivante illustre comment un parallélisme de données à 2 voies et un parallélisme des modèles à 4 voies sont répartis sur 8 GPU : les modèles sont partitionnés sur 4 GPU et chaque partition est ajoutée à 2 GPU.

    • "custom_mpi_options" (obligatoire) : utilisez cette clé pour transmettre toutes les options MPI personnalisées dont vous pouvez avoir besoin. Si vous ne transmettez aucune option personnalisée MPI à la clé, l'option MPI est définie par défaut sur l'indicateur suivant.

      --mca btl_vader_single_copy_mechanism none
      Note

      Vous n'avez pas besoin de spécifier explicitement cet indicateur par défaut à la clé. Si vous le spécifiez explicitement, votre tâche d'entraînement parallèle de modèle distribué peut échouer avec l'erreur suivante :

      The following MCA parameter has been listed multiple times on the command line: MCA param: btl_vader_single_copy_mechanism MCA parameters can only be listed once on a command line to ensure there is no ambiguity as to its value. Please correct the situation and try again.
      Astuce

      Si vous lancez une tâche d'entraînement à l'aide d'un type d'instance compatible EFA, tel que ml.p4d.24xlarge et ml.p3dn.24xlarge, utilisez l'indicateur suivant pour de meilleures performances :

      -x FI_EFA_USE_DEVICE_RDMA=1 -x FI_PROVIDER=efa -x RDMAV_FORK_SAFE=1

Pour lancer la tâche d'entraînement à l'aide du script d'entraînement configuré pour le parallélisme des modèles SageMaker, vous utilisez la fonction Estimator.fit(). Vous pouvez lancer une tâche d'entraînement SageMaker à l'aide d'une instance de bloc-notes SageMaker, ou localement.

Consultez les ressources suivantes pour en savoir plus sur l'utilisation du kit Python SDK SageMaker avec ces cadres :

Étendre ou adapter un conteneur Docker contenant la bibliothèque de modèles parallèles distribués de SageMaker

Pour étendre un conteneur précréé ou adapter votre propre conteneur à l'utilisation de la bibliothèque de modèles parallèles distribués de SageMaker, vous devez utiliser l'une des images de base du cadre général du GPU PyTorch ou du GPU TensorFlow. La bibliothèque de modèles parallèles distribués est incluse dans toutes les images versionnées CUDA 11 (cu11x) TensorFlow 2.3.x et PyTorch 1.6.x et versions ultérieures. Veuillez consulter Available Deep Learning Containers Images (Images de conteneurs Deep Learning Containers disponibles) pour obtenir une liste des images disponibles.

Astuce

Nous vous recommandons d'utiliser l'image contenant la dernière version de TensorFlow ou PyTorch pour accéder à la version la plus récente de la bibliothèque de modèles parallèles distribués SageMaker.

Par exemple, si vous utilisez PyTorch 1.8.1, votre Dockerfile doit contenir une instruction FROM semblable à celle-ci :

# SageMaker PyTorch image FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:1.8.1-gpu-py36-cu111-ubuntu18.04 # Add your dependencies here RUN ... ENV PATH="/opt/ml/code:${PATH}" # this environment variable is used by the SageMaker PyTorch container to determine our user code directory. ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code # /opt/ml and all subdirectories are utilized by SageMaker, use the /code subdirectory to store your user code. COPY cifar10.py /opt/ml/code/cifar10.py

En outre, lorsque vous définissez un estimator PyTorch ou TensorFlow, vous devez spécifier le entry_point pour votre script d'entraînement. Il doit être identique au chemin d'accès que celui identifié avec ENV SAGEMAKER_SUBMIT_DIRECTORYdans votre Dockerfile.

Vous devez envoyer ce conteneur docker vers Amazon Elastic Container Registry (Amazon ECR) et utiliser l'URI d'image (image_uri) pour définir un estimateur. Pour plus d'informations, consultez Étendre un conteneur précréé.

Par exemple, si votre Dockerfile a été défini à l'aide du bloc de code précédent et a utilisé le nom et la balise pour le transmettre vers Amazon ECR, vous devez définir un estimator PyTorch de la façon suivante. Cet exemple suppose que vous avez déjà défini les smp_options et mpi_options.

smd_mp_estimator = PyTorch( entry_point='/opt/ml/code/pt_mnist.py', # Identify source_dir='utils', role=role, instance_type='ml.p3.16xlarge', sagemaker_session=sagemaker_session, image_uri='aws_account_id.dkr.ecr.region.amazonaws.com/name:tag' instance_count=1, distribution={ "smdistributed": smp_options, "mpi": mpi_options }, base_job_name="SMD-MP-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')