MLflow sur le cloud
Dans cet article, je vais parler de la façon d'héberger mlflow sur le cloud (AWS et GCP), d'exécuter des expériences d'apprentissage automatique, de consigner les paramètres, les métriques et de stocker le modèle dans le registre des modèles.
Qu'est-ce que mlflow ?
mlflow est une plate-forme open source qui gère le cycle de vie de l'apprentissage automatique de bout en bout. Ses principales fonctionnalités sont :
- Suivi des expériences : conserve toutes les expériences d'apprentissage automatique et permet de les interroger
- Reproductibilité : Il empaquette le code d'apprentissage automatique et est capable de reproduire ces résultats sur n'importe quelle plate-forme
- Déploiement : possibilité de déployer les modèles ML dans une variété d'environnements (ex : AWS Sagemaker, GCP Cloud run, .. etc.)
- Registre des modèles : conserver plusieurs versions du modèle dans un référentiel centralisé
Nous pouvons exécuter mlflow sur des machines locales, mais l'héberger sur le cloud a ses avantages
- Nous pouvons tirer parti du stockage en nuage, de la puissance de calcul, de la sécurité, etc.
- Vue centralisée de toutes les expériences de chaque membre de l'équipe
Nous avons les 3 composants principaux suivants dans mlflow :
- Tableau de bord : C'est une interface utilisateur où l'on peut voir la liste des expériences, les paramètres du modèle, les métriques .. etc pour chaque expérience
- Meta Store : Il utilise une base de données backend (MySql) pour stocker toutes les expériences, paramètres, métriques, etc.
- Artifactory Store : Il l'utilise pour les fichiers volumineux, comme le modèle sérialisé. En général, nous utilisons des systèmes de fichiers distribués comme Amazon S3 ou GCP Cloud Storage.
- Docker
- Base de données MySql
- Système de fichiers distribué
Le diagramme d'architecture ci-dessus montre quels sont tous les services AWS dont nous avons besoin et comment interagissent-ils pour héberger mlflow sur AWS. Nous allons lancer le mlflow en utilisant AWS Fargate qui est sans serveur.
Tout d'abord, nous devons créer un fichier docker, qui regroupe mlflow et ses dépendances. Nous définissons les dépendances suivantes dans requirements.txt
Le fichier docker pour l'installation de mlflow et l'exécution du serveur
Le fichier docker contient le compartiment et d'autres détails de connexion à la base de données en tant que variables, ces valeurs seront configurées en tant que variables d'environnement dans la définition de tâche Fargate
Une fois que nous avons le fichier docker, exécutez la commande ci-dessous pour créer l'image docker
docker build -t mlflowtracker .
Maintenant, nous devons pousser l'image docker que nous avons créée localement sur le registre de conteneurs dans AWS.
# Login
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
Ensuite, nous avons besoin de MySql pour que mlflow stocke les méta-informations, pour lesquelles nous allons créer une instance AWS RDS MySql
Pour connaître les étapes de création de MySql dans AWS RDS, cliquez ici
Nous devons créer un compartiment S3 pour que mlflow stocke les artefacts du modèle. Accédez à la console aws, recherchez s3, fournissez le nom du compartiment et assurez-vous de bloquer tous les accès publics et cliquez sur "Créer un compartiment"
Ensuite, nous devons créer un cluster AWS ECS en sélectionnant fargate comme calcul. Accédez à la console aws et recherchez le service de conteneur élastique et cliquez sur "Créer un cluster". Dans la page de création de cluster, indiquez le nom du cluster, sélectionnez vpc et sous-réseau. Par défaut, l'option fargate serait sélectionnée.
Dans ECS, une tâche est une entité de niveau granulaire qui exécute l'image docker, elle est similaire à un pod dans kubernetes. Nous devons donc créer une définition de tâche qui utilisera l'image docker que nous avons téléchargée sur ECR. Ici, nous définissons les valeurs des variables d'environnement. Pour créer une définition de tâche, accédez à Amazon Elastic Container Service > Définitions de tâche > Créer une nouvelle définition de tâche et indiquez le nom de la tâche, l'uri de l'image que nous avons chargée sur ECR, le port du conteneur et les variables d'environnement.
Lors de la création de la définition de tâche, sélectionnez le rôle ecsTaskExecution qui est créé automatiquement par AWS, assurez-vous d'ajouter une stratégie d'accès s3 afin qu'elle puisse lire et écrire dans le compartiment s3
Une fois la définition de tâche créée, nous devons créer un service qui utilise la définition de tâche créée ci-dessus. Lors de la création du service, nous pouvons sélectionner le nombre minimum et maximum de tâches dont nous avons besoin (je n'ai sélectionné qu'une seule tâche), afin qu'il puisse évoluer automatiquement. Nous avons la possibilité de créer un équilibreur de charge lors de cette étape.
Pour créer un service ECS, accédez à Amazon Elastic Container Service >clusters >cluster_name> Créer et fournir le nom du service, sélectionnez la définition de tâche et sa révision que nous avons créées précédemment, entrez le nombre minimum et maximum de tâches, sélectionnez vpc dans la section mise en réseau, sélectionnez l'application équilibreur de charge dans la section équilibreur de charge et fournissez le nom, le port de liste, le nom du groupe cible
Une fois que nous avons créé le service, il lance le nombre requis de tâches, nous pouvons utiliser l'URL de l'équilibreur de charge pour lancer le tableau de bord mlflow.
Remarque : L'équilibreur de charge utilise un groupe de sécurité qui définit les règles de réseau entrant et sortant. Vous devez modifier/ajouter des règles afin de pouvoir accéder à l'interface utilisateur mlflow.
Maintenant que nous avons hébergé mlflow sur AWS, exécutons une expérience d'apprentissage automatique à partir de notre local en pointant vers le mlflow sur le cloud
Après avoir exécuté l'expérience, nous pouvons voir tous les paramètres, métriques et modèles dans mlflow que nous avons enregistrés pendant l'expérience
MLflow sur GCP
Le diagramme d'architecture ci-dessus montre les services GCP dont nous avions besoin et comment ils interagissent pour héberger mlflow sur GCP. Nous allons lancer le mlflow en utilisant GCP Cloudrun qui est sans serveur.
Nous pouvons utiliser le même Dockerfile et requirements.txt (veuillez vous référer à la section MLflow sur AWS) sauf que nous devons changer boto3 en google-cloud-storage
Les variables à l'intérieur du Dockerfile pour l'artefact par défaut, les détails de connexion à la base de données seront configurés en tant que variables d'environnement dans google cloudrun
Exécutez les commandes suivantes pour créer, baliser et transférer l'image Docker vers Google Container Registry (GCR)
# Build docker image
docker build -t mlflowtracker-gcp .
# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker
# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest
# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest
Nous avons créé une instance de base de données, nous devons maintenant créer une base de données et un utilisateur afin que mlflow puisse utiliser ces détails pour se connecter à la base de données. Dans la page SQL, cliquez sur Bases de données et cliquez sur Créer une base de données pour fournir le nom de la base de données. De même, cliquez sur le lien des utilisateurs et fournissez le nom d'utilisateur et le mot de passe
Nous devons créer un bucket de stockage cloud pour que mlflow stocke les artefacts de modèle. Pour créer un compartiment de stockage cloud, recherchez le stockage cloud dans la console GCP, cliquez sur le bouton "Créer", indiquez le nom du compartiment, la région et cliquez sur Créer
Nous allons créer un service cloudrun dans gcp qui utilisera l'image docker que nous avons téléchargée sur le registre des conteneurs. Pour créer une instance d'exécution dans le cloud, accédez à la page d'exécution dans le cloud, cliquez sur créer un service, sélectionnez l'image de conteneur que nous avons téléchargée sur GCR, fournissez le port de conteneur, les valeurs de CPU et de mémoire, les instances min et max pour la mise à l'échelle automatique et les variables d'environnement.
Remarque : Assurez-vous que le compte de service que vous avez choisi dans cloudrun a accès au stockage dans le cloud, sinon le téléchargement de l'artefact du modèle échouerait
Maintenant que nous avons hébergé mlflow sur GCP, exécutons une expérience d'apprentissage automatique à partir de notre local en pointant vers le mlflow sur le cloud
Après avoir exécuté l'expérience, nous pouvons voir tous les paramètres, métriques et modèles dans mlflow que nous avons enregistrés pendant l'expérience
Remarque : Nous avons créé toutes les ressources cloud manuellement à l'aide de la console. L'utilisation de l'infrastructure en tant que code (Terraform ou CloudFormation) est une bonne pratique.
J'espère que vous avez très bien compris comment nous pouvons héberger mlflow sur les plates-formes cloud AWS et GCP et exécuter des expériences d'apprentissage automatique sur le cloud
Bon apprentissage !!