Migrieren der Protokollierung vom SDK v1 zum SDK v2

Azure Machine Learning verwendet die MLflow-Nachverfolgung für die Metrikprotokollierung und Artefaktspeicherung für Ihre Experimente, unabhängig davon, ob Sie die Experimente über das Python-SDK für Azure Machine Learning, über die Azure Machine Learning CLI oder über das Azure Machine Learning Studio erstellt haben. Es wird empfohlen, MLflow für die Nachverfolgung von Experimenten zu verwenden.

Wenn Sie vom SDK v1 zum SDK v2 migrieren, verwenden Sie die Informationen in diesem Abschnitt, um die MLflow-Entsprechungen der SDK v1-Protokollierungs-APIs zu verstehen.

Gründe für MLflow

MLflow ist mit über 13 Mio. monatlichen Downloads zur Standardplattform für End-to-End-MLOps geworden und ermöglicht es Teams jeder Größe, jedes Modell für Batch- oder Echtzeitrückschlüsse zu verfolgen, freizugeben, zu packen und bereitzustellen. Azure Machine Learning ist in MLflow integriert, sodass Ihr Trainingscode echte Portabilität und nahtlose Integration mit anderen Plattformen erreichen kann, da er keine Azure Machine Learning-spezifischen Anweisungen enthält.

Vorbereiten der Migration zu MLflow

Wenn Sie die MLflow-Nachverfolgung verwenden möchten, müssen Sie das Mlflow SDK-Paket „mlflow“ und das Azure Machine Learning-Plug-In für MLflow „azureml-mlflow“installieren. In allen Azure Machine Learning-Umgebungen stehen diese Pakete bereits zur Verfügung, aber Sie müssen sie einbinden, wenn Sie Ihre eigene Umgebung erstellen.

pip install mlflow azureml-mlflow

Herstellen einer Verbindung mit Ihrem Arbeitsbereich

Mit Azure Machine Learning können Benutzer die Nachverfolgung in Trainingsaufträgen durchführen, die in Ihrem Arbeitsbereich oder remote ausgeführt werden (Nachverfolgung von Experimenten, die außerhalb von Azure Machine Learning ausgeführt werden). Für eine Remotenachverfolgung müssen Sie den Arbeitsbereich angeben, mit dem Sie MLflow verbinden möchten.

Sie sind bereits mit Ihrem Arbeitsbereich verbunden, wenn die Ausführung in Azure Machine Learning-Compute erfolgt.

Experimente und Ausführungen

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 mit MLflow

# Set the MLflow experiment and start a run
mlflow.set_experiment("logging-with-mlflow")
mlflow_run = mlflow.start_run()

Vergleich von Protokollierungs-APIs

Protokollieren einer integer- oder float-Metrik

SDK v1

azureml_run.log("sample_int_metric", 1)

SDK v2 mit MLflow

mlflow.log_metric("sample_int_metric", 1)

Protokollieren einer boolean-Metrik

SDK v1

azureml_run.log("sample_boolean_metric", True)

SDK v2 mit MLflow

mlflow.log_metric("sample_boolean_metric", 1)

Protokollieren einer string-Metrik

SDK v1

azureml_run.log("sample_string_metric", "a_metric")

SDK v2 mit MLflow

mlflow.log_text("sample_string_text", "string.txt")
  • Die Zeichenfolge wird als Artefakt protokolliert, nicht als Metrik. In Azure Machine Learning Studio wird der Wert auf der Registerkarte Ausgaben und Protokolle angezeigt.

Protokollieren eines Bilds in einer PNG- oder JPEG-Datei

SDK v1

azureml_run.log_image("sample_image", path="Azure.png")

SDK v2 mit MLflow

mlflow.log_artifact("Azure.png")

Das Bild wird als Artefakt protokolliert und wird auf der Registerkarte Bilder in Azure Machine Learning Studio angezeigt.

Protokollieren von matplotlib.pyplot

SDK v1

import matplotlib.pyplot as plt

plt.plot([1, 2, 3])
azureml_run.log_image("sample_pyplot", plot=plt)

SDK v2 mit 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")
  • Das Bild wird als Artefakt protokolliert und wird auf der Registerkarte Bilder in Azure Machine Learning Studio angezeigt.

Protokollieren einer Liste von Metriken

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 mit 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)
  • Metriken werden auf der Registerkarte Metriken in Azure Machine Learning Studio angezeigt.
  • Textwerte werden nicht unterstützt.

Protokollieren einer Zeile mit Metriken

SDK v1

azureml_run.log_row("sample_table", col1=5, col2=10)

SDK v2 mit MLflow

metrics = {"sample_table.col1": 5, "sample_table.col2": 10}
mlflow.log_metrics(metrics)
  • Metriken werden in Azure Machine Learning Studio nicht als Tabelle dargestellt.
  • Textwerte werden nicht unterstützt.
  • Als Artefakt protokolliert, nicht als Metrik.

Protokollieren einer Tabelle

SDK v1

table = {
"col1" : [1, 2, 3],
"col2" : [4, 5, 6]
}
azureml_run.log_table("table", table)

SDK v2 mit 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")
  • Protokolliert die Metriken für jede Spalte.
  • Metriken werden in Azure Machine Learning Studio nicht als Tabelle dargestellt.
  • Textwerte werden nicht unterstützt.
  • Als Artefakt protokolliert, nicht als Metrik.

Protokollieren einer Genauigkeitstabelle

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 mit 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')
  • Metriken werden in Azure Machine Learning Studio nicht als Genauigkeitstabelle dargestellt.
  • Als Artefakt protokolliert, nicht als Metrik.
  • Die mlflow.log_dict-Methode ist experimentell.

Protokollieren einer Konfusionsmatrix

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 mit 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')
  • Metriken werden in Azure Machine Learning Studio nicht als Konfusionsmatrix dargestellt.
  • Als Artefakt protokolliert, nicht als Metrik.
  • Die mlflow.log_dict-Methode ist experimentell.

Protokollieren von Vorhersagen

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 mit 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')
  • Metriken werden in Azure Machine Learning Studio nicht als Konfusionsmatrix dargestellt.
  • Als Artefakt protokolliert, nicht als Metrik.
  • Die mlflow.log_dict-Methode ist experimentell.

Protokollieren von Restdaten

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 mit 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')
  • Metriken werden in Azure Machine Learning Studio nicht als Konfusionsmatrix dargestellt.
  • Als Artefakt protokolliert, nicht als Metrik.
  • Die mlflow.log_dict-Methode ist experimentell.

Anzeigen von Informationen und Daten zur Ausführung

Sie können mithilfe der Eigenschaften „data“ und „info“ des MLflow-Ausführungsobjekts (mlflow.entities.Run) auf Ausführungsinformationen zugreifen.

Tipp

Nachverfolgungsinformationen zu Experimenten und Ausführungen in Azure Machine Learning können mithilfe von MLflow abgefragt werden. MLflow bietet eine umfassende Such-API zum einfachen Abfragen und Suchen nach Experimenten und Ausführungen sowie zum schnellen Vergleichen von Ergebnissen. Weitere Informationen zu allen Funktionen in MLflow in dieser Dimension finden Sie unter Abfragen und Vergleichen von Experimenten und Ausführungen mit MLflow

Das folgende Beispiel zeigt, wie eine abgeschlossene Ausführung abgerufen werden kann:

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>")

Das folgende Beispiel zeigt, wie Sie metrics, tags und params anzeigen können:

metrics = finished_mlflow_run.data.metrics
tags = finished_mlflow_run.data.tags
params = finished_mlflow_run.data.params

Hinweis

Die metrics enthalten nur den zuletzt protokollierten Wert für eine bestimmte Metrik. Wenn Sie beispielsweise einen Wert in der Reihenfolge 1, dann 2, 3 und schließlich 4 in eine Metrik namens sample_metric protokollieren, wird nur 4 im metrics-Wörterbuch vorhanden sein. Verwenden Sie MlFlowClient.get_metric_history, um alle Metriken abzurufen, die für eine bestimmte benannte Metrik protokolliert wurden:

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"))

Weitere Informationen finden Sie in der Referenz zu MlFlowClient.

Das Feld info enthält allgemeine Informationen zur Ausführung wie Startzeit, Ausführungs-ID, Experiment-ID usw.:

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

Anzeigen von Ausführungsartefakten

Zum Anzeigen der Artefakte einer Ausführung verwenden Sie MlFlowClient.list_artifacts:

client.list_artifacts(finished_mlflow_run.info.run_id)

Verwenden Sie zum Herunterladen eines Artefakts mlflow.artifacts.download_artifacts:

mlflow.artifacts.download_artifacts(run_id=finished_mlflow_run.info.run_id, artifact_path="Azure.png")

Nächste Schritte