Blog de Amazon Web Services (AWS)

Lleve su propia imagen de contenedor personalizada a los notebooks de Amazon SageMaker Studio

Por Stefan Natu, Huong Nguyen y Jaipreet Singh

 

Amazon SageMaker Studio es el primer entorno de desarrollo (IDE) totalmente integrado para aprendizaje automático (ML). SageMaker Studio permite a los científicos de datos utilizar notebooks  Studio para explorar datos, crear modelos, lanzar trabajos de entrenamiento de Amazon SageMaker e implementar endpoints alojados. Los notebooks  Studio vienen con un conjunto de imágenes precompiladas, que consisten en el SDK de Python de Amazon SageMaker y la última versión del tiempo de ejecución o kernel de IPython. Con esta nueva función, puede llevar sus propias imágenes personalizadas a los notebooks  de Amazon SageMaker. Estas imágenes estarán disponibles para todos los usuarios autenticados en el dominio. En esta publicación, compartimos cómo llevar una imagen de contenedor personalizada a los notebooks  de SageMaker Studio.

Los desarrolladores y científicos de datos pueden requerir imágenes personalizadas para varios casos de uso diferentes:

  • Acceso a versiones específicas o más recientes de framerworks de ML populares como TensorFlow, MxNet, PyTorch u otros.
  • Lleve código personalizado o algoritmos desarrollados localmente a los notebooks  de Studio para una rápida iteración y entrenamiento de modelos.
  • El acceso a los lagos de datos o almacenes de datos locales a través de API, y los administradores deben incluir los controladores correspondientes dentro de la imagen.
  • Acceso a un motor de ejecución de back-end, también llamado kernel, que no sea IPython como R, Julia u otros. También puede utilizar el enfoque descrito en esta publicación para instalar un kernel personalizado.

En las grandes empresas, los administradores de plataformas ML a menudo necesitan asegurarse de que los paquetes y códigos de terceros sean aprobados previamente por los equipos de seguridad para su uso y no se descarguen directamente de Internet. Un flujo de trabajo común puede ser que el equipo de ML Platform apruebe un conjunto de paquetes y framerworks para su uso, construya un contenedor personalizado utilizando estos paquetes, pruebe el contenedor en busca de vulnerabilidades e inserte la imagen aprobada en un registro de contenedor privado como Amazon Elastic Container Registry ( ECR Amazon). Ahora, los equipos de la plataforma ML pueden adjuntar directamente imágenes aprobadas al dominio de Studio (consulte el siguiente diagrama de flujo de trabajo). Simplemente puede seleccionar la imagen personalizada aprobada de su elección en Studio. A continuación, puede trabajar con la imagen personalizada localmente en el notebook de Studio. Con esta versión, un único dominio de Studio puede contener hasta 30 imágenes personalizadas, con la opción de agregar una nueva versión o eliminar imágenes según sea necesario.

 

 

Ahora explicamos cómo puede traer una imagen de contenedor personalizada a los notebooks  de SageMaker Studio con esta función. Aunque demostramos el enfoque predeterminado a través de Internet, incluimos detalles sobre cómo puede modificarlo para que funcione en una nube privada de Amazon Virtual Private Cloud (Amazon VPC) privada.

 

Requisitos previos

Antes de comenzar, debe asegurarse de cumplir los siguientes requisitos previos:

  • Tener una cuenta de AWS.
  • Asegúrese de que la función de ejecución que utiliza para acceder a Amazon SageMaker tenga los siguientes permisos de AWS Identity and Access Management (IAM), que permiten a SageMaker Studio crear un repositorio en Amazon ECR con el prefijo smstudio. y otorgar permisos para insertar y extraer imágenes de este repositorio. Para utilizar un repositorio existente, reemplace el recurso por el ARN del repositorio. Para crear la imagen contenedor, puede usar un cliente Docker local o crear la imagen directamente desde SageMaker Studio, lo que demostramos aquí. Para crear un repositorio en Amazon ECR, SageMaker Studio utiliza AWS CodeBuildy también debe incluir los permisos CodeBuild que se muestran a continuación.
{

            "Effect": "Allow",

            "Action": [

                "ecr:CreateRepository",

                "ecr:BatchGetImage",

                "ecr:CompleteLayerUpload",

                "ecr:DescribeImages",

                "ecr:DescribeRepositories",

                "ecr:UploadLayerPart",

                "ecr:ListImages",

                "ecr:InitiateLayerUpload",

                "ecr:BatchCheckLayerAvailability",

                "ecr:GetDownloadUrlForLayer",

                "ecr:PutImage"

            ],

            "Resource": "arn:aws:ecr:*:*:repository/smstudio*"

        },

        {

            "Effect": "Allow",

            "Action": "ecr:GetAuthorizationToken",

            "Resource": "*"

           }

