Comment Amazon SageMaker gère votre image de formation - 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.

Comment Amazon SageMaker gère votre image de formation

Vous pouvez utiliser un script de point d'entrée personnalisé pour automatiser l'infrastructure et réaliser l'entraînement dans un environnement de production. Si vous transmettez votre script de point d'entrée dans votre conteneur Docker, vous pouvez également l'exécuter en tant que script autonome sans avoir à reconstruire vos images. SageMakertraite votre image d'entraînement à l'aide d'un script de point d'entrée de conteneur Docker.

Cette section vous montre comment utiliser un point d'entrée personnalisé sans utiliser la boîte à outils d'entraînement. Si vous souhaitez utiliser un point d'entrée personnalisé mais que vous ne savez pas comment configurer manuellement un conteneur Docker, nous vous recommandons d'utiliser plutôt la bibliothèque de boîtes à outils de SageMaker formation. Pour plus d'informations sur comment utiliser la boîte à outils d'entraînement, consultez Adaptation de votre propre conteneur d'entraînement.

Par défaut, SageMaker recherche un script appelé train à l'intérieur de votre conteneur. Vous pouvez également fournir manuellement votre propre point d'entrée personnalisé en utilisant les ContainerEntrypoint paramètres ContainerArguments et de l'AlgorithmSpecificationAPI.

Vous disposez des deux options suivantes pour configurer manuellement votre conteneur Docker afin d'exécuter votre image.

  • Utilisez l'CreateTrainingJobAPI et un conteneur Docker contenant une instruction de point d'entrée.

  • Utilisez l'API CreateTrainingJob et transmettez votre script d'entraînement depuis l'extérieur de votre conteneur Docker.

Si vous transmettez votre script d'entraînement depuis l'extérieur de votre conteneur Docker, vous n'avez pas besoin de reconstruire le conteneur Docker lorsque vous mettez à jour votre script. Vous pouvez également utiliser plusieurs scripts différents à exécuter dans le même conteneur.

Votre script de point d'entrée doit contenir le code d'entraînement pour votre image. Si vous utilisez le paramètre source_dir facultatif dans un estimateur, il doit faire référence au chemin Amazon S3 relatif vers le dossier contenant votre script de point d'entrée. Vous pouvez référencer plusieurs fichiers à l'aide du paramètre source_dir. Si vous n'utilisez pas source_dir, vous pouvez spécifier le point d'entrée à l'aide du paramètre entry_point. Pour un exemple de script de point d'entrée personnalisé contenant un estimateur, voir Bring Your Own Model with Script Mode. SageMaker

SageMaker model training prend en charge les compartiments de répertoire S3 Express One Zone à hautes performances en tant qu'emplacement d'entrée de données pour le mode fichier, le mode fichier rapide et le mode tube. Vous pouvez également utiliser les compartiments de répertoire S3 Express One Zone pour stocker vos résultats d'entraînement. Pour utiliser S3 Express One Zone, fournissez l'URI d'un compartiment de répertoire S3 Express One Zone au lieu d'un compartiment Amazon S3 à usage général. Pour plus d'informations, consultez S3 Express One Zone.

Exécuter une tâche d'entraînement à l'aide d'un script de point d'entrée intégré au conteneur Docker

