Cómo gestiona Amazon SageMaker AI tu imagen de entrenamiento - Amazon SageMaker AI

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.

Cómo gestiona Amazon SageMaker AI tu imagen de entrenamiento

Puede usar un script de punto de entrada personalizado para automatizar la infraestructura para entrenar en un entorno de producción. Si pasa el script de punto de entrada a su contenedor de Docker, también puede ejecutarlo como un script independiente sin tener que volver a crear las imágenes. SageMaker La IA procesa tu imagen de entrenamiento mediante un script de punto de entrada de un contenedor Docker.

En esta sección se muestra cómo usar un punto de entrada personalizado sin usar el kit de heramientas de entrenamiento. Si quieres usar un punto de entrada personalizado pero no estás familiarizado con la configuración manual de un contenedor de Docker, te recomendamos que utilices en su lugar la biblioteca del kit de herramientas de formación. SageMaker Para más información sobre cómo utilizar el Training Toolkit, consulte Adaptación del contenedor de entrenamiento propio.

De forma predeterminada, SageMaker AI busca un script llamado train dentro de tu contenedor. También puedes proporcionar manualmente tu propio punto de entrada personalizado mediante los ContainerEntrypoint parámetros ContainerArguments y de la AlgorithmSpecificationAPI.

Dispone de las dos opciones siguientes para configurar manualmente el contenedor de Docker para ejecutar la imagen.

  • Usa la CreateTrainingJobAPI y un contenedor de Docker que contenga una instrucción de punto de entrada.

  • Use la API CreateTrainingJob y transfiera su script de entrenamiento desde fuera de su contenedor de Docker.

Si pasa el script de entrenamiento desde fuera del contenedor de Docker, no tendrá que volver a crear el contenedor de Docker al actualizar el script. También puede usar varios scripts diferentes para que se ejecuten en el mismo contenedor.

El script de punto de entrada debe contener un código de entrenamiento para la imagen. Si utiliza el parámetro source_dir opcional dentro de un estimador, debería hacer referencia a la ruta relativa de Amazon S3 a la carpeta que contiene el script de punto de entrada. Puede hacer referencia a varios archivos mediante el parámetro source_dir. Si no usa source_dir, puede especificar el punto de entrada mediante el parámetro entry_point. Para ver un ejemplo de un script de punto de entrada personalizado que contiene un estimador, consulte Bring Your Own Model with AI Script Mode. SageMaker

SageMaker El entrenamiento de modelos de IA admite depósitos de directorio S3 Express One Zone de alto rendimiento como ubicación de entrada de datos para el modo archivo, el modo rápido y el modo canalizado. También puede utilizar buckets de directorio de S3 Express One Zone para almacenar su salida de entrenamiento. Para usar S3 Express One Zone, proporcione el URI de un bucket de directorio de S3 Express One Zone en lugar de un bucket de uso general de Amazon S3. Solo puede cifrar los datos de salida de SageMaker IA en depósitos de directorio con cifrado del lado del servidor con claves administradas de Amazon S3 (SSE-S3). Actualmente, no se admite el cifrado con AWS KMS claves del lado del servidor (SSE-KMS) para almacenar los datos de salida de la IA en depósitos de directorio. SageMaker Para obtener más información, consulte S3 Express One Zone.

Ejecute un trabajo de entrenamiento con un script de punto de entrada agrupado en el contenedor de Docker

SageMaker La IA puede ejecutar un script de punto de entrada incluido en el contenedor de Docker.

  • De forma predeterminada, Amazon SageMaker AI ejecuta el siguiente contenedor.

    docker run image train
  • SageMaker AI anula cualquier sentencia CMD predeterminada en un contenedor especificando el train argumento después del nombre de la imagen. En su contenedor de Dockerfile, use el formulario exec siguiente de la instrucción ENTRYPOINT.

    ENTRYPOINT ["executable", "param1", "param2", ...]

    En el siguiente ejemplo se muestra cómo especificar una instrucción de punto de entrada de Python llamada k-means-algorithm.py.

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    La forma exec de la instrucción ENTRYPOINT inicia el archivo ejecutable directamente, no como un elemento secundario de /bin/sh. Esto le permite recibir señales como SIGTERM y SIGKILL desde. SageMaker APIs Se aplican las siguientes condiciones al utilizar el SageMaker APIs.

    • La CreateTrainingJobAPI tiene una condición de parada que indica a la SageMaker IA que detenga el entrenamiento del modelo después de un tiempo específico.

    • A continuación se muestra la API StopTrainingJob. Esta API emite el equivalente de docker stop, con un comando de 2 minutos de tiempo de espera que detiene correctamente el contenedor especificado.

      docker stop -t 120

      El comando intenta detener el contenedor en ejecución enviando una señal SIGTERM. Tras el tiempo de espera de 2 minutos, la API envía los SIGKILL y detiene por la fuerza los contenedores. Si el contenedor gestiona SIGTERM correctamente y sale antes de los 120 segundos de haberla recibido, no se envía ningún SIGKILL.

    Si quieres acceder a los artefactos del modelo intermedio después de que la SageMaker IA detenga el entrenamiento, añade código para guardar los artefactos en tu SIGTERM controlador.

  • Si tiene previsto utilizar dispositivos de GPU para la capacitación de modelos, asegúrese de que sus contenedores sean compatibles con nvidia-docker. Incluya solo el kit de herramientas de CUDA en los contenedores; no agrupe los controladores de NVIDIA con la imagen. Para obtener más información sobre nvidia-docker, consulte NVIDIA/nvidia-docker.

  • No puedes usar el tini inicializador como script de punto de entrada en los contenedores de SageMaker IA porque se confunde con los argumentos y. train serve

  • /opt/mly todos los subdirectorios están reservados por entrenamiento. SageMaker Al crear la imagen de Docker de su algoritmo, asegúrese de no colocar ningún dato que requiera su algoritmo en este directorio. Porque si lo hace, es posible que los datos ya no estén visibles durante el entrenamiento.

