MLflow est une plateforme open source conçue pour gérer le cycle de vie complet de l'apprentissage automatique. Databricks l'a créé en tant que projet interne pour relever les défis rencontrés dans leurs propres processus de développement et de déploiement d'apprentissage automatique. MLflow a ensuite été publié en tant que projet open source en juin 2018.
En tant qu'outil de gestion du cycle de vie complet, MLflow contient les composants suivants.
Il est possible d'installer toutes ces fonctionnalités sur une machine de développement afin que les ingénieurs puissent expérimenter à leur guise sans se soucier de gâcher une installation de production.
Tous les fichiers utilisés pour installer et configurer MLflow se trouvent dans notre référentiel Github .
La documentation MLFlow répertorie pas moins de 6 options pour installer MLFlow. Cela peut sembler excessif, mais ces options s'adaptent à différentes préférences pour une base de données et à différents niveaux de complexité du réseau.
L'option la mieux adaptée à une organisation qui dispose de plusieurs équipes utilisant de grands ensembles de données et créant des modèles qui peuvent eux-mêmes devenir assez volumineux est présentée ci-dessous. Cette option nécessite la configuration de trois serveurs - un serveur de suivi, une base de données PostgreSQL et un magasin d'objets S3 - notre implémentation utilisera MinIO.
Le serveur de suivi est un point d'entrée unique depuis la machine de développement d'un ingénieur pour accéder aux fonctionnalités MLflow. (Ne vous laissez pas tromper par son nom – il contient tous les composants répertoriés ci-dessus – Suivi, Modèle, Projets et Référentiels.) Le serveur de suivi utilise PostgreSQL pour stocker les entités. Les entités sont des exécutions, des paramètres, des métriques, des balises, des notes et des métadonnées. (Plus d'informations sur les exécutions plus tard.) Le serveur de suivi de notre implémentation accède à MinIO pour stocker les artefacts. Des exemples d'artefacts sont des modèles, des ensembles de données et des fichiers de configuration.
Ce qui est bien avec les outils modernes dont disposent les ingénieurs de nos jours, c'est que vous pouvez émuler un environnement de production - y compris le choix des outils et la connectivité réseau - à l'aide de conteneurs. C'est ce que je vais montrer dans cet article. Je vais montrer comment utiliser Docker Compose pour installer les serveurs décrits ci-dessus en tant que services exécutés dans un conteneur. De plus, la configuration de MLflow est configurée de telle sorte que vous pouvez utiliser une instance existante de MinIO si vous le souhaitez. Dans cet article, je vais montrer comment déployer une toute nouvelle instance de MinIO, mais les fichiers de notre référentiel Github ont un fichier « docker-compose » qui montre comment se connecter à une instance existante de MinIO.
Vous trouverez ci-dessous une liste de tout ce qui doit être installé. Cette liste comprend les serveurs qui deviendront des services dans des conteneurs (MinIO, Postgres et MLFlow), ainsi que les SDK dont vous aurez besoin (MinIO et MLflow).
Bureau Docker
Serveur de suivi MLFlow via Docker Compose
Serveur MinIO via Docker Compose
PostgresSQL via Docker Compose
SDK MLFlow via l'installation de pip
SDK MinIO via l'installation de pip
Commençons par Docker Desktop, qui servira d'hôte à nos services Docker Compose.
Vous pouvez trouver l' installation appropriée pour votre système d'exploitation sur le site de Docker. Si vous installez Docker Desktop sur un Mac, vous devez connaître la puce utilisée par votre Mac : Apple ou Intel. Vous pouvez le déterminer en cliquant sur l'icône Apple dans le coin supérieur gauche de votre Mac et en cliquant sur l'option de menu « À propos de ce Mac ».
Nous sommes maintenant prêts à installer nos services.
Le serveur de suivi MLFLow, PostgresSQL et MinIO seront installés en tant que services à l'aide du fichier Docker Compose présenté ci-dessous.
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
Il y a quelques points à noter qui vous aideront à résoudre les problèmes en cas de problème. Premièrement, MinIO et PostgreSQL utilisent tous deux le système de fichiers local pour stocker les données. Pour PostgreSQL, il s'agit du dossier `db_data` et pour MinIO, il s'agit du dossier `minio_data`. Si jamais vous souhaitez recommencer avec une nouvelle installation, supprimez ces dossiers.
Ensuite, ce fichier Docker Compose est basé sur la configuration. Par exemple, au lieu de coder en dur le nom de la base de données PostgreSQL en « mlflow », le nom provient du fichier « config.env » présenté ci-dessous en utilisant la syntaxe suivante dans le fichier 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
Toutes les variables d'environnement dont ces services ont besoin sont configurées dans ce fichier. Ce fichier de configuration contient également les informations nécessaires à la communication de ces services. Notez que c'est l'utilisation de variables d'environnement qui indique au serveur MLFlow Tracking comment accéder à MinIO. En d'autres termes, l'URL (y compris le numéro de port), la clé d'accès, la clé d'accès secrète et le bucket. Cela m'amène à mon dernier et plus important point sur l'utilisation de Docker Compose : la première fois que vous ouvrez ces services, les services de suivi MLflow ne fonctionneront pas car vous devrez d'abord accéder à l'interface utilisateur MinIO, obtenir vos clés et créer le compartiment. que le service de suivi utilisera pour stocker les artefacts.
Faisons-le maintenant. Démarrez les services pour la première fois à l'aide de la commande ci-dessous.
docker-compose --env-file config.env up -d --build
Assurez-vous d'exécuter cette commande dans le même répertoire où se trouve votre fichier Docker Compose.
Nous pouvons maintenant obtenir nos clés et créer notre bucket à l'aide de l'interface utilisateur MinIO.
Depuis votre navigateur, accédez à « localhost:9001 ». Si vous avez spécifié un port différent pour l'adresse de la console MinIO dans le fichier `docker-compose`, utilisez ce port à la place. Connectez-vous en utilisant l'utilisateur root et le mot de passe spécifiés dans le fichier `config.env`.
Une fois connecté, accédez à l’onglet Clés d’accès et cliquez sur le bouton Créer une clé d’accès.
Cela vous mènera à la page Créer une clé d'accès.
Votre clé d'accès et votre clé secrète ne sont enregistrées que lorsque vous cliquez sur le bouton Créer. Ne quittez pas cette page tant que cela n’est pas fait. Ne vous inquiétez pas de copier les clés de cet écran. Une fois que vous aurez cliqué sur le bouton Créer, vous aurez la possibilité de télécharger les clés sur votre système de fichiers (dans un fichier JSON). Si vous souhaitez utiliser le SDK MinIO pour gérer les données brutes, créez une autre clé d'accès et une autre clé secrète pendant que vous êtes sur cette page.
Ensuite, créez un bucket nommé « mlflow ». C'est simple, allez dans l'onglet Buckets et cliquez sur le bouton « Créer un bucket ».
Une fois que vous avez vos clés et que vous avez créé votre bucket, vous pouvez terminer la configuration des services en arrêtant les conteneurs, en mettant à jour le « config.env », puis en redémarrant les conteneurs. La commande ci-dessous arrêtera et supprimera vos conteneurs.
docker-compose down
Recommencer:
docker-compose --env-file config.env up -d --build
Commençons ensuite l'interface utilisateur MLflow et assurons-nous que tout fonctionne.
Accédez à « localhost :5000 ». Vous devriez voir l'interface utilisateur de MLflow.
Prenez le temps d'explorer tous les onglets. Si vous êtes nouveau sur MLflow, familiarisez-vous avec le concept d'exécutions et d'expériences.
Le package MLflow Python est une simple installation « pip ». Je recommande de l'installer dans un environnement virtuel Python.
pip install mlflow
Vérifiez à nouveau l'installation en répertoriant la bibliothèque MLflow.
pip list | grep mlflow
Vous devriez voir la bibliothèque ci-dessous.
mlflow 2.5.0
Vous n'avez pas besoin d'accéder directement à MinIO pour profiter des fonctionnalités de MLflow : le SDK MLflow s'interfacera avec l'instance de MinIO que nous avons configurée ci-dessus. Cependant, vous souhaiterez peut-être vous connecter directement à cette instance de MinIO pour gérer les données avant qu'elles ne soient transmises à MLflow. MinIO est un excellent moyen de stocker toutes sortes de données non structurées. MinIO utilise pleinement le matériel sous-jacent, vous pouvez donc enregistrer toutes les données brutes dont vous avez besoin sans vous soucier de l'évolutivité ou des performances . MinIO inclut des fonctionnalités de réplication de compartiment pour garder les données synchronisées dans plusieurs emplacements. De plus, un jour l’IA sera réglementée ; ce jour-là, vous aurez besoin des fonctionnalités d'entreprise de MinIO ( verrouillage d'objets , gestion des versions , cryptage et verrouillages légaux ) pour sécuriser vos données au repos et pour vous assurer de ne pas supprimer accidentellement quelque chose qu'une agence de réglementation pourrait demander.
Si vous avez installé le package MLflow Python dans un environnement virtuel, installez MinIO dans le même environnement.
pip install minio
Vérifiez à nouveau l'installation.
pip list | grep minio
Cela confirmera que la bibliothèque Minio a été installée et affichera la version que vous utilisez.
minio 7.1.15
Cet article fournissait une recette facile à suivre pour configurer MLflow et MinIO sur une machine de développement. L'objectif était de vous faire gagner du temps et des efforts liés à la recherche des serveurs MLflow et de la configuration de Docker-compose.
Tous les efforts ont été faits pour que cette recette reste exacte. Si vous rencontrez un problème, veuillez nous en informer en nous envoyant un message à [email protected] ou en rejoignant la discussion sur notre chaîne Slack générale .
Vous êtes prêt à commencer à coder et à former des modèles avec MLflow et MinIO.
Également publié ici .