Blog de Amazon Web Services (AWS)

Use su propio entorno R a Amazon SageMaker Studio

Por Nick Minaie y Sam Liu

 

Amazon SageMaker Studio es el primer entorno de desarrollo (IDE) totalmente integrado para aprendizaje automático (ML). Con un solo clic, los científicos de datos y desarrolladores pueden activar rápidamente los notebooks de SageMaker Studio para explorar conjuntos de datos y crear modelos. El 27 de octubre de 2020, Amazon lanzó una función de imágenes personalizadas que le permite lanzar portátiles SageMaker Studio con sus propias imágenes.

Los notebooks de SageMaker Studio proporcionan un conjunto de imágenes populares para la ciencia de datos y frameworks de ML, además de opciones de cómputo para ejecutar estos notebooks. Las imágenes integradas de SageMaker contienen el SDK de Python de Amazon SageMaker y la última versión del proceso de motor de ejecución de back-end, también denominado kernel. Con la función de imágenes personalizadas, puede registrar imágenes creadas personalizadas y kernels, y ponerlos a disposición de todos los usuarios que compartan un dominio de SageMaker Studio. Puede empezar clonando y extendiendo uno de los archivos Docker de ejemplo proporcionados por SageMaker, o crear sus propias imágenes desde cero.

Esta publicación se centra en agregar una imagen R personalizada a SageMaker Studio para que pueda construir y entrenar sus modelos R con SageMaker. Después de vincular la imagen R personalizada, puede seleccionar la imagen en Studio y usar R para acceder a los SDK utilizando el paquete reticulate de RStudio. Para obtener más información acerca de R en SageMaker, consulte Coding with R on Amazon SageMaker Notebook Instances y R User Guide to Amazon SageMaker Guide to Amazon SageMaker.

Puede crear imágenes y versiones de imagen y vincular versiones de imagen a su dominio mediante el Panel de control de SageMaker Studio, AWS SDK para Python (Boto3) o la interfaz de línea de comandos de AWS (AWS CLI).  Para obtener más información acerca de los comandos de CLI, consulte Referencia de comandos de la CLI de AWS. En esta publicación se explican los métodos de AWS CLI y de la interfaz de usuario de la consola de SageMaker y para vincular y desvincular imágenes a un dominio de SageMaker Studio.

Requisitos previos

Antes de comenzar, debe cumplir los siguientes requisitos previos:

Creación de su Dockerfile

Antes de vincular su imagen a Studio, debe construir una imagen Docker usando un Dockerfile. Puede crear un Dockerfile personalizado utilizando imágenes base u otros repositorios de imágenes Docker, como el repositorio de Jupyter Docker Stacks, y usar o revisar los que se ajusten a sus necesidades específicas.

SageMaker mantiene un repositorio de imágenes Docker de muestra que puede usar para casos de uso comunes (incluidos R, Julia, Scala y TensorFlow). Este repositorio contiene ejemplos de imágenes Docker que son imágenes personalizadas válidas para aplicaciones Jupyter KernelGateway en SageMaker Studio. Estas imágenes personalizadas le permiten traer sus propios paquetes, archivos y kernels para su uso dentro de SageMaker Studio.

Para obtener más información acerca de las especificaciones que se aplican a la imagen contenedor representada por una versión de imagen de SageMaker, consulte Especificaciones de imagen personalizada de SageMaker.

Para este post, utilizamos el ejemplo Dockerfile para R. Este archivo Dockerfile toma la imagen base de Python 3.6 e instala los requisitos previos de la biblioteca del sistema R, conda a través de Miniconda, y paquetes R y paquetes Python que se pueden utilizar a través de reticulate. Puede crear un archivo denominado Dockerfile utilizando el siguiente script y copiarlo en la carpeta de instalación. Puede personalizar este Dockerfile para su caso de uso específico e instalar paquetes adicionales.

 

# This project is licensed under the terms of the Modified BSD License

# (also known as New or Revised or 3-Clause BSD), as follows:




#    Copyright (c) 2001-2015, IPython Development Team

#    Copyright (c) 2015-, Jupyter Development Team




# All rights reserved.




FROM python:3.6




ARG NB_USER="sagemaker-user"

ARG NB_UID="1000"

ARG NB_GID="100"




# Setup the "sagemaker-user" user with root privileges.

