GithubHelp home page GithubHelp logo

aacecandev / mlops-desarrollo-y-operaciones-de-inteligencia-artificial Goto Github PK

View Code? Open in Web Editor NEW
3.0 1.0 6.0 5 MB

Código para el curso MLOps desarrollo y operaciones de inteligencia artificial

License: GNU General Public License v3.0

Jupyter Notebook 96.03% Shell 3.97%

mlops-desarrollo-y-operaciones-de-inteligencia-artificial's Introduction

MLOps: desarrollo y operaciones de IA

OpenSSF Scorecard

1. Tabla de contenidos

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 formato aws <comando> [subcomando, [...subcomando]] help, por ejemplo aws sagemaker help o aws 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 de bash 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>.

2. Creación de una imagen customizada con el CLI de AWS

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

3. Creación de un bucket S3

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

3.1. 2.1 ¿Cómo borrarías el bucket?

Intentemos borrar el bucket usando el CLI, ¿qué comandos utilizarías?

3.2. Ejercicio guiado: Creación de un bucket S3 con CloudFormation

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

4. Ejercicio 2 Creación de instancias EC2

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.

5. Reseteo de la cuenta de AWS

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

6. La importancia de las claves en AWS

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:

7. Ejercicio 3 Limpieza de secrets de nuestros repositorios

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.

8. IAM con AWS Python SDK

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

9. Servicios gestionados en AWS

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

9.1. Ejercicio 2: Moderación de contenido de video

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.

9.2. Ejercicio guiado: Uso de Comprehend

10. SageMaker, introducción y arquitectura

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

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.

10.1. SageMaker Pricing

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.

10.2. Despliegue de SageMaker

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:

10.2.1. Desplegando laboratorios SageMaker Classic

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:

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.

10.2.2. Ejercicio 4 Despliegue de una instancia de SageMaker Classic personalizada

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.

10.2.3. 9.1.3 Desplegando laboratorios SageMaker Studio

Ahora vamos a desplegar una instancia de SageMaker Studio. Este tipo de notebook funciona distinto como ya vimos, ya que utiliza Jupyter Kernel 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:

10.2.4. Ejercicio 5 Customización de SageMaker Studio con LifecycleConfig

Para este ejercicio guiado vamos a utilizar los siguientes ficheros:

11. SageMaker Studio y MLOps

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.

11.1. Ejercicio guiado: Entrenamiento tradicional dentro de Sagemaker

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.

11.2. Ejercicio guiado: Entrenamiento utilizando las APIs Sagemaker

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.

11.3. Ejercicio guiado: Entrenamiento utilizando SageMaker Autopilot (AutoML)

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.

11.4. Ejercicio 3: Entrenamiento con Autopilot

Para este ejercicio propongo

https://github.com/aws/amazon-sagemaker-examples/blob/main/autopilot/autopilot_customer_churn.ipynb

11.5. SageMaker Pipelines y Model Monitoring

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:

12. Proyecto personal

Como conclusión a este curso tenemos la posibilidad de realizar 3 tipos de ejercicios distintos, con dificultades distintas:

  1. 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.
  2. Realizar un entrenamiento completo utilizando AutoPilot
  3. 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

12.1. Arquitectura de SageMaker

12.2. SageMaker Studio vs SageMaker Classic

12.3. SageMaker Lifecycle Configuration

13. References

14. Further Reading

mlops-desarrollo-y-operaciones-de-inteligencia-artificial's People

Contributors

aacecandev avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.