Concepto clave
Desplegar una API de Machine Learning en un servidor cloud es como construir una fábrica automatizada en lugar de un taller artesanal. En producción, necesitas que tu modelo ML esté disponible 24/7, escale automáticamente según la demanda y sea resistente a fallos. El cloud computing proporciona la infraestructura elástica que hace esto posible, permitiéndote enfocarte en la lógica de tu aplicación en lugar de administrar servidores físicos.
Imagina que tu API es un restaurante: en desarrollo, cocinas para unos pocos amigos; en producción, necesitas un local con cocina industrial, personal capacitado y sistemas de reservas. Servicios como AWS, Google Cloud o Azure ofrecen estas "cocinas industriales" donde puedes instalar tu API. La clave está en containerizar tu aplicación usando Docker, lo que empaqueta todo lo necesario para ejecutarla de forma consistente en cualquier entorno, y luego orquestar estos contenedores con herramientas como Kubernetes para gestionar el escalado y la disponibilidad.
Cómo funciona en la práctica
Vamos a desplegar una API FastAPI con un modelo ML en AWS usando EC2 (servidores virtuales) y Docker. Este enfoque es común en proyectos reales por su simplicidad y control. Sigue estos pasos:
- Prepara tu aplicación: Asegúrate de que tu API FastAPI esté lista con endpoints definidos, validación de datos y manejo de errores.
- Crea un Dockerfile: Este archivo describe cómo construir la imagen de tu aplicación, incluyendo dependencias como scikit-learn o TensorFlow.
- Construye y prueba localmente: Ejecuta la imagen Docker en tu máquina para verificar que todo funcione.
- Sube a un registro: Usa Docker Hub o AWS ECR para almacenar tu imagen en la nube.
- Despliega en EC2: Lanza una instancia EC2, instala Docker y ejecuta tu contenedor.
- Configura seguridad: Abre puertos (ej. 80 para HTTP) y establece reglas de firewall.
- Monitorea: Usa CloudWatch o herramientas similares para rastrear el rendimiento.
Este flujo garantiza que tu API sea portable y fácil de replicar en diferentes entornos.
Código en acción
Aquí tienes un ejemplo funcional de un Dockerfile para una API FastAPI con un modelo de clasificación:
# Usa una imagen base de Python
FROM python:3.9-slim
# Establece el directorio de trabajo
WORKDIR /app
# Copia los archivos de requisitos e instala dependencias
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copia el código de la aplicación
COPY . .
# Expone el puerto donde corre FastAPI (por defecto 8000)
EXPOSE 8000
# Comando para ejecutar la aplicación
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]Y este es un script de despliegue básico para EC2 usando la CLI de AWS:
#!/bin/bash
# Despliegue en EC2 para API FastAPI
# 1. Construir la imagen Docker localmente
docker build -t mi-api-ml .
# 2. Etiquetar la imagen para subirla a ECR
docker tag mi-api-ml:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/mi-api-ml:latest
# 3. Autenticarse en ECR
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com
# 4. Subir la imagen
docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/mi-api-ml:latest
# 5. Conectarse a la instancia EC2 y ejecutar (ejemplo con SSH)
ssh -i "mi-key.pem" [email protected] \
"docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/mi-api-ml:latest && \
docker run -d -p 80:8000 mi-api-ml"Errores comunes
- Olvidar exponer puertos en Docker: Si no usas EXPOSE en el Dockerfile o mapeas puertos al ejecutar, la API será inaccesible. Solución: Siempre verifica con
docker psque los puertos estén correctamente mapeados. - No gestionar secretos de forma segura: Hardcodear claves API o credenciales en el código es un riesgo. Solución: Usa variables de entorno o servicios como AWS Secrets Manager, y nunca las incluyas en el repositorio.
- Ignorar el monitoreo y logs: Sin logs, es imposible depurar problemas en producción. Solución: Configura logging en FastAPI y envía logs a CloudWatch o herramientas similares.
- Desplegar sin pruebas de carga: Asumir que la API escalará bien puede llevar a caídas. Solución: Realiza pruebas de carga con herramientas como Locust antes del despliegue.
- No planificar la actualización del modelo: Los modelos ML se desactualizan. Solución: Diseña un pipeline para actualizar el modelo sin downtime, usando versionado de imágenes Docker.
Checklist de dominio
- ✅ Tengo un Dockerfile funcional que construye mi API FastAPI con todas las dependencias.
- ✅ He probado mi contenedor localmente y responde en
http://localhost:8000/docs. - ✅ He configurado seguridad en la nube (grupos de seguridad, IAM roles) para mi instancia.
- ✅ He automatizado el despliegue con scripts o CI/CD (ej. GitHub Actions).
- ✅ He implementado monitoreo básico (métricas de CPU, logs de errores).
- ✅ Tengo un plan para escalar horizontalmente (ej. usando un balanceador de carga).
- ✅ He documentado el proceso de despliegue para mi equipo.
Despliega tu API FastAPI en AWS EC2 usando Docker
Sigue estos pasos para desplegar una API FastAPI con un modelo ML en un servidor cloud. Asegúrate de tener una cuenta AWS y Docker instalado localmente.
- Prepara tu proyecto: Crea una carpeta con tu código FastAPI y un archivo
requirements.txtque incluya fastapi, uvicorn, y las librerías ML necesarias (ej. scikit-learn). - Crea un Dockerfile: Usa el ejemplo de la lección para construir una imagen. Asegúrate de copiar todos los archivos, incluyendo el modelo ML serializado (ej. .pkl).
- Construye y prueba localmente: Ejecuta
docker build -t mi-api .y luegodocker run -p 8000:8000 mi-api. Verifica que la API funcione enhttp://localhost:8000/docs. - Configura AWS: Crea una instancia EC2 (usa Amazon Linux 2) y un grupo de seguridad que permita tráfico HTTP en el puerto 80. Genera un par de claves y descárgalo.
- Despliega en EC2: Conéctate via SSH a tu instancia, instala Docker, y ejecuta tu contenedor mapeando el puerto 80 al 8000. Usa
sudo docker run -d -p 80:8000 mi-api. - Verifica el despliegue: Accede a la IP pública de tu EC2 en un navegador para ver la documentación de la API. Prueba un endpoint de predicción.
- Documenta: Crea un README con los pasos y capturas de pantalla.
- Si la API no responde, revisa los logs del contenedor con 'docker logs '.
- Asegúrate de que el grupo de seguridad en AWS permita tráfico entrante en el puerto 80 desde cualquier IP (0.0.0.0/0).
- Para persistir datos, considera usar volúmenes Docker o servicios de almacenamiento cloud como S3.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.