Migrer la journalisation du SDK v1 vers SDK v2
Azure Machine Learning utilise MLflow Tracking pour la journalisation des métriques et le stockage d’artefacts pour vos expériences, que vous ayez créé l’expérience via le SDK Python Azure Machine Learning, l’interface CLI Azure Machine Learning ou Azure Machine Learning studio. Nous vous recommandons d’utiliser MLflow pour les expériences de suivi.
Si vous migrez du SDK v1 vers le SDK v2, utilisez les informations de cette section pour comprendre les équivalents MLflow des API de journalisation du SDK v1.
Pourquoi MLflow ?
Avec plus de 13 millions de téléchargements mensuels, MLflow est devenu la plateforme standard pour les MLOps de bout en bout : il permet aux équipes de toute taille de suivre, partager, empaqueter et déployer n’importe quel modèle pour l’inférence par lots ou en temps réel. Azure Machine Learning s’intègre à MLflow. Cela vous permet d’obtenir un code d’entraînement disposant d’une véritable portabilité et s’intégrant de façon transparente à d’autres plateformes, car il ne contient pas d’instructions spécifiques à Azure Machine Learning.
Préparer la migration vers MLflow
Pour utiliser le suivi MLflow, vous devez installer le package SDK MLflowmlflow
et le plug-in Azure Machine Learning pour MLflow azureml-mlflow
. Tous les environnements Azure Machine Learning mettent déjà ces packages à votre disposition, mais vous devez les inclure si vous créez votre propre environnement.
pip install mlflow azureml-mlflow
Se connecter à un espace de travail
Azure Machine Learning permet aux utilisateurs de suivre les travaux d’entraînement exécutés sur votre espace de travail ou exécutés à distance (suivi d’expériences exécutées en dehors d’Azure Machine Learning). Si vous effectuez un suivi à distance, vous devez indiquer l’espace de travail auquel vous souhaitez connecter MLflow.
Vous êtes déjà connecté à votre espace de travail quand l’exécution s’effectue dans la capacité de calcul Azure Machine Learning.
Expériences et exécutions
SDK v1
from azureml.core import Experiment
# create an Azure Machine Learning experiment and start a run
experiment = Experiment(ws, "create-experiment-sdk-v1")
azureml_run = experiment.start_logging()
SDK v2 avec MLflow
# Set the MLflow experiment and start a run
mlflow.set_experiment("logging-with-mlflow")
mlflow_run = mlflow.start_run()
Comparaison des API de journalisation
Journaliser une métrique de type entier ou float
SDK v1
azureml_run.log("sample_int_metric", 1)
SDK v2 avec MLflow
mlflow.log_metric("sample_int_metric", 1)
Journaliser une métrique booléenne
SDK v1
azureml_run.log("sample_boolean_metric", True)
SDK v2 avec MLflow
mlflow.log_metric("sample_boolean_metric", 1)
Journaliser une métrique de chaîne
SDK v1
azureml_run.log("sample_string_metric", "a_metric")
SDK v2 avec MLflow
mlflow.log_text("sample_string_text", "string.txt")
- La chaîne est journalisée en tant qu’artefact, et non en tant que métrique. Dans Azure Machine Learning Studio, la valeur s’affiche sous l’onglet Sorties + journaux.
Journaliser une image dans un fichier PNG ou JPEG
SDK v1
azureml_run.log_image("sample_image", path="Azure.png")
SDK v2 avec MLflow
mlflow.log_artifact("Azure.png")
L’image est enregistrée en tant qu’artefact et apparaît sous l’onglet Images dans Azure Machine Learning Studio.
Journaliser un matplotlib.pyplot
SDK v1
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
azureml_run.log_image("sample_pyplot", plot=plt)
SDK v2 avec MLflow
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
fig, ax = plt.subplots()
ax.plot([0, 1], [2, 3])
mlflow.log_figure(fig, "sample_pyplot.png")
- L’image est enregistrée en tant qu’artefact et apparaît sous l’onglet Images dans Azure Machine Learning Studio.
Journaliser une liste des métriques
SDK v1
list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
azureml_run.log_list('sample_list', list_to_log)
SDK v2 avec MLflow
list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time
metrics = [Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log]
MlflowClient().log_batch(mlflow_run.info.run_id, metrics=metrics)
- Les métriques apparaissent sous l’onglet Métriques dans Azure Machine Learning studio.
- Les valeurs de texte ne sont pas prises en charge.
Journaliser une ligne de métriques
SDK v1
azureml_run.log_row("sample_table", col1=5, col2=10)
SDK v2 avec MLflow
metrics = {"sample_table.col1": 5, "sample_table.col2": 10}
mlflow.log_metrics(metrics)
- Les métriques ne s’affichent pas en tant que table dans Azure Machine Learning studio.
- Les valeurs de texte ne sont pas prises en charge.
- Journalisé en tant qu’artefact, et non en tant que métrique.
Journaliser une table
SDK v1
table = {
"col1" : [1, 2, 3],
"col2" : [4, 5, 6]
}
azureml_run.log_table("table", table)
SDK v2 avec MLflow
# Add a metric for each column prefixed by metric name. Similar to log_row
row1 = {"table.col1": 5, "table.col2": 10}
# To be done for each row in the table
mlflow.log_metrics(row1)
# Using mlflow.log_artifact
import json
with open("table.json", 'w') as f:
json.dump(table, f)
mlflow.log_artifact("table.json")
- Journalise des métriques pour chaque colonne.
- Les métriques ne s’affichent pas en tant que table dans Azure Machine Learning studio.
- Les valeurs de texte ne sont pas prises en charge.
- Journalisé en tant qu’artefact, et non en tant que métrique.
Journaliser un table de précision
SDK v1
ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
'[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
'432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
'114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
'"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'
azureml_run.log_accuracy_table('v1_accuracy_table', ACCURACY_TABLE)
SDK v2 avec MLflow
ACCURACY_TABLE = '{"schema_type": "accuracy_table", "schema_version": "v1", "data": {"probability_tables": ' +\
'[[[114311, 385689, 0, 0], [0, 0, 385689, 114311]], [[67998, 432002, 0, 0], [0, 0, ' + \
'432002, 67998]]], "percentile_tables": [[[114311, 385689, 0, 0], [1, 0, 385689, ' + \
'114310]], [[67998, 432002, 0, 0], [1, 0, 432002, 67997]]], "class_labels": ["0", "1"], ' + \
'"probability_thresholds": [0.52], "percentile_thresholds": [0.09]}}'
mlflow.log_dict(ACCURACY_TABLE, 'mlflow_accuracy_table.json')
- Les métriques ne s’affichent pas en tant que table de précision dans Azure Machine Learning studio.
- Journalisé en tant qu’artefact, et non en tant que métrique.
- La méthode
mlflow.log_dict
est expérimentale.
Journaliser une matrice de confusion
SDK v1
CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
'["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'
azureml_run.log_confusion_matrix('v1_confusion_matrix', json.loads(CONF_MATRIX))
SDK v2 avec MLflow
CONF_MATRIX = '{"schema_type": "confusion_matrix", "schema_version": "v1", "data": {"class_labels": ' + \
'["0", "1", "2", "3"], "matrix": [[3, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]]}}'
mlflow.log_dict(CONF_MATRIX, 'mlflow_confusion_matrix.json')
- Les métriques ne s’affichent pas en tant que matrice de fusion dans Azure Machine Learning studio.
- Journalisé en tant qu’artefact, et non en tant que métrique.
- La méthode
mlflow.log_dict
est expérimentale.
Journaliser des prédictions
SDK v1
PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'
azureml_run.log_predictions('test_predictions', json.loads(PREDICTIONS))
SDK v2 avec MLflow
PREDICTIONS = '{"schema_type": "predictions", "schema_version": "v1", "data": {"bin_averages": [0.25,' + \
' 0.75], "bin_errors": [0.013, 0.042], "bin_counts": [56, 34], "bin_edges": [0.0, 0.5, 1.0]}}'
mlflow.log_dict(PREDICTIONS, 'mlflow_predictions.json')
- Les métriques ne s’affichent pas en tant que matrice de fusion dans Azure Machine Learning studio.
- Journalisé en tant qu’artefact, et non en tant que métrique.
- La méthode
mlflow.log_dict
est expérimentale.
Journaliser des résidus
SDK v1
RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'
azureml_run.log_residuals('test_residuals', json.loads(RESIDUALS))
SDK v2 avec MLflow
RESIDUALS = '{"schema_type": "residuals", "schema_version": "v1", "data": {"bin_edges": [100, 200, 300], ' + \
'"bin_counts": [0.88, 20, 30, 50.99]}}'
mlflow.log_dict(RESIDUALS, 'mlflow_residuals.json')
- Les métriques ne s’affichent pas en tant que matrice de fusion dans Azure Machine Learning studio.
- Journalisé en tant qu’artefact, et non en tant que métrique.
- La méthode
mlflow.log_dict
est expérimentale.
Afficher les informations d’exécution et les données
Vous pouvez accéder aux informations d’exécution à l’aide des propriétés data
et info
de l’objet d’exécution MLflow (mlflow.entities.Run).
Conseil
Vous pouvez interroger les informations de suivi des expériences et des exécutions dans Azure Machine Learning à l’aide de MLflow, qui fournit une API de recherche complète pour interroger et rechercher facilement des expériences et des exécutions, et comparer rapidement les résultats. Pour plus d’informations sur toutes les fonctionnalités de MLflow dans cette dimension, consultez Requête & comparer les expériences et les exécutions avec MLflow
L’exemple suivant montre comment récupérer une exécution terminée :
from mlflow.tracking import MlflowClient
# Use MlFlow to retrieve the run that was just completed
client = MlflowClient()
finished_mlflow_run = MlflowClient().get_run("<RUN_ID>")
L’exemple suivant montre comment afficher metrics
, tags
et params
:
metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params
Notes
metrics
aura seulement la valeur journalisée la plus récente pour une métrique donnée. Par exemple, si vous journalisez dans l’ordre une valeur de 1
, puis 2
, 3
et enfin 4
en une métrique nommée sample_metric
, seule 4
sera présente dans le dictionnaire metrics
. Pour obtenir toutes les métriques enregistrées pour une métrique nommée spécifique, utilisez MlFlowClient.get_metric_history :
with mlflow.start_run() as multiple_metrics_run:
mlflow.log_metric("sample_metric", 1)
mlflow.log_metric("sample_metric", 2)
mlflow.log_metric("sample_metric", 3)
mlflow.log_metric("sample_metric", 4)
print(client.get_run(multiple_metrics_run.info.run_id).data.metrics)
print(client.get_metric_history(multiple_metrics_run.info.run_id, "sample_metric"))
Pour plus d’informations, consultez les informations de référence sur MlFlowClient.
Le champ info
fournit des informations générales sur l’exécution, telles que l’heure de début, l’ID d’exécution, l’ID d’expérience, etc. :
run_start_time = finished_mlflow_run.info.start_time
run_experiment_id = finished_mlflow_run.info.experiment_id
run_id = finished_mlflow_run.info.run_id
Afficher les artefacts des exécutions
Pour afficher les artefacts d’une exécution, utilisez MlFlowClient.list_artifacts.
client.list_artifacts(finished_mlflow_run.info.run_id)
Pour télécharger un artefact, utilisez mlflow.artifacts.download_artifacts :
mlflow.artifacts.download_artifacts(run_id=finished_mlflow_run.info.run_id, artifact_path="Azure.png")