MLflow es una plataforma de código abierto diseñada para gestionar el ciclo de vida completo del aprendizaje automático. Databricks lo creó como un proyecto interno para abordar los desafíos que enfrentan en sus propios procesos de desarrollo e implementación de aprendizaje automático. Posteriormente, MLflow se lanzó como un proyecto de código abierto en junio de 2018.
Como herramienta para gestionar el ciclo de vida completo, MLflow contiene los siguientes componentes.
Es posible instalar todas estas capacidades en una máquina de desarrollo para que los ingenieros puedan experimentar a su gusto sin preocuparse por estropear una instalación de producción.
Todos los archivos utilizados para instalar y configurar MLflow se pueden encontrar en nuestro repositorio de Github .
La documentación de MLFlow enumera no menos de 6 opciones para instalar MLFlow. Esto puede parecer excesivo, pero estas opciones se adaptan a diferentes preferencias para una base de datos y a distintos niveles de complejidad de la red.
A continuación se muestra la opción más adecuada para una organización que tiene varios equipos que utilizan grandes conjuntos de datos y crean modelos que pueden llegar a ser bastante grandes. Esta opción requiere la configuración de tres servidores: un servidor de seguimiento, una base de datos PostgreSQL y un almacén de objetos S3; nuestra implementación utilizará MinIO.
El servidor de seguimiento es un punto de entrada único desde la máquina de desarrollo de un ingeniero para acceder a la funcionalidad de MLflow. (No se deje engañar por su nombre: contiene todos los componentes enumerados anteriormente: seguimiento, modelo, proyectos y repositorios). El servidor de seguimiento utiliza PostgreSQL para almacenar entidades. Las entidades son ejecuciones, parámetros, métricas, etiquetas, notas y metadatos. (Más sobre ejecuciones más adelante). El servidor de seguimiento en nuestra implementación accede a MinIO para almacenar artefactos. Ejemplos de artefactos son modelos, conjuntos de datos y archivos de configuración.
Lo bueno de las herramientas modernas disponibles para los ingenieros hoy en día es que pueden emular un entorno de producción, incluida la elección de herramientas y la conectividad de red, utilizando contenedores. Eso es lo que mostraré en este post. Mostraré cómo usar Docker Compose para instalar los servidores descritos anteriormente como servicios que se ejecutan en un contenedor. Además, la configuración de MLflow está configurada de manera que pueda usar una instancia existente de MinIO si lo desea. En esta publicación, mostraré cómo implementar una nueva instancia de MinIO, pero los archivos en nuestro repositorio de Github tienen un archivo `docker-compose` que muestra cómo conectarse a una instancia existente de MinIO.
A continuación se muestra una lista de todo lo que debe instalarse. Esta lista incluye servidores que se convertirán en servicios en contenedores (MinIO, Postgres y MLFlow), así como los SDK que necesitará (MinIO y MLflow).
Escritorio acoplable
Servidor de seguimiento MLFlow a través de Docker Compose
Servidor MinIO a través de Docker Compose
PostgresSQL a través de Docker Compose
MLFlow SDK mediante instalación de pip
MinIO SDK mediante instalación de pip
Comencemos con Docker Desktop, que servirá como host para nuestros servicios Docker Compose.
Puede encontrar la instalación adecuada para su sistema operativo en el sitio de Docker. Si está instalando Docker Desktop en una Mac, necesita saber qué chip está usando su Mac: Apple o Intel. Puede determinar esto haciendo clic en el ícono de Apple en la esquina superior izquierda de su Mac y haciendo clic en la opción de menú "Acerca de esta Mac".
Ahora estamos listos para instalar nuestros servicios.
El servidor de seguimiento MLFLow, PostgresSQL y MinIO se instalarán como servicios utilizando el archivo Docker Compose que se muestra a continuación.
version: "3.3" services: db: restart: always image: postgres container_name: mlflow_db expose: - "${PG_PORT}" networks: - backend environment: - POSTGRES_USER=${PG_USER} - POSTGRES_PASSWORD=${PG_PASSWORD} - POSTGRES_DATABASE=${PG_DATABASE} volumes: - ./db_data:/var/lib/postgresql/data/ healthcheck: test: ["CMD", "pg_isready", "-p", "${PG_PORT}", "-U", "${PG_USER}"] interval: 5s timeout: 5s retries: 3 s3: restart: always image: minio/minio container_name: mlflow_minio volumes: - ./minio_data:/data ports: - "${MINIO_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" networks: - frontend - backend environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ADDRESS=${MINIO_ADDRESS} - MINIO_PORT=${MINIO_PORT} - MINIO_STORAGE_USE_HTTPS=${MINIO_STORAGE_USE_HTTPS} - MINIO_CONSOLE_ADDRESS=${MINIO_CONSOLE_ADDRESS} command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 tracking_server: restart: always build: ./mlflow image: mlflow_server container_name: mlflow_server depends_on: - db ports: - "${MLFLOW_PORT}:5000" networks: - frontend - backend environment: - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY} - MLFLOW_S3_ENDPOINT_URL=http://s3:${MINIO_PORT} - MLFLOW_S3_IGNORE_TLS=true command: > mlflow server --backend-store-uri postgresql://${PG_USER}:${PG_PASSWORD}@db:${PG_PORT}/${PG_DATABASE} --host 0.0.0.0 --serve-artifacts --artifacts-destination s3://${MLFLOW_BUCKET_NAME} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MLFLOW_PORT}/"] interval: 30s timeout: 10s retries: 3 volumes: db_data: minio_data: networks: frontend: driver: bridge backend: driver: bridge
Hay algunas cosas que vale la pena tener en cuenta y que le ayudarán a solucionar problemas en caso de que algo salga mal. Primero, tanto MinIO como PostgreSQL utilizan el sistema de archivos local para almacenar datos. Para PostgreSQL, esta es la carpeta `db_data` y para MinIO, es la carpeta `minio_data`. Si alguna vez desea comenzar de nuevo con una instalación limpia, elimine estas carpetas.
A continuación, este archivo Docker Compose está controlado por la configuración. Por ejemplo, en lugar de codificar el nombre de la base de datos PostgreSQL en `mlflow`, el nombre proviene del archivo `config.env` que se muestra a continuación usando la siguiente sintaxis en el archivo Docker Compose: `${PG_DATABASE}`.
# Postgres configuration PG_USER=mlflow PG_PASSWORD=mlflow PG_DATABASE=mlflow PG_PORT=5432 # MLflow configuration MLFLOW_PORT=5000 MLFLOW_BUCKET_NAME=mlflow # MinIO access keys - these are needed by MLflow MINIO_ACCESS_KEY=XeAMQQjZY2pTcXWfxh4H MINIO_SECRET_ACCESS_KEY=wyJ30G38aC2UcyaFjVj2dmXs1bITYkJBcx0FtljZ # MinIO configuration MINIO_ROOT_USER: 'minio_user' MINIO_ROOT_PASSWORD: 'minio_pwd' MINIO_ADDRESS: ':9000' MINIO_STORAGE_USE_HTTPS: False MINIO_CONSOLE_ADDRESS: ':9001' MINIO_PORT=9000 MINIO_CONSOLE_PORT=9001
Todas las variables de entorno que necesitan estos servicios se configuran en este archivo. Este archivo de configuración también contiene información necesaria para que estos servicios se comuniquen entre sí. Tenga en cuenta que es el uso de variables de entorno lo que informa al servidor MLFlow Tracking cómo acceder a MinIO. En otras palabras, la URL (incluido el número de puerto), la clave de acceso, la clave de acceso secreta y el depósito. Esto me lleva a mi punto final y más importante sobre el uso de Docker Compose: la primera vez que abra estos servicios, los servicios de seguimiento de MLflow no funcionarán porque primero deberá ingresar a la interfaz de usuario de MinIO, obtener sus claves y crear el depósito. que el servicio de seguimiento utilizará para almacenar artefactos.
Hagamos esto ahora. Inicie los servicios por primera vez usando el siguiente comando.
docker-compose --env-file config.env up -d --build
Asegúrese de ejecutar este comando en el mismo directorio donde se encuentra su archivo Docker Compose.
Ahora podemos obtener nuestras claves y crear nuestro depósito usando la interfaz de usuario de MinIO.
Desde su navegador, vaya a `localhost:9001`. Si especificó un puerto diferente para la dirección de la consola MinIO en el archivo `docker-compose`, use ese puerto en su lugar. Inicie sesión con el usuario root y la contraseña especificados en el archivo `config.env`.
Una vez que inicie sesión, navegue hasta la pestaña Claves de acceso y haga clic en el botón Crear clave de acceso.
Esto lo llevará a la página Crear clave de acceso.
Su clave de acceso y clave secreta no se guardan hasta que haga clic en el botón Crear. No salga de esta página hasta que lo haya hecho. No te preocupes por copiar las claves de esta pantalla. Una vez que haga clic en el botón Crear, se le dará la opción de descargar las claves a su sistema de archivos (en un archivo JSON). Si desea utilizar el SDK de MinIO para administrar datos sin procesar, cree otra clave de acceso y otra clave secreta mientras se encuentra en esta página.
A continuación, cree un depósito llamado "mlflow". Esto es sencillo: vaya a la pestaña Depósitos y haga clic en el botón "Crear depósito".
Una vez que tenga sus claves y haya creado su depósito, puede terminar de configurar los servicios deteniendo los contenedores, actualizando `config.env` y luego reiniciando los contenedores. El siguiente comando detendrá y eliminará sus contenedores.
docker-compose down
Para reiniciar:
docker-compose --env-file config.env up -d --build
A continuación, iniciemos la interfaz de usuario de MLflow y asegurémonos de que todo esté funcionando.
Navegue hasta `localhost: 5000`. Debería ver la interfaz de usuario de MLflow.
Tómate un tiempo para explorar todas las pestañas. Si es nuevo en MLflow, familiarícese con el concepto de ejecuciones y experimentos.
El paquete MLflow Python es una instalación simple de "pip". Recomiendo instalarlo en un entorno virtual Python.
pip install mlflow
Verifique la instalación enumerando la biblioteca MLflow.
pip list | grep mlflow
Deberías ver la biblioteca a continuación.
mlflow 2.5.0
No necesita acceder a MinIO directamente para aprovechar las funciones de MLflow: el SDK de MLflow interactuará con la instancia de MinIO que configuramos anteriormente. Sin embargo, es posible que desee interactuar con esta instancia de MinIO directamente para administrar los datos antes de enviarlos a MLflow. MinIO es una excelente manera de almacenar todo tipo de datos no estructurados. MinIO aprovecha al máximo el hardware subyacente, por lo que puede guardar todos los datos sin procesar que necesita sin preocuparse por la escala o el rendimiento . MinIO incluye funciones de replicación de depósitos para mantener sincronizados los datos en múltiples ubicaciones. Además, algún día se regulará la IA; Cuando llegue ese día, necesitará las funciones empresariales de MinIO ( bloqueo de objetos , control de versiones , cifrado y bloqueos legales ) para proteger sus datos en reposo y asegurarse de no eliminar accidentalmente algo que una agencia reguladora pueda solicitar.
Si instaló el paquete MLflow Python en un entorno virtual, instale MinIO en el mismo entorno.
pip install minio
Verifique nuevamente la instalación.
pip list | grep minio
Esto confirmará que la biblioteca Minio se instaló y mostrará la versión que está utilizando.
minio 7.1.15
Esta publicación proporcionó una receta fácil de seguir para configurar MLflow y MinIO en una máquina de desarrollo. El objetivo era ahorrarle el tiempo y el esfuerzo de investigar los servidores MLflow y la configuración de Docker-Compose.
Se hizo todo lo posible para mantener esta receta precisa. Si tiene algún problema, háganoslo saber enviándonos un mensaje a [email protected] o uniéndose a la discusión en nuestro canal general de Slack .
Está listo para comenzar a codificar y entrenar modelos con MLflow y MinIO.
También publicado aquí .