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
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 estimateursource_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
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 CMD
instructions par défaut d'un conteneur en spécifiant l' train
argument après le nom de l'image. Dans votre conteneur Docker, utilisez la formeexec
suivante de l'instructionENTRYPOINT
.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'instructionENTRYPOINT
lance l'exécutable directement, et non en tant qu'enfant de/bin/sh
. Cela lui permet de recevoir des signaux similairesSIGTERM
et enSIGKILL
provenance de SageMaker APIs. Les conditions suivantes s'appliquent lors de l'utilisation du SageMaker APIs.-
CreateTrainingJob
APIIl 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
StopTrainingJob
API. 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 envoieSIGKILL
et arrête de force les conteneurs. Si le conteneur gèreSIGTERM
normalement et s'arrête dans les 120 secondes suivant sa réception, aucunSIGKILL
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'
tini
initialiseur comme script de point d'entrée dans les SageMaker conteneurs car les arguments et le confondent.train
serve
-
/opt/ml
et 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.
-
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é dansmydir
. 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/
-
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.
-
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.
-
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é dansmydir
.FROM
<base-docker-image>
:<tag>
# Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.py /mydir/
-
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 uniquement
ContainerEntrypoint
, 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>
imageNote
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éfautENTRYPOINT
de l'image. -
Si vous fournissez uniquement
ContainerArguments
, SageMaker suppose que le conteneur Docker contient un script de point d'entrée. La syntaxe de la demande utilisant leCreateTrainingJob
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 leCreateTrainingJob
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.
-
InputModeIl doit être du type
File
. -
Le S3 DataDistributionType doit l'être
FullyReplicated
.
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
}'