Suivi d'expériences avec MLflow sur Databricks Community Edition

Introduction au Databricks Community Edition et MLflow

Chaque jour, le nombre d’outils permettant aux Data Scientists de créer des modèles plus rapidement augmente. Par conséquent, la nécessité de gérer les résultats et les modèles eux-mêmes devient évidente. MLflow répond à ce besoin avec ses capacités de suivi d’expériences, la prise en charge du packaging et son registre de modèles. Nous avons déjà décrit la déclinaison open-source de MLflow, que nous pouvons configurer et exécuter sur une machine locale. Dans ce tutoriel, nous allons essayer sa version gérée sur la plateforme Databricks Community Edition (CE). CE est une édition gratuite avec une puissance de calcul limitée, principalement dédiée à l’apprentissage. Les fonctionnalités de MLflow en mode hébergé sur CE sont limitées. Nous pouvons l’utiliser pour le suivi des expériences, mais nous ne pouvons pas servir des accès distants ou pour déployer le modèle. Le déploiement vers le registre n’est lui non plus pas supporté. De plus, nous ne pouvons pas exécuter de projets MLflow sur CE. Cependant, cela suffira à montrer les avantages du suivi des expériences et l’expérience utilisateur offerte par l’environnement Databricks.

Databricks Community Edition (CE) a déjà été décrit plus en détail et nous avons également montré comment importer un jeu de données dans l’environnement. Si vous avez besoin d’un rappel, vous pouvez commencer par cet article.

Créer un compte Databricks Community Edition

Tout d’abord, créez un compte Community Edition si vous ne l’avez pas déjà. Les fichiers que nous allons utiliser peuvent être téléchargés depuis mon dépôt GitHub :

  • notebooks :

    • train_initial.ipynb avec le code de base du modèle que nous allons modifier
    • train_final.ipynb avec toutes les modifications
  • le jeu de données : winequality-red.csv

Nous utiliserons le runtime standard Databricks Runtime. Il comprend Apache Spark et un certain nombre de composants et de mises à jour qui améliorent l’exploitabilité, les performances et la sécurité des traitements Big Data. J’utilisais Databricks Runtime 6.4 (Apache Spark 2.4.5, Scala 2.11) et MLflow 1.7.2.

Suivi d’expériences avec MLflow géré sur Databricks Community Edition

Note avant de commencer : le cluster Community Edition se désactive après 120 minutes de non-activité et vous ne pouvez pas le redémarrer. Si ça vous arrive, vous devrez le supprimer et en créer un nouveau.

Tout d’abord, créons un nouveau cluster en cliquant sur l’icône Clusters dans la barre latérale, puis sur Créer un cluster. Nommez-le mlflow et gardez une version d’exécution et une zone de disponibilité par défaut. Lorsque le cluster sera opérationnel, nous allons installer la bibliothèque mlflow.

Install MLflow

Allez dans Workspace et créez un nouveau dossier mlflow_test. Vous y sauvegarderez vos exécutions par la suite. En faisant un clic droit sur le nom, importez train_initial.ipynb. Après l’importation du notebook, cliquez sur son nom pour l’ouvrir. Actuellement, il n’est attaché à aucun cluster, donc vous ne pouvez pas l’exécuter. Vous pouvez l’attacher à votre cluster mlflow en cliquant sur le menu déroulant dans le coin supérieur gauche du notebook, sous le titre. Le cluster apparaîtra sur la liste et vous pourrez le joindre.

Attach cluster

Ajoutez le nom de l’expérience au début de la fonction train. Une expérience désigne un groupe d’exécutions nommé.

def train(in_alpha, in_l1_ratio):   # Une ligne existante
  mlflow.set_experiment('/mlflow_test/elasticnet_wine')

À la fin de la fonction, ajoutez les instructions pour sauvegarder les données que nous utilisons pour l’entraînement.

mlflow.sklearn.log_model(lr, "model")    # Une ligne existante
data.to_csv('winequality_red.txt', encoding = 'utf-8', index=False)
mlflow.log_artifact('winequality_red.txt')

Maintenant, nous allons tester différentes combinaisons des paramètres alpha et rations l1 dans notre modèle. Une fois tous les tests terminés, nous pouvons trouver les résultats dans /mlflow_test/elasticnet_wine. En cliquant sur le nom d’un test, nous voyons les détails, y compris les artefacts que nous avons sauvegardés. Tous les artefacts peuvent être téléchargés. De plus, nous avons accès au notebook avec le code source qui a produit ce modèle.

Model source code

En cliquant dessus, nous ouvrons le notebook et à droite, nous avons un historique des changements. Si vous souhaitez restaurer d’anciennes versions du code, vous pouvez facilement le faire en cliquant sur Restore this revision.

Revision history

Nous pouvons enrichir notre exemple avec une source de données reproductible. La version exacte des données de test doit être sauvegardée pour reproduire les expériences si nécessaire et à des fins d’audit. Dans notre cas, nous téléchargeons les données sur la qualité du vin à partir d’une URL chaque fois que nous exécutons le code. Il est facile d’imaginer que les auteurs de ce jeu de données le mettent à jour ou même le suppriment. Par conséquent, notre modèle commencera à produire des résultats différents ou échouera complètement, sans comprendre pourquoi. Nous allons examiner deux façons d’y remédier : tout d’abord, nous chargerons un ensemble de données dans le système de fichiers Databricks (DBFS) et créerons une table. Si vous ne savez pas comment faire, consultez cet article. J’ai nommé ma table wine_quality et elle est stockée dans la base de données wine_db.

Puisqu’on utilise Scikit-learn, il nous faut de données d’entrée en pandas DataFrame. Pour l’obtenir, on peut créer des Spark DataFrames à partir d’une table puis les convertir en pandas DataFrames. Il est important de comprendre que cela va collecter les partitions de données de tous les workers et créer une grande table dans la mémoire du driver, où elle sera traitée en mode nœud unique. Pour rappel, dans Databricks CE, nous n’avons pas de workers. Cela fonctionne bien si le jeu de données est suffisamment petit. Dans le cas de gros jeu de données, nous devrions utiliser Apache Spark MLlib, qui fonctionne sur des données distribuées.

data = spark.table("wine_db.wine_quality").toPandas()

Vous pouvez utiliser cette options ci-dessus pour remplacer l’ensemble du bloc de téléchargement (Cmd 6 20-27). Vous êtes maintenant prêts à suivre vos expériences en ayant le contrôle de vos jeux de données.

Conclusion

Dans ce tutorial, nous avons découvert un environnement convivial, qui peut être facilement utilisé pour le suivi des expériences. Nous pouvons enregistrer des artefacts et des métriques pour une utilisation ultérieure, y compris les modèles et la liste des dépendances. La plateforme utilisée peut suffire pour une école ou un projet de loisirs, mais pour un usage professionnel, il faudrait se tourner vers la version open source ou Enterprise Edition.

References

Canada - Morocco - France

International locations

10 rue de la Kasbah
2393 Rabbat
Canada

Nous sommes une équipe passionnées par l'Open Source, le Big Data et les technologies associées telles que le Cloud, le Data Engineering, la Data Science le DevOps…

Nous fournissons à nos clients un savoir faire reconnu sur la manière d'utiliser les technologies pour convertir leurs cas d'usage en projets exploités en production, sur la façon de réduire les coûts et d'accélérer les livraisons de nouvelles fonctionnalités.

Si vous appréciez la qualité de nos publications, nous vous invitons à nous contacter en vue de coopérer ensemble.