Génération de votre propre conteneur de traitement (scénario avancé) - Amazon SageMaker

Génération de votre propre conteneur de traitement (scénario avancé)

Vous pouvez fournir à Amazon SageMaker Processing une image Docker comprenant votre propre code et vos propres dépendances pour exécuter vos applications de traitement des données, d'ingénierie des fonctionnalités et d'évaluation des modèles.

L'exemple suivant d'un Dockerfile génère un conteneur avec les bibliothèques Python scikit-learn et pandas que vous pouvez exécuter en tant que tâche de traitement.

FROM python:3.7-slim-buster # Install scikit-learn and pandas RUN pip3 install pandas==0.25.3 scikit-learn==0.21.3 # Add a Python script and configure Docker to run it ADD processing_script.py / ENTRYPOINT ["python3", "/processing_script.py"]

Créez et envoyez cette image Docker à un référentiel Amazon Elastic Container Registry (Amazon ECR) et assurez-vous que votre rôle IAM SageMaker peut extraire l'image d'Amazon ECR. Ensuite, vous pouvez exécuter cette image sur Amazon SageMaker Processing.

Exécution de votre image de conteneur de traitement par Amazon SageMaker Processing

Amazon SageMaker Processing exécute votre image de conteneur de traitement de la même manière que la commande suivante, où AppSpecification.ImageUri est l'URI de l'image Amazon ECR que vous spécifiez dans une opération CreateProcessingJob.

docker run [AppSpecification.ImageUri]

Cette commande exécute la commande ENTRYPOINT configurée dans votre image Docker.

Vous pouvez également remplacer la commande entrypoint dans l'image ou donner des arguments de ligne de commande à votre commande entrypoint à l'aide des paramètres AppSpecification.ContainerEntrypoint et AppSpecification.ContainerArgument de votre demande CreateProcessingJob. La spécification de ces paramètres configure Amazon SageMaker Processing de sorte qu'il exécute le conteneur de la même manière qu'avec la commande suivante.

docker run --entry-point [AppSpecification.ContainerEntrypoint] [AppSpecification.ImageUri] [AppSpecification.ContainerArguments]

Par exemple, si vous spécifiez le ContainerEntrypoint comme [python3, -v, /processing_script.py] dans votre demande CreateProcessingJob et ContainerArguments comme [data-format, csv], Amazon SageMaker Processing exécute votre conteneur avec la commande suivante.

python3 -v /processing_script.py data-format csv

Lors de la génération de votre conteneur de traitement, tenez compte des éléments suivants  :

  • Amazon SageMaker Processing détermine si la tâche se termine ou échoue en fonction du code de sortie de l'exécution de la commande. Une tâche de traitement se termine si tous les conteneurs de traitement quittent avec succès avec un code de sortie égal à 0 et échoue si l'un des conteneurs quitte avec un code de sortie différent de zéro.

  • Amazon SageMaker Processing vous permet de remplacer le point d'entrée du conteneur de traitement et de définir des arguments de ligne de commande, tout comme avec l'API Docker. Les images Docker peuvent également configurer les arguments d'entrée et de ligne de commande à l'aide des instructions ENTRYPOINT et CMD. La méthode dont les paramètres CreateProcessingJob et ContainerEntrypoint de ContainerArgument configurent le point d'entrée et les arguments d'une image Docker reflète la façon dont Docker remplace le point d'entrée et les arguments via l'API Docker :

    • En l'absence de ContainerEntrypoint et ContainerArguments, Processing utilise la valeur par défaut ENTRYPOINT ou CMD dans l'image.

    • Si ContainerEntrypoint est fourni, mais pas ContainerArguments, Processing exécute l'image avec le point d'entrée donné, et ignore les instructions ENTRYPOINT et CMD dans l'image.

    • Si ContainerArguments est fourni, mais pas ContainerEntrypoint, Processing exécute l'image avec l'instruction par défaut ENTRYPOINT dans l'image et avec les arguments fournis.

    • Si ContainerEntrypoint et ContainerArguments sont fournis, Processing exécute l'image avec le point d'entrée et les arguments donnés, et ignore les instructions ENTRYPOINT et le CMD dans l'image.

  • Vous devez utiliser le formulaire exec de l'instruction ENTRYPOINT dans votre Dockerfile (ENTRYPOINT ["executable", "param1", "param2"])) au lieu du formulaire shell (ENTRYPOINT command param1 param2). Cela permet à votre conteneur de traitement de recevoir des signaux SIGINT et SIGKILL que Processing utilise pour arrêter les tâches de traitement avec l'API StopProcessingJob.

  • /opt/ml et tous ses sous-répertoires sont réservés par SageMaker. Lors de la création de votre image Docker de traitement, ne placez aucune des données requises par votre conteneur de traitement dans ces répertoires.

  • Si vous envisagez d'utiliser des périphériques GPU, assurez-vous que vos conteneurs sont compatibles avec nvidia-docker. Incluez uniquement la boîte à outils CUDA dans les conteneurs. Ne regroupez pas des pilotes NVIDIA avec l'image. Pour plus d'informations sur nvidia-docker, consultez NVIDIA/nvidia-docker.

