Concept
Le cycle de travail quotidien de tout data scientist ou data engineer contient au moins une sauvegarde/un téléchargement d'un modèle, qu'il soit fraîchement entraîné ou pré-entraîné pour un ajustement plus poussé. Être capable de suivre le cycle de vie d’un modèle, de le partager ou d’en explorer d'autres sont autant de tâches qui incombent régulièrement à un data scientist. Cela vaut également pour les datasets, les démonstrations techniques, etc. C'est de là qu’est apparu le besoin d'un HUB centralisé pour faciliter toutes ces tâches.
Pour cela, nous explorerons les outils qui permettent le chargement et le téléchargement de modèles (push and pull), le versioning, la supervision (monitoring), la gestion d’utilisateurs (user management) et la génération de Demo|API.
Dans cet article nous évaluerons 4 plateformes : Hugging Face, MLflow, DataHub et Weights & Biases (W&B)
1. Hugging Face
Hugging Face a deux outils très complets, Hugging Face Hub et Hugging Face Spaces. Le premier fonctionne comme un endroit centralisé où chacun peut partager et explorer des modèles et des datasets. Le second permet d'héberger des applications qui utilisent ces modèles.
Hugging Face Hub utilise des répertoires basés sur Git. Ce sont des espaces de stockage pouvant contenir tous les fichiers liés au modèle. Il offre d'autres avantages tels que :
Le versioning
L’historique des commits et les différences
Les branches
Répertoire d’un modèle BERT
Ces répertoires sont complétés par plusieurs informations/fonctionnalités utiles:
Des métadonnées sur le modèle (tâches, langues, métriques, etc.)
On peut jouer avec le modèle directement dans le navigateur !
Les graphiques des métriques d’entrainement sont affichés si le répertoire contient des traces TensorBoard.
Une API est fournie pour utiliser les modèles dans une configuration de production.
Un widget est également fourni pour faire des inférences directement dans le navigateur.
Il est possible d’utiliser les modèles de Hugging Face Hub dans plus de 10 frameworks tels que 🤗 Transformers, Asteroid et ESPnet
Widget d’un modèle BERT
Hugging Face Spaces, tout comme Hugging Face Hub, utilise des répertoires basés sur Git pour stocker le code de l'application. Il permet l'utilisation de deux SDK pour le développement d'applications Python (Streamlit et Gradio) ainsi que l'utilisation de HTML pour personnaliser les applications.
Exemple d’un Space dans HuggingFace Spaces
Il permet également de gérer les variables d'environnement, les dépendances externes et les métadonnées.
Pour l'utilisation de ces outils, Hugging Face propose deux plans à usage professionnel :
Plans à usage professionnel
👍 Les Pour :
- Bonne gamme d'outils
- Bonnes intégrations avec des outils externes
- Facile à utiliser et à déployer
👎 Les Contre :
- Limitation d'un espace privé uniquement disponible dans un plan personnalisé
- Des problèmes peuvent survenir avec les projets Open Source
2. MLflow
MLflow est une plateforme qui se compose de 4 partie : Tracking, Projects, Models, et Model Registry.
Tracking
MLflow Tracking permet le stockage de divers paramètres du modèle et centralise les données liées à son exécution. Il utilise un service web pour établir une connexion entre l'application client et le serveur de suivi. Le serveur de suivi saisit les données suivantes du modèle et utilise le backend pour les enregistrer:
Paramètres d'enregistrement
Versions du code
Métriques
Balises et notes supplémentaires
Heure de début et de fin de l'exécution
MLflow Tracking crée un dossier avec des fichiers locaux pour chaque exécution. Pour les environnements de production, il permet l'intégration avec différents services tels que Amazon S3, Azure Blob, GCS ou Databricks, ainsi que le stockage des métadonnées dans un SQL store (tels que SQL Lite et MySQL).
Projects
MLflow Projects offre un format standard pour le packaging de code réutilisable. Chaque projet est un répertoire contenant du code ou un répertoire Git et utilise un fichier descripteur (YAML) ou une convention pour spécifier ses dépendances et comment exécuter le code. Il est également possible de configurer le conteneur Docker et Kubernetes pour l'exécution du projet. MLflow Projects fournit des outils en ligne de commande et une API pour exécuter le projet et créer le flux de travail.
Ci-dessous un exemple d'un fichier descripteur où le fichier conda.yaml est utilisé comme environnement conda (pour l’installation des dépendances du projet):
1 name: my-demo
2 conda_env: conda.yaml
3 entry_points:
4 model_run:
5 parameters:
6 max_depth: int
7 max_leaf_nodes: {type: int, default: 32}
8 model_name: {type: string, default: "tree-classification"}
9 run_origin: {type: string, default: "default" }
10 command: "python model_run.py -r {max_depth} {max_leaf_nodes} {model_name}"
Il est possible de créer un projet multi-étapes couvrant différents points d'entrée (flux de travail de production). MLflow donne l'exemple suivant:
1 name: multistep_example
2
3 conda_env: conda.yaml
4
5 entry_points:
6 load_raw_data:
7 command: "python load_raw_data.py"
8
9 etl_data:
10 parameters:
11 ratings_csv: path
12 max_row_limit: {type: int, default: 100000}
13 command: "python etl_data.py --ratings-csv {ratings_csv} --max-row-limit {max_row_limit}"
14
15 als:
16 parameters:
17 ratings_data: path
18 max_iter: {type: int, default: 10}
19 reg_param: {type: float, default: 0.1}
20 rank: {type: int, default: 12}
21 command: "python als.py --ratings-data {ratings_data} --max-iter {max_iter} --reg-param {reg_param} --rank {rank}"
22
23 train_keras:
24 parameters:
25 ratings_data: path
26 als_model_uri: string
27 hidden_units: {type: int, default: 20}
28 command: "python train_keras.py --ratings-data {ratings_data} --als-model-uri {als_model_uri} --hidden-units {hidden_units}"
29
30 main:
31 parameters:
32 als_max_iter: {type: int, default: 10}
33 keras_hidden_units: {type: int, default: 20}
34 max_row_limit: {type: int, default: 100000}
35 command: "python main.py --als-max-iter {als_max_iter} --keras-hidden-units {keras_hidden_units}
36 --max-row-limit {max_row_limit}"
Nous pouvons résumer les étapes de la construction de notre projet de la manière suivante :
1. Créer un fichier MLproject [définir le point d’entrée du projet].
2. Créer un fichier conda.yaml pour toutes les dépendances python.
3. Créer un projet python et enregistrer les fichiers MLproject et conda.yaml dans le répertoire racine (ou tout autre emplacement contenant l'exécuteur principal)
4. Pusher le projet python sur GitHub
5. Tester le projet local ainsi que le projet sur Github.
test local → mlflow run . -P <param> test github →mlflow run git://<projet-url> <param>.
Models
Un MLfLow Model est un format de packaging standard des modèles sous plusieurs “flavors” et une variété d'outils pour les utiliser. Le concept de “flavor” fait la particularité de MLflow Models. Il s’agit d’une convention utilisée par les outils de déploiement intégrés dans MLflow (built-in) pour comprendre le modèle. Par exemple, la “flavor” mlflow.sklearn permet au modèle d'être chargé comme un objet Pipeline de sickit-learn qui pourra être utilisé dans un code utilisant sickit-learn.
Chaque modèle est stocké sous la forme d'un répertoire contenant des fichiers arbitraires et un fichier descripteur énumérant les différentes "flavors" dans lesquelles le modèle peut être utilisé.
Les objectifs des "flavors" sont les suivants :
Utiliser le même format de mémoire pour différents systèmes.
Éviter les surcharges de communication entre systèmes (sérialisation et désérialisation).
Fournir des fonctionnalités communes partageables.
Les "flavors" sont généralement de deux types :
les flavors intégrées (disponibles pour les algorithmes et bibliothèques de machine learning les plus populaires): H2O, Keras, MLeap, PyTorch, Scikit-Learn, MLlib, Tensorflow, ONNX (Open Neural Network Exchange), MXNET gluon, XGBoost, LightGBM
Custom flavors (docs)
Model Registry
MLflow Model Registry gère le cycle de vie complet du modèle de machine learning et fournit les fonctionnalités suivantes :
Centralized model store: Stockage pour le modèle enregistré.
Model lineage: Détails des expériences et des exécutions
Model versioning: Tracer les versions du modèle enregistré.
Model Stage: Attribution de phases prédéfinies ou personnalisées à chaque version de modèle (e.g. "Staging" et "Production") pour représenter le cycle de vie d'un modèle. Avant de déployer un modèle dans une application de production, la bonne pratique consiste souvent à le tester dans un environnement de préparation.
CRUD operations sur les modèles enregistrés : Create, update, delete, archive, list, etc.
Il existe deux types de workflows dans MLflow Model Registry : UI workflow et API workflow.
UI workflow
On commence par enregistrer le modèle sur la page Artifacts dans la section MLflow.
Ensuite on ajoute un nouveau modèle dans le champ ''Model name'' (on peut choisir parmi les modèles existants ou fournir un nouveau nom)
Une fois nommé, la section "Registered model" affichera les détails du modèle.
Toutes les versions des modèles seront affichées dans leurs sections détaillées.
La phase du modèle (Model Stage) peut être modifiée de la phase d'attente à celle de production à partir du menu déroulant.
API workflow
Une autre alternative pour utiliser Model Registry est d’utiliser l’interface API. Cette interface permet une multitude d’opérations sur le modèle (voir détails ici), notamment:
Publier un nouveau modèle : Il existe trois fonctions pour enregistrer un modèle et effectuer des opérations dessus :
mlflow.<model_flavor>.log_model() mlflow.register_model() ou mlflow.client.create_registered_model().
Récupérer un modèle
Modifier la description du modèle
Mettre à jour la phase de déploiement d'un modèle publié.
Chercher et lister des modèles
etc.
3. DataHub
DataHub est une plateforme de métadonnées composée de 5 composants : Metadata Store, Metadata Models, Ingestion Framework, GraphQL API et User Interface, nous allons principalement nous concentrer sur les 2 composants: Metadata Store et Ingestion Framework, puisque les autres servent principalement à la communication entre les différentes entités de DataHub, aux événements et à l'interface utilisateur
Composants de DataHub
Metadata Store
Il s’agit du module responsable du stockage et de la gestion des métadonnées des différentes entités (datasets, pipelines, etc.). Il est possible de consulter, de modifier ou de supprimer des informations, tant à partir du service web que de la console via des appels HTTP. Datahub utilise Mysql, Elasticseach et Kafka.
Ingestion Framework
Une importante fonctionnalité de Datahub est qu’il permet l'intégration avec de nombreux outils de manière modulaire pour alimenter le magasin de métadonnées, comme Snowflake, Looker, MySQL, Kafka, etc. Ainsi de nouvelles informations sont importées à partir de modèles ou de datasets.
Par ailleurs, Datahub offre plusieurs fonctionnalités, notamment :
La Recherche et la Découverte en profondeur: Datahub permet d’exécuter facilement des recherches parmi tous les types d'entités. Il permet de voir les dépendances entre elles, de voir les statistiques associées et les recommandations par similarité.
La Documentation et le Tagging: Datahub permet de rédiger une documentation pour chacune des entités pour enrichir les informations qui lui sont liées. Il permet également de leur attribuer des tags.
La Gouvernance des données: il est possible de créer et d'affecter des utilisateurs ou des groupes aux entités, afin de restreindre leur accès ou leur visibilité ou d'attribuer des crédits.
👍 Le pour :
- Datahub permet l’intégration avec plusieurs outils externes pour alimenter ses propres données
- Il dispose d'une interface dynamique et les outils GraphQL lui confèrent une grande rapidité
- Il donne de l’importance à la gestion des utilisateurs et des groupes, ce que les autres outils ne permettent pas de faire nativement.
👎 Le Contre :
- Il s'agit d'un projet encore en cours de développement et, bien qu'il offre une gamme d'outils pour l'intégration de données, son utilisation est assez complexe (e.g. entrer des données à partir de modèles ou d'ensembles de données)
4. Weights and Biases
W&B est une plateforme qui offre 5 principaux outils qui couvrent 5 fonctionnalités :
Experiments pour le suivi
Reports pour l’analyse collaborative
Artifacts pour le le versioning des datasets et des modèles
Tables pour la data visualisation et l’analyse
Sweeps pour l’optimisation des hyperparamètres
Experiments
L’outil peut être facilement intégré à de nombreuses bibliothèques telles que Tensorflow, Pytorch, Keras, Scikit, Hugging Face, etc. Il permet de visualiser et de comparer les expériences et leurs métriques, vérifier l’avancement des expériences et visualiser en temps réel les résultats sur un ensemble de données. Il permet également de surveiller la consommation des ressources.
Reports
Il s'agit d'un outil qui permet, entre autres, de créer des rapports en direct et de manière collaborative, d'ajouter des graphiques, et de les exporter dans divers formats.
Artifacts
C'est l'outil de contrôle de version pour les modèles et les datasets. Il permet de sauvegarder à chaque étape d’entraînement les modèles et les datasets, et de comparer les modèles déjà entraînés pour évaluer leurs performances et voir leurs dépendances. Il intègre également un contrôle d'accès des utilisateurs à travers l’attribution des droits d'accès aux modèles et aux ensembles de données.
Tables
Il s'agit d'un outil de visualisation et d'analyse, permettant de filtrer, de trier, de générer de nouvelles colonnes à analyser dans un ensemble de données et de les comparer. Il permet également de créer des graphiques.
Sweeps
C’est l’outil d’optimisation des hyperparamètres. Il permet de visualiser les hyperparamètres qui impactent les métriques pertinentes et fournit des outils pour les optimiser. Il permet de conserver automatiquement les exécutions les plus prometteuses et de tester de nouvelles combinaisons d’hyperparamètres.
Résumé des composants de W&B.
Intégration
L’intégration de W&B est très simple. Il suffit d’initialiser le framework pour tout enregistrer. Il est possible de gérer tout le reste depuis le web.
1 # Integration for any Python script
2 import wandb
3 # 1. Start a W&B run
4 wandb.init(project='gpt3')
5 # Extract configuration
6 config=wandb.config
7 # Ready to do anything required
👍Le pour :
- Facile à intégrer. Il offre de très bons outils, ainsi qu'un contrôle d'accès.
👎Le Contre :
- W&B est payant. MLFlow offre la plupart des outils proposés et n'e contient au moins une sauvegarde/un téléchargement d'un modèle, qu'il soit fraîchement entraîné ou pré-entraîné pour un ajustement plus poussé. Être capable de suivre le cycle de vie d’un modèle, de le partager ou d’en explorer d'autres sont autant de tâches qui incombent régulièrement à un data scientist. Cela vaut également pour les datasets, les démonstrations techniques, etc. C'est de là qu’est apparu le besoin d'un HUB centralisé pour faciliter toutes ces tâches.r
Remerciement
Merci à nos collègues Ismail EL HATIMI et Renaud CARDIN pour la revue de l’article.
A propos de l’auteur
Javier MARTINEZ est data scientist à La Javaness depuis 2021.
Comments