Verwalten von Modellregistrierungen in Azure Machine Learning mit MLflow

Azure Machine Learning unterstützt MLflow für die Modellverwaltung, wenn sie mit einem Arbeitsbereich verbunden ist. Dieser Ansatz stellt für Benutzer*innen, die mit dem MLFlow-Client vertraut sind, eine bequeme Möglichkeit dar, den gesamten Lebenszyklus des Modells zu unterstützen. Der folgende Artikel beschreibt die verschiedenen Möglichkeiten und wie sie im Vergleich zu anderen Optionen abschneiden.

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.

  • Beachten Sie, dass Organisationsregistrierungen für die Modellverwaltung mit MLflow nicht unterstützt werden.

  • Einige Vorgänge können direkt mit der Fluent-API (mlflow.<method>) von MLflow ausgeführt werden. Für andere ist jedoch möglicherweise die Erstellung eines MLflow-Clients erforderlich, der die Kommunikation mit Azure Machine Learning im MLflow-Protokoll ermöglicht. Sie können wie folgt ein MlflowClient-Objekt erstellen. In diesem Tutorial wird das client-Objekt verwendet, um auf den MLflow-Client zu verweisen.

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

Eintragen neuer Modelle im Register

Die Modellregistrierung bietet eine einfache und zentrale Möglichkeit zum Verwalten von Modellen in einem Arbeitsbereich. Jeder Arbeitsbereich verfügt über eine eigene unabhängige Modellregistrierung. Im folgenden Abschnitt werden mehrere Möglichkeiten erläutert, wie Sie Modelle mithilfe des MLflow SDK in der Registrierung registrieren können.

Erstellen von Modellen aus einer bestehenden Ausführung

Wenn Sie ein MLflow-Modell innerhalb einer Ausführung protokolliert haben und es in einer Registrierung registrieren möchten, verwenden Sie dazu die Ausführungs-ID und den Pfad, unter dem das Modell protokolliert wurde. Unter Verwalten von Experimenten und Ausführungen mit MLflow erfahren Sie, wie Sie diese Informationen abfragen können, wenn Sie sie nicht haben.

mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)

Hinweis

Modelle können nur im Arbeitsbereich in der Registrierung registriert werden, in dem auch die Ausführung nachverfolgt wurde. Arbeitsbereichsübergreifende Vorgänge werden derzeit von Azure Machine Learning nicht unterstützt.

Tipp

Es wird empfohlen, Modelle aus Ausführungen zu registrieren oder die Methode mlflow.<flavor>.log_model innerhalb der Ausführung zu verwenden, da die Herkunft des Auftrags, der das Objekt generiert hat, beibehalten wird.

Erstellen von Modellen aus Objekten

Wenn Sie einen Ordner mit einem MLModel MLflow-Modell haben, können Sie es direkt registrieren. Es ist nicht notwendig, dass das Modell immer im Kontext einer Ausführung steht. Zu diesem Zweck können Sie das URI-Schema file://path/to/model verwenden, um MLflow-Modelle zu registrieren, die im lokalen Dateisystem gespeichert sind. Lassen Sie uns ein einfaches Modell unter Verwendung von Scikit-Learn erstellen, und es im MLflow-Format im lokalen Speicher speichern:

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

mlflow.sklearn.save_model(reg, "./regressor")

Tipp

Die Methode save_model() funktioniert auf die gleiche Weise wie log_model(). Während log_model() das Modell innerhalb einer aktiven Ausführung speichert, verwendet save_model() das lokale Dateisystem zum Speichern des Modells.

Sie können das Modell nun über den lokalen Pfad registrieren:

import os

model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")

Abfragen von Modellregistrierungen

Sie können das MLflow SDK verwenden, um in der Registrierung registrierte Modelle abzufragen und nach diesen zu suchen. Im folgenden Abschnitt werden mehrere Möglichkeiten erläutert, die Ihnen hierfür zur Verfügung stehen.

Abfragen aller Modelle des Registers

Sie können alle registrierten Modelle in der Registrierung mithilfe des MLflow-Clients abfragen. Das folgende Beispiel druckt alle Modellnamen aus:

for model in client.search_registered_models():
    print(f"{model.name}")

Verwenden Sie order_by, um nach einer bestimmten Eigenschaft wie name, version, creation_timestamp und last_updated_timestamp zu sortieren:

client.search_registered_models(order_by=["name ASC"])

Hinweis

MLflow 2.0-Empfehlung: Verwenden Sie in älteren Versionen von MLflow (<2.0) stattdessen die Methode MlflowClient.list_registered_models().

Abrufen bestimmter Versionen des Modells

Der Befehl search_registered_models() ruft das Modellobjekt ab, das alle Modellversionen enthält. Wenn Sie jedoch die letzte registrierte Modellversion eines bestimmten Modells abrufen möchten, dann verwenden Sie get_registered_model :

client.get_registered_model(model_name)

Wenn Sie eine bestimmte Version des Modells benötigen, können Sie dies angeben:

client.get_model_version(model_name, version=2)

Laden von Modellen aus der Registrierung

Sie können Modelle direkt aus der Registrierung laden, um die protokollierten Modellobjekte wiederherzustellen. Verwenden Sie die Funktion mlflow.<flavor>.load_model() oder mlflow.pyfunc.load_model(). Geben Sie dabei den URI des zu ladenden Modells mit der folgenden Syntax an:

  • models:/<model-name>/latest zum Laden der letzten Modellversion
  • models:/<model-name>/<version-number> zum Laden einer bestimmten Modellversion
  • models:/<model-name>/<stage-name> zum Laden einer bestimmten Version in einer bestimmten Phase für ein Modell Ausführliche Informationen finden Sie unter Modellphasen.

Tipp

Wenn Sie mehr über den Unterschied zwischen mlflow.<flavor>.load_model() und mlflow.pyfunc.load_model() erfahren möchten, sehen Sie sich Workflows zum Laden von MLflow-Modellen an.

Modellphasen

MLflow unterstützt Modellphasen, um den Lebenszyklus des Modells zu verwalten. Die Version des Modells kann von einer Phase zur nächsten übergehen. Phasen werden der Modellversion zugewiesen (anstelle von Modellen), was bedeutet, dass ein bestimmtes Modell mehrere Versionen in verschiedenen Phasen haben kann.

Wichtig

Auf Phasen kann nur über das MLflow SDK zugegriffen werden. Sie werden nicht im Azure ML Studio-Portal angezeigt und können auch nicht über Azure ML SDK, Azure ML CLI oder Azure ML REST API abgerufen werden. Bereitstellung aus einer bestimmten Modellphase zu erstellen wird derzeit nicht unterstützt.

Abfragen von Modellphasen

Sie können den MLflow-Client verwenden, um alle möglichen Phasen eines Modells zu ermitteln:

client.get_model_version_stages(model_name, version="latest")

Sie können sehen, welche Modellversionen sich in den einzelnen Phasen befinden, indem Sie das Modell aus dem Register abrufen. Das folgende Beispiel ruft die Modellversion ab, die sich gerade in der Phase Staging befindet.

client.get_latest_versions(model_name, stages=["Staging"])

Hinweis

In Mlflow können sich mehrere Versionen gleichzeitig in der gleichen Phase befinden. Diese Methode gibt jedoch die neueste Version (größere Version) unter allen Versionen zurück.

Warnung

Bei den Phasennamen muss auf Groß- und Kleinschreibung geachtet werden.

Modelle im Übergang

Der Übergang einer Modellversion zu einer bestimmten Phase kann mit dem MLflow-Client erfolgen.

client.transition_model_version_stage(model_name, version=3, stage="Staging")

Wenn es in dieser Phase bereits eine Modellversion gibt, wird diese standardmäßig beibehalten. Sie wird also nicht ersetzt, da sich mehrere Modellversionen gleichzeitig in derselben Phase befinden können. Alternativ können Sie auch archive_existing_versions=True anweisen, dass MLflow die Version des vorhandenen Modells in die Phase Archived verschieben soll.

client.transition_model_version_stage(
    model_name, version=3, stage="Staging", archive_existing_versions=True
)

Laden von Modellen aus Phasen

Sie können ein Modell in einer bestimmten Phase direkt aus Python laden, indem Sie die Funktion load_model und das folgende URI-Format verwenden. Beachten Sie, dass Sie für den Erfolg dieser Methode alle Bibliotheken und Abhängigkeiten bereits in der Umgebung, in der Sie arbeiten, installiert haben müssen.

model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

Bearbeiten und Löschen von Modellen

Das Bearbeiten registrierter Modelle wird sowohl in Mlflow als auch in Azure ML unterstützt. Es gibt jedoch einige wichtige Unterschiede, die beachtet werden sollten:

Warnung

Das Umbenennen von Modellen wird in Azure Machine Learning nicht unterstützt, da Modellobjekte unveränderlich sind.

Bearbeiten von Modellen

Sie können die Modellbeschreibung und die Tags eines Modells mit Hilfe von Mlflow bearbeiten:

client.update_model_version(model_name, version=1, description="My classifier description")

Um Tags zu bearbeiten, müssen Sie die Methoden set_model_version_tag und remove_model_version_tag verwenden:

client.set_model_version_tag(model_name, version="1", key="type", value="classification")

Entfernen eines Tags:

client.delete_model_version_tag(model_name, version="1", key="type")

Löschen einer Modellversion

Sie können jede Modellversion im Register mit dem MLflow-Client löschen, wie im folgenden Beispiel gezeigt wird:

client.delete_model_version(model_name, version="2")

Hinweis

Azure Machine Learning unterstützt nicht das Löschen des gesamten Modell-Containers. Um das Gleiche zu erreichen, müssen Sie alle Modellversionen eines bestimmten Modells löschen.

Unterstützungsmatrix für die Verwaltung von Modellen mit MLflow

Der MLflow-Client stellt mehrere Methoden zum Abrufen und Verwalten von Modellen zur Verfügung. Die folgende Tabelle zeigt, welche dieser Methoden derzeit in MLflow unterstützt werden, wenn eine Verbindung zu Azure ML besteht. Er vergleicht sie auch mit anderen Modellverwaltungsfunktionen in Azure ML.

Funktion MLflow Azure ML mit MLflow Azure ML CLIv2 Azure ML Studio
Registrieren von Modellen im MLflow-Format
Registrieren von Modellen, die nicht im MLflow-Format vorliegen
Registrieren von Modellen aus Laufergebnissen/Artefakten 1 2
Registrieren von Modellen anhand von Ausgaben von Ausführungen/Artefakten in einem anderen Nachverfolgungsserver/Arbeitsbereich 5 5
Suchen/Auflisten registrierter Modelle
Abrufen von Informationen zu den registrierten Versionen des Modells
Bearbeiten der Versionsbeschreibung des registrierten Modells
Bearbeiten der Versionstags des registrierten Modells
Umbenennen registrierter Modelle 3 3 3
Löschen eines registrierten Modells (Container) 3 3 3
Löschen der Version eines registrierten Modells
Verwalten von MLflow-Modellphasen
Suchen registrierter Modelle nach Name 4
Suchen registrierter Modelle mit Zeichenfolgenvergleichen LIKE und ILIKE 4
Suchen von registrierten Modellen nach Tag 4
Unterstützung von Organisationsregistrierungen

Hinweis

  • 1 Verwenden von URIs im Format runs:/<ruin-id>/<path>.
  • 2 Verwenden von URIs im Format azureml://jobs/<job-id>/outputs/artifacts/<path>.
  • 3 Registrierte Modelle sind unveränderliche Objekte in Azure ML.
  • 4 Verwenden des Suchfeldes in Azure ML Studio. Teilweise Übereinstimmung wird unterstützt
  • 5 Verwenden Sie Registrierungen, um Modelle über verschiedene Arbeitsbereiche hinweg zu verschieben und gleichzeitig die Datenherkunft beizubehalten.

Nächste Schritte