{

            "Effect": "Allow",

            "Action": [

                "codebuild:DeleteProject",

                "codebuild:CreateProject",

                "codebuild:BatchGetBuilds",

                "codebuild:StartBuild"

            ],

            "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"

}

{

            "Effect": "Allow",

            "Action": "iam:PassRole",

            "Resource": "arn:aws:iam::*:role/*",

            "Condition": {

                "StringLikeIfExists": {

                    "iam:PassedToService": "codebuild.amazonaws.com"

                }

            }

}

 

{
  "Version": "2012-10-17",

  "Statement": [

    {

      "Effect": "Allow",

      "Principal": {

        "Service": [

          "codebuild.amazonaws.com"

        ]

      },

      "Action": "sts:AssumeRole"

    }

  ]

}

 

Creación de su Dockerfile

Para demostrar la necesidad común de los científicos de datos de experimentar con los framerworks más recientes, utilizamos el siguiente Dockerfile, que utiliza la última versión de TensorFlow 2.3 como imagen base. Puede reemplazar este Dockerfile con un Dockerfile de su elección. Actualmente, SageMaker Studio admite una serie de imágenes base, como Ubuntu, Amazon Linux 2 y otras. Dockerfile instala el tiempo de ejecución de IPython necesario para ejecutar los notebooks  Jupyter e instala el SDK y boto3 de Amazon SageMaker Python.

Además de los notebooks , los científicos de datos y los ingenieros de ML a menudo iteran y experimentan en sus notebooks  locales utilizando varios IDE populares como Visual Studio Code o PyCharm. Puede que desee llevar estos scripts a la nube para la entrenamiento escalable o el procesamiento de datos. Puede incluir estos scripts como parte del contenedor Docker para que estén visibles en su almacenamiento local en SageMaker Studio. En el siguiente Dockerfile, copiamos el script train.py , que es un script base para entrenar un modelo de aprendizaje profundo simple en el conjunto de datos MNIST. Puede reemplazar este script con sus propios scripts o paquetes que contengan su código.

FROM tensorflow/tensorflow:2.3.0

RUN apt-get update

RUN apt-get install -y git

RUN pip install --upgrade pip

RUN pip install ipykernel && \

    python -m ipykernel install --sys-prefix && \

    pip install --quiet --no-cache-dir \

    'boto3>1.0<2.0' \

    'sagemaker>2.0<3.0'

       

COPY train.py /root/train.py #Replace with your own custom scripts or packages

El siguiente código es el script train.py:

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.evaluate(x_test, y_test)

En lugar de un script personalizado, también puede incluir otros archivos, como archivos Python que acceden a secretos de cliente y variables de entorno a través de AWS Secrets Manager o AWS Systems Manager Parameter Store, archivos de configuración para habilitar conexiones con PyPi privado u otras herramientas de administración de paquetes. Aunque puede copiar el script utilizando la imagen personalizada, los comandos ENTRYPOINT o CMD del archivo Dockerfile no se ejecutan.

 

Configuración de la carpeta de instalación

Debe crear una carpeta en su equipo local y agregar los siguientes archivos en esa carpeta:

  • El archivo Dockerfile que creó en el paso anterior
  • Un archivo llamado app-image-config-input.json con el siguiente contenido:
"AppImageConfigName": "custom-tf2",

    "KernelGatewayImageConfig": {

        "KernelSpecs": [

            {

                "Name": "python3",

                "DisplayName": "Python 3"

            }

        ],

        "FileSystemConfig": {

            "MountPath": "/root/data",

            "DefaultUid": 0,

            "DefaultGid": 0

        }

    }

}