RUN \

    apt-get update && \

    apt-get install -y sudo && \

    useradd -m -s /bin/bash -N -u $NB_UID $NB_USER && \

    chmod g+w /etc/passwd && \

    echo "${NB_USER}    ALL=(ALL)    NOPASSWD:    ALL" >> /etc/sudoers && \

    # Prevent apt-get cache from being persisted to this layer.

    rm -rf /var/lib/apt/lists/*




USER $NB_UID




# Make the default shell bash (vs "sh") for a better Jupyter terminal UX

ENV SHELL=/bin/bash \

    NB_USER=$NB_USER \

    NB_UID=$NB_UID \

    NB_GID=$NB_GID \

    HOME=/home/$NB_USER \

    MINICONDA_VERSION=4.6.14 \

    CONDA_VERSION=4.6.14 \

    MINICONDA_MD5=718259965f234088d785cad1fbd7de03 \

    CONDA_DIR=/opt/conda \

    PATH=$CONDA_DIR/bin:${PATH}




# Heavily inspired from https://github.com/jupyter/docker-stacks/blob/master/r-notebook/Dockerfile




USER root




# R system library pre-requisites

RUN apt-get update && \

    apt-get install -y --no-install-recommends \

    fonts-dejavu \

    unixodbc \

    unixodbc-dev \

    r-cran-rodbc \

    gfortran \

    gcc && \

    rm -rf /var/lib/apt/lists/* && \

    mkdir -p $CONDA_DIR && \

    chown -R $NB_USER:$NB_GID $CONDA_DIR && \

    # Fix for devtools https://github.com/conda-forge/r-devtools-feedstock/issues/4

    ln -s /bin/tar /bin/gtar




USER $NB_UID




ENV PATH=$CONDA_DIR/bin:${PATH}




# Install conda via Miniconda

RUN cd /tmp && \

    curl --silent --show-error --output miniconda-installer.sh https://repo.anaconda.com/miniconda/Miniconda3-${MINICONDA_VERSION}-Linux-x86_64.sh && \

    echo "${MINICONDA_MD5} *miniconda-installer.sh" | md5sum -c - && \

    /bin/bash miniconda-installer.sh -f -b -p $CONDA_DIR && \

    rm miniconda-installer.sh && \

    conda config --system --prepend channels conda-forge && \

    conda config --system --set auto_update_conda false && \

    conda config --system --set show_channel_urls true && \

    conda install --quiet --yes conda="${CONDA_VERSION%.*}.*" && \

    conda update --all --quiet --yes && \

    conda clean --all -f -y && \

    rm -rf /home/$NB_USER/.cache/yarn







# R packages and Python packages that are usable via "reticulate".

RUN conda install --quiet --yes \

    'r-base=4.0.0' \

    'r-caret=6.*' \

    'r-crayon=1.3*' \

    'r-devtools=2.3*' \

    'r-forecast=8.12*' \

    'r-hexbin=1.28*' \

    'r-htmltools=0.4*' \

    'r-htmlwidgets=1.5*' \

    'r-irkernel=1.1*' \

    'r-rmarkdown=2.2*' \

    'r-rodbc=1.3*' \

    'r-rsqlite=2.2*' \

    'r-shiny=1.4*' \

    'r-tidyverse=1.3*' \

    'unixodbc=2.3.*' \

    'r-tidymodels=0.1*' \

    'r-reticulate=1.*' \

    && \

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

    'boto3>1.0<2.0' \

    'sagemaker>2.0<3.0' && \

    conda clean --all -f -y




WORKDIR $HOME

USER $NB_UID

 

Configuración de la carpeta de instalación

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

 

.

├── Dockerfile

├── app-image-config-input.json

├── create-and-attach-image.sh

├── create-domain-input.json

└── default-user-settings.json

 

En las siguientes secuencias de comandos, los  Amazon resource names (ARN) deben tener un formato similar al siguiente:

 

arn:partition:service:region:account-id:resource-id

arn:partition:service:region:account-id:resource-type/resource-id

arn:partition:service:region:account-id:resource-type:resource-id

 

 

1. Dockerfile es el archivo Dockerfile que creó en el paso anterior.

2. Cree un archivo llamado app-image-config-input.json con el siguiente contenido:

 

{

    "AppImageConfigName": "custom-r-image-config",

    "KernelGatewayImageConfig": {

        "KernelSpecs": [

            {

                "Name": "ir",

                "DisplayName": "R (Custom R Image)"

            }

        ],

        "FileSystemConfig": {

            "MountPath": "/home/sagemaker-user",

            "DefaultUid": 1000,

            "DefaultGid": 100

        }

 }

 

3. Cree un archivo denominado default-user-settings.json con el siguiente contenido. Si va a agregar varias imágenes personalizadas, agréguele a la lista de CustomImages.

 

{

  "DefaultUserSettings": {

    "KernelGatewayAppSettings": {

      "CustomImages": [

          {

                   "ImageName": "custom-r",

                   "AppImageConfigName": "custom-r-image-config"

                }

            ]

        }

    }

}

 

4. Cree un último archivo en su carpeta de instalación denominado create-and-attach-image.sh utilizando el siguiente script bash. El script ejecuta lo siguiente en orden:

a. Crea un repositorio denominado smstudio-custom en Amazon ECR e inicia sesión en ese repositorio

b. Construye una imagen usando Dockerfile y adjunta una etiqueta a la imagen r

c. Empuja la imagen a Amazon ECR

d. Crea una imagen para SageMaker Studio y vincula la imagen de Amazon ECR a esa imagen

e. Crea un AppImageConfigfor esta imagen usando app-image-config-input.json

 

# Replace with your AWS account ID and your Region, e.g. us-east-1, us-west-2

ACCOUNT_ID = <AWS ACCOUNT ID>

REGION = <STUDIO DOMAIN REGION>




# create a repository in ECR, and then login to ECR repository

aws --region ${REGION} ecr create-repository --repository-name smstudio-custom

aws ecr --region ${REGION} get-login-password | docker login --username AWS \

    --password-stdin ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/smstudio-custom




# Build the docker image and push to Amazon ECR (modify image tags and name as required)

$(aws ecr get-login --region ${REGION} --no-include-email)

docker build . -t smstudio-r -t ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/smstudio-custom:r

docker push ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/smstudio-custom:r




# Using with SageMaker Studio

## Create SageMaker Image with the image in ECR (modify image name as required)

ROLE_ARN = "<YOUR EXECUTION ROLE ARN>"




aws sagemaker create-image \

    --region ${REGION} \

    --image-name custom-r \

    --role-arn ${ROLE_ARN}




aws sagemaker create-image-version \

    --region ${REGION} \

    --image-name custom-r \

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




## Create AppImageConfig for this image (modify AppImageConfigName and

## KernelSpecs in app-image-config-input.json as needed)

## note that 'file://' is required in the file path

aws sagemaker create-app-image-config \

    --region ${REGION} \

    --cli-input-json file://app-image-config-input.json

 

Actualización de un dominio existente de SageMaker Studio con una imagen personalizada

Si ya tiene un dominio de Studio, no necesita crear un dominio nuevo y puede actualizar fácilmente su dominio existente adjuntando la imagen personalizada. Puede hacerlo utilizando la CLI de AWS para Amazon SageMaker o el Panel de control de SageMaker Studio (que tratamos en las secciones siguientes). Antes de ir a los pasos siguientes, asegúrese de que su dominio esté en estado Listo y obtenga su ID de dominio de Studio desde el Panel de control de Studio. El ID de dominio debe estar en formato d-xxxxxxxx.

 

 

Uso de la CLI de AWS para SageMaker

En el terminal, vaya a la carpeta de instalación y ejecute los siguientes comandos. Esto hace que el bash scrip ejecutable:

chmod +x create-and-attach-image.sh

A continuación, ejecute el siguiente comando en el terminal:

./create-and-attach-image.sh

Después de ejecutar correctamente el script bash, necesita actualizar su dominio existente ejecutando el siguiente comando en el terminal. Asegúrate de proporcionar tu ID de dominio y región.

aws sagemaker update-domain --domain-id <DOMAIN_ID> \
    --region <REGION_ID> \
    --cli-input-json file://default-user-settings.json

Después de ejecutar este comando, el estado de su dominio se muestra como Updating durante unos segundos y, a continuación, se muestra como Ready de nuevo. Ahora puede abrir Studio.

Cuando se encuentre en el entorno de Studio, puede usar el Launcher para iniciar una nueva actividad y debería ver la imagen custom-r (latest) que aparece en el menú desplegable bajo Seleccionar una imagen de SageMaker para iniciar su actividad.

Uso de la consola de SageMaker

También puede actualizar su dominio adjuntando la imagen a través de la consola de SageMaker. La imagen que creó aparece en la página Images de la consola.

 

 

  1. Para adjuntar esta imagen a su dominio, en el Panel de control de SageMaker Studio, en Imágenes personalizadas adjuntas al dominio, elija Adjuntar imagen.
  2. En Origen de imagen, elija Imagen existente.
  3. Elija una imagen existente de la lista.
  4. Elija una versión de la imagen de la lista.
  5. Elija Siguiente.
  6. Elija el rol de IAM. Para obtener más información, vea Crear una imagen personalizada de SageMaker (Consola).
  7. Elija Siguiente.
  8. En Configuración de Studio, introduzca o cambie los siguientes parámetros. Para obtener información sobre cómo obtener la información del kernel de la imagen, consulte DESARROLLO en el repositorio GitHub Custom Image Samples de SageMaker Studio.

a. En ruta de montaje de EFS, introduzca la ruta dentro de la imagen para montar el directorio home de Amazon Elastic File System (Amazon EFS) del usuario.

b. En Nombre del kernel, introduzca el nombre de un kernel existente en la imagen.

c. (Opcional) En Nombre para mostrar del kernel, introduzca el nombre para mostrar del kernel.

d. Elija Agregar kernel.

e. (Opcional) En Etiquetas de configuración, elija Agregar nueva etiqueta y agregue una etiqueta de configuración.

Para obtener más información, consulte las secciones Descubrimiento del kernel y Datos de usuario de las especificaciones de imagen personalizada de SageMaker.

9. Seleccione Enviar.

10. Espere a que la versión de la imagen se vincule al dominio.

Mientras adjunta, el estado de tu dominio se encuentra en Updating. Cuando se adjunta, la versión se muestra en la lista Imágenes personalizadas y resaltada brevemente, y el estado del dominio se muestra comoReady.

 

 

En las imágenes SageMaker se almacenan versiones automáticamente de las imágenes. Puede seleccionar una imagen pre-vinculada y elegir Desenlazar para desvincular la imagen y todas las versiones, o bien seleccionar Adjuntar imagen para vincular una nueva versión. No hay límite para el número de versiones por imagen o la capacidad de desvincular imágenes.

 

Uso de una imagen personalizada para crear notebooks

Cuando termine de actualizar el dominio de Studio con la imagen personalizada, puede usar esa imagen para crear nuevos notebooks. Para ello, elija su imagen personalizada de la lista de imágenes en el Launcher. En este ejemplo, usamos custom-r. Esto muestra la lista de kernels que puede utilizar para crear notebooks. Cree un nuevo notebook con el kernel R.

 

 

Si es la primera vez que utiliza este kernel para crear un notebook, puede tardar aproximadamente un minuto en iniciarlo, y el mensaje de Kernel Starting aparece en la esquina inferior izquierda de su Studio. Puede escribir scripts R mientras se inicia el kernel, pero sólo puede ejecutar el script después de que el kernel esté listo. El notebook se crea con una instancia ml.t3.medium predeterminada asociada. Puede ver el kernel R (Custom R Image) y el tipo de instancia en la esquina superior derecha del notebook. Puede cambiar las instancias de ML sobre la marcha en SageMaker Studio. También puede ajustar el tamaño correcto de las instancias para diferentes cargas de trabajo. Para obtener más información, consulte Ajuste de tamaño de los recursos y evitar costes innecesarios en Amazon SageMaker.

Para probar el kernel, introduzca la siguiente secuencia de comandos R de ejemplo en la primera celda y ejecute el script. Este script prueba varios aspectos, incluida la importación de bibliotecas, la creación de una sesión de SageMaker, la obtención del rol de IAM y la importación de datos de repositorios públicos.

El set de datos de abalon en esta publicación es de Dua, D. y Graff, C. ( 2019). Repositorio de aprendizaje automático UCI [http://archive.ics.uci.edu/ml]. Irvine, CA: Universidad de California, Facultad de Información e Informática (http://archive.ics.uci.edu/ml/datasets/Abalone).

 

# Simple script to test R Kernel in SageMaker Studio




# Import reticulate, readr and sagemaker libraries

library(reticulate)

library(readr)

sagemaker <- import('sagemaker')




# Create a sagemaker session

session <- sagemaker$Session()




# Get execution role

role_arn <- sagemaker$get_execution_role()




# Read a csv file from UCI public repository

# Dua, D. and Graff, C. (2019). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml].\

# Irvine, CA: University of California, School of Information and Computer Science

data_file <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data'




# Copy data to a dataframe, rename columns, and show dataframe head

abalone <- read_csv(file = data_file, col_names = FALSE, col_types = cols())

names(abalone) <- c('sex', 'length', 'diameter', 'height', 'whole_weight', 'shucked_weight', 'viscera_weight', 'shell_weight', 'rings')

head(abalone)

 

Si la imagen está configurada correctamente y el kernel se está ejecutando, la salida debe verse como la siguiente captura de pantalla.

 

 

Listado, desvinculación y eliminación de imágenes personalizadas

Si desea ver la lista de imágenes personalizadas adjuntas a su Studio, puede utilizar la CLI de AWS o ir a la consola de SageMaker para ver la imagen adjunta en el Panel de control de Studio.

Uso de la CLI de AWS para SageMaker

Para ver la lista de imágenes personalizadas a través de la CLI de AWS, introduzca el siguiente comando en el terminal (proporcione la región en la que creó el dominio):

 

aws sagemaker list-images --region <region-id>

La respuesta incluye los detalles de las imágenes personalizadas adjuntas:

{

    "Images": [

        {

            "CreationTime": "xxxxxxxxxxxx",

            "ImageArn": "arn:aws:sagemaker:us-east-2:XXXXXXX:image/custom-r",

            "ImageName": "custom-r",

            "ImageStatus": "CREATED",

            "LastModifiedTime": "xxxxxxxxxxxxxx"

        },

        ....

    ]

}

 

Si desea desvincular o eliminar una imagen adjunta, puede hacerlo en el Panel de control de SageMaker Studio (consulte Desvincular una imagen personalizada de SageMaker). Alternativamente, utilice el nombre de la imagen personalizada del archivo default-user-settings.json y vuelva a ejecutar el siguiente comando para actualizar el dominio separando la imagen:

aws sagemaker update-domain --domain-id <YOUR DOMAIN ID> \

    --cli-input-json file://default-user-settings.json

A continuación, elimine la configuración de la imagen de la aplicación:

aws sagemaker delete-app-image-config \

    --app-image-config-name custom-r-image-config

Elimine la imagen de SageMaker, que también elimina todas las versiones de la imagen. Las imágenes de contenedor de Amazon ECR que están representadas por las versiones de imagen no se eliminan.

aws sagemaker delete-image \

    --region <region-id> \

    --image-name custom-r

Después de eliminar la imagen, no aparecerá en imágenes personalizadas en SageMaker Studio. Para obtener más información, vea Limpiar recursos.

Uso de la consola de SageMaker

También puede desvincular (y eliminar) imágenes de su dominio a través de la interfaz de usuario del Panel de control de Studio. Para ello, en Imágenes personalizadas asociadas al dominio, seleccione la imagen y elija Detach (Desasociar). También tiene la opción de eliminar todas las versiones de la imagen de su dominio. Esto desasocia la imagen del dominio.

 

 

Obtener registros en Amazon CloudWatch

También puede obtener acceso a los registros de SageMaker Studio en Amazon CloudWatch, que puede utilizar para solucionar problemas de su entorno. 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 kernel.

Para obtener más información, consulte Log Amazon SageMaker Events with Amazon CloudWatch.

 

Conclusión

En esta publicación se describe el proceso de adjuntar una imagen Docker personalizada a su dominio de Studio para ampliar las imágenes integradas de Studio. Hemos discutido cómo puede actualizar un dominio existente con una imagen personalizada mediante la CLI de AWS para SageMaker o la consola de SageMaker. También explicamos cómo puede usar la imagen personalizada para crear notebooks con kernel personalizados.

Para obtener más información, consulte los siguientes recursos:

 

 


Sobre los autores

Nick Minaie es un Arquitecto de Soluciones especialista en inteligencia artificial y aprendizaje automático (AI/ML), que ayuda a los clientes en su camino hacia soluciones de aprendizaje automático bien diseñadas a escala. En su tiempo libre, Nick disfruta del tiempo en familia, la pintura abstracta y la exploración de la naturaleza.

 

 

 

Sam Liu es Product Manager de Amazon Web Services (AWS). Su enfoque actual es la infraestructura y las herramientas del aprendizaje automático y la inteligencia artificial. Más allá de eso, tiene 10 años de experiencia en la construcción de aplicaciones de aprendizaje automático en diversas industrias. En su tiempo libre, disfruta haciendo videos cortos para la educación técnica o la protección de los animales.

 

 

Revisor

Enrique Rodríguez es Arquitecto de Soluciones de Amazon Web Servicies (AWS) Basado en Chile actualmente ayudando a los clientes de la región a lograr sus desafíos en la nube. Además de eso, es un entusiasta en proyectos de Data Science y AI/ML y el desarrollo de proyectos en la nube. En su tiempo libre disfruta su familia, la música y lectura de ciencia ficción.