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 mlflow du SDK MLflow et le plug-in Azure Machine Learning pour MLflow azureml-mlflow.

    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. mlflow-skinny 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.

  • Un espace de travail Azure Machine Learning. Vous pouvez en créer un en suivant le tutoriel : Créer des ressources de Machine Learning.

  • Si vous effectuez un suivi à distance (autrement dit, des expériences de suivi 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 obtenir 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_namesou 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 contenant metrics.*, params.* ou tags.* dans le paramètre order_by n’est pas prise en charge actuellement. À la place, utilisez la méthode order_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 =, likeet != sont pris en charge pour le filtrage de parameters.

  • 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.

Capture d’écran du panneau de préversion montrant comment comparer des travaux et des modèles dans Azure Machine Learning studio.

Les notebooks MLflow avec Azure Machine Learning illustrent et développent les concepts abordés dans cet article.

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.