Automatizar Despliegues con CI/CD para ML

Lectura
30 min~5 min lectura

Concepto clave

La automatización de despliegues con CI/CD para Machine Learning es el proceso de crear un flujo automatizado que construye, prueba y despliega modelos de ML en contenedores Docker y los orquesta en Kubernetes. Imagina que eres un panadero que automatiza su producción: en lugar de hornear cada pan manualmente, configuras una línea de producción que mezcla ingredientes, hornea y empaqueta automáticamente cuando recibes un nuevo pedido. En ML, esto significa que cada vez que actualizas tu código del modelo, un sistema automatizado lo empaca en un contenedor, lo prueba y lo despliega sin intervención manual.

El CI/CD (Integración Continua/Despliegue Continuo) para ML agrega desafíos únicos: no solo debes probar código, sino también datos, modelos entrenados y métricas de rendimiento. Un pipeline típico incluye etapas como: entrenamiento del modelo, validación de métricas, construcción de la imagen Docker, pruebas de integración y despliegue en Kubernetes. La clave es que todo esto se dispara automáticamente al hacer un cambio en tu repositorio de código, asegurando que tus modelos en producción estén siempre actualizados y funcionando correctamente.

Cómo funciona en la práctica

Vamos a desglosar un ejemplo paso a paso usando GitHub Actions como herramienta de CI/CD y un modelo de clasificación simple. Supongamos que tienes un proyecto de ML con esta estructura:

  • train.py: Script para entrenar el modelo
  • Dockerfile: Para construir la imagen del contenedor
  • deployment.yaml: Configuración de Kubernetes
  • requirements.txt: Dependencias de Python

El flujo automatizado se activa cuando haces un push a la rama main de tu repositorio. Primero, el sistema ejecuta el entrenamiento del modelo y valida que su precisión supere un umbral (ej., 90%). Luego, construye la imagen Docker, la etiqueta con la versión del commit y la sube a un registro como Docker Hub. Finalmente, actualiza el despliegue en Kubernetes para usar la nueva imagen, realizando un rollout gradual que minimiza el tiempo de inactividad.

Código en acción

A continuación, un ejemplo real de un archivo .github/workflows/ml-cicd.yaml que define el pipeline de CI/CD:

name: ML CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  train-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout código
        uses: actions/checkout@v3
      
      - name: Configurar Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      
      - name: Instalar dependencias
        run: pip install -r requirements.txt
      
      - name: Entrenar modelo
        run: python train.py
      
      - name: Validar métricas
        run: |
          accuracy=$(python -c "import json; data=open('metrics.json').read(); print(json.loads(data)['accuracy'])")
          if [ $(echo "$accuracy < 0.9" | bc) -eq 1 ]; then
            echo "Accuracy too low: $accuracy"
            exit 1
          fi
  
  build-and-push:
    needs: train-and-test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout código
        uses: actions/checkout@v3
      
      - name: Login a Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      
      - name: Construir y push imagen Docker
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: tuusuario/ml-model:latest
  
  deploy-to-kubernetes:
    needs: build-and-push
    runs-on: ubuntu-latest
    steps:
      - name: Configurar kubectl
        uses: azure/setup-kubectl@v3
      
      - name: Desplegar en Kubernetes
        run: kubectl apply -f deployment.yaml

Y aquí un Dockerfile básico para el modelo:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Errores comunes

  • No versionar modelos o datos: Si tu pipeline no guarda versiones de modelos entrenados o datasets, puedes perder trazabilidad. Solución: Usa herramientas como DVC o almacena artefactos en tu CI/CD.
  • Ignorar pruebas de integración: Solo probar el modelo en aislamiento puede llevar a fallos en producción. Solución: Incluye pruebas que simulen el entorno de Kubernetes, como verificar que el contenedor responde a solicitudes HTTP.
  • Despliegues sin rollback: Actualizar sin un plan de reversión puede causar downtime. Solución: Configura estrategias de rollout en Kubernetes, como RollingUpdate, y monitorea métricas para revertir automáticamente si hay errores.
  • Exponer secretos en el código Hardcodear credenciales en Dockerfiles o scripts es un riesgo de seguridad. Solución: Usa variables de entorno o secretos de Kubernetes, gestionados desde tu CI/CD.
  • No optimizar el tamaño de la imagen Docker: Imágenes grandes ralentizan despliegues. Solución: Usa imágenes base ligeras como python:3.9-alpine y limpia cachés en el Dockerfile.

Checklist de dominio

  1. ¿Tu pipeline de CI/CD se activa automáticamente al hacer cambios en el repositorio?
  2. ¿Incluye validación de métricas del modelo (ej., precisión, recall) antes del despliegue?
  3. ¿Las imágenes Docker se etiquetan con versiones únicas (ej., hash del commit)?
  4. ¿Tienes configurado un rollback automático en Kubernetes si el despliegue falla?
  5. ¿Usas secretos gestionados para credenciales en lugar de hardcodearlos?
  6. ¿El tamaño de tu imagen Docker está optimizado (ej., menos de 500 MB)?
  7. ¿Documentas cada paso del pipeline para facilitar debugging?

Configurar un pipeline CI/CD básico para un modelo de ML

En este ejercicio, crearás un pipeline de CI/CD simple para automatizar el despliegue de un modelo de clasificación en Kubernetes. Sigue estos pasos:

  1. Prepara tu entorno: Clona un repositorio de ejemplo con un modelo de ML (ej., desde GitHub) o usa tu propio proyecto. Asegúrate de tener un Dockerfile, requirements.txt, y un script de entrenamiento.
  2. Crea el archivo de workflow: En la carpeta .github/workflows/ de tu repositorio, crea un archivo ml-pipeline.yaml. Basate en el ejemplo de la lección, pero adaptalo para tu modelo.
  3. Configura los secretos: En tu plataforma de CI/CD (ej., GitHub Secrets), agrega variables para Docker Hub (usuario y contraseña) y para Kubernetes si es necesario.
  4. Prueba el pipeline: Haz un push a la rama main y verifica que el pipeline se ejecute correctamente, entrenando el modelo, construyendo la imagen y desplegando.
  5. Verifica el despliegue: Usa kubectl get pods para confirmar que tu contenedor está corriendo en Kubernetes.
Pistas
  • Si el pipeline falla en la etapa de entrenamiento, revisa que las dependencias en requirements.txt estén correctas.
  • Para reducir el tamaño de la imagen Docker, considera usar una imagen base más ligera como python:3.9-alpine.
  • Asegúrate de que los secretos en GitHub estén bien configurados y que los nombres coincidan con los usados en el workflow.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.