Abfragen und Vergleichen von Experimenten und Ausführungen mit MLflow

Experimente und Jobs (oder Ausführungen) in Azure Machine Learning können mithilfe von MLflow abgefragt werden. Sie müssen kein bestimmtes SDK installieren, um die Vorgänge innerhalb eines Trainingsauftrags zu verwalten. Dadurch wird ein nahtloserer Übergang zwischen lokalen Ausführungen und der Cloud ermöglicht, da cloudspezifische Abhängigkeiten entfernt werden. In diesem Artikel werden Sie erfahren, wie Sie Experimente und Ausführungen in Ihrem Arbeitsbereich mit Azure Machine Learning und dem MLflow-SDK in Python abfragen und vergleichen.

MLflow ermöglicht Folgendes:

  • Erstellen, Abfragen, Löschen und Suchen nach Experimenten in einem Arbeitsbereich
  • Abfragen, Löschen und Suchen nach Ausführungen in einem Arbeitsbereich.
  • Nachverfolgen und Abrufen von Metriken, Parametern, Artefakten und Modellen aus Ausführungen

Unter Supportmatrix für die Abfrage von Ausführungen und Experimenten in Azure Machine Learning finden Sie einen detaillierten Vergleich zwischen MLflow (Open Source) und MLflow (mit Azure Machine Learning verbunden).

Hinweis

Das Azure Machine Learning Python SDK v2 bietet keine nativen Protokollierungs- oder Nachverfolgungsfunktionen. Dies gilt nicht nur für die Protokollierung, sondern auch für die Abfrage der protokollierten Metriken. Verwenden Sie stattdessen MLflow zum Verwalten von Experimenten und Ausführungen. In diesem Artikel wird erläutert, wie Sie mit MLflow Experimente und Ausführungen in Azure Machine Learning verwalten.

Sie können Experimente und Ausführungen auch abfragen und durchsuchen, indem Sie die REST-API für MLflow verwenden. Ein Beispiel zur Nutzung finden Sie unter Verwenden von MLflow REST mit Azure Machine Learning.

Voraussetzungen

  • Installieren Sie das Mlflow SDK-Paket mlflow und das Azure Machine Learning-Plug-In für MLflow azureml-mlflow.

    pip install mlflow azureml-mlflow
    

    Tipp

    Sie können auch das Paket mlflow-skinny verwenden. Dabei handelt es sich um ein abgespecktes MLflow-Paket ohne SQL-Speicher, Server, Benutzeroberfläche oder Data Science-Abhängigkeiten. mlflow-skinny wird für diejenigen empfohlen, die in erster Linie die Funktionen für Nachverfolgung und Protokollierung benötigen und nicht sämtliche Funktionen von MLflow (einschließlich Bereitstellungen) importieren möchten.

  • Ein Azure Machine Learning-Arbeitsbereich. Sie können eines erstellen, indem Sie das Tutorial „Erstellen von Ressourcen für maschinelles Lernen“ ausführen.

  • Wenn Sie eine Remote-Nachverfolgung durchführen (d.h. Nachverfolgung von Experimenten, die außerhalb von Azure Machine Learning ausgeführt werden), konfigurieren Sie MLflow so, dass es auf den Nachverfolgungs-URI Ihres Azure Machine Learning-Arbeitsbereichs verweist. Weitere Informationen zum Herstellen einer Verbindung zwischen MLflow und dem Arbeitsbereich finden Sie unter Konfigurieren von MLflow für Azure Machine Learning.

Abfrage- und Suchexperimente

Verwenden Sie MLflow, um in Ihrem Arbeitsbereich nach Experimenten zu suchen. Hierzu folgende Beispiele:

  • Abrufen aller aktiven Experimente:

    mlflow.search_experiments()
    

    Hinweis

    In Legacyversionen von MLflow (<2.0) verwenden Sie stattdessen die Methode mlflow.list_experiments().

  • Abrufen aller Experimente, einschließlich der archivierten:

    from mlflow.entities import ViewType
    
    mlflow.search_experiments(view_type=ViewType.ALL)
    
  • Abrufen eines bestimmten Experiments anhand des Namens:

    mlflow.get_experiment_by_name(experiment_name)
    
  • Abrufen eines bestimmten Experiments anhand der ID:

    mlflow.get_experiment('1234-5678-90AB-CDEFG')
    