Establecemos el núcleo backend para este Dockerfile como un kernel IPython y proporcionamos una ruta de montaje para Amazon Elastic File System (Amazon EFS). Amazon SageMaker reconoce los núcleos definidos por Jupyter. Por ejemplo, para un kernel R, establezca Name en el código anterior en ir. Debe asegurarse de que el Uid, Gid y el nombre del núcleo coinciden con las especificaciones del kernelspecs y la información del usuario en la imagen de Docker. Para extraer estos valores, consulte este documento.

Cree un archivo denominado default-user-settings.json con el siguiente contenido. Si va a agregar varias imágenes personalizadas, sólo tiene que añadir a la lista de imágenes personalizadas.

{

  "DefaultUserSettings": {

    "KernelGatewayAppSettings": {

      "CustomImages": [

          {

                   "ImageName": "tf2kernel",

                   "AppImageConfigName": "custom-tf2"

                }

            ]

        }

    }

}

 

Crear y adjuntar la imagen a su dominio de Studio

Si tiene un dominio existente, simplemente necesita actualizar el dominio con la nueva imagen. En esta sección, demostramos cómo los usuarios existentes de Studio pueden adjuntar imágenes. Para obtener instrucciones sobre cómo incorporar un nuevo usuario, consulte Onboard to Amazon SageMaker Studio Using IAM.

En primer lugar, utilizamos la CLI de compilación de SageMaker Studio Docker para compilar y enviar Dockerfile a Amazon ECR. Tenga en cuenta que puede utilizar otros métodos para enviar contenedores a ECR, como el cliente docker local y la CLI de AWS.

    1. Inicie sesión en Studio con su perfil de usuario.
    2. Cargue su Dockerfile y cualquier otro código o dependencias que desee copiar en su contenedor a su dominio de Studio.
    3. Desplácese hasta la carpeta que contiene el Dockerfile.
    4. En una ventana de terminal o en un Jupyter notebok:
!pip install sagemaker-studio-image-build

5. Exporte una variable llamada IMAGE_NAME y defina el valor especificado en el parámetro

sm-docker build . --repository smstudio-custom:IMAGE_NAME

6. Si desea utilizar un repositorio diferente, reemplace smstudio-custom en el código anterior con su nombre de repositorio.

SageMaker Studio crea la imagen Docker por usted y la envía a Amazon ECR en un repositorio denominado smstudio-custom, etiquetado con el nombre de imagen apropiado. Para personalizarlo aún más, como proporcionar una ruta de archivo detallada u otras opciones, consulte Uso de la CLI de compilación de imágenes de Amazon SageMaker Studio para crear imágenes de contenedor a partir de los notebooks  de Studio. Para que el comando pip anterior funcione en un entorno VPC privado, necesita una ruta a Internet o acceso a este paquete en su repositorio privado.

7. En la carpeta de instalación de versiones anteriores, cree un nuevo archivo llamado create-and-update-image.sh:

ACCOUNT_ID=AWS ACCT ID #Substitua com o ID de sua conta AWS

REGION=us-east-2 #Substitua com sua região

DOMAINID=d-####### #Substitua com o nome do domínio do seu SageMaker Studio

IMAGE_NAME=tf2kernel #Substitua com o nome da sua imagem




# Usando com o SageMaker Studio

## Crie a imagem do SageMaker com a imagem no ECR (modifique o nome da imagem como requerido)

ROLE_ARN='The Execution Role ARN for the execution role you want to use'




aws --region ${REGION} sagemaker create-image \

    --image-name ${IMAGE_NAME} \

    --role-arn ${ROLE_ARN}




aws --region ${REGION} sagemaker create-image-version \

    --image-name ${IMAGE_NAME} \

    --base-image "${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/smstudio-custom:${IMAGE_NAME}"

   

## Crie o AppImageConfig para esta imagem (modifique o AppImageConfigName e KernelSpecs no app-image-config-input.json conforme necessário)

aws --region ${REGION} sagemaker create-app-image-config --cli-input-json file://app-image-config-input.json




## Atualize o domínio, provendo a imagem e AppImageConfig

aws --region ${REGION} sagemaker update-domain --domain-id ${DOMAINID} --cli-input-json file://default-user-settings.json


Consulte la CLI de AWS para obtener más información sobre los argumentos que puede pasar a la API create-image . Para comprobar el estado, vaya a la consola de Amazon SageMaker y elija Amazon SageMaker Studio en el panel de navegación.

 