SageMaker peut exécuter un script de point d'entrée intégré à votre conteneur Docker.

  • Par défaut, Amazon SageMaker exécute le conteneur suivant.

    docker run image train
  • SageMaker remplace toutes les instructions CMD par défaut d'un conteneur en spécifiant l'trainargument après le nom de l'image. Dans votre conteneur Docker, utilisez la forme exec suivante de l'instruction ENTRYPOINT.

    ENTRYPOINT ["executable", "param1", "param2", ...]

    L'exemple suivant montre comment spécifier une instruction de point d'entrée Python appelée k-means-algorithm.py.

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    Le formulaire exec de l'instruction ENTRYPOINT lance l'exécutable directement, et non en tant qu'enfant de /bin/sh. Cela lui permet de recevoir des signaux tels que SIGTERM et SIGKILL depuis des SageMaker API. Les conditions suivantes s'appliquent lors de l'utilisation SageMaker des API.

    • L'CreateTrainingJobAPI comporte une condition d'arrêt qui indique SageMaker d'arrêter l'entraînement du modèle après un certain temps.

    • L'exemple suivant montre l'API StopTrainingJob. L'API émet l'équivalent de la commande docker stop, avec 2 minutes de délai d'attente, pour arrêter correctement le conteneur spécifié.

      docker stop -t 120

      La commande tente d'arrêter le conteneur en cours d'exécution en envoyant un signal SIGTERM. Après le délai d'expiration de 2 minutes, l'API envoie SIGKILL et arrête de force les conteneurs. Si le conteneur gère SIGTERM normalement et s'arrête dans les 120 secondes suivant sa réception, aucun SIGKILL n'est envoyé.

    Si vous souhaitez accéder aux artefacts du modèle intermédiaire après l' SageMaker arrêt de l'entraînement, ajoutez du code pour gérer la sauvegarde des artefacts dans votre SIGTERM gestionnaire.

  • Si vous prévoyez d'utiliser des périphériques GPU pour l'entraînement de modèle, assurez-vous que vos conteneurs sont compatibles avec nvidia-docker. N'incluez que la boîte à outils CUDA dans les conteneurs ; ne regroupez pas de pilote NVIDIA avec l'image. Pour plus d'informations sur nvidia-docker, consultez NVIDIA/nvidia-docker.

  • Vous ne pouvez pas utiliser l'tiniinitialiseur comme script de point d'entrée dans les SageMaker conteneurs car les arguments et le confondent. train serve

  • /opt/mlet tous les sous-répertoires sont réservés par SageMaker entraînement. Lors de la création de l'image Docker de votre algorithme, veillez à ne pas placer de données requises par votre algorithme dans ce répertoire. Dans le cas contraire, les données risquent de ne plus être visibles pendant l'entraînement.

Pour regrouper vos scripts shell ou Python dans votre image Docker, ou pour fournir le script dans un compartiment Amazon S3 ou à l'aide de la AWS Command Line Interface (CLI), passez à la section suivante.

Regrouper votre script shell dans un conteneur Docker

Si vous souhaitez regrouper un script shell personnalisé dans votre image Docker, procédez comme suit.

  1. Copiez votre script shell depuis votre répertoire de travail vers votre conteneur Docker. L'extrait de code suivant copie un script de point d'entrée personnalisé custom_entrypoint.sh du répertoire de travail actuel vers un conteneur Docker situé dans mydir. L'exemple suivant suppose que Python est installé sur l'image Docker de base.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.sh /mydir/
  2. Créez et envoyez un conteneur Docker vers l'Amazon Elastic Container Registry (Amazon ECR) en suivant les instructions de la section Pousser une image Docker dans le Guide de l'utilisateur Amazon ECR.

  3. Lancez la tâche de formation en exécutant la AWS CLI commande suivante.

    aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/mydir/custom_entrypoint.sh"]}' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'

Regrouper votre script Python dans un conteneur Docker

Pour regrouper un script Python personnalisé dans votre image Docker, procédez comme suit.

  1. Copiez votre script Python depuis votre répertoire de travail vers votre conteneur Docker. L'extrait de code suivant copie un script de point d'entrée personnalisé custom_entrypoint.py du répertoire de travail actuel vers un conteneur Docker situé dans mydir.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.py /mydir/
  2. Lancez la tâche de formation en exécutant la AWS CLI commande suivante.

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

Exécuter une tâche d'entraînement à l'aide d'un script de point d'entrée en dehors du conteneur Docker

Vous pouvez utiliser votre propre conteneur Docker pour l'entraînement et transmettre un script de point d'entrée depuis l'extérieur du conteneur Docker. La structuration de votre script de point d'entrée en dehors du conteneur présente certains avantages. Si vous mettez à jour votre script de point d'entrée, vous n'avez pas besoin de reconstruire le conteneur Docker. Vous pouvez également utiliser plusieurs scripts différents à exécuter dans le même conteneur.