Experimente suchen

Mit der search_experiments()-Methode, die seit MLflow 2.0 verfügbar ist, können Sie mit filter_string nach Experimenten suchen, die den Kriterien entsprechen.

  • Abrufen mehrerer Experimente basierend auf ihren IDs:

    mlflow.search_experiments(filter_string="experiment_id IN ("
        "'CDEFG-1234-5678-90AB', '1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')"
    )
    
  • Abrufen aller Experimente, die nach einer bestimmten Zeit erstellt wurden:

    import datetime
    
    dt = datetime.datetime(2022, 6, 20, 5, 32, 48)
    mlflow.search_experiments(filter_string=f"creation_time > {int(dt.timestamp())}")
    
  • Abrufen aller Experimente mit einem bestimmten Tag:

    mlflow.search_experiments(filter_string=f"tags.framework = 'torch'")
    

Abfrage- und Suchausführungen

MLflow ermöglicht die Suche innerhalb eines beliebigen Experiments und auch in mehreren Experimenten gleichzeitig. Die Methode mlflow.search_runs() akzeptiert die Argumente experiment_ids und experiment_name, um anzugeben, nach welchen Experimenten Sie suchen möchten. Sie können auch search_all_experiments=True angeben, wenn Sie alle Experimente im Arbeitsbereich durchsuchen möchten:

  • Nach Experimentname:

    mlflow.search_runs(experiment_names=[ "my_experiment" ])
    
  • Nach Experiment-ID:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ])
    
  • Suchen in allen Experimenten im Arbeitsbereich:

    mlflow.search_runs(filter_string="params.num_boost_round='100'", search_all_experiments=True)
    

Beachten Sie, dass experiment_ids die Bereitstellung einer Reihe von Experimenten unterstützt, sodass Sie bei Bedarf mehrere Experimente durchsuchen können. Das kann nützlich sein, wenn Sie Ausführungen desselben Modells vergleichen möchten, falls es in verschiedenen Experimenten protokolliert wird (z. B. von verschiedenen Personen oder verschiedenen Projektiterationen).

Wichtig

Wenn experiment_ids, experiment_names oder search_all_experiments nicht angegeben sind, sucht MLflow standardmäßig im derzeit aktiven Experiment. Sie können das aktive Experiment mithilfe von mlflow.set_experiment() festlegen.

Standardmäßig gibt MLflow die Daten im Pandas-Format Dataframe zurück. Das ist für die Weiterverarbeitung der Ausführungsanalyse praktisch. Zurückgegebene Daten enthalten Spalten mit:

  • Grundlegenden Informationen zur Ausführung.
  • Parametern mit dem Spaltennamen params.<parameter-name>.
  • Metriken (jeweils zuletzt protokollierter Wert) mit dem Spaltennamen metrics.<metric-name>.

Alle Metriken und Parameter werden auch beim Abfragen von Ausführungen zurückgegeben. Für Metriken, die mehrere Werte enthalten (z. B. eine Verlustkurve oder eine PR-Kurve), wird jedoch nur der letzte Wert der Metrik zurückgegeben. Wenn Sie alle Werte einer bestimmten Metrik abrufen möchten, wird die mlflow.get_metric_history-Methode verwendet. Ein Beispiel finden Sie unter Abrufen von Parametern und Metriken aus einer Ausführung.

Sortieren von Ausführungen

Standardmäßig werden Experimente absteigend nach start_time sortiert. Dies ist der Zeitpunkt, zu dem das Experiment in Azure Machine Learning in die Warteschlange eingereiht wurde. Sie können diese Standardeinstellung jedoch mithilfe des Parameters order_by ändern.

  • Festlegen der Reihenfolge der Ausführungen nach Attributen, z. B. start_time:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ],
                       order_by=["attributes.start_time DESC"])
    
  • Legen Sie die Reihenfolge der Ausführungen fest und schränken Sie die Ergebnisse ein. Im folgenden Beispiel wird die letzte einzelne Ausführung im Experiment zurückgegeben:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       max_results=1, order_by=["attributes.start_time DESC"])
    
  • Reihenfolge der Ausführungen nach dem Attribut duration:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       order_by=["attributes.duration DESC"])
    

    Tipp

    attributes.duration ist nicht in MLflow-OSS vorhanden, wird aber der Einfachheit halber in Azure Machine Learning bereitgestellt.

  • Reihenfolge der Ausführung nach Metrikwerten:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ]).sort_values("metrics.accuracy", ascending=False)
    

    Warnung

    Das Verwenden von order_by mit Ausdrücken, die metrics.*, params.* oder tags.* im Parameter order_by enthalten, wird derzeit nicht unterstützt. Verwenden Sie stattdessen die order_values-Methode von Pandas wie im Beispiel dargestellt.

Filtern von Ausführungen

Sie können auch nach einer Ausführung mit einer bestimmten Kombination in den Hyperparametern suchen. Verwenden Sie dazu den Parameter filter_string. Verwenden Sie params, um auf die Parameter der Ausführung zuzugreifen, metrics, um auf Metriken zuzugreifen, die bei der Ausführung protokolliert wurden, und attributes, um auf Ausführungsinformationen zuzugreifen. MLflow unterstützt Ausdrücke, die mit dem AND-Schlüsselwort verbunden sind (OR wird von der Syntax nicht unterstützt):

  • Suchausführungen basierend auf dem Wert eines Parameters:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="params.num_boost_round='100'")
    

    Warnung

    Nur die Operatoren =, like und != werden zum Filtern von parameters unterstützt.

  • Suchausführungen basierend auf dem Wert einer Metrik:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="metrics.auc>0.8")
    
  • Suchausführungen mit einem bestimmten Tag:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="tags.framework='torch'")
    
  • Suchausführungen, die von einem bestimmten Benutzer erstellt wurden:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.user_id = 'John Smith'")
    
  • Suchen Sie nach fehlerhaften Ausführungen. Mögliche Werte finden Sie unter Filterausführungen nach Status:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.status = 'Failed'")
    
  • Suchausführungen, die nach einer bestimmten Zeit erstellt wurden:

    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())}'")
    

    Tipp

    Werte für den Schlüssel attributes sollten immer Zeichenfolgen sein und daher zwischen Anführungszeichen codiert werden.

  • Suchen Sie nach Ausführungen, die länger als eine Stunde dauern:

    duration = 360 * 1000 # duration is in milliseconds
    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string=f"attributes.duration > '{duration}'")
    

    Tipp

    attributes.duration ist nicht in MLflow-OSS vorhanden, wird aber der Einfachheit halber in Azure Machine Learning bereitgestellt.

  • Suchen Sie nach Ausführungen mit der ID in einer bestimmten Gruppe:

    mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                       filter_string="attributes.run_id IN ('1234-5678-90AB-CDEFG', '5678-1234-90AB-CDEFG')")
    

Filtern von Ausführungen nach Status

Beim Filtern von Ausführungen nach Status verwendet MLflow eine andere Konvention, um die verschiedenen möglichen Status einer Ausführung im Vergleich zu Azure Machine Learning zu benennen. In der folgenden Tabelle sind die möglichen Werte aufgeführt:

Status des Azure Machine Learning-Auftrags attributes.status von MLflow Bedeutung
Nicht begonnen Scheduled Der Auftrag/die Ausführung wurde von Azure Machine Learning empfangen.
Warteschlange Scheduled Das Ausführen des Auftrags/der Ausführung ist geplant, wurde aber noch nicht gestartet.
Wird vorbereitet Scheduled Der Auftrag oder die Ausführung wurde noch nicht gestartet, aber eine Computeressource wurde für ihre Ausführung zugewiesen und bereitet die Umgebung und ihre Eingaben vor.
Wird ausgeführt Running Der Auftrag/die Ausführung wird derzeit aktiv ausgeführt.
Abgeschlossen Finished Der Auftrag oder die Ausführung wurde ohne Fehler abgeschlossen.
Fehler Failed Der Auftrag oder die Ausführung wurde mit Fehlern abgeschlossen.
Storniert Killed Der Auftrag oder die Ausführung wurde vom Benutzer abgebrochen oder vom System beendet.

Beispiel:

mlflow.search_runs(experiment_ids=[ "1234-5678-90AB-CDEFG" ], 
                   filter_string="attributes.status = 'Failed'")

Abrufen von Metriken, Parametern, Artefakten und Modellen

Die Methode search_runs gibt ein Pandas-Element (Dataframe) zurück, das standardmäßig eine begrenzte Menge an Informationen enthält. Sie können Python-Objekte nach Bedarf abrufen, was möglicherweise hilfreich ist, um Details zu ihnen zu erhalten. Verwenden Sie den Parameter output_format, um zu steuern, wie die Ausgabe zurückgegeben wird:

runs = mlflow.search_runs(
    experiment_ids=[ "1234-5678-90AB-CDEFG" ],
    filter_string="params.num_boost_round='100'",
    output_format="list",
)

Auf Details kann dann über das info-Mitglied zugegriffen werden. Das folgende Beispiel zeigt, wie die run_id abgerufen wird:

last_run = runs[-1]
print("Last run ID:", last_run.info.run_id)

Abrufen von Parametern und Metriken aus einer Ausführung

Wenn Ausführungen mit output_format="list" zurückgegeben werden, können Sie einfach mithilfe des Schlüssels data auf Parameter zugreifen:

last_run.data.params

Auf dieselbe Weise können Sie Metriken abfragen:

last_run.data.metrics

Für Metriken, die mehrere Werte enthalten (z. B. eine Verlustkurve oder eine PR-Kurve), wird nur der letzte protokollierte Wert der Metrik zurückgegeben. Wenn Sie alle Werte einer bestimmten Metrik abrufen möchten, wird die mlflow.get_metric_history-Methode verwendet. Für diese Methode müssen Sie MlflowClient verwenden:

client = mlflow.tracking.MlflowClient()
client.get_metric_history("1234-5678-90AB-CDEFG", "log_loss")

Abrufen von Artefakten aus einer Ausführung

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("1234-5678-90AB-CDEFG")

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

file_path = mlflow.artifacts.download_artifacts(
    run_id="1234-5678-90AB-CDEFG", artifact_path="feature_importance_weight.png"
)

Hinweis

In Legacyversionen von MLflow (<2.0) verwenden Sie stattdessen die Methode MlflowClient.download_artifacts().

Abrufen von Modellen aus einer Ausführung

Modelle können auch in der Ausführung protokolliert und dann direkt daraus abgerufen werden. Um ein Modell abzurufen, müssen Sie den Pfad zum Artefakt kennen, in dem es gespeichert ist. Mit der Methode list_artifacts kann nach Artefakten gesucht werden, die ein Modell darstellen, da MLflow-Modelle immer Ordner sind. Sie können ein Modell herunterladen, indem Sie den Pfad angeben, in dem das Modell mithilfe der download_artifact-Methode gespeichert wird:

artifact_path="classifier"
model_local_path = mlflow.artifacts.download_artifacts(
  run_id="1234-5678-90AB-CDEFG", artifact_path=artifact_path
)

Anschließend können Sie das Modell aus den heruntergeladenen Artefakten mithilfe der typischen Funktion load_model im variantenspezifischen Namespace laden. Im folgenden Beispiel wird xgboost verwendet:

model = mlflow.xgboost.load_model(model_local_path)

MLflow ermöglicht es Ihnen auch, beide Vorgänge gleichzeitig auszuführen und das Modell in einer einzigen Anweisung herunterzuladen und zu laden. MLflow lädt das Modell in einen temporären Ordner herunter und lädt es von dort aus. Die Methode load_model gibt mithilfe eines URI-Formats an, wo das Modell abgerufen werden muss. Beim Laden eines Modells aus einer Ausführung sieht die URI-Struktur wie folgt aus:

model = mlflow.xgboost.load_model(f"runs:/{last_run.info.run_id}/{artifact_path}")

Tipp

Informationen zum Abfragen und Laden von Modellen, die in der Modellregistrierung registriert sind, finden Sie unter Verwalten von Modellregistrierungen in Azure Machine Learning mit MLflow.

Abrufen von untergeordneten (geschachtelten) Ausführungen

MLflow unterstützt das Konzept von untergeordneten (geschachtelten) Ausführungen. Diese Ausführungen sind nützlich, wenn Sie nachzuverfolgende Trainingsroutinen unabhängig vom Haupttrainingsprozess ausgliedern müssen. Prozesse für die Hyperparameteroptimierung oder Azure Machine Learning-Pipelines sind typische Beispiele für Aufträge, die mehrere untergeordnete Ausführungen generieren. Sie können alle untergeordneten Ausführungen einer bestimmten Ausführung mithilfe des Eigenschaftentags mlflow.parentRunId abfragen, das die Ausführungs-ID der übergeordneten Ausführung enthält.

hyperopt_run = mlflow.last_active_run()
child_runs = mlflow.search_runs(
    filter_string=f"tags.mlflow.parentRunId='{hyperopt_run.info.run_id}'"
)

Vergleichen von Aufträgen und Modellen in Azure Machine Learning Studio (Vorschau)

Um die Qualität Ihrer Aufträge und Modelle in Azure Machine Learning Studio zu vergleichen und zu bewerten, verwenden Sie den Vorschaubereich, um das Feature zu aktivieren. Nach der Aktivierung können Sie die Parameter, Metriken und Tags der von Ihnen ausgewählten Aufträge und/oder Modelle vergleichen.

Wichtig

Die in diesem Artikel markierten Elemente (Vorschau) sind aktuell als öffentliche Vorschau verfügbar. Die Vorschauversion wird ohne Vereinbarung zum Servicelevel bereitgestellt und ist nicht für Produktionsworkloads vorgesehen. Manche Features werden möglicherweise nicht unterstützt oder sind nur eingeschränkt verwendbar. Weitere Informationen finden Sie unter Zusätzliche Nutzungsbestimmungen für Microsoft Azure-Vorschauen.

Screenshot: Vorschaubereich zum Vergleichen von Aufträgen und Modellen in Azure Machine Learning Studio

In den Notebooks „MLflow mit Azure Machine Learning“ werden die in diesem Artikel vorgestellten Konzepte weiter erläutert und demonstriert.

Unterstützungsmatrix zum Abfragen von Ausführungen und Experimenten

Das MLflow SDK macht mehrere Methoden zum Abrufen von Ausführungen verfügbar, einschließlich Optionen, mit denen gesteuert werden kann, was zurückgegeben wird und wie. In der folgenden Tabelle erfahren Sie, welche dieser Methoden derzeit in MLflow unterstützt wird, wenn sie mit Azure Machine Learning verbunden ist:

Funktion Von MLflow unterstützt Unterstützt durch Azure Machine Learning
Sortieren von Ausführungen nach Attributen
Sortieren von Ausführungen nach Metriken 1
Sortieren von Ausführungen nach Parametern 1
Sortieren von Ausführungen nach Tags 1
Filtern von Ausführungen nach Attributen
Filtern von Ausführungen nach Metriken
Filtern von Ausführungen nach Metriken mit Sonderzeichen (Mit Escapezeichen)
Filtern von Ausführungen nach Parametern
Filtern von Ausführungen nach Tags
Filtern von Ausführungen mit numerischen Vergleichsoperatoren (Metriken), einschließlich =, !=, >, >=, < und <=
Filtern von Ausführungen mit Vergleichsoperatoren für Zeichenfolgen (Parameter, Tags und Attribute): = und != 2
Filtern von Ausführungen mit Vergleichsoperatoren für Zeichenfolgen (Parameter, Tags und Attribute): LIKE/ILIKE
Filtern von Ausführungen mit Vergleichsoperatoren AND
Filtern von Ausführungen mit Vergleichsoperatoren OR
Umbenennen von Experimenten

Hinweis

  • 1 Im Abschnitt Sortieren von Ausführungen finden Sie Anweisungen und Beispiele dazu, wie Sie die gleiche Funktionalität in Azure Machine Learning erreichen können.
  • 2!= für Tags, die nicht unterstützt werden.