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
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 estimadorsource_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
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 CMD
en un contenedor especificando el train
argumento después del nombre de la imagen. En su contenedor de Dockerfile, use el formularioexec
siguiente de la instrucciónENTRYPOINT
.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ónENTRYPOINT
inicia el archivo ejecutable directamente, no como un elemento secundario de/bin/sh
. Esto le permite recibir señales comoSIGTERM
ySIGKILL
desde SageMaker APIs. Se aplican las siguientes condiciones al utilizar el SageMaker APIs.-
CreateTrainingJob
APITiene 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
StopTrainingJob
API. 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 contenedoresSIGKILL
y los detiene por la fuerza. Si el contenedor gestionaSIGTERM
correctamente y sale antes de los 120 segundos de haberla recibido, no se envía ningúnSIGKILL
.
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/ml
y 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.
-
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 enmydir
. 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/
-
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.
-
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.
-
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 enmydir
.FROM
<base-docker-image>
:<tag>
# Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.py /mydir/
-
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 proporciona
ContainerEntrypoint
, 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>
imagenota
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 proporciona
ContainerArguments
, SageMaker asume que el contenedor de Docker contiene un script de punto de entrada. La sintaxis de solicitud que utiliza elCreateTrainingJob
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 caracteres
ContainerArguments
, laContainerEntrypoint
sintaxis de la solicitud que utilizaCreateTrainingJob
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.
-
InputModeDebe ser de ese tipo.
File
-
El S3 DataDistributionType debe serlo
FullyReplicated
.
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
}'