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 dans votre conteneur. Vous pouvez également fournir manuellement votre propre point d'entrée personnalisé en utilisant les ContainerEntrypoint paramètres ContainerArguments et du. AlgorithmSpecificationAPI

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

  • Utilisez le conteneur Docker CreateTrainingJobAPIet contenant une instruction de point d'entrée.

  • Utilisez le script CreateTrainingJob API d'entraînement et transmettez-le 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 un compartiment URI de répertoire S3 Express One Zone au lieu d'un compartiment Amazon S3 à usage général. Vous ne pouvez chiffrer vos données de SageMaker sortie que dans des compartiments d'annuaire avec un chiffrement côté serveur avec des clés gérées par Amazon S3 (-S3). SSE Le chiffrement côté serveur à l'aide de AWS KMS clés (SSE-KMS) n'est actuellement pas pris en charge pour le stockage des données SageMaker de sortie dans des compartiments de répertoire. 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 CMDinstructions 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 similaires SIGTERM et en SIGKILL provenance de SageMaker APIs. Les conditions suivantes s'appliquent lors de l'utilisation du SageMaker APIs.

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

    • Ce qui suit montre le StopTrainingJobAPI. Cela API émet l'équivalent dedocker stop, avec une commande de temporisation de 2 minutes 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 de 2 minutes, le système 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 GPU des appareils pour la formation des modèles, assurez-vous que vos conteneurs sont nvidia-docker compatibles. N'incluez que le CUDA kit d'outils sur les conteneurs ; ne regroupez pas NVIDIA les pilotes avec l'image. Pour plus d'informationsnvidia-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 en utilisant le 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 transférez un conteneur Docker vers le Amazon Elastic Container Registry (Amazon ECR) en suivant les instructions de la section Envoyer une image Docker dans le guide de ECRl'utilisateur Amazon.

  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 du 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 utilisant le 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 de la demande utilisant le CreateTrainingJob API 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 etContainerArguments, la syntaxe de la demande utilisant le CreateTrainingJob API 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 InputDataConfig source prise en charge CreateTrainingJob API 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 DataSourceAPIpour 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 le AWS CLI directement ou avec un JSON fichier.

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

Pour configurer votre canal de données d'entrée avec un JSON fichier, 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 le 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 JSON fichier 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 JSON fichier, 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}'