MLflow sur le cloud

May 09 2023
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 de 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 : Nous pouvons exécuter mlflow sur des machines locales, mais l'héberger sur le cloud a ses avantages Nous avons les 3 composants principaux suivants dans mlflow : Le diagramme d'architecture ci-dessus montre quels sont tous les services AWS dont nous avons besoin et comment ils interagissent dans afin d'héberger mlflow sur AWS.

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 :

  1. Suivi des expériences : conserve toutes les expériences d'apprentissage automatique et permet de les interroger
  2. Reproductibilité : Il empaquette le code d'apprentissage automatique et est capable de reproduire ces résultats sur n'importe quelle plate-forme
  3. Déploiement : possibilité de déployer les modèles ML dans une variété d'environnements (ex : AWS Sagemaker, GCP Cloud run, .. etc.)
  4. 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

  1. Nous pouvons tirer parti du stockage en nuage, de la puissance de calcul, de la sécurité, etc.
  2. Vue centralisée de toutes les expériences de chaque membre de l'équipe

Nous avons les 3 composants principaux suivants dans mlflow :

  1. 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
  2. Meta Store : Il utilise une base de données backend (MySql) pour stocker toutes les expériences, paramètres, métriques, etc.
  3. 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.
  1. Docker
  2. Base de données MySql
  3. Système de fichiers distribué
Architecture MLflow-AWS

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 .

Créer un référentiel AWS ECR

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"

Créer un compartiment S3

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.

Créer un cluster ECS

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.

Définition de la tâche ECS

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

Service ECS pour l'orchestration des tâches
Équilibreur de charge de service ECS

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 avec des résultats expérimentaux — AWS

MLflow sur GCP

Architecture MLflow-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

Création d'une instance MySQL GCP pour le métastore mlflow

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

Création de base de données MySQL GCP
Création d'utilisateurs de la base de données MySQL GCP

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

Compartiment GCP pour l'artefact du modèle mlflow

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.

GCP Cloud Run
Configuration de GCP Cloud Run

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

mlflow avec résultats expérimentaux — GCP

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 !!