Adjuntar imágenes mediante la interfaz de usuario de Studio

También puede realizar el paso final de adjuntar la imagen al dominio de Studio a través de la interfaz de usuario. En este caso, la interfaz de usuario se encargará de crear la imagen y la versión de la imagen, y actualizar el dominio con la imagen adjunta.

  1. En la consola de Amazon SageMaker, elija Amazon SageMaker Studio.

En la página Panel de control , puede ver que se ha aprovisionado el dominio de Studio, junto con los perfiles de usuario que haya creado.

  1. Elija Adjuntar imagen.

 

 

3. Seleccione si desea adjuntar una imagen nueva o preexistente.

a. Si selecciona Imagen existente, elija una imagen en el almacén de imágenes de Amazon SageMaker.

b. Si selecciona Nueva imagen, proporcione la ruta de registro de Amazon ECR para la imagen de Docker. La ruta debe estar en la misma región que el dominio del estudio. El repositorio de ECR también debe estar en la misma cuenta que su dominio de Studio o los permisos entre cuentas para Studio deben estar habilitados.

4. Elija Siguiente.

 

 

5. En Nombre de imagen, escriba un nombre.

6. En Nombre para mostrar imagen, escriba un nombre descriptivo.

7. En Descripción, introduzca una definición de etiqueta.

8. Para el rol de IAM, elija el rol de IAM requerido por Amazon SageMaker para adjuntar imágenes de Amazon ECR a las imágenes de Amazon SageMaker en su nombre.

9. Además, puede etiquetar su imagen.

10. Elija Siguiente.

 

 

11. Para Nombre del núcleo , escriba Python 3.

12. Seleccione Enviar.

 

 

La casilla verde indica que la imagen se ha adjuntado correctamente al dominio.

 

 

El almacén de imágenes de Amazon SageMaker actualiza automáticamente las imágenes. Puede seleccionar una imagen preconectada y elegir Desenlazar para separar la imagen y todas las versiones, o bien seleccionar Adjuntar imagen para adjuntar una nueva versión. No hay límite para el número de versiones por imagen o la capacidad de separar imágenes.

 

Experiencia del usuario con una imagen personalizada

Ahora vamos a entrar en la experiencia de usuario de un usuario de Studio.

  1. Inicie sesión en Studio con su perfil de usuario.
  2. Para iniciar una nueva actividad, elija Launcher.
  3. Para Seleccionar una imagen de SageMaker para iniciar su actividad, elija tf2kernel

 

 

4. Elija el icono Notebok para abrir un nuevo Jupyter notebok con el núcleo personalizado.

¡El núcleo del notebook tarda un par de minutos en girar y ya está listo!

 

Prueba de su contenedor personalizado en el notebook

Cuando el kernel está en funcionamiento, puede ejecutar código en el Jupyter notebok. Primero, probemos que la versión correcta de TensorFlow que se especificó en Dockerfile está disponible para su uso. En la siguiente captura de pantalla, podemos ver que el notebok está usando el tf2kernel que acabamos de lanzar.

 

 

Los notebooks  de Amazon SageMaker también muestran el uso local de la CPU y la memoria.

A continuación, probemos el script de entrenamiento personalizado directamente en el notebok. Copie el script de entrenamiento en una celda de notebook y ejecútelo. El script descarga el dataset mnist de la utilidad tf.keras.datasets , divide los datos en conjuntos de entrenamiento y prueba, define un algoritmo de red neuronal profunda personalizado, entrena el algoritmo en los datos de entrenamiento y prueba el algoritmo en el conjunto de datos de prueba.

 

 

Para experimentar con el marco TensorFlow 2.3, es posible que desee probar las API recién lanzadas, como las utilidades de preprocesamiento de funciones más recientes en Keras. En la siguiente captura de pantalla, importamos la biblioteca keras.layers.experimental lanzada con TensorFlow 2.3, que contiene API más recientes para el preprocesamiento de datos. Cargamos una de estas API y volvemos a ejecutar el script en el notebook.

 

 