Configuration de l'entrée et la sortie de votre conteneur de traitement par Amazon SageMaker Processing

Lorsque vous créez une tâche de traitement à l'aide de l'opération CreateProcessingJob, vous pouvez spécifier plusieurs valeurs ProcessingInput et ProcessingOutput.

Vous utilisez le paramètre ProcessingInput pour spécifier un URI Amazon Simple Storage Service (Amazon S3) à partir duquel télécharger les données et un chemin d'accès dans votre conteneur de traitement vers lequel télécharger les données. Le paramètre ProcessingOutput configure un chemin d'accès dans votre conteneur de traitement à partir duquel télécharger les données et l'emplacement dans Amazon S3 où télécharger les données. Pour ProcessingInput et ProcessingOutput, le chemin dans le conteneur de traitement doit commencer par /opt/ml/processing/ .

Par exemple, vous pouvez créer une tâche de traitement avec un paramètre ProcessingInput qui télécharge les données de s3://your-data-bucket/path/to/input/csv/data vers /opt/ml/processing/csv dans votre conteneur de traitement, et un paramètre ProcessingOutput qui télécharge les données de /opt/ml/processing/processed_csv vers s3://your-data-bucket/path/to/output/csv/data. Dans ce cas, votre tâche de traitement lit les données d'entrée et écrit les données de sortie dans /opt/ml/processing/processed_csv. Les données écrites sont ensuite téléchargées vers ce chemin d'accès dans l'emplacement de sortie Amazon S3 spécifié.

Important

Les liens symboliques (symlinks) ne peuvent pas être utilisés pour télécharger des données de sortie vers Amazon S3. Les liens symboliques ne sont pas suivis lors du téléchargement des données de sortie.

Fourniture de journaux et métriques pour votre conteneur de traitement par Amazon SageMaker Processing

Lorsque votre conteneur de traitement écrit dans stdout ou stderr, Amazon SageMaker Processing enregistre la sortie de chaque conteneur de traitement et la place dans Amazon CloudWatch logs. Pour de plus amples informations sur la journalisation, veuillez consulter Journaliser les événements Amazon SageMaker à l'aide d'Amazon CloudWatch.

Amazon SageMaker Processing fournit également des métriques CloudWatch pour chaque instance exécutant votre conteneur de traitement. Pour de plus amples informations sur les métriques, veuillez consulter contrôler Amazon SageMaker à l'aide d'Amazon CloudWatch.

Configuration de votre conteneur de traitement par Amazon SageMaker Processing

Amazon SageMaker Processing fournit des informations de configuration à votre conteneur de traitement via des variables d'environnement et deux fichiers JSON, /opt/ml/config/processingjobconfig.json et /opt/ml/config/resourceconfig.json, à des emplacements prédéfinis dans le conteneur.

Lorsqu'une tâche de traitement démarre, elle utilise les variables d'environnement que vous avez spécifiées avec la carte Environment dans la demande CreateProcessingJob. Le fichier /opt/ml/config/processingjobconfig.json contient des informations sur les noms d'hôte de vos conteneurs de traitement et est également spécifié dans la demande CreateProcessingJob.

L'exemple suivant illustre le format du fichier /opt/ml/config/processingjobconfig.json.

