Integrantes:
- Julio Agustín Donadello
- Diego Braga
- Eduardo Echeverria
- Marco Joel Isidro
- Diego Sarina
En este trabajo práctico integrador de la materia Aprendizaje de Máquinas II, hemos llevado a cabo el ciclo completo de MLOps, que incluye desde la preparación y limpieza de datos hasta el despliegue de un modelo de Machine Learning en producción. Este proyecto es una continuación del trabajo realizado en Aprendizaje de Máquinas I, donde inicialmente modelamos un sistema de predicción utilizando técnicas de aprendizaje supervisado.
Para este proyecto, utilizamos un dataset sobre el clima en Australia que contiene información recopilada durante 10 años en diversas ciudades del país. Los datos incluyen variables como temperatura, velocidad y dirección del viento, precipitaciones, entre otros.
Dataset utilizado: Kaggle - Rain in Australia
Los servicios que se implementaron fueron:
- Apache Airflow
- MLflow
- API Rest para servir el modelo (FastAPI)
- MinIO
- Base de datos relacional PostgreSQL
- Grafana
- Prometheus
- Streamlit
Por defecto, cuando se inician los multi-contenedores, se crean los siguientes buckets:
s3://data
s3://mlflow
(usada por MLflow para guardar los artefactos).
las siguientes bases de datos:
mlflow_db
(usada por MLflow).airflow
(usada por Airflow).
y los volumenes para persistir los datos:
db_data
(usado por Postgres)minio_data
(usado por MinIO)prometheus_data
(usado por Prometheus)
-
Instalar Docker en tu computadora (o en el servidor que desees usar).
-
Clona este repositorio.
-
Si estás en Linux o MacOS, en el archivo
.env
, reemplazaAIRFLOW_UID
por el de tu usuario o alguno que consideres oportuno (para encontrar el UID, usa el comandoid -u <username>
). De lo contrario, Airflow dejará sus carpetas internas como root y no podrás subir DAGs (enairflow/dags
) o plugins, etc. -
En la carpeta raíz de este repositorio, ejecutar:
docker compose --profile all up
- Podrás acceder a los diferentes servicios mediante:
- Apache Airflow: http://localhost:8080
- MLflow: http://localhost:5000
- MinIO: http://localhost:9001 (ventana de administración de Buckets)
- API: http://localhost:8800/
- Documentación de la API: http://localhost:8800/docs
- Grafana: http://localhost:3000/
- Stremlit: http://localhost:8501/
Recomendamos al usuario ingresar al servicio de streamlit para una experiencia mas agradable. Se adjunta un ejemplo:
.
├── .gitignore
├── .gitattributes
├── LICENSE
├── poetry.lock
├── pyproject.toml
├── diagrama-servicios.png
├── README.md
│
└── servicio-ml
├── .env
├── docker-compose.yaml
├── LICENSE
│
├── airflow
│ ├── config/
│ ├── dags/
│ │ ├── etl_process.py
│ │ ├── retrain_model.py
│ ├── plugins/
│ └── secrets/
│ ├── connections.yaml
│ └── variables.yaml
│
├── dockerfiles
│ ├── airflow/
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ ├── fastapi/
│ │ ├── app.py
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ ├── grafana/
│ │ ├── Dockerfile
│ │ ├── dashboards/
│ │ │ ├── airflow/
│ │ │ │ ├── airflow-cluster-dashboard.json
│ │ │ │ └── airflow-dag-dashboard.json
│ │ │ ├── minio/
│ │ │ │ └── minio-dashboard.json
│ │ │ └── postgres/
│ │ │ │ └── postgre-dashboard.json
│ │ ├── provisioning/
│ │ ├── dashboards/
│ │ │ └── dashboards.yaml
│ │ └── datasources/
│ │ └── datasources.yaml
│ ├── mlflow/
│ │ ├── Dockerfile
│ │ └── requirements.txt
│ ├── postgres/
│ │ ├── Dockerfile
│ │ └── mlflow.sql
│ ├── prometheus/
│ │ ├── Dockerfile
│ │ ├── config/
│ │ └── prometheus.yml
│ ├── statsd-exporter/
│ │ ├── Dockerfile
│ │ ├── config/
│ │ └── statsd.yaml
│ ├── streamlit/
│ ├── app.py
│ ├── data_overview.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── results.py
│ ├── test_model.py
│ ├── components/
│ │ └── charts.py
│ └── utils/
│ ├── data_processing.py
│ ├── utils.py
│
└── notebooks
├── mlflow_aux.py
├── optuna_aux.py
├── plots.py
├── train_rain_in_australia.ipynb
A continuación se explica como el usuario utilizara el proyecto.
Este repositorio contiene dos DAGs diseñados para ejecutar procesos de ETL y reentrenamiento de modelos en Apache Airflow. Previo a ejecutar el DAG de reentrenamiento, se asume que ya existe un modelo en producción cargado en MLflow. Dicho modelo pudo haber sido generado, por ejemplo, a través del notebook aprMaq2/servicio-ml/notebooks/train_rain_in_australia.ipynb
.
- Script:
etl_process.py
- Descripción: Este DAG maneja el proceso de carga de datos, incluyendo las transformaciones, la división del dataset en subconjuntos de entrenamiento y validación, y la normalización de los datos de entrada.
- Programación: Se ejecuta el primer día de cada mes a las 00:00 horas.
- Script:
retrain_model.py
- Descripción: Este DAG realiza el reentrenamiento del modelo basado en un modelo existente cargado en MLflow. Si las métricas del nuevo modelo superan a las del modelo existente, el modelo se actualiza, se etiqueta como "champion" y se desmarca el modelo anterior.
- Programación: Se ejecuta el primer día de cada mes a las 01:00 horas, una hora después del DAG
etl_process_rain_australia
.
El DAG etl_process_rain_australia
está programado para ejecutarse a las 00:00 horas del primer día de cada mes. El DAG train_model_rain_australia
está programado para ejecutarse una hora más tarde, a las 01:00 horas. Según las pruebas realizadas, este intervalo es suficiente para completar el proceso ETL antes de que comience el reentrenamiento.
Este proyecto utiliza MLflow para el seguimiento detallado de los procesos de ETL, el tuneo de hiperparámetros y el reentrenamiento de modelos. A continuación, se describen los principales aspectos registrados.
- Runs y Runs Anidados: Cada proceso de tuneo de hiperparámetros se registra en MLflow, creando un run principal para el proceso general y runs anidados para cada trial realizado. En cada run anidado, se registran los parámetros específicos utilizados y las métricas obtenidas.
- Modelos y Artefactos: Los modelos generados durante el tuneo, junto con sus artefactos, como gráficos de correlación, se almacenan y están disponibles para su revisión.
- Datasets Originales y Transformados: Durante la ejecución del DAG de ETL, se guarda en MLflow información detallada de los datasets originales y transformados. Esto incluye la cantidad de observaciones en los conjuntos de entrenamiento y prueba, así como los parámetros de escalamiento utilizados (media y desviación estándar).
- Información de los Runs de Reentrenamiento: Cada corrida del DAG de reentrenamiento ("challenger") se registra en MLflow, detallando los datos del modelo entrenado, las métricas obtenidas, y si este modelo superó al modelo "champion" en ese momento.
- Comparación de Métricas: En caso de que el modelo "challenger" supere al "champion", se registran las métricas de ambos modelos para una comparación detallada, facilitando la toma de decisiones en la promoción de modelos a producción. ...
En este proyecto, se utilizó Streamlit como la herramienta principal para el desarrollo de la interfaz de usuario. Streamlit es un framework de código abierto que permite la creación rápida de aplicaciones web interactivas y altamente personalizables en Python. La elección de Streamlit se debió a su facilidad de uso, la integración fluida con bibliotecas de ciencia de datos y su capacidad para visualizar datos en tiempo real.
Ventajas de Usar Streamlit:
-
Desarrollo Rápido: Streamlit permite convertir scripts de Python en aplicaciones web interactivas con una mínima cantidad de código adicional. Esto agiliza el proceso de desarrollo, permitiendo a los equipos enfocarse más en la lógica del negocio y en la visualización de los datos.
-
Interactividad y Visualización Dinámica: Con Streamlit, es sencillo agregar controles como sliders, botones, y entradas de texto que permiten a los usuarios interactuar directamente con los datos. Además, la capacidad de actualizar gráficos y tablas en tiempo real mejora significativamente la experiencia del usuario.
-
Integración Sencilla con Bibliotecas de Python: Streamlit se integra perfectamente con bibliotecas populares como Pandas, Matplotlib, Plotly, y TensorFlow, lo que facilita la visualización de datos complejos y modelos de machine learning.
-
Despliegue Sencillo: Las aplicaciones creadas con Streamlit pueden ser desplegadas fácilmente en diferentes entornos, incluyendo servidores locales o servicios en la nube, lo que permite su acceso y uso por parte de diferentes equipos de trabajo o clientes.