Amazon SageMaker también modifica dinámicamente el uso de la CPU y la memoria a medida que se ejecuta el código. Al incorporar su contenedor personalizado y guiones de entrenamiento, esta función le permite experimentar con guiones y algoritmos de entrenamiento personalizados directamente en el notebok de Amazon SageMaker. Cuando esté satisfecho con la experimentación en el notebook de Studio, puede comenzar un trabajo de entrenamiento.

¿Qué pasa con los archivos Python o los archivos personalizados que incluyó con Dockerfile usando el comando COPY? SageMaker Studio monta el sistema de archivos elástico en la ruta de archivo proporcionada en app-image-config-input.json, que configuramos en root/data. Para evitar que Studio sobrescribe los archivos personalizados que desee incluir, el comando COPY carga el archivo train.py en la ruta /root. Para acceder a este archivo, abra un terminal o Jupyter notebok y ejecute el código:

! cat /root/train.py

Debería ver una salida como se muestra en la captura de pantalla a continuación.

 

 

El archivo train.py se encuentra en la ubicación especificada.

 

Iniciar sesión en CloudWatch

SageMaker Studio también publica métricas del kernel en Amazon CloudWatch, que puede utilizar para solucionar problemas. Las métricas se capturan bajo el espacio de nombres /aws/sagemaker/studio .

Para acceder a los registros, en la consola de CloudWatch, elija Registros de CloudWatch. En la página Grupos de registro , introduzca el espacio de nombres para ver los registros asociados con el servidor Jupyter y la puerta de enlace del núcleo.

 

 

Desconexión de una imagen o versión

Puede separar una imagen o una versión de imagen del dominio si ya no es compatible.

Para desenlazar una imagen y todas las versiones, seleccione la imagen en la tabla Imágenes personalizadas adjuntas a dominio y elija Desenlazar .

 

 

También tiene la opción de eliminar la imagen y todas las versiones, lo que no afecta a la imagen en Amazon ECR.

 

 

Para separar una versión de imagen, elija la imagen. En la página Detalles de la imagen , seleccione la versión de la imagen (o varias versiones) en la tabla Versiones de imagen adjuntas a dominio y elija Desenlazar . Verá una advertencia y opciones similares a las del flujo anterior.

 

Conclusión

SageMaker Studio le permite colaborar, experimentar, entrenar e implementar modelos ML de una manera optimizada. Para ello, los científicos de datos a menudo requieren acceso a los framerworks de ML más recientes, scripts personalizados y paquetes de repositorios de código públicos y privados y herramientas de administración de paquetes. Ahora puede crear imágenes personalizadas que contengan todo el código relevante e iniciarlas con los noteboks de Studio. Estas imágenes estarán disponibles para todos los usuarios del dominio Studio. También puede usar esta función para experimentar con otros lenguajes populares y tiempos de ejecución además de Python, como R, Julia y Scala. Los archivos de ejemplo están disponibles en el repositorio de GitHub. Para obtener más información acerca de esta función, vea Traer su propia imagen de SageMaker.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre os Autores

Stefan Natu es un Sr. Especialista en aprendizaje automático en AWS. Se centra en ayudar a los clientes de servicios financieros a crear soluciones integrales de aprendizaje automático en AWS. En su tiempo libre, le gusta leer blogs de aprendizaje automático, tocar la guitarra y explorar la escena gastronómica en la ciudad de Nueva York.

 

 

 

Jaipreet Singh es ingeniero sénior de software en el equipo de Amazon SageMaker Studio. Ha estado trabajando en Amazon SageMaker desde su creación en 2017 y ha contribuido a varios proyectos de código abierto del Proyecto Jupyter. En su tiempo libre, disfruta del senderismo y el esquí en el noroeste del Pacífico.

 

 

 

 

Huong Nguyen es un Sr. Gerente de producto en AWS. Ella está liderando la experiencia de usuario de SageMaker Studio. Tiene 13 años de experiencia creando productos obsesionados con el cliente y basados en datos para espacios empresariales y de consumo. En su tiempo libre, le gusta leer, estar en la naturaleza y pasar tiempo con su familia.

 

 

 

Revisor

Sergio Beltrán es arquitecto de soluciones especialista en AI/ML en AWS. En su rol apoya a los clientes a encontrar la mejor solución y arquitectura para sus necesidades y aprovechar los servicios de  AI/ML para generar innovación y mejorar la productividad. Antes de AWS, trabajó como data scientist y gerente de business development en la industria Telco.