Protokollieren von Metriken, Parametern und Dateien mit MLflow

GILT FÜR: Python SDK azure-ai-ml v2 (aktuell)

Azure Machine Learning unterstützt die Protokollierung und Verfolgung von Experimenten mit MLflow-Nachverfolgung. Sie können Modelle, Metriken, Parameter und Artefakte mit MLflow protokollieren, entweder lokal auf Ihrem Computer oder in einer Cloudumgebung.

Wichtig

Im Gegensatz zum Azure Machine Learning SDK v1 gibt es im Azure Machine Learning SDK für Python (v2) keine Protokollierungsfunktion. Wenn Sie zuvor das Azure Machine Learning SDK v1 verwendet haben, empfiehlt es sich, MLflow zum Nachverfolgen von Experimenten zu nutzen. Weitere Informationen finden Sie unter Migrieren der Protokollierung von SDK v1 zu MLflow.

Protokolle helfen bei der Diagnose von Fehlern und Warnungen und beim Nachverfolgen von Leistungsmetriken wie Parametern und Modellleistung. In diesem Artikel wird erläutert, wie Sie die Protokollierung in den folgenden Szenarien aktivieren:

  • Protokollieren von Metriken, Parametern und Modellen beim Übermitteln von Aufträgen.
  • Nachverfolgen von Ausführungen beim interaktiven Training.
  • Protokollieren Sie Metriken asynchron.
  • Anzeigen von Diagnoseinformationen zum Training.

Tipp

In diesem Artikel erfahren Sie, wie Sie den Modelltrainingsprozess überwachen. Wenn Sie daran interessiert sind, die Ressourcennutzung und Ereignisse von Azure Machine Learning zu überwachen, z. B. Kontingente, abgeschlossene Trainingsaufträge oder abgeschlossene Modellimplementierungen, finden Sie weitere Informationen unter Überwachen von Azure Machine Learning.

Voraussetzungen

  • Sie müssen über einen Azure Machine Learning-Arbeitsbereich verfügen. Wenn Sie keins haben, lesen Sie Erstellen von Arbeitsbereichsressourcen.

  • Sie müssen die mlflow- und azureml-mlflow-Pakete installiert haben. Ist dies nicht der Fall, verwenden Sie den folgenden Befehl, um sie in Ihrer Entwicklungsumgebung zu installieren:

    pip install mlflow azureml-mlflow
    

    Hinweis

    Für die asynchrone Protokollierung von Metriken benötigen Sie MLflow Version 2.8.0+ und azureml-mlflow Version 1.55+.

  • Wenn Sie Remoteverfolgung durchführen (Nachverfolgen von Experimenten, die außerhalb von Azure Machine Learning ausgeführt werden), konfigurieren Sie MLflow zum Nachverfolgen von Experimenten. Weitere Informationen finden Sie unter Konfigurieren von MLflow für Azure Machine Learning.

  • Um Metriken, Parameter, Artefakte und Modelle in Ihren Experimenten in Azure Machine Learning mithilfe von MLflow zu protokollieren, importieren Sie MLflow einfach in Ihr Skript:

    import mlflow
    

Konfigurieren von Experimenten

MLflow organisiert die Informationen in Experimenten und Ausführungen (in Azure Machine Learning werden die Ausführungen als Aufträge bezeichnet). Es gibt einige Unterschiede bei der Konfiguration, je nachdem, wie Sie Ihren Code ausführen:

Wenn Sie interaktiv trainieren, z. B. in einem Jupyter Notebook, verwenden Sie das folgende Muster:

  1. Erstellen Sie das aktive Experiment oder legen Sie es fest.
  2. Beginnen Sie den Auftrag.
  3. Verwenden Sie Protokollierungsmethoden, um Metriken und andere Informationen zu protokollieren.
  4. Beenden Sie den Auftrag.

Der folgende Codeausschnitt konfiguriert beispielsweise das Experiment und protokolliert dann während eines Auftrags:

import mlflow
# Set the experiment
mlflow.set_experiment("mlflow-experiment")

