Cómo SageMaker gestiona Amazon tu imagen de entrenamiento - 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.

Cómo SageMaker gestiona Amazon 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 pasas el script de punto de entrada a tu contenedor de Docker, también puedes ejecutarlo como un script independiente sin tener que volver a crear las imágenes. SageMakerprocesa la 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 desea utilizar un punto de entrada personalizado pero no sabe cómo configurar manualmente un contenedor de Docker, le recomendamos que utilice 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 busca un script llamado train dentro de su contenedor. También puede proporcionar manualmente su propio punto de entrada personalizado utilizando los ContainerEntrypoint parámetros ContainerArguments y del. AlgorithmSpecificationAPI

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

  • Utilice el contenedor CreateTrainingJobAPIy un contenedor Docker con una instrucción de punto de entrada incluida en su interior.

  • Usa el CreateTrainingJob API script de entrenamiento y pásalo desde fuera de tu 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 Script Mode. SageMaker

SageMaker El entrenamiento de modelos 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 de archivo rápido y el modo canalizado. También puedes usar los depósitos de directorio de S3 Express One Zone para almacenar los resultados de tu entrenamiento. Para usar S3 Express One Zone, proporcione un bucket URI de directorio S3 Express One Zone en lugar de un bucket de uso general de Amazon S3. Solo puede cifrar los datos de SageMaker salida en depósitos de directorio con cifrado del lado del servidor con claves gestionadas por Amazon S3 (-S3). SSE Actualmente, no se admite el cifrado del lado del servidor con AWS KMS claves (SSE-KMS) para almacenar los datos de salida 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 puede ejecutar un script de punto de entrada incluido en su contenedor de Docker.

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

    docker run image train
  • SageMaker anula cualquier sentencia predeterminada CMDen 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.

    • CreateTrainingJobAPITiene una condición de parada que indica que se SageMaker interrumpe el entrenamiento del modelo después de un tiempo específico.

    • A continuación se muestra el StopTrainingJobAPI. Esto API emite el equivalente aldocker stop, con un comando de tiempo de espera de 2 minutos para detener correctamente el contenedor especificado.

      docker stop -t 120

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

    Si desea acceder a los artefactos del modelo intermedio después de SageMaker detener el entrenamiento, añada código para guardar los artefactos en su controlador. SIGTERM

  • Si planea usar GPU dispositivos para el entrenamiento de modelos, asegúrese de que sus contenedores sean nvidia-docker compatibles. Incluya únicamente el CUDA kit de herramientas en los contenedores; no incluya los NVIDIA controladores con la imagen. Para obtener más información al respectonvidia-docker, consulte NVIDIA/nvidia-docker.

  • No puedes usar el tini inicializador como script de punto de entrada en SageMaker los contenedores porque los argumentos y lo confunden. 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 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 Amazon Elastic Container Registry (Amazon ECR) siguiendo las instrucciones que se encuentran en Insertar una imagen de Docker en la Guía ECRdel usuario de Amazon.

  3. Ejecute el siguiente AWS CLI comando para iniciar el trabajo de entrenamiento.

    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 del 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 solicitud que utiliza CreateTrainingJob API es la siguiente.

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

    A continuación, el backend de SageMaker 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 asume que el contenedor de Docker contiene un script de punto de entrada. La sintaxis de solicitud que utiliza el CreateTrainingJob API es la siguiente.

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

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

    docker run image <ContainerArguments>
  • Si proporciona ambos caracteresContainerArguments, la ContainerEntrypoint sintaxis de la solicitud que utiliza CreateTrainingJob API es la siguiente.

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

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

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

Puedes usar cualquier InputDataConfig fuente compatible en el CreateTrainingJob API para proporcionar un script de punto de entrada para ejecutar tu 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 DataSourceAPIpara 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. Para ello, utilice el AWS CLI directamente o con un JSON archivo.

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

Para configurar el canal de datos de entrada con un JSON archivo, utilícelo AWS CLI 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 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 JSON archivo 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 JSON archivo, 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}'