Interroger et comparer les expériences et les exécutions avec MLflow
Les expériences et les tâches (ou exécutions) dans Azure Machine Learning peuvent être interrogées à l’aide de MLflow. Vous n’avez pas besoin d’installer un KIT de développement logiciel (SDK) spécifique pour gérer ce qui se passe à l’intérieur d’un travail de formation, ce qui crée une transition plus fluide entre les exécutions locales et le cloud en supprimant les dépendances spécifiques au cloud. Dans cet article, vous allez apprendre à interroger et comparer les expériences et les exécutions dans votre espace de travail avec Azure Machine Learning et le kit de développement logiciel (SDK) MLflow dans Python.
MLflow vous donne les possibilités suivantes :
- Créez, interrogez, supprimez et recherchez des expériences dans un espace de travail.
- Interroger, supprimer et rechercher des exécutions dans un espace de travail.
- Suivez, puis récupérez des métriques, des paramètres, des artefacts et des modèles depuis des exécutions.
Si vous souhaitez obtenir une comparaison détaillée entre MLflow open source et MLflow lorsque le système est connecté à Azure Machine Learning, veuillez consulter la rubrique Matrice de prise en charge pour interroger des exécutions et des expériences dans Azure Machine Learning.
Remarque
Le Kit de développement logiciel (SDK) Azure Machine Learning Python v2 ne fournit pas de fonctionnalités de journalisation ou de suivi natives. Cela s’applique non seulement à la journalisation, mais également à l’interrogation des métriques journalisées. Utilisez plutôt MLflow pour gérer les expériences et les exécutions. Cet article explique comment utiliser MLflow pour gérer les expériences et les exécutions dans Azure Machine Learning.
Vous pouvez également interroger et rechercher des expériences et des exécutions à l’aide de l’API REST MLflow. Pour obtenir un exemple sur la façon de l’utiliser, consultez Utilisation de REST MLflow avec Azure Machine Learning.
Prérequis
Installer le package du SDK MLflow
mlflow
et le plug-inazureml-mlflow
d’Azure Machine Learning pour MLflow de la manière suivante :pip install mlflow azureml-mlflow
Conseil
Vous pouvez utiliser le package
mlflow-skinny
qui est un package MLflow léger sans dépendances de stockage SQL, de serveur, d’interface utilisateur ou de science des données. Ce package est recommandé pour les utilisateurs qui ont principalement besoin des fonctionnalités de suivi et de journalisation de MLflow, sans importer la suite complète de fonctionnalités, notamment les déploiements.Créez un espace de travail Azure Machine Learning. Pour créer un espace de travail, consultez Créer les ressources dont vous avez besoin pour commencer. Examinez les autorisations d’accès nécessaires pour effectuer vos opérations MLflow dans votre espace de travail.
Pour effectuer un suivi à distance, autrement dit, pour suivre des expériences qui s’exécutent en dehors d’Azure Machine Learning, configurez MLflow pour qu’il pointe vers l’URI de suivi de votre espace de travail Azure Machine Learning. Pour plus d’informations sur la connexion de MLflow à votre espace de travail, consultez Configurer MLflow pour Azure Machine Learning.
Expériences de requête et de recherche
Utilisez MLflow pour rechercher des expériences à l’intérieur de votre espace de travail. Regardez les exemples suivants :
Obtenir toutes les expériences actives :
mlflow.search_experiments()
Remarque
Dans les versions héritées de MLflow (<2.0), utilisez plutôt la méthode
mlflow.list_experiments()
.Obtenir toutes les expériences, y compris archivées :
from mlflow.entities import ViewType mlflow.search_experiments(view_type=ViewType.ALL)
Obtenir une expérience spécifique par nom :
mlflow.get_experiment_by_name(experiment_name)
Obtenir une expérience spécifique par ID :
mlflow.get_experiment('1234-5678-90AB-CDEFG')
Expériences de recherche
La méthode search_experiments()
, disponible depuis Mlflow 2.0, vous permet de rechercher des expériences qui correspondent aux critères à l’aide de filter_string
.
Récupérer plusieurs expériences en fonction de leurs ID :
mlflow.search_experiments(filter_string="experiment_id IN (" "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')" )
Récupérer toutes les expériences créées après un délai donné :
import datetime dt = datetime.datetime(2022, 6, 20, 5, 32, 48) mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
Récupérer toutes les expériences avec une balise donnée :
mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
Exécutions de requête et de recherche
MLflow vous permet de rechercher des exécutions à l’intérieur de n’importe quelle expérience, et même de plusieurs expériences simultanément. La méthode mlflow.search_runs()
accepte l’argument experiment_ids
et experiment_name
pour indiquer sur quelles expériences vous souhaitez effectuer une recherche. Vous pouvez également utiliser search_all_experiments=True
si vous souhaitez effectuer une recherche sur toutes les expériences de l’espace de travail :
Par nom de l’expérience :
mlflow.search_runs(experiment_names=[ "my_experiment" ])
Par ID d’expérience :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
Rechercher toutes les expériences dans l’espace de travail :
mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
Notez que experiment_ids
prend en charge la fourniture d’un tableau d’expériences pour que vous puissiez rechercher des exécutions sur plusieurs expériences si nécessaire. Cela peut être utile si vous souhaitez comparer les exécutions d’un même modèle lorsqu’il est journalisé dans différentes expériences (par différentes personnes ou différentes itérations de projet).
Important
Si experiment_ids
, experiment_names
ou search_all_experiments
ne sont pas spécifiés, MLflow effectue une recherche par défaut dans l’expérience active en cours. Vous pouvez définir l’expérience active avec mlflow.set_experiment()
.
Par défaut, MLflow retourne les données au format Pandas Dataframe
, ce qui simplifie le traitement supplémentaire de notre analyse des exécutions. Les données retournées incluent des colonnes avec :
- des informations de base sur l’exécution ;
- des paramètres portant le nom de colonne
params.<parameter-name>
; - des métriques (dernière valeur journalisée) avec le nom de colonne
metrics.<metric-name>
.
Toutes les métriques et tous les paramètres sont également retournés lors de l’interrogation des exécutions. Cependant, pour les métriques contenant plusieurs valeurs (par exemple, une courbe de perte ou une courbe PR), seule la dernière valeur de la métrique est retournée. Si vous souhaitez récupérer toutes les valeurs d’une métrique donnée, utilisez la méthode mlflow.get_metric_history
. Pour obtenir un exemple, consultez Obtention de paramètres et de métriques à partir d’une exécution.
Exécutions d’ordres
Par défaut, les expériences sont triées par ordre décroissant de start_time
, c’est-à-dire le moment où l’expérience a été mise en file d’attente dans Azure Machine Learning. Toutefois, vous pouvez modifier cette valeur par défaut à l’aide du paramètre order_by
.
L’ordre s’exécute par attributs, comme
start_time
:mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], order_by=["attributes.start_time DESC"])
Commandez les exécutions et limitez les résultats. L’exemple suivant retourne la dernière exécution unique de l’expérience :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], max_results=1, order_by=["attributes.start_time DESC"])
L’ordre s’exécute par l’attribut
duration
:mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], order_by=["attributes.duration DESC"])
Conseil
attributes.duration
n’est pas présent dans MLflow OSS, mais fourni dans Azure Machine Learning à des fins pratiques.L’ordre s’exécute en fonction des valeurs de la métrique :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
Avertissement
L’utilisation de
order_by
avec des expressions contenantmetrics.*
,params.*
outags.*
dans le paramètreorder_by
n’est pas prise en charge actuellement. À la place, utilisez la méthodeorder_values
de Pandas, comme indiqué dans l’exemple.
Séries de filtres
Vous pouvez également rechercher une exécution avec une combinaison spécifique dans les hyperparamètres à l’aide du paramètre filter_string
. Utilisez params
pour accéder aux paramètres de l’exécution, metrics
pour accéder aux métriques enregistrées dans l’exécution et attributes
pour accéder aux informations d’exécution. MLflow prend en charge les expressions jointes par le mot clé AND (la syntaxe ne prend pas en charge OR) :
Exécutions de la recherche en fonction de la valeur d’un paramètre :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="params.num_boost_round='100'")
Avertissement
Seuls les opérateurs
=
,like
et!=
sont pris en charge pour le filtrage deparameters
.Exécutions de la recherche en fonction de la valeur d’une métrique :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="metrics.auc>0.8")
Exécutions de la recherche avec une balise donnée :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="tags.framework='torch'")
Exécutions de la recherche créée par un utilisateur donné :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.user_id = 'John Smith'")
Exécutions de la recherche qui ont échoué. Pour connaître les valeurs possibles, consultez Filtrage des exécutions par état :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.status = 'Failed'")
Exécutions de la recherche créées après une heure donnée :
import datetime dt = datetime.datetime(2022, 6, 20, 5, 32, 48) mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string=f"attributes.creation_time > '{int(dt.timestamp())}'")
Conseil
Pour la clé
attributes
, les valeurs doivent toujours être des chaînes et donc être encodées entre guillemets.Exécutions de la recherche qui durent plus d’une heure :
duration = 360 * 1000 # duration is in milliseconds mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string=f"attributes.duration > '{duration}'")
Conseil
attributes.duration
n’est pas présent dans MLflow OSS, mais fourni dans Azure Machine Learning à des fins pratiques.Exécutions de la recherche qui ont l’ID dans un ensemble donné :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
Filtrage des exécutions par état
Lorsque vous filtrez les exécutions par état, MLflow utilise une convention différente pour nommer les différents états possibles d’une exécution par rapport à Azure Machine Learning. Le tableau suivant présente les valeurs possibles :
État du travail Azure Machine Learning | attributes.status MLflow |
Signification |
---|---|---|
Portage non commencé | Scheduled |
La tâche/l’exécution a été reçue par Azure Machine Learning. |
File d'attente | Scheduled |
Le travail/l’exécution est planifié(e) pour l’exécution, mais celle-ci n’a pas encore démarré. |
Préparation en cours | Scheduled |
Le travail/l’exécution n’a pas encore commencé, mais un calcul a été alloué pour son exécution et il prépare l’environnement et ses entrées. |
Exécution en cours | Running |
Le travail/l’exécution est actuellement en cours d’exécution active. |
Effectué | Finished |
Le travail/l’exécution s’est terminé(e) sans erreurs. |
Échec | Failed |
Le travail/l’exécution s’est terminé(e) avec des erreurs. |
Annulé | Killed |
Le travail/l’exécution a été annulé(e) par l’utilisateur ou arrêté(e) par le système. |
Exemple :
mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
filter_string="attributes.status = 'Failed'")
Obtenir des métriques, des paramètres, des artefacts et des modèles
La méthode search_runs
retourne un Pandas Dataframe
qui contient une quantité limitée d’informations par défaut. Vous pouvez obtenir des objets Python si nécessaire, ce qui peut être utile pour obtenir des détails sur ces objets. Utilisez le paramètre pour contrôler la façon dont la sortie output_format
est retournée :
runs = mlflow.search_runs(
experiment_ids=[ "1234-5678-90AB-CDEFG" ],
filter_string="params.num_boost_round='100'",
output_format="list",
)
Les détails sont ensuite accessibles à partir du membre info
. L'exemple suivant montre comment obtenir le run_id
:
last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)
Obtenir des paramètres et des métriques depuis une exécution
Lorsque des exécutions sont retournées à l’aide de output_format="list"
, vous pouvez facilement accéder aux paramètres à l’aide de la clé data
:
last_run.data.params
De la même façon, vous pouvez interroger les métriques :
last_run.data.metrics
Pour les métriques contenant plusieurs valeurs (par exemple, une courbe de perte ou une courbe PR), seule la dernière valeur de la métrique est retournée. Si vous souhaitez récupérer toutes les valeurs d’une métrique donnée, utilisez la méthode mlflow.get_metric_history
. Cette méthode vous oblige à utiliser le MlflowClient
:
client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")
Obtenir des artefacts depuis une exécution
MLflow peut interroger n’importe quel artefact journalisé par une exécution. Vous ne pouvez pas accéder aux artefacts à l’aide de l’objet d’exécution lui-même et vous devez utiliser le client MLflow à la place :
client = mlflow.tracking.MlflowClient()
client.list_artifacts("1234-5678-90AB-CDEFG")
La méthode précédente liste tous les artefacts journalisés dans l’exécution, mais ils restent stockés dans le magasin d’artefacts (stockage Azure Machine Learning). Pour télécharger l’un d’eux, utilisez la méthode download_artifact
:
file_path = mlflow.artifacts.download_artifacts(
run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)
Notes
Dans les versions héritées de MLflow (<2.0), utilisez plutôt la méthode MlflowClient.download_artifacts()
.
Obtenir des modèles depuis une exécution
Les modèles peuvent également être journalisés dans l’exécution, puis récupérés directement à partir de celle-ci. Pour récupérer un modèle, vous devez connaître le chemin d’accès à l’artefact où il est stocké. La méthode list_artifacts
permet de trouver des artefacts qui représentent un modèle, car les modèles MLflow sont toujours des dossiers. Vous pouvez télécharger un modèle en spécifiant le chemin d’accès de l’emplacement de stockage du modèle à l’aide de la méthode download_artifact
:
artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)
Vous pouvez ensuite charger le modèle à partir des artefacts téléchargés à l’aide de la fonction classique load_model
dans l’espace de noms à saveur spécifique. L'exemple suivant utilise xgboost
:
model = mlflow.xgboost.load_model(model_local_path)
MLflow vous permet également d’effectuer les deux opérations à la fois, puis de télécharger, puis de charger le modèle dans une seule instruction. MLflow télécharge le modèle dans un dossier temporaire, puis le charge depuis cet emplacement. La méthode load_model
utilise le format URI pour indiquer à partir de quel emplacement le modèle doit être récupéré. Dans le cas du chargement d’un modèle à partir d’une exécution, la structure d’URI est la suivante :
model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")
Conseil
Si vous souhaitez interroger et charger des modèles inscrits dans le registre de modèles, veuillez consulter la rubrique Gérer les registres de modèles dans Azure Machine Learning avec MLflow.
Obtenir des exécutions enfants (imbriquées)
MLflow prend en charge le concept d’exécutions enfants (imbriquées). Ces exécutions sont utiles lorsque vous devez faire tourner des routines de formation qui doivent être suivies indépendamment du processus de formation principal. Les processus d’optimisation du réglage des hyperparamètres ou les pipelines Azure Machine Learning sont des exemples typiques de travaux qui génèrent plusieurs exécutions enfants. Vous pouvez interroger toutes les exécutions enfants d’une exécution spécifique à l’aide de la balise de propriété mlflow.parentRunId
, qui contient l’ID d’exécution de l’exécution parente.
hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)
Comparer des travaux et des modèles dans Azure Machine Learning studio (préversion)
Pour comparer et évaluer la qualité de vos travaux et modèles dans Azure Machine Learning studio, utilisez le panneau de préversion pour activer la fonctionnalité. Une fois activée, vous pouvez comparer les paramètres, les métriques et les balises entre les travaux et/ou les modèles que vous avez sélectionnés.
Important
Les éléments marqués (préversion) dans cet article sont actuellement en préversion publique. La préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail en production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.
Les notebooks MLflow avec Azure Machine Learning illustrent et développent les concepts abordés dans cet article.
- Former et suivre un classifieur avec MLflow : démontre comment suivre des expériences à l’aide de MLflow, journaliser des modèles et combiner plusieurs saveurs dans des pipelines.
- Gérer les expériences et les exécutions avec MLflow : démontre comment interroger des expériences, des exécutions, des métriques, des paramètres et des artefacts depuis Azure Machine Learning à l’aide de MLflow.
Matrice de prise en charge pour l’interrogation des exécutions et des expériences
Le kit SDK MLflow expose plusieurs méthodes pour récupérer les exécutions, y compris des options permettant de contrôler ce qui est retourné et comment. Utilisez le tableau suivant pour en savoir plus sur les méthodes actuellement prises en charge dans MLflow dans le cadre d’une connexion à Azure Machine Learning :
Fonctionnalité | Pris en charge par MLflow | Pris en charge par Azure Machine Learning |
---|---|---|
Tri des exécutions par attributs | ✓ | ✓ |
Tri des exécutions par métriques | ✓ | 1 |
Tri des exécutions par paramètres | ✓ | 1 |
Tri des exécutions par balises | ✓ | 1 |
Filtrage des exécutions par attributs | ✓ | ✓ |
Filtrage des exécutions par métriques | ✓ | ✓ |
Filtrage des exécutions par métriques avec des caractères spéciaux (échappement) | ✓ | |
Filtrage des exécutions par paramètres | ✓ | ✓ |
Filtrage des exécutions par balises | ✓ | ✓ |
Filtrage des exécutions à l’aide de comparateurs numériques (métriques) y compris = , != , > , >= , < et <= |
✓ | ✓ |
Filtrage des exécutions à l’aide de comparateurs de chaînes (paramètres, balises et attributs) : = et != |
✓ | ✓2 |
Filtrage des exécutions à l’aide de comparateurs de chaînes (paramètres, balises et attributs) : LIKE /ILIKE |
✓ | ✓ |
Filtrage des exécutions à l’aide de comparateurs AND |
✓ | ✓ |
Filtrage des exécutions à l’aide de comparateurs OR |
||
Renommage des expériences | ✓ |
Notes
- 1 Consultez la section Commande d’exécutions pour obtenir des instructions et des exemples sur la façon d’obtenir les mêmes fonctionnalités dans Azure Machine Learning.
- 2
!=
pour les balises non prises en charge.