Spécifiez l'emplacement de votre script d'entraînement à l'aide des ContainerArguments paramètres ContainerEntrypoint et de l'AlgorithmSpecificationAPI. Ces points d'entrée et arguments se comportent de la même manière que les points d'entrée et arguments Docker. Les valeurs de ces paramètres remplacent les valeurs correspondantes ENTRYPOINT ou CMD fournies dans le cadre du conteneur Docker.

Lorsque vous transmettez votre script de point d'entrée personnalisé à votre conteneur d'entraînement Docker, les entrées que vous fournissez déterminent le comportement du conteneur.

  • Par exemple, si vous fournissez uniquementContainerEntrypoint, la syntaxe de la demande à l'aide de l' CreateTrainingJob API est la suivante.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    Ensuite, le backend de SageMaker formation exécute votre point d'entrée personnalisé comme suit.

    docker run --entrypoint <ContainerEntrypoint> image
    Note

    S'il ContainerEntrypoint est fourni, le backend d' SageMaker entraînement exécute l'image avec le point d'entrée donné et remplace la valeur par défaut ENTRYPOINT de l'image.

  • Si vous fournissez uniquementContainerArguments, SageMaker suppose que le conteneur Docker contient un script de point d'entrée. La syntaxe des requêtes utilisant l'API CreateTrainingJob est la suivante.

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    Le backend de SageMaker formation gère votre point d'entrée personnalisé comme suit.

    docker run image <ContainerArguments>
  • Si vous fournissez à la fois le ContainerEntrypoint et le ContainerArguments, la syntaxe de la requête utilisant l'API CreateTrainingJob est la suivante.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    Le backend de SageMaker formation gère votre point d'entrée personnalisé comme suit.

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

Vous pouvez utiliser n'importe quelle source InputDataConfig prise en charge dans l'API CreateTrainingJob pour fournir un script de point d'entrée permettant d'exécuter votre image d'entraînement.

Fournissez votre script de point d'entrée dans un compartiment Amazon S3

Pour fournir un script de point d'entrée personnalisé à l'aide d'un compartiment S3, utilisez le S3DataSource paramètre de l'DataSourceAPI pour spécifier l'emplacement du script. Si vous utilisez le paramètre S3DataSource, les éléments suivants sont obligatoires.

Dans l'exemple suivant, un script appelé custom_entrypoint.sh est placé dans un chemin d'accès vers un compartiment S3 s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh.

#!/bin/bash echo "Running custom_entrypoint.sh" echo "Hello you have provided the following arguments: " "$@"

Ensuite, vous devez définir la configuration du canal de données d'entrée pour exécuter une tâche d'entraînement. Pour ce faire, utilisez AWS CLI directement ou un fichier JSON.

Configurer le canal de données d'entrée à l' AWS CLI aide d'un fichier JSON

Pour configurer votre canal de données d'entrée avec un fichier JSON, AWS CLI utilisez-le comme indiqué dans la structure de code suivante. Assurez-vous que tous les champs suivants utilisent la syntaxe de demande définie dans l'CreateTrainingJobAPI.

// run-my-training-job.json { "AlgorithmSpecification": { "ContainerEntrypoint": ["/bin/sh"], "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"], ... }, "InputDataConfig": [ { "ChannelName": "<your_channel_name>", "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket-name>/<bucket_prefix>" } }, "InputMode": "File", }, ...] }

Ensuite, exécutez la AWS CLI commande pour lancer la tâche de formation à partir du fichier JSON comme suit.

aws sagemaker create-training-job --cli-input-json file://run-my-training-job.json

Configurez le canal de données d'entrée en utilisant AWS CLI directement

Pour configurer votre canal de données d'entrée sans fichier JSON, utilisez la structure de AWS CLI code suivante.

aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"]}' \ --input-data-config '[{ \ "ChannelName":"<your_channel_name>", \ "DataSource":{ \ "S3DataSource":{ \ "S3DataType":"S3Prefix", \ "S3Uri":"s3://<bucket-name>/<bucket_prefix>", \ "S3DataDistributionType":"FullyReplicated"}}}]' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'