-
- 3.1. 2.1 ¿Cómo borrarías el bucket?
- 3.2. 2.2 Ejercicio guiado: Creación de un bucket S3 con CloudFormation
-
- 9.1. 8.1. Ejercicio 2: Moderación de contenido de video
- 9.2. 8.2. Ejercicio guiado: Uso de Comprehend
-
- 10.1. 9.1 SageMaker Pricing
- 10.2. 9.1 Despliegue de SageMaker
-
- 11.1. 9.2 Ejercicio guiado: Entrenamiento tradicional dentro de Sagemaker
- 11.2. 9.3 Ejercicio guiado: Entrenamiento utilizando las APIs Sagemaker
- 11.3. 9.4 Ejercicio guiado: Entrenamiento utilizando SageMaker Autopilot (AutoML)
- 11.4. 9.5 Ejercicio 3: Entrenamiento con Autopilot
- 11.5. 9.6 SageMaker Pipelines y Model Monitoring
Para poder seguir correctamente las instrucciones, tenemos que asegurarnos de tener exportadas las siguientes variables de entorno:
# Variables necesarias para construir la imagen con el CLI de AWS
export DOCKER_REGISTRY_USER_NAME="aacecandev"
export DOCKER_REGISTRY_IMAGE_NAME="awscli"
export DOCKER_REGISTRY_IMAGE_TAG="curso-mlops"
# Variables relacionadas con AWS
export AWS_DEFAULT_REGION="us-east-1"
export AWS_ACCOUNT_ID="123456789012" # $(aws sts get-caller-identity --query Account --output text)
export AWS_IAM_USER="alejandro.aceituna"
export AWS_ACCESS_KEY_ID=ThiIsMYaccessKEY
También debemos crear un fichero .aws/credentials
con las credenciales de AWS a partir de la plantilla .aws/credentials.template
IMPORTANTE
- Todos los scripts están pensados para ser ejecutados desde la raíz del repositorio.
- Los scripts de
bash
están pensados para ser ejecutados en un entorno Linux o Mac. Si se ejecutan en Windows, es posible que no funcionen correctamente. - Si necesitamos ayuda con el CLI de AWS, o necesitamos usar la herramienta, podemos acceder a la ayuda de los comandos desde dentro del contenedor de AWS CLI con el comando
docker run -it --rm --entrypoint /bin/bash aacecandev/awscli:curso-mlops
y usando el formatoaws <comando> [subcomando, [...subcomando]] help
, por ejemploaws sagemaker help
oaws sagemaker create-endpoint-config help
. - Para poder simplificar el desarrollo del módulo, y con todos los prerequisitos mencionados anteriormente satisfechos, desarrollaremos el curso en un entorno de desarrollo basado en Docker. Para ello, ejecutaremos el script
./scripts/02-run-docker-awscli.sh
que nos creará un contenedor de Docker con todas las herramientas necesarias para poder desarrollar el curso. Para poder ejecutar los scripts debash
que se encuentran en el directorio./scripts
, debemos ejecutarlos desde dentro del contenedor de desarrollo. Para ello, ejecutaremos el comando./scripts/<nombre-del-script></nombre-del-script>
.
En este primer paso vamos a generar una imagen con el CLI de AWS y a pushearla a nuestro registry privado en DockerHub. Esta imagen será desde la cual podremos lanzar todos los scripts para generar, actualizar y borrar infraestructura.
./scripts/01-build-docker-awscli.sh
El primer paso para poder trabajar con SageMaker es crear un bucket S3 en el que almacenar los datos de entrada y los modelos de salida. Para ello practicaremos con la consola Web, el CLI de AWS y CloudFormation.
aws s3api create-bucket --bucket test-bucket-989282 --region us-east-1 # No funciona!
aws s3api create-bucket --bucket test-bucket-$(date +%s) --region us-east-1
Intentemos borrar el bucket usando el CLI, ¿qué comandos utilizarías?
En este ejercicio vamos a crear un bucket S3 con CloudFormation. Para ello, vamos a crear un fichero cfn/01-s3-bucket.yml
con el siguiente contenido:
AWSTemplateFormatVersion: '2010-09-09'
Description: 'S3 Bucket for MLOps course'
Parameters:
Timestamp:
Type: String
Description: Timestamp
Default: "1668970863"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "mlops-test-bucket-${Timestamp}"
# Outputs:
# BucketName:
# Description: Name of the S3 bucket
# Value: !Ref S3Bucket
Y a aplicarlo con el siguiente comando:
aws cloudformation create-stack --stack-name test-bucket --template-body "file:///cfn/01-create-s3-bucket.yaml" --parameters "ParameterKey=Timestamp,ParameterValue=$(date +'%s')"
A continuación vamos a proceder a actualizar el stack para que produzca como salida el nombre del bucket creado. Para ello, descomentaremos la sección de Output del fichero YAML y ejecutaremos el siguiente comando:
aws cloudformation update-stack --stack-name test-bucket --template-body "file:///cfn/01-create-s3-bucket.yaml" --parameters "ParameterKey=Timestamp,ParameterValue=$(date +'%s')"
Podemos obtener el output con el nombre del bucket con el siguiente comando:
aws cloudformation describe-stacks --stack-name test-bucket --query "Stacks[0].Outputs[0].OutputValue" --output text
Podemos después borrar el stack ejecutando:
aws cloudformation delete-stack --stack-name test-bucket
En este ejercicio vamos a crear una instancia EC2 con el CLI de AWS y con CloudFormation. Como punto de partida tenemos que conseguir el ID de la VPC default así como el de alguna de sus subnets para emplazar en ellas la instancia EC2.
Tenemos que conseguir generar los siguientes componentes:
- SSH Key Pair con permisos Unix 400 (sólo lectura para el usuario propietario)
- Security Group con el puerto 22 abierto para nuestra IP pública
- VPC (default o custom) con sus subnets
- Conocer el ID de la AMI
En primer lugar, seguiremos las instrucciones de la documentación oficial sobre EC2 con CLI para crear todos los componentes necesarios de la instancia y poder conectarnos a ella.
En segundo lugar generaremos una plantilla de CloudFormation cfn/02-ec2-instance.yml
y ejecutaremos los comandos necesarios para crear el stack, obtener el nombre de la instancia y por último, borrar el stack. Podemos encontrar ejemplos de todos los componentes en la documentación oficial sobre snippets EC2 con CloudFormation.
En este ejercicio vamos a borrar todos los recursos que hemos creado en la cuenta de AWS para poder empezar de cero.
Para ello, vamos a utilizar la herramienta aws-nuke
Para utilizarla tenemos que revisar cuidadosamente los scripts que se facilitan con este módulo así como la configuración nuke/config.yaml
, y ejecutarlos en el siguiente orden:
scripts/05-docker-nuke-dry-run.sh
scripts/06-docker-nuke-no-dry-run.sh
En este ejercicio vamos a hablar de la importancia de las claves que utilizamos en nuestros repositorios, y repasaremos cómo podemos prevenir y reaccionar ante fugas de claves utilizando varias herramientas:
- gitleaks
- pre-commit
- shhgit
- bfg-repo-cleaner
- aws-nuke + Github Actions
En este ejercicio vamos a limpiar los secrets de nuestros repositorios utilizando las herramientas que hemos visto en el ejercicio anterior.
Para ello, vamos a utilizar el repositorio de este módulo como ejemplo. Para ello, vamos a utilizar los siguientes comandos:
echo "my-super-secret-key" > .secrets
git add .secrets
git commit -m "Add secret"
docker run -v $(pwd):/path zricethezav/gitleaks:latest detect --source /path -v
Y a continuación, vamos a utilizar las herramientas que hemos visto en el ejercicio anterior para limpiar el repositorio de los secrets que hemos introducido. Para ello, usaremos el script scripts/07-bfg-repo-cleaner.sh
.
Para continuar, vamos a interactuar con la herramienta que nos falta dentro del conjunto de formas para interactuar con la API de AWS y el último de los servicios básicos que vamos a ver en este módulo en profundidad.
Para seguir el ejercicio usaremos el notebook notebooks/01-aws-execution-role.ipynb
Durante el desarrollo de este apartado, vamos a hacer un repaso superficial por todos los servicios autogestionados que nos ofrece AWS, y pararemos en dos específicos para verlos en profundidad. Para el desarrollo de este apartado, vamos a utilizar un entorno de ejecución de SageMaker Studio desde el cual ejecutaremos los notebook
notebooks/02-managed-services.ipynb
notebooks/03-sagemaker.ipynb
Para poder trabajar correctamente con ellos, haremos un fork de este repositorio en nuestro propio perfil de [Github] y crearemos un nuevo entorno de ejecución de SageMaker Studio desde el cual podremos trabajar con los notebooks.
Una vez inicializado SageMaker, procederemos a clonar desde una terminal del sistema el repositorio. Para ello, ejecutaremos los siguientes comandos:
# Creamos una clave SSH, copiamos la clave pública y la añadimos a nuestro perfil de Github y testeamos
ssh-keygen -t rsa -b 4096 -C "sagemaker" -f .ssh/id_rsa
cat .ssh/id_rsa.pub
ssh -T [email protected]
# Clonamos nuestro propio fork dentro de SageMaker
git clone git@github/<user>/mlops-desarrollo-y-operaciones-de-inteligencia-artificial.git
Si durante la clase se modificasen los ficheros del repositorio, podemos obtener una copia actualizada de los mismos ejecutando el siguiente comando:
git remote add upstream [email protected]:aacecandev/mlops-desarrollo-y-operaciones-de-inteligencia-artificial.git
git fetch upstream
git checkout main
git rebase upstream/main
Toda la documentación sobre gestión de claves SSH podemos encontrarla en el siguiente enlace de Github
Para este ejercicio nos apoyaremos en los dos notebooks que hemos visto en este apartado para hacer una llamada a la API de Rekognition enviando el video ./media/weapon.mp4
, que tendremos que almacenar en S3 previamente.
Como resultado tenemos que recibir un JSON en el cual se nos indicará la probabilidad de que el video contenga contenido violento en un momento concreto del mismo.
En esta parte del módulo vamos a repasar de forma teórico-práctica los conceptos básicos de SageMaker, y vamos a interactuar con el servicio a través de la consola Web de AWS y de las APIs disponibles para conocer un poco mejor el servicio.
Tenemos a nuestra disposición este video con un repaso en 5 minutos del servicio
- [AWS] What Is Amazon SageMaker?
- [AWS] Amazon SageMaker Components
- [AWS] Deep Dive into Amazon SageMaker Studio Notebook Architecture
En este punto comenzaremos desplegando SageMaker Studio a través de la UI para familiarizarnos con el proceso, ya que tardará unos minutos en estar disponible. Podemos continuar con el siguiente apartado mientras se despliega.
Es importante que conozcamos cómo y por qué conceptos puede AWS facturarnos mientras que utilizamos el servicio SageMaker. En primer lugar, tenemos que tener en cuenta que como acabamos de crear una cuenta, estamos dentro de la capa gratuita de SageMaker, por lo que durante el desarrollo del módulo no vamos a tener que pagar nada.
Pero aun así, repasar los conceptos de facturación nos va a ayudar a entender mejor el servicio y a saber cómo podemos optimizar el uso de los recursos. Para ello, podemos consultar la siguiente página de AWS.
Y además tenemos que tener en cuenta que el almacenamiento que utilicemos tanto en S3 como en EFS
A todos los efectos, tenemos que tener en nuestros favoritos la calculadora de precios de SageMaker ya que en algún momento de nuestra carrera, como arquitectos de soluciones de ML en AWS, nos van a pedir presupuestos para proyectos y tendremos que saber cómo calcularlos y ajustarlos lo máximo posible.
Antes de comenzar a trabajar con SageMaker, vamos a hacer un rápido repaso de los tipos de notebooks disponibles, y se facilitarán las siguientes templates de despliegue de SageMaker utilizando CloudFormation:
Para desplegar este tipo de recurso es importante leer la sección de parámetros de la template de CloudFormation para tener una idea global de lo que vamos a desplegar.
Vamos a utilizar para este fin los siguientes ficheros:
- Archivo con la template de CloudFormation: 03-sagemaker-notebook-classic.yaml
- Script para la creación del stack: 08-cfn-stack-sagemaker-notebook-classic.sh
Es importante recordar que en la arquitectura de nuestro notebook classic, el almacenamiento está basado en EBS, por lo que si queremos hacer uso de los datos que tengamos en S3, tendremos que montar el volumen de EFS en el notebook.
Podemos encontrar valiosos ejemplos de configuración mediante LifecycleConfig en el repositorio oficial de ejemplos.
Es importante también repasar los logs en CloudWatch para ver qué ha ocurrido durante el proceso de instalación.
En este ejercicio vamos a modificar el SageMaker Classic. Para ello, vamos a utilizar como base el template y el script que hemos visto en el apartado anterior para obtener una instancia limpia, y una vez desplegado, vamos a utilizar los scripts de customización oficiales.
Una vez instalado, vamos a repasar los logs de instalación en ya que es allí donde encontraremos logs valiosos que contendrán, por ejemplo, la URL desde la que podremos acceder a code-server
.
Ahora vamos a desplegar una instancia de SageMaker Studio. Este tipo de notebook funciona distinto como ya vimos, ya que utiliza Jupyter Enterprise Gateway (importante no confundirnos con Jupyter Enterprise Gateway)
En primer lugar vamos a centrarnos en conseguir una instancia vanilla de SageMaker Studio. Para ello, vamos a utilizar los siguientes ficheros:
- Archivo con la template de CloudFormation: 05-create-sagemaker-vanilla.yaml
- Script para la creación del stack: 09-cfn-stack-sagemaker-vanilla.sh
Para este ejercicio guiado vamos a utilizar los siguientes ficheros:
- Script que convertiremos a base64: 10-sagemaker-studio-customization.sh
Una vez tenemos una guía para realizar despliegues automatizados, vamos a utilizar nuestra instalación del tipo vanilla para conseguir un pipeline MLOps utilizando SageMaker Studio.
Vamos a comenzar trabajando de forma tradicional dentro de SageMaker, y a continuación vamos a realizar el mismo ejercicio utilizando las APIs de SageMaker. Por último, vamos a realizar el mismo ejercicio.
En primer lugar, vamos a utilizar el notebook 09-sagemaker-traditional-approach.ipynb para realizar un entrenamiento de regresión lineal utilizando el dataset de Boston Housing dataset.
Una vez realizado el entrenamiento, vamos a utilizar el notebook notebooks/10-sagemaker-using-sagemaker-features-approach.ipynb
para realizar el mismo ejercicio utilizando las APIs de SageMaker.
Por último utilizaremos el notebook notebooks/11-sagemaker-using-autopilot-approach.ipynb
para dejar decidir a un trabajo de AutoML la mejor forma de realizar el entrenamiento sobre el Dataset California housing utlizando AutoPilot.
Para este ejercicio propongo
https://github.com/aws/amazon-sagemaker-examples/blob/main/autopilot/autopilot_customer_churn.ipynb
Una vez tenemos un modelo entrenado, vamos a utilizar SageMaker Pipelines para automatizar el proceso de despliegue y monitorización del modelo.
Para seguir este ejercicio guiado, podemos utilizar los siguientes notebooks:
Como conclusión a este curso tenemos la posibilidad de realizar 3 tipos de ejercicios distintos, con dificultades distintas:
- Realizar un proyecto en el que utilicemos el SDK de Python boto3 para implementar una solución basada en alguno de los servicios gestionados que hemos visto en el este módulo, aprovechando la capa gratuita de AWS.
- Realizar un entrenamiento completo utilizando AutoPilot
- Implementar un ciclo completo utilizando SageMaker Pipelines
En todos estos ejercicios la temática será libre. Podéis escoger los Datasets y utilizar cualquiera de los servicios vistos en clase. En caso de que en algún punto saliéseis de la capa gratuita de AWS, os recomiendo que os pongáis en contacto conmigo para que veamos posibles soluciones, como entregar el código sin tener que ejecutarlo.
Existe también la posibilidad de que me enviéis un link a un video (subido por supuesto a vuestro S3 de forma programática) en el que ejecutéis cualquiera de las tareas anteriores, aunque para este punto pediré un poco más de dificultad en cuanto al contenido de la tarea.
Podéis encontrar muy buenos ejemplos en el repositorio de Amazon SageMaker Examples
- [AWS] How Are Amazon SageMaker Studio Notebooks Different from Notebook Instances?
- [AWS] SageMaker Studio Custom Image Samples
- [AWS] Create a Lifecycle Configuration from the AWS CLI
- [Github] SageMaker Studio Lifecycle Configuration Samples
- [AWS] Machine Learning Free Tier
- [AWS] Build environment compute types
- [Github] Jupyter Docker Stacks
- [Github] AWS EFA and NCCL Base AMI/Docker Build Pipeline
- [Github] AWS Samples
- [AWS] Amazon SageMaker Studio Pricing
- [AWS] Use Lifecycle Configurations with Amazon SageMaker Studio
- [AWS] Use Amazon SageMaker Studio Notebooks
- [Github] SageMaker-Studio-Autoshutdown-Extension
- [Towards Data Science] Customizing SageMaker Studio
- [AWS] Bringing your own custom container image to Amazon SageMaker Studio notebooks
- [AwsTut] Delete ECR images using CloudFormation Custom Resources
- [AWS] Attach a custom SageMaker image
- [Towards Data Science] Automating the Setup of SageMaker Studio Custom Images
- [Github] Issue, Attach custom image to SageMaker domain without update-domain command
- [AWS] Launch a custom SageMaker image in Amazon SageMaker Studio
- [AWS] Customize Amazon SageMaker Studio using Lifecycle Configurations
- [Github] SageMaker Studio Lifecycle Configuration Samples
- [AWS] Host code-server on Amazon SageMaker
- [Github] https://github.com/aws-samples/amazon-sagemaker-codeserver#code-server-on-amazon-sagemaker
- [AWS] Secure Data Science with Amazon SageMaker Studio Workshop
- [Github] AWS CloudFormation resource providers SageMaker
- [AWS] Amazon SageMaker Fridays
- [YouTube] Kubeflow + BERT + TensorFlow + PyTorch + Reinforcement Learning + Multi-arm Bandits + Amazon SageMaker
- [Gitub] awesome-sagemaker
- [Github][Terraform] Terrafrom SageMaker Sample
- [AWS] Generate images from text with the Stable Diffusion model on Amazon SageMaker Jumpstart