Para agrupar sus scripts de shell o Python dentro de su imagen de Docker, o para proporcionar el script en un bucket de Amazon S3 o mediante la AWS Command Line Interface (CLI), continúe con la siguiente sección.

Agrupe su script de intérprete de comandos en un contenedor de Docker

Si quiere incluir un script de intérprete de comandos personalizado dentro de su imagen de Docker, siga estos pasos.

  1. Copie el script de intérprete de comandos de su directorio de trabajo dentro de su contenedor de Docker. El siguiente fragmento de código copia un script de punto de entrada personalizado custom_entrypoint.sh del directorio de trabajo actual a un contenedor de Docker ubicado en mydir. En el siguiente ejemplo se presupone que la imagen de Docker base tiene Python instalado.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.sh /mydir/
  2. Cree e inserte un contenedor de Docker en el registro de Amazon Elastic Container Registry (Amazon ECR) siguiendo las instrucciones que se indican en Inserción de una imagen de Dockerr en la Guía del usuario de Amazon ECR.

  3. Ejecute el siguiente AWS CLI comando para iniciar el trabajo de formación.

    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}'

Agrupe su script de Python en un contenedor de Docker

Para agrupar un script de Python personalizado dentro de su imagen de Docker, siga estos pasos.

  1. Copie el script de Python de su directorio de trabajo dentro de su contenedor de Docker. El siguiente fragmento de código copia un script de punto de entrada personalizado custom_entrypoint.py del directorio de trabajo actual a un contenedor de Docker ubicado en mydir.

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.py /mydir/
  2. Ejecute el AWS CLI comando siguiente para iniciar el trabajo de formación.

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

Ejecute un trabajo de entrenamiento con un script de punto de entrada fuera del contenedor de Docker

Puede usar su propio contenedor de Docker para el entrenamiento y pasar un script de punto de entrada desde fuera del contenedor de Docker. Estructurar el script de punto de entrada fuera del contenedor tiene algunas ventajas. Si actualiza el script de punto de entrada, no es necesario volver a crear el contenedor de Docker. También puede usar varios scripts diferentes para que se ejecuten en el mismo contenedor.

Especifique la ubicación del guion de entrenamiento mediante los ContainerArguments parámetros ContainerEntrypoint y de la AlgorithmSpecificationAPI. Estos puntos de entrada y argumentos se comportan de la misma manera que los puntos de entrada y los argumentos de Docker. Los valores de estos parámetros anulan los correspondientes ENTRYPOINT o CMD proporcionados como parte del contenedor de Docker.

Cuando pasa su script de punto de entrada personalizado a su contenedor de entrenamiento de Docker, las entradas que proporcione determinan el comportamiento del contenedor.

  • Por ejemplo, si solo lo proporcionaContainerEntrypoint, la sintaxis de la solicitud mediante la CreateTrainingJob API es la siguiente.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    Luego, el backend SageMaker de entrenamiento ejecuta tu punto de entrada personalizado de la siguiente manera.

    docker run --entrypoint <ContainerEntrypoint> image
    nota

    Si ContainerEntrypoint se proporciona, el backend de SageMaker entrenamiento ejecuta la imagen con el punto de entrada indicado y anula el valor predeterminado de la imagen. ENTRYPOINT

  • Si solo lo proporcionaContainerArguments, SageMaker AI asume que el contenedor de Docker contiene un script de punto de entrada. La sintaxis de la solicitud mediante la API CreateTrainingJob es la siguiente.

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    El backend SageMaker de entrenamiento ejecuta tu punto de entrada personalizado de la siguiente manera.

    docker run image <ContainerArguments>
  • Si proporciona ContainerEntrypoint y ContainerArguments, la sintaxis de la solicitud mediante la API CreateTrainingJob es la siguiente.

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    El backend SageMaker de entrenamiento ejecuta tu punto de entrada personalizado de la siguiente manera.

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

Puede usar cualquier fuente de InputDataConfig compatible en la API CreateTrainingJob para proporcionar un script de punto de entrada para ejecutar su imagen de entrenamiento.

Proporcionar el script de punto de entrada en un bucket de Amazon S3

Para proporcionar un script de punto de entrada personalizado mediante un bucket de S3, utilice el S3DataSource parámetro de la DataSourceAPI para especificar la ubicación del script. Si utiliza el parámetro S3DataSource, se requiere lo siguiente.

En el siguiente ejemplo, se coloca un script denominado custom_entrypoint.sh en una ruta a un bucket de S3 s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh.

#!/bin/bash echo "Running custom_entrypoint.sh" echo "Hello you have provided the following arguments: " "$@"

A continuación, debe establecer la configuración del canal de datos de entrada para ejecutar un trabajo de entrenamiento. Puede hacerlo AWS CLI directamente o con un archivo JSON.

Configure el canal de datos de entrada utilizando AWS CLI un archivo JSON

Para configurar el canal de datos de entrada con un archivo JSON, AWS CLI utilícelo como se muestra en la siguiente estructura de código. Asegúrese de que todos los campos siguientes utilicen la sintaxis de solicitud definida en la 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", }, ...] }

A continuación, ejecute el AWS CLI comando para iniciar el trabajo de formación desde el archivo JSON de la siguiente manera.

aws sagemaker create-training-job --cli-input-json file://run-my-training-job.json

Configure el canal de datos de entrada utilizando AWS CLI directamente

Para configurar el canal de datos de entrada sin un archivo JSON, utilice la siguiente estructura AWS CLI de código.

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}'