# Start the run
mlflow_run = mlflow.start_run()
# Log metrics or other information
mlflow.log_metric('mymetric', 1)
# End run 
mlflow.end_run()

Tipp

Eigentlich müssen Sie start_run() nicht aufrufen, da eine neue Ausführung erstellt wird, wenn noch keine vorhanden ist und Sie eine Protokollierungs-API aufrufen. In diesem Fall können Sie mlflow.active_run() verwenden, um die Ausführung abzurufen, die gerade verwendet wird. Weitere Informationen finden Sie unter mlflow.active_run().

Sie können auch das Kontext-Manager-Paradigma verwenden:

import mlflow
mlflow.set_experiment("mlflow-experiment")

# Start the run, log metrics, end the run
with mlflow.start_run() as run:
    # Run started when context manager is entered, and ended when context manager exits
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)
    pass

Wenn Sie einen neuen Lauf mit mlflow.start_run starten, kann es hilfreich sein, den Parameter run_name anzugeben, der dann in den Namen des Laufs in der Azure Machine Learning-Benutzeroberfläche übersetzt wird und Ihnen hilft, den Lauf schneller zu identifizieren:

with mlflow.start_run(run_name="iris-classifier-random-forest") as run:
    mlflow.log_metric('mymetric', 1)
    mlflow.log_metric('anothermetric',1)

Weitere Informationen zu den MLflow-Protokollierungs-APIs finden Sie in der MLflow-Referenz.

Protokollparameter

MLflow unterstützt die von Ihren Experimenten verwendeten Parameter für die Protokollierung. Die Parameter können von beliebigem Typ sein und können mit der folgenden Syntax protokolliert werden:

mlflow.log_param("num_epochs", 20)

MLflow bietet auch eine bequeme Möglichkeit, mehrere Parameter zu protokollieren, indem alle Parameter mit einem Wörterbuch angegeben werden. Mehrere Frameworks können auch Parameter an Modelle übergeben, indem sie Wörterbücher verwenden, so dass dies eine bequeme Möglichkeit ist, sie im Experiment zu protokollieren.

params = {
    "num_epochs": 20,
    "dropout_rate": .6,
    "objective": "binary_crossentropy"
}

mlflow.log_params(params)

Protokollieren von Metriken

Metriken sind im Gegensatz zu Parametern immer numerisch, und sie können entweder synchron oder asynchron protokolliert werden. Wenn Metriken protokolliert werden, stehen sie bei der Rückkehr des Anrufs sofort zur Verfügung. In der folgenden Tabelle wird beschrieben, wie bestimmte numerische Typen protokolliert werden können:

Protokollierter Wert Beispielcode Notizen
Protokollierung eines numerischen Werts (int oder float) mlflow.log_metric("my_metric", 1)
Protokollieren eines numerischen Wertes (int oder float) im Zeitverlauf mlflow.log_metric("my_metric", 1, step=1) Verwenden Sie den Parameter step, um den Schritt anzugeben, bei dem Sie den Metrikwert protokollieren. Es kann eine beliebige ganze Zahl sein. Der Standardwert ist Null.
Protokollierung eines booleschen Werts mlflow.log_metric("my_metric", 0) 0 = True, 1 = False

Wichtig

Leistungsüberlegungen: Wenn Sie mehrere Metriken (oder mehrere Werte für dieselbe Metrik) protokollieren müssen, vermeiden Sie Aufrufe von mlflow.log_metric in Schleifen. Eine bessere Leistung kann durch asynchrones Protokollieren mit mlflow.log_metric("metric1", 9.42, synchronous=False) oder durch Protokollieren von Batches von Metriken erreicht werden.

Metriken asynchron Protokollieren

MLflow ermöglicht auch die Protokollierung von Metriken auf asynchrone Weise. Die asynchrone Metrikprotokollierung ist besonders nützlich in Fällen, in denen große Trainingsaufträge mit Dutzenden von Serverknoten ausgeführt werden und versuchen, Metriken gleichzeitig zu protokollieren. Es ist auch nützlich, wenn eine kleine Anzahl von Knoten versucht, eine hohe Anzahl von Metriken zu protokollieren.