{ "ProcessingJobArn": "<processing_job_arn>", "ProcessingJobName": "<processing_job_name>", "AppSpecification": { "ImageUri": "<image_uri>", "ContainerEntrypoint": null, "ContainerArguments": null }, "Environment": { "KEY": "VALUE" }, "ProcessingInputs": [ { "InputName": "input-1", "S3Input": { "LocalPath": "/opt/ml/processing/input/dataset", "S3Uri": "<s3_uri>", "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3InputMode": "File", "S3CompressionType": "None", "S3DownloadMode": "StartOfJob" } } ], "ProcessingOutputConfig": { "Outputs": [ { "OutputName": "output-1", "S3Output": { "LocalPath": "/opt/ml/processing/output/dataset", "S3Uri": "<s3_uri>", "S3UploadMode": "EndOfJob" } } ], "KmsKeyId": null }, "ProcessingResources": { "ClusterConfig": { "InstanceCount": 1, "InstanceType": "ml.m5.xlarge", "VolumeSizeInGB": 30, "VolumeKmsKeyId": null } }, "RoleArn": "<IAM role>", "StoppingCondition": { "MaxRuntimeInSeconds": 86400 } }

Le fichier /opt/ml/config/resourceconfig.json contient des informations sur les noms d'hôte de vos conteneurs de traitement. Utilisez les noms d'hôte suivants lors de la création ou de l'exécution du code de traitement distribué.

{ "current_host": "algo-1", "hosts": ["algo-1","algo-2","algo-3"] }

N'utilisez pas les informations relatives aux noms d'hôte contenues dans /etc/hostname ou /etc/hosts, car elles peuvent être inexactes.

Les informations sur le nom d'hôte peuvent ne pas être immédiatement disponibles pour le conteneur de traitement. Nous vous recommandons d'ajouter une stratégie de nouvelle tentative aux opérations de résolution de nom d'hôte quand les nœuds deviennent disponibles dans le cluster.

Enregistrement et accès aux informations de métadonnées relatives à votre tâche de traitement

Pour enregistrer les métadonnées du conteneur de traitement après l'avoir quitté, les conteneurs peuvent écrire du texte codé UTF-8 dans le fichier /opt/ml/output/message. Une fois que la tâche de traitement affiche un état du terminal (« Completed », « Stopped » ou « Failed »), le champ « ExitMessage » dans DescribeProcessingJob contient le premier Ko de ce fichier. Accédez à cette partie initiale du fichier avec un appel à DescribeProcessingJob, qui la renvoie via le paramètre ExitMessage. Pour les tâches de traitement ayant échoué, vous pouvez utiliser ce champ pour indiquer pourquoi le conteneur de traitement a échoué

Important

N'écrivez pas de données sensibles dans le fichier /opt/ml/output/message.

Si les données de ce fichier ne sont pas codées en UTF-8, la tâche échoue et renvoie une erreur ClientError. Si plusieurs conteneurs quittent avec une erreur ExitMessage,, le contenu de l'erreur ExitMessage de chaque conteneur de traitement est concaténé, puis tronqué à 1 Ko.

Exécution de votre conteneur de traitement à l'aide du SDK SageMaker Python

Vous pouvez utiliser le SDK SageMaker Python pour exécuter votre propre image de traitement en utilisant la classe Processor. L'exemple suivant montre comment exécuter votre propre conteneur de traitement avec une entrée depuis Amazon Simple Storage Service (Amazon S3) et une sortie vers Amazon S3.

from sagemaker.processing import Processor, ProcessingInput, ProcessingOutput processor = Processor(image_uri='<your_ecr_image_uri>', role=role, instance_count=1, instance_type="ml.m5.xlarge") processor.run(inputs=[ProcessingInput( source='<s3_uri or local path>', destination='/opt/ml/processing/input_data')], outputs=[ProcessingOutput( source='/opt/ml/processing/processed_data', destination='<s3_uri>')], ))

Au lieu de créer votre code de traitement dans votre image de traitement, vous pouvez fournir un ScriptProcessor avec votre image et la commande que vous voulez exécuter, ainsi que le code que vous voulez exécuter à l'intérieur de ce conteneur. Pour voir un exemple, consultez Exécuter des scripts avec votre propre conteneur de traitement.

Vous pouvez également utiliser l'image scikit-learn qu'Amazon SageMaker Processing fournit via SKLearnProcessor pour exécuter des scripts scikit-learn. Pour obtenir un exemple, veuillez consulter Traitement de données avec scikit-learn.