Adaptación del contenedor de entrenamiento propio
Para ejecutar su propio modelo de entrenamiento, cree un contenedor de Docker con el Amazon SageMaker Training Toolk
Paso 1: Crear una instancia de cuaderno de SageMaker
Abra la consola de Amazon SageMaker AI en https://console.aws.amazon.com/sagemaker/
. -
En el panel de navegación, elija Notebook Cuaderno), seleccione Notebook instances (Instancias de cuaderno) y, a continuación, seleccione Create notebook instance (Crear instancia de cuaderno).
-
En la página Crear instancia de bloc de notas, proporcione la siguiente información:
-
En Notebook instance name (Nombre de instancia del bloc de notas), escriba
RunScriptNotebookInstance. -
En Tipo de instancia de bloc de notas, elija
ml.t2.medium. -
En la sección Permissions and encryption (Permisos y cifrado), haga lo siguiente:
-
En Rol de IAM, elija Crear un nuevo rol. Se abre una nueva ventana.
-
En la página Create an IAM role (Crear un rol de IAM), elija Buckets de S3 específicos, especifique un bucket de Amazon S3 denominado
sagemaker-run-scripty, a continuación, elija Create role (Crear rol).SageMaker AI crea un rol de IAM denominado
AmazonSageMaker-ExecutionRole-. Por ejemplo,YYYYMMDDTHHmmSSAmazonSageMaker-ExecutionRole-20190429T110788. Tenga en cuenta que la convención de nomenclatura de rol de ejecución utiliza la fecha y la hora en que se creó el rol, separadas por unaT.
-
-
En Root Access (Acceso raíz), elija Enable (Habilitar).
-
Elija Crear instancia de bloc de notas.
-
-
En la página Notebook instances (Instancias de cuaderno), Status (Estado) es Pemnding (Pendiente). Amazon SageMaker AI puede tardar unos minutos en lanzar una instancia de computación de machine learning, en este caso, una instancia de cuaderno, y asociarle un volumen de almacenamiento de machine learning. La instancia de cuaderno cuenta con un servidor de cuaderno de Jupyter configurado previamente y un conjunto de bibliotecas de Anaconda. Para obtener más información, consulte Crear una instancia de cuaderno.
-
Haga clic en el Name (Nombre) del cuaderno que acaba de crear. Se abre una nueva página.
-
En la sección Permissions and encryption (Permisos y cifrado), copie el número de ARN del rol de IAM y péguelo en un archivo de cuaderno para guardarlo temporalmente. Este número ARN del rol de IAM se utiliza más adelante para configurar un estimador de entrenamiento local en la instancia del cuaderno. El número de ARN de rol de IAM tiene el siguiente aspecto:
'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'. -
Cuando el estado de la instancia del cuaderno cambie a InService, seleccione Open JupyterLab (Abrir JupyterLab).
Paso 2: Crear y cargar scripts de entrenamiento de Dockerfile y Python
-
Cuando se abra JupyterLab, cree una nueva carpeta en el directorio principal de su JupyterLab. En la esquina superior izquierda, elija el icono de nueva carpeta y, a continuación, escriba el nombre de la carpeta
docker_test_folder. -
Cree un archivo de texto
Dockerfileen el directoriodocker_test_folder.-
Seleccione el icono del nuevo lanzador (+) en la esquina superior izquierda.
-
En el panel derecho, en la sección Other (Otro), seleccione Text file (Archivo de texto).
-
Pegue el siguiente código de ejemplo
Dockerfileen el archivo de texto.#Download an open source TensorFlow Docker image FROM tensorflow/tensorflow:latest-gpu-jupyter # Install sagemaker-training toolkit that contains the common functionality necessary to create a container compatible with SageMaker AI and the Python SDK. RUN pip3 install sagemaker-training # Copies the training code inside the container COPY train.py /opt/ml/code/train.py # Defines train.py as script entrypoint ENV SAGEMAKER_PROGRAM train.pyEl script Dockerfile realiza las siguientes tareas:
-
FROM tensorflow/tensorflow:latest-gpu-jupyter: descarga la imagen base más reciente de Docker de TensorFlow. Puede sustituirla por cualquier imagen base de Docker que desee utilizar para crear contenedores, así como por imágenes base de contenedores precompilados de AWS. -
RUN pip install sagemaker-training: instala SageMaker AI Training Toolkit, que contiene la funcionalidad común necesaria para crear un contenedor compatible con SageMaker AI. -
COPY train.py /opt/ml/code/train.py: copia el script en la ubicación dentro del contenedor que espera SageMaker AI. El script debe estar ubicado en esta carpeta. -
ENV SAGEMAKER_PROGRAM train.py— Toma el script de entrenamientotrain.pycomo script de punto de entrada copiado en la carpeta/opt/ml/codedel contenedor. Esta es la única variable de entorno que debe especificar cuando crea su propio contenedor.
-
-
En la navegación del directorio izquierdo, el nombre del archivo de texto se establece automáticamente como
untitled.txt. Para cambiar el nombre del archivo, haga clic con el botón derecho en el archivo, seleccione Rename (Cambiar nombre), cámbiele el nombre aDockerfilesin la extensión.txty, a continuación, pulseCtrl+soCommand+spara guardar el archivo.
-
-
Cargue un script de entrenamiento
train.pyen ladocker_test_folder. Para este ejercicio, puede usar el siguiente script de ejemplo para crear un modelo que lea dígitos manuscritos entrenados en el conjunto de datos MNIST. import tensorflow as tf import os mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1) model_save_dir = f"{os.environ.get('SM_MODEL_DIR')}/1" model.evaluate(x_test, y_test) tf.saved_model.save(model, model_save_dir)
Paso 3: Compilar el contenedor
-
En el directorio principal de JupyterLab, abra un cuaderno de Jupyter. Para abrir un cuaderno nuevo, seleccione el icono de nuevo lanzamiento y, a continuación, seleccione la última versión de conda_tensorflow2 en la sección Notebook (Cuaderno).
-
Ejecute el siguiente comando en la primera celda del cuaderno para cambiar al directorio
docker_test_folder:cd ~/SageMaker/docker_test_folderEsto devuelve su directorio actual como se indica a continuación:
! pwdoutput: /home/ec2-user/SageMaker/docker_test_folder -
Para crear el contenedor de Docker, ejecute el siguiente comando de compilación de Docker, incluyendo el espacio seguido del punto final:
! docker build -t tf-custom-container-test .El comando de compilación de Docker debe ejecutarse desde el directorio creado, en este caso
docker_test_folder.nota
Si aparece el siguiente mensaje de error que indica que Docker no puede encontrar el Dockerfile, asegúrese de que el Dockerfile tenga el nombre correcto y se haya guardado en el directorio.
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directoryRecuerde que
dockerbusca un archivo llamado específicamenteDockerfilesin ninguna extensión en el directorio actual. Si lo nombró de otra manera, puede pasar el nombre de archivo manualmente con la marca-f. Por ejemplo, si asignó el nombreDockerfile-text.txta su Dockerfile, ejecute el siguiente comando:! docker build -t tf-custom-container-test -f Dockerfile-text.txt .
Paso 4: Probar el contenedor
-
Para probar el contenedor localmente en la instancia de cuaderno, abra un cuaderno de Jupyter. Seleccione el icono de nuevo lanzamiento y, a continuación, seleccione la última versión de conda_tensorflow2 en la sección Notebook (Cuaderno).
-
Pegue el script de ejemplo siguiente en la celda de código de cuaderno para configurar un estimador de SageMaker AI.
import sagemaker from sagemaker.estimator import Estimator estimator = Estimator(image_uri='tf-custom-container-test', role=sagemaker.get_execution_role(), instance_count=1, instance_type='local') estimator.fit()En el ejemplo de código anterior,
sagemaker.get_execution_role()se especifica en el argumentorolepara recuperar automáticamente el rol configurado para la sesión de SageMaker AI. También puede sustituirlo por el valor de cadena del número de ARN del rol de IAM que utilizó al configurar la instancia de cuaderno. El ARN debería tener el aspecto siguiente:'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'. -
Ejecute la celda de código. Esta prueba devuelve la configuración del entorno de capacitación, los valores utilizados en las variables de entorno, el origen de los datos y la pérdida y precisión obtenidas durante la capacitación.
Paso 5: Insertar el contenedor en Amazon Elastic Container Registry (Amazon ECR)
-
Después de ejecutar correctamente la prueba de modo local, puede insertar el contenedor de Docker en Amazon ECR para utilizarlo para ejecutar trabajos de entrenamiento. Si desea utilizar un registro privado de Docker en lugar de Amazon ECR, consulte Insertar un contenedor de entrenamiento en un registro privado.
Puede ejecutar manualmente comandos de Git como los siguientes en una celda del cuaderno.
%%sh # Specify an algorithm name algorithm_name=tf-custom-container-testaccount=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly aws ecr get-login-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}nota
Este script de intérprete de comandos bash puede provocar un problema de permisos similar al siguiente mensaje de error:
"denied: User: [ARN] is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:[id]:repository/tf-custom-container-test"Si se produce este error, debe asociar la política AmazonEC2ContainerRegistryFullAccess a su rol de IAM. Vaya a la consola de IAM
, seleccione Roles en el panel de navegación izquierdo y busque el IAMrole usado para la instancia de cuaderno. En la pestaña Permission (Permiso), pulse el botón Attach policies (Asociar políticas) y busque la política AmazonEC2ContainerRegistryFullAccess. marque la casilla de verificación de la política y, a continuación, elija Add permissions (Añadir permisos) para finalizar. -
Ejecute el siguiente código en una celda de un cuaderno de Studio para llamar a la imagen de Amazon ECR de su contenedor de entrenamiento.
import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'tf-custom-container-test' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) byoc_image_uri # This should return something like # 111122223333.dkr.ecr.us-east-2.amazonaws.com/sagemaker-byoc-test:latest -
Utilice la
ecr_imagerecuperada en el paso anterior para configurar un objeto de estimador de SageMaker AI. El siguiente ejemplo de código configura un estimador de SageMaker AI con elbyoc_image_urie inicia un trabajo de entrenamiento en una instancia de Amazon EC2. -
Si desea implementar el modelo con su propio contenedor, consulte Adaptación del contenedor de inferencias propio. También puedes usar un contenedor de marco AWS que pueda implementar un modelo de TensorFlow. Para implementar el modelo de ejemplo para leer dígitos escritos a mano, introduzca el siguiente script de ejemplo en el mismo cuaderno usado para entrenar el modelo en el subpaso anterior para obtener los URI (identificadores universales de recursos) de imagen necesarios para la implementación e implemente el modelo.
import boto3 import sagemaker #obtain image uris from sagemaker import image_uris container = image_uris.retrieve(framework='tensorflow',region='us-west-2',version='2.11.0', image_scope='inference',instance_type='ml.g4dn.xlarge') #create the model entity, endpoint configuration and endpoint predictor = estimator.deploy(1,instance_type='ml.g4dn.xlarge',image_uri=container)Pruebe el modelo con un ejemplo de dígito manuscrito del conjunto de datos MNIST mediante el siguiente ejemplo de código.
#Retrieve an example test dataset to test import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist # Load the MNIST dataset and split it into training and testing sets (x_train, y_train), (x_test, y_test) = mnist.load_data() # Select a random example from the training set example_index = np.random.randint(0, x_train.shape[0]) example_image = x_train[example_index] example_label = y_train[example_index] # Print the label and show the image print(f"Label: {example_label}") plt.imshow(example_image, cmap='gray') plt.show()Convierta el dígito escrito a mano de la prueba en un formato que TensorFlow pueda asimilar y hacer una predicción de prueba.
from sagemaker.serializers import JSONSerializer data = {"instances": example_image.tolist()} predictor.serializer=JSONSerializer() #update the predictor to use the JSONSerializer predictor.predict(data) #make the prediction
Para ver un ejemplo completo que muestra cómo probar un contenedor personalizado localmente y enviarlo a una imagen de Amazon ECR, consulte el cuaderno de ejemplo Building Your Own TensorFlow Container
sugerencia
Para perfilar y depurar los trabajos de entrenamiento a fin de supervisar los problemas de uso del sistema (como los cuellos de botella de la CPU y la infrautilización de la GPU) e identificar los problemas de entrenamiento (como el sobreajuste, el sobreentrenamiento, la explosión de los tensores y la desaparición de los gradientes), utilice Depurador de Amazon SageMaker. Para obtener más información, consulte Uso del depurador con contenedores de entrenamiento personalizados.
Paso 6: Eliminar recursos
Para limpiar los recursos una vez que haya terminado con el ejemplo de inicio
-
Abra la consola de SageMaker AI
, seleccione la instancia de cuaderno RunScriptNotebookInstance, elija Acciones y elija Detener. Puede que transcurran unos minutos hasta que la instancia se detenga. -
Cuando State (Estado) de la instancia cambie a Stopped (Detenida), elija Actions (Acciones), elija Delete (Eliminar) y, a continuación, elija Delete (Eliminar) en el cuadro de diálogo. Puede que transcurran unos minutos hasta que la instancia se elimine. La instancia del cuaderno desaparece de la tabla cuando se elimina.
-
Abra la consola de Amazon S3
y elimine el bucket que creó para almacenar los artefactos del modelo y los conjuntos de datos de entrenamiento. -
Abra la consola de IAM
y elimine el rol de IAM. Si ha creado políticas de permisos, puede eliminarlas también. nota
El contenedor de Docker se cierra automáticamente después de que se haya ejecutado. No es necesario eliminarlo.
Blogs y casos prácticos
En los siguientes blogs se analizan casos prácticos sobre el uso de contenedores de entrenamiento personalizados en Amazon SageMaker AI.
-
Why bring your own container to Amazon SageMaker AI and how to do it right
, Medium (20 de enero de 2023)