Crear su propio contenedor de procesamiento (escenario avanzado) - Amazon SageMaker

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Crear su propio contenedor de procesamiento (escenario avanzado)

Puede proporcionar a Procesamiento de Amazon SageMaker una imagen de Docker que tenga su propio código y dependencias para ejecutar sus cargas de trabajo de procesamiento de datos, ingeniería de características y evaluación de modelos.

El siguiente ejemplo de un archiDockerfile crea un contenedor con las bibliotecas de Python scikit-learn y pandas que puede ejecutar como un trabajo de procesamiento.

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

Para ver un ejemplo de un script de procesamiento, consulte Introducción al procesamiento de SageMaker.

Cree e inserte esta imagen de Docker en un repositorio de Amazon Elastic Container Registry (Amazon ECR) y asegúrese de que su rol de IAM de SageMaker pueda extraer la imagen de Amazon ECR. A continuación, puede ejecutar esta imagen en Procesamiento de Amazon SageMaker.

Cómo ejecuta Procesamiento de Amazon SageMaker su imagen de Contenedor de procesamiento

Procesamiento de Amazon SageMaker ejecuta la imagen de contenedor de procesamiento de forma similar al comando siguiente, donde AppSpecification.ImageUri es el URI de imagen de Amazon ECR que especifica en una operación de CreateProcessingJob.

docker run [AppSpecification.ImageUri]

Este comando ejecuta el comando ENTRYPOINT configurado en la imagen de Docker.

También puede anular el comando entrypoint en la imagen o proporcionar argumentos de línea de comandos al comando entrypoint utilizando los parámetros AppSpecification.ContainerEntrypoint y AppSpecification.ContainerArgument en la solicitud CreateProcessingJob. La especificación de estos parámetros configura Procesamiento de Amazon SageMaker para ejecutar el contenedor de forma similar a la que lo hace el siguiente comando.

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

Por ejemplo, si especifica que ContainerEntrypoint sea [python3, -v, /processing_script.py] en su solicitud CreateProcessingJob y que ContainerArguments sea [data-format, csv], Procesamiento de Amazon SageMaker ejecuta el contenedor con el siguiente comando.

python3 -v /processing_script.py data-format csv

Al crear su contenedor de procesamiento, tenga en cuenta los siguientes detalles:

  • El Procesamiento de Amazon SageMaker decide si el trabajo se completa o se produce un error en función del código de salida de la ejecución del comando. Un trabajo de procesamiento se completa si todos los contenedores de procesamiento salen correctamente con un código de salida 0 y devuelve un error si alguno de los contenedores sale con un código de salida distinto de cero.

  • El Procesamiento de Amazon SageMaker le permite anular el punto de entrada del contenedor de procesamiento y establecer argumentos de línea de comandos al igual que puede hacer con la API de Docker. Las imágenes de Docker también pueden configurar los argumentos de punto de entrada y línea de comandos mediante las instrucciones ENTRYPOINT y CMD. La forma en que los parámetros ContainerEntrypoint y ContainerArgument de CreateProcessingJob configuran el punto de entrada y los argumentos de una imagen de Docker refleja cómo Docker anula el punto de entrada y los argumentos a través de la API de Docker:

    • Si no se proporcionan ContainerEntrypoint ni ContainerArguments, el Procesamiento utiliza el ENTRYPOINT o CMD predeterminado en la imagen.

    • Si se proporciona ContainerEntrypoint, pero no ContainerArguments, el Procesamiento ejecuta la imagen con el punto de entrada indicado, e ignora el ENTRYPOINT y CMD en la imagen.

    • Si se proporciona ContainerArguments, pero no ContainerEntrypoint, el Procesamiento ejecuta la imagen con el ENTRYPOINT predeterminado en la imagen y con los argumentos proporcionados.

    • Si se proporcionan ContainerEntrypoint y ContainerArguments, el Procesamiento ejecuta la imagen con el punto de entrada y los argumentos indicados y se ignoran el ENTRYPOINT y CMD en la imagen.

  • Debe usar el formato exec de la instrucción ENTRYPOINT en su Dockerfile (ENTRYPOINT ["executable", "param1", "param2"]) en lugar del formato shell (ENTRYPOINT command param1 param2). Esto permite que su contenedor de procesamiento reciba señales SIGINT y SIGKILL, que el Procesamiento utiliza para detener los trabajos de procesamiento utilizando la API StopProcessingJob.

  • /opt/ml y todos sus subdirectorios están reservados por SageMaker. Cuando cree su imagen de Docker de procesamiento, no coloque ningún dato requerido por su contenedor de procesamiento en estos directorios.

  • Si planea usar dispositivos GPU, asegúrese de que sus contenedores sean compatibles con nvidia-docker. Incluya solo el kit de herramientas CUDA en los contenedores. No cree un paquete con controladores de NVIDIA con la imagen. Para obtener más información sobre nvidia-docker, consulte NVIDIA/nvidia-docker.

Cómo configura Procesamiento de Amazon SageMaker la entrada y salida del contenedor de procesamiento

Cuando crea un trabajo de procesamiento mediante la operación CreateProcessingJob, puede especificar varios valores ProcessingInput y ProcessingOutput.

Utilice el ProcessingInput parámetro para especificar un URI de Amazon Simple Storage Service (Amazon S3) desde el que descargar datos y una ruta de acceso en el contenedor de procesamiento donde descargar los datos. El parámetro ProcessingOutput configura una ruta de acceso en su contenedor de procesamiento desde la que cargar datos y donde Amazon S3 cargará esos datos. Para ProcessingInput y ProcessingOutput, la ruta de acceso en el contenedor de procesamiento debe empezar por /opt/ml/processing/ .

Por ejemplo, podría crear un trabajo de procesamiento con un parámetro ProcessingInput que descargue datos desde s3://your-data-bucket/path/to/input/csv/data en /opt/ml/processing/csv en el contenedor de procesamiento y un parámetro ProcessingOutput que cargue datos desde /opt/ml/processing/processed_csv en s3://your-data-bucket/path/to/output/csv/data. Su trabajo de procesamiento leería los datos de entrada y escribiría los datos de salida en /opt/ml/processing/processed_csv. A continuación, carga los datos escritos en esta ruta a la ubicación de salida especificada por Amazon S3.

importante

Los enlaces simbólicos (symlinks) no se pueden utilizar para cargar datos de salida en Amazon S3. No se siguen los symlinks al cargar los datos de salida.

Cómo el Procesamiento de Amazon SageMaker proporciona registros y métricas para el contenedor de procesamiento

Cuando el contenedor de procesamiento escribe en stdout o stderr, el Procesamiento de Amazon SageMaker guarda la salida de cada contenedor de procesamiento y la coloca en Registros de Amazon CloudWatch. Para obtener más información acerca del registro, consulte Registra SageMaker los eventos de Amazon con Amazon CloudWatch.

El Procesamiento de Amazon SageMaker también proporciona métricas de CloudWatch para cada instancia que ejecuta el contenedor de procesamiento. Para obtener más información acerca de las métricas, consulte Supervisa Amazon SageMaker con Amazon CloudWatch.

Cómo configura Procesamiento de Amazon SageMaker su contenedor de procesamiento

El Procesamiento de Amazon SageMaker proporciona información de configuración al contenedor de procesamiento a través de variables de entorno y dos archivos JSON (/opt/ml/config/processingjobconfig.json y /opt/ml/config/resourceconfig.json) en ubicaciones predefinidas en el contenedor.

Cuando se inicia un trabajo de procesamiento, utiliza las variables de entorno que ha especificado con el mapeo de Environment en la solicitud CreateProcessingJob. El archivo /opt/ml/config/processingjobconfig.json contiene información sobre los nombres de host de los contenedores de procesamiento, y también se especifica en la solicitud CreateProcessingJob.

En el ejemplo siguiente se muestra el formato del archivo /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 } }

El archivo /opt/ml/config/resourceconfig.json contiene información sobre los nombres de host de los contenedores de procesamiento. Utilice los siguientes nombres de host al crear o ejecutar código de procesamiento distribuido.

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

No utilice la información sobre los nombres de host que se incluye en /etc/hostname o /etc/hosts porque podría ser inexacta.

Es posible que la información del nombre de host no esté disponible inmediatamente para el contenedor de procesamiento. Recomendamos agregar una política de reintentos en las operaciones de resolución de nombres de host a medida que los nodos estén disponibles en el clúster.

Guardar y acceder a la información de metadatos sobre su trabajo de procesamiento

Para guardar metadatos del contenedor de procesamiento después de salir de él, los contenedores pueden escribir texto codificado en UTF-8 en el archivo /opt/ml/output/message. Después de que el trabajo de procesamiento cambie a un estado de terminal ("Completed", "Stopped" o "Failed"), el campo "ExitMessage" en DescribeProcessingJob contiene el primer 1 KB de este archivo. Obtenga acceso a esa parte inicial del archivo con una llamada a DescribeProcessingJob, que la devuelve a través del parámetro ExitMessage. Para trabajos de procesamiento con error, puede utilizar este campo para ofrecer información de por qué el contenedor de procesamiento generó un error.

importante

No escriba datos confidenciales en el archivo /opt/ml/output/message.

Si los datos de este archivo no están codificados en UTF-8, se produce un error en el trabajo y devuelve ClientError. Si varios contenedores finalizan con ExitMessage, el contenido ExitMessage de cada contenedor de procesamiento se concatena y, a continuación, se trunca a 1 KB.

Ejecutar su contenedor de procesamiento usando el SDK de SageMaker Python

Puede usar el SDK de SageMaker Python para ejecutar su propia imagen de procesamiento mediante el uso de la clase Processor. El siguiente ejemplo muestra cómo ejecutar su propio contenedor de procesamiento con una entrada de Amazon Simple Storage Service (Amazon S3) y una salida a 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>')], )

En lugar de crear el código de procesamiento en la imagen de procesamiento, puede proporcionar un ScriptProcessor con su imagen y el comando que desea ejecutar, junto con el código que desea ejecutar dentro de ese contenedor. Para ver un ejemplo, consulte Ejecutar scripts con su propio contenedor de procesamiento.

También puede usar la imagen scikit-learn que el Procesamiento de Amazon SageMaker proporciona mediante SKLearnProcessor para ejecutar scripts scikit-learn. Para ver un ejemplo, consulte Procesamiento de características con scikit-learn.