Mit der asynchronen Metrikprotokollierung können Sie Metriken sofort protokollieren, indem Sie nicht darauf warten, dass sie im Back-End-Dienst materialisiert werden. Dieser Ansatz wird auf große Trainingsroutinen skaliert, die Hunderte von Tausenden von Metrikwerten protokollieren, under ist der empfohlene Ansatz.

MLflow protokolliert Metriken standardmäßig synchron, Sie können dieses Verhalten jedoch jederzeit ändern:

import mlflow

mlflow.config.enable_async_logging()

Dieselbe Eigenschaft kann über eine Umgebungsvariable festgelegt werden:

export MLFLOW_ENABLE_ASYNC_LOGGING=True

Um bestimmte Metriken asynchron zu protokollieren, verwenden Sie die MLflow-Protokollierungs-API wie gewohnt, fügen aber den zusätzlichen Parameter synchronous=False.

import mlflow

with mlflow.start_run():
    # (...)
    mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)

Wenn Sie log_metric(synchronous=False) verwenden, wird das Steuerelement automatisch an die aufrufende Funktion zurückgegeben, sobald der Vorgang angenommen wurde. Der Wert ist jedoch nicht zum Lesen direkt verfügbar. Die asynchrone Protokollierung von Metriken garantiert die Reihenfolge und wird mit dem Zeitstempel beibehalten, zu dem sie protokolliert wurden.

Wichtig

Selbst mit synchronous=False garantiert Azure Machine Learning die Reihenfolge der Metriken.

Wenn Sie darauf warten müssen, dass ein bestimmter Wert im Backend persistiert wird, können Sie die zurückgegebene metrische Operation verwenden, um darauf zu warten, wie im folgenden Beispiel gezeigt:

import mlflow

with mlflow.start_run():
    # (...)
    run_operation = mlflow.log_metric("metric1", 9.42, synchronous=False)
    # (...)
    run_operation.wait()
    # (...)

Sie können asynchron jeweils eine Metrik oder einen Stapel von Metriken protokollieren, wie im folgenden Beispiel gezeigt:

import mlflow
import time
from mlflow.entities import Metric

with mlflow.start_run() as current_run:
    mlflow_client = mlflow.tracking.MlflowClient()

    metrics = {"metric-0": 3.14, "metric-1": 6.28}
    timestamp = int(time.time() * 1000)
    metrics_arr = [Metric(key, value, timestamp, 0) for key, value in metrics.items()]

    run_operation = mlflow_client.log_batch(
        run_id=current_run.info.run_id,
        metrics=metrics_arr,
        synchronous=False,
    )

Der wait()-Vorgang ist auch verfügbar, wenn eine Reihe von Metriken protokolliert wird:

run_operation.wait()

Sie müssen wait() nicht in Ihren Routinen aufrufen, wenn Sie nicht sofortigen Zugriff auf die metrischen Werte benötigen. Azure Machine Learning wartet automatisch, wenn der Auftrag kurz vor dem Ende steht, um zu sehen, ob es noch eine ausstehende Metrik gibt, die persistiert werden muss. Wenn ein Auftrag in Azure Machine Learning abgeschlossen ist, sind alle Metriken garantiert persistiert.

Protokollierung von Kurven oder einer Liste mit Werten

Kurven (oder eine Liste numerischer Werte) können mit MLflow protokolliert werden, indem dieselbe Metrik mehrfach protokolliert wird. Das folgende Beispiel zeigt, wie Sie vorgehen können:

list_to_log = [1, 2, 3, 2, 1, 2, 3, 2, 1]
from mlflow.entities import Metric
from mlflow.tracking import MlflowClient
import time

client = MlflowClient()
client.log_batch(mlflow.active_run().info.run_id, 
                 metrics=[Metric(key="sample_list", value=val, timestamp=int(time.time() * 1000), step=0) for val in list_to_log])

Protokollbilder

MLflow unterstützt zwei Methoden zur Protokollierung von Bildern. Beide Methoden speichern das angegebene Bild als Artefakt innerhalb der Ausführung.

Protokollierter Wert Beispielcode Notizen
Protokollierung von numpy-Metriken oder PIL-Imageobjekten mlflow.log_image(img, "figure.png") img sollte eine Instanz von numpy.ndarray order PIL.Image.Imagesein. figure.png ist der Name des in der Ausführung generierten Artefakts. Die Datei muss nicht unbedingt bereits vorhanden sein.
Protokollierung von matlotlib-Plot oder Imagedatei mlflow.log_figure(fig, "figure.png") figure.png ist der Name des in der Ausführung generierten Artefakts. Die Datei muss nicht unbedingt bereits vorhanden sein.

Protokolldateien

Im Allgemeinen werden Dateien in MLflow als Artefakte bezeichnet. Sie können Artefakte in Mlflow auf verschiedene Arten protokollieren:

Protokollierter Wert Beispielcode Notizen
Text in einer Textdatei protokollieren mlflow.log_text("text string", "notes.txt") Der Text wird innerhalb der Ausführung in einer Textdatei mit dem Namen notes.txt gespeichert.
Protokollwörterbücher als JSON- und YAML-Dateien mlflow.log_dict(dictionary, "file.yaml" dictionary ist ein Wörterbuchobjekt, das die gesamte Struktur enthält, die Sie als JSON- oder YAML-Datei speichern möchten.
Eine bereits vorhandene triviale Datei protokollieren mlflow.log_artifact("path/to/file.pkl") Dateien werden immer im Stammverzeichnis der Ausführung protokolliert. Wenn artifact_pathdieser Parameter angegeben wird, wird die Datei in dem in diesem Parameter angegebenen Ordner gespeichert.
Alle Artefakte in einem bestehenden Ordner protokollieren mlflow.log_artifacts("path/to/folder") Die Ordnerstruktur wird in den Lauf kopiert, aber der angegebene Stammordner ist nicht enthalten.

Tipp

Wenn Sie große Dateien mit log_artifact oder log_model protokollieren, treten möglicherweise Timeoutfehler auf, bevor der Upload der Datei abgeschlossen ist. Erwägen Sie, den Timeoutwert zu erhöhen, indem Sie die Umgebungsvariable AZUREML_ARTIFACTS_DEFAULT_TIMEOUT anpassen. Der Standardwert ist 300 (Sekunden).

Protokollmodelle

MLflow führt das Konzept von „Modellen“ ein, um alle Artefakte zu verpacken, die für die Funktion eines bestimmten Modells erforderlich sind. Modelle in MLflow sind immer ein Ordner mit einer beliebigen Anzahl von Dateien, abhängig von dem Framework, das zur Erzeugung des Modells verwendet wird. Die Protokollierung von Modellen hat den Vorteil, dass alle Elemente des Modells als eine einzige Einheit erfasst werden können, die registriert und dann bereitgestellt werden kann. Darüber hinaus genießen MLflow-Modelle den Vorteil der No-Code-Bereitstellung und können mit dem verantwortlichen KI-Dashboard im Studio verwendet werden. Weitere Informationen finden Sie unter Von Artefakten zu Modellen in MLflow.

Um das Modell aus einer Trainingsausführung zu speichern, verwenden Sie die log_model()-API für das Framework, mit dem Sie arbeiten. Beispielsweise mlflow.sklearn.log_model(). Weitere Informationen finden Sie unter Protokollierung von MLflow-Modellen. Informationen zum Migrieren vorhandener Modelle zu MLflow finden Sie unter Konvertieren von benutzerdefinierten Modellen in MLflow.

Tipp

Wenn Sie große Modelle protokollieren, tritt möglicherweise der Fehler Failed to flush the queue within 300 seconds auf. In der Regel bedeutet dies, dass der Vorgang einen Timeout aufweist, bevor der Upload der Modellartefakte abgeschlossen ist. Erwägen Sie, den Timeoutwert zu erhöhen, indem Sie die Umgebungsvariable AZUREML_ARTIFACTS_DEFAULT_TIMEOUT anpassen.

Automatische Protokollierung

Mit Azure Machine Learning und MLflow können Benutzer Metriken, Modellparameter und Modellartefakte automatisch protokollieren, wenn sie ein Modell trainieren. Jedes Framework entscheidet, was automatisch für Sie nachverfolgt werden soll. Eine Vielzahl beliebter Machine Learning-Bibliotheken wird unterstützt. Erfahren Sie mehr über die automatische Protokollierung mit MLflow.

Um die automatische Protokollierung zu aktivieren, fügen Sie den folgenden Code vor Ihrem Trainingscode ein:

mlflow.autolog()

Tipp

Mit autolog können Sie steuern, was automatisch protokolliert wird. Wenn Sie beispielsweise mlflow.autolog(log_models=False) angeben, protokolliert MLflow alles außer Modelle für Sie. Eine solche Steuerung ist nützlich, wenn Sie Modelle manuell protokollieren möchten, aber dennoch eine automatische Protokollierung von Metriken und Parametern wünschen. Beachten Sie auch, dass einige Frameworks die automatische Protokollierung von Modellen deaktivieren können, wenn das trainierte Modell bestimmte Grenzen überschreitet. Ein solches Verhalten hängt von der verwendeten Variante ab und wir empfehlen Ihnen, dass Sie sich die Dokumentation ansehen, wenn dies der Fall ist.

Anzeigen von Informationen zu Aufträgen oder Ausführungen mit MLflow

Sie können die mit MLflow protokollierten Informationen über das Objekt MLflow.entities.Run anzeigen:

import mlflow

run = mlflow.get_run(run_id="<RUN_ID>")

Sie können die Metriken, Parameter und Tags für die Ausführung im Datenfeld des Ausführungsobjekts anzeigen.

metrics = run.data.metrics
params = run.data.params
tags = run.data.tags

Hinweis

Das von mlflow.get_run oder mlflow.search_runs zurückgegebene Metrikwörterbuch gibt nur den zuletzt protokollierten Wert für einen angegebenen Metriknamen zurück. Wenn Sie z. B. eine Metrik namens iteration protokollieren, die mehrmals mit Werten aufgerufen wird, nämlich 1, dann 2, dann 3, dann 4, wird nur 4 beim Aufrufen von run.data.metrics['iteration'] zurückgegeben.

Damit alle Metriken für einen bestimmten Metriknamen protokolliert werden, können Sie MlFlowClient.get_metric_history() verwenden, wie im Beispiel Abrufen von Parametern und Metriken aus einer Ausführung erläutert.

Tipp

MLflow kann Metriken und Parameter von mehreren Ausführungen gleichzeitig abrufen und ermöglicht so schnelle Vergleiche über mehrere Versuche hinweg. Weitere Informationen finden Sie unter Abfragen und Vergleich von Experimenten und Ausführungen mit MLflow.

MLflow kann jedes von einer Ausführung protokollierte Artefakt abfragen. Auf Artefakte kann nicht mithilfe des Ausführungsobjekts selbst zugegriffen werden. Stattdessen sollte der MLflow-Client verwendet werden:

client = mlflow.tracking.MlflowClient()
client.list_artifacts("<RUN_ID>")

Diese Methode listet alle Artefakte auf, die in der Ausführung protokolliert sind. Sie bleiben jedoch im Artefaktspeicher (Azure Machine Learning-Speicher) gespeichert. Verwenden Sie zum Herunterladen beliebiger Artefakte die Methode download_artifact:

file_path = client.download_artifacts("<RUN_ID>", path="feature_importance_weight.png")

Weitere Informationen finden Sie unter Abrufen von Metriken, Parametern, Artefakten und Modellen.

Anzeigen von Informationen zu Aufträgen oder Ausführungen im Studio

Sie können abgeschlossene Auftragsdatensätze, einschließlich protokollierter Metriken, im Azure Machine Learning Studiodurchsuchen.

Navigieren Sie zur Registerkarte Aufträge. Um alle Ihre Ausführungen in Ihrem Arbeitsbereich experimentübergreifend anzuzeigen, wählen Sie die Registerkarte Alle Ausführungen aus. Sie können Drilldowns zu Aufträgen für bestimmte Experimente ausführen, indem Sie den Filter Experiment in der oberen Menüleiste anwenden. Wählen Sie den gewünschten Auftrag, um die Detailansicht aufzurufen, und wählen Sie dann die Registerkarte Metriken aus.

Wählen Sie die protokollierten Metriken aus, um Diagramme auf der rechten Seite zu erstellen. Sie können Diagramme anpassen, indem Sie eine Glättung anwenden, die Farbe ändern oder mehrere Metriken in einem einzelnen Graphen zeichnen. Sie können auch die Größe und Anordnung des Layouts nach Belieben ändern. Nachdem Sie die gewünschte Ansicht erstellt haben, können Sie sie für die zukünftige Verwendung speichern und über einen direkten Link mit Ihren Teamkollegen teilen.

Screenshot der Ansicht „Metriken“.

Anzeigen und Herunterladen von Diagnoseprotokollen

Protokolldateien sind eine wichtige Ressource zum Debuggen von Azure Machine Learning-Workloads. Nachdem Sie einen Trainingsauftrag übermittelt haben, zeigen Sie Detailinformationen zu einer bestimmten Ausführung an, um die zugehörigen Protokolle und Ausgaben anzuzeigen:

  1. Navigieren Sie zur Registerkarte Aufträge.
  2. Wählen Sie die runID für eine bestimmte Ausführung aus.
  3. Wählen Sie oben auf der Seite Ausgaben und Protokolle aus.
  4. Wählen Sie Alle herunterladen aus, um alle Ihre Protokolle in einen ZIP-Ordner herunterzuladen.
  5. Sie können auch einzelne Protokolldateien herunterladen, indem Sie zuerst die Protokolldatei und dann Herunterladen auswählen.

Screenshot des Abschnitts „Ausgaben und Protokolle“ einer Ausführung.

user_logs-Ordner

Dieser Ordner enthält Informationen zu den vom Benutzer bzw. der Benutzerin generierten Protokollen. Dieser Ordner ist standardmäßig geöffnet, und das std_log.txt-Protokoll ist ausgewählt. In std_log.txt werden die Protokolle Ihres Codes (z. B. Druckanweisungen) angezeigt. Diese Datei enthält das Protokoll stdout und die Protokolle stderr aus Ihrem Steuerungs- und Trainingsskript pro Prozess. In den meisten Fällen werden Sie die Protokolle hier überwachen.

system_logs-Ordner

Dieser Ordner enthält die von Azure Machine Learning generierten Protokolle und wird standardmäßig geschlossen. Die vom System generierten Protokolle sind in verschiedenen Ordnern gruppiert, je nachdem, in welcher Phase sich der Auftrag während der Laufzeit befindet.

Andere Ordner

Für Aufträge zum Trainieren auf mehreren Computeclustern sind für jeden IP-Knoten Protokolle vorhanden. Die Struktur ist bei den einzelnen Knoten identisch mit der bei Aufträgen mit einzelnen Knoten. Es gibt einen weiteren Protokollordner für die Protokolle zur allgemeinen Ausführung und für stderr und stdout.

Azure Machine Learning protokolliert während des Trainings auch Informationen aus verschiedenen Quellen, wie z. B. aus AutoML oder dem Docker-Container, in dem der Trainingsauftrag ausgeführt wird. Viele dieser Protokolle sind nicht dokumentiert. Wenn Sie Probleme haben und sich an den Microsoft-Support wenden, können diese Protokolle möglicherweise bei der Problembehandlung verwendet werden.