Creare il proprio container di elaborazione (scenario avanzato) - Amazon SageMaker

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Creare il proprio container di elaborazione (scenario avanzato)

Puoi fornire ad Amazon SageMaker Processing un'immagine Docker con il tuo codice e le tue dipendenze per eseguire i carichi di lavoro di elaborazione dei dati, ingegneria delle funzionalità e valutazione dei modelli.

Il seguente esempio di file Docker crea un container con le librerie Python scikit-learn e panda che è possibile eseguire come attività di elaborazione.

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"]

Per un esempio di script di elaborazione, consulta Get started with Processing. SageMaker

Crea e invia questa immagine Docker in un repository Amazon Elastic Container Registry (Amazon ECR) e assicurati che il tuo ruolo SageMaker IAM possa estrarre l'immagine da Amazon ECR. Quindi puoi eseguire questa immagine su Amazon SageMaker Processing.

In che modo Amazon SageMaker Processing esegue l'immagine del tuo contenitore di elaborazione

Amazon SageMaker Processing esegue l'immagine del contenitore di elaborazione in modo simile al seguente comando, dove si AppSpecification.ImageUri trova l'URI dell'immagine Amazon ECR specificato in un'CreateProcessingJoboperazione.

docker run [AppSpecification.ImageUri]

Questo comando esegue il comando ENTRYPOINT configurato nell'immagine Docker.

È inoltre possibile sovrascrivere il comando entrypoint nell'immagine o fornire argomenti della riga di comando al comando entrypoint utilizzando i parametri AppSpecification.ContainerEntrypoint e AppSpecification.ContainerArgument nella richiesta CreateProcessingJob. La specificazione di questi parametri configura Amazon SageMaker Processing per eseguire il contenitore in modo simile al comando seguente.

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

Ad esempio, se specifichi ContainerEntrypoint to be [python3, -v, /processing_script.py] nella tua CreateProcessingJob richiesta e ContainerArguments to be[data-format, csv], Amazon SageMaker Processing esegue il contenitore con il seguente comando.

python3 -v /processing_script.py data-format csv

Quando si costruisce il container di elaborazione, tieni presenti i seguenti dettagli:

  • Amazon SageMaker Processing decide se il processo viene completato o meno in base al codice di uscita del comando eseguito. Un'attività di elaborazione viene completata se tutti i container di elaborazione escono correttamente con un codice di uscita pari a 0 e non riesce se uno dei container esce con un codice di uscita diverso da zero.

  • Amazon SageMaker Processing ti consente di sovrascrivere il punto di ingresso del contenitore di elaborazione e impostare argomenti della riga di comando proprio come puoi fare con l'API Docker. Le immagini Docker possono anche configurare gli argomenti dell'entrypoint e della riga di comando utilizzando le istruzioni ENTRYPOINT e CMD. Il modo in cui i parametri ContainerEntrypoint e ContainerArgument di CreateProcessingJob configurano l'entrypoint e gli argomenti di un'immagine Docker rispecchia il modo in cui Docker sovrascrive l'entrypoint e gli argomenti attraverso l'API Docker:

    • Se non vengono forniti né ContainerEntrypointContainerArguments, Processing utilizza l'ENTRYPOINT o il CMD predefinito nell'immagine.

    • Se viene fornito ContainerEntrypoint, ma non ContainerArguments, Processing esegue l'immagine con il punto di ingresso specificato e ignora l'ENTRYPOINT e il CMD nell'immagine.

    • Se viene fornito ContainerArguments, ma non ContainerEntrypoint, Processing esegue l'immagine con l'ENTRYPOINT predefinito nell'immagine e con gli argomenti forniti.

    • Se vengono forniti sia ContainerEntrypoint sia ContainerArguments, Processing esegue l'immagine con l'entrypoint e gli argomenti specificati e ignora l'ENTRYPOINT e il CMD nell'immagine.

  • Utilizza il modulo exec dell'istruzione ENTRYPOINT nel Dockerfile (ENTRYPOINT ["executable", "param1", "param2"]) invece del modulo shell (ENTRYPOINT command param1 param2). Ciò consente al container di elaborazione di ricevere segnali SIGINT e SIGKILL, che Processing utilizza per interrompere le attività di elaborazione utilizzando l'API StopProcessingJob.

  • /opt/mle tutte le relative sottodirectory sono riservate da. SageMaker Quando si crea l'immagine Docker di elaborazione, non inserire i dati richiesti dal container di elaborazione in queste directory.

  • Se si prevede di utilizzare dispositivi GPU, assicurarsi che i container siano compatibili con nvidia-docker. Includi solo il toolkit CUDA nei container. Non aggregare i driver NVIDIA con l'immagine. Per ulteriori informazioni su nvidia-docker, consulta NVIDIA/nvidia-docker.

In che modo Amazon SageMaker Processing configura input e output per il tuo contenitore di elaborazione

Quando crei un'attività di elaborazione utilizzando l'operazione CreateProcessingJob, puoi specificare più valori ProcessingInput e ProcessingOutput.

Usi il parametro ProcessingInput per specificare un URI Amazon Simple Storage Service (Amazon S3) da cui scaricare i dati e un percorso nel container di elaborazione per scaricare i dati. Il parametro ProcessingOutput configura un percorso nel container di elaborazione da cui caricare i dati e il percorso in Amazon S3 dove caricare tali dati. Per entrambi ProcessingInput e ProcessingOutput, il percorso nel container di elaborazione deve iniziare con /opt/ml/processing/ .

Ad esempio, puoi creare un'attività di elaborazione con un parametro ProcessingInput che scarica i dati da un percorso s3://your-data-bucket/path/to/input/csv/data in un percorso /opt/ml/processing/csv del container di elaborazione e un parametro ProcessingOutput che carica i dati da /opt/ml/processing/processed_csv in s3://your-data-bucket/path/to/output/csv/data. Il processo di elaborazione legge i dati di input e scrive i dati di output in /opt/ml/processing/processed_csv. Quindi carica i dati scritti in questo percorso nella posizione di output Amazon S3 specificata.

Importante

I link simbolici (symlinks) non possono essere utilizzati per caricare dati di output su Amazon S3. I link simbolici non vengono seguiti durante il caricamento dei dati di output.

In che modo Amazon SageMaker Processing fornisce log e parametri per il tuo contenitore di elaborazione

Quando il container di elaborazione scrive su stdout ostderr, Amazon SageMaker Processing salva l'output di ogni contenitore di elaborazione e lo inserisce nei CloudWatch log di Amazon. Per ulteriori informazioni sulla registrazione, consulta Registra SageMaker eventi Amazon con Amazon CloudWatch.

Amazon SageMaker Processing fornisce anche CloudWatch parametri per ogni istanza che esegue il container di elaborazione. Per ulteriori informazioni sui parametri, consulta Monitora Amazon SageMaker con Amazon CloudWatch.

In che modo Amazon SageMaker Processing configura il tuo contenitore di elaborazione

Amazon SageMaker Processing fornisce informazioni di configurazione al contenitore di elaborazione tramite variabili di ambiente e due file JSON /opt/ml/config/processingjobconfig.json e /opt/ml/config/resourceconfig.json in posizioni predefinite all'interno del contenitore.

Quando viene avviato un processo di elaborazione, vengono utilizzate le variabili di ambiente specificate con la mappa Environment nella richiesta CreateProcessingJob. Il file /opt/ml/config/processingjobconfig.json contiene le informazioni sui nomi host dei container di elaborazione ed è specificato anche nella richiesta CreateProcessingJob.

Nell'esempio seguente viene illustrato il formato del file /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 } }

Il file /opt/ml/config/resourceconfig.json contiene informazioni sui nomi host dei container di elaborazione. Utilizza i seguenti nomi host durante la creazione o l'esecuzione di codice di elaborazione distribuito.

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

Non utilizzare le informazioni sui nomi host contenuti in /etc/hostname o /etc/hosts perché potrebbero non essere accurate.

Le informazioni sul nome host potrebbero non essere immediatamente disponibili per il container di elaborazione. Ti consigliamo di aggiungere una policy per i nuovi tentativi sulle operazioni di risoluzione del nome host man mano che i nodi diventano disponibili nel cluster.

Salvare e accedere alle informazioni dei metadati sul processo di elaborazione

Per salvare i metadati dal container di elaborazione una volta chiuso, i container possono scrivere testo codificato UTF-8 nel file /opt/ml/output/message. Quando il processo di elaborazione passa a uno stato del terminale ("Completed", "Stopped" o "Failed"), il campo "ExitMessage" in DescribeProcessingJob contiene il primo 1 KB di questo file. Accedi a quella parte iniziale del file con una chiamata a DescribeProcessingJob, che la restituisce attraverso il parametro ExitMessage. Per le attività di elaborazione non riuscite, puoi utilizzare questo campo per comunicare informazioni sul perché il container di elaborazione non è riuscito.

Importante

Non scrivere dati sensibili nel file /opt/ml/output/message.

Se i dati in questo file non sono codificati UTF-8, il processo non riesce e viene restituito un ClientError. Se più container vengono chiusi con un ExitMessage,, il contenuto di ExitMessage di ciascun container di elaborazione viene concatenato, quindi troncato a 1 KB.

Esegui il tuo contenitore di elaborazione utilizzando l' SageMaker SDK Python

Puoi usare SageMaker Python SDK per eseguire la tua immagine di elaborazione utilizzando la classe. Processor L'esempio seguente mostra come eseguire il container di elaborazione con un input da Amazon Simple Storage Service (Amazon S3) e un output in 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>')], )

Invece di creare il codice di elaborazione nell'immagine di elaborazione, puoi fornire uno ScriptProcessor con la tua immagine e il comando che vuoi eseguire, insieme al codice da eseguire all'interno di quel container. Per vedere un esempio, consulta Eseguire script con il proprio container di elaborazione.

Puoi anche usare l'immagine scikit-learn fornita da Amazon SageMaker Processing SKLearnProcessor per eseguire script scikit-learn. Per un esempio, consulta Elaborazione di dati con sci-kit-learn.