Protokollieren, Laden, Registrieren und Bereitstellen von MLflow-Modellen

Ein MLflow-Modell ist ein Standardformat für das Packen von Machine Learning-Modellen, das in einer Vielzahl von Downstreamtools (z. B. Batchrückschlüsse in Apache Spark oder Echtzeitbereitstellung über eine REST-API) verwendet werden kann. Das Format definiert eine Konvention, mit der Sie ein Modell in verschiedenen Varianten (Python-Funktion, PyTorch, sklearn usw.) speichern können, die von verschiedenen Modellbereitstellungs- und Rückschlussplattformen verstanden werden können.

Protokollieren und Laden von Modellen

Wenn Sie ein Modell protokollieren, protokolliert MLflow automatisch die requirements.txt- und conda.yaml-Dateien. Sie können diese Dateien verwenden, um die Modellentwicklungsumgebung neu zu erstellen und Abhängigkeiten mithilfe von virtualenv (empfohlen) oder conda neu zu installieren.

Wichtig

Anaconda Inc. hat die Vertragsbedingungen für die Kanäle von anaconda.org aktualisiert. Gemäß den neuen Vertragsbedingungen benötigen Sie nun möglicherweise eine kommerzielle Lizenz für die Nutzung der Paket- und Verteilungslösung von Anaconda. Weitere Informationen finden Sie unter Anaconda Commercial Edition FAQ (Häufig gestellte Fragen zu Anaconda Commercial Edition). Jegliche Nutzung von Anaconda-Kanälen unterliegt den Anaconda-Vertragsbedingungen.

MLflow-Modelle, die vor v1.18 (Databricks Runtime 8.3 ML oder früher) wurden standardmäßig mit dem conda-defaults Kanal (https://repo.anaconda.com/pkgs/) als Abhängigkeit protokolliert. Aufgrund dieser Lizenzänderung hat Databricks die Verwendung des defaults-Kanals für Modelle beendet, die mit MLflow v1.18 und höher protokolliert werden. Der protokollierte Standardkanal ist jetzt conda-forge, der auf die verwaltete Community https://conda-forge.org/ verweist.

Wenn Sie ein Modell vor MLflow v1.18 protokolliert haben, ohne den Kanal defaults aus der conda-Umgebung für das Modell auszuschließen, hat dieses Modell möglicherweise eine Abhängigkeit vom Kanal defaults, den die Sie möglicherweise nicht beabsichtigt haben. Um manuell zu überprüfen, ob ein Modell diese Abhängigkeit aufweist, können Sie den Wert von channel in der Datei conda.yaml untersuchen, die mit dem protokollierten Modell gepackt ist. Beispielsweise sieht die Datei conda.yaml eines Modells mit einer Abhängigkeit vom Kanal defaults wie folgt aus:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Da Databricks nicht bestimmen kann, ob Ihre Verwendung des Anaconda-Repositorys für die Interaktion mit Ihren Modellen gemäß Ihrer Beziehung mit Anaconda zulässig ist, erzwingt Databricks keine Änderungen von der Kundschaft. Wenn Ihre Nutzung des Anaconda.com-Repositorys über die Verwendung von Databricks unter den Bedingungen von Anaconda zulässig ist, müssen Sie keine Maßnahmen ergreifen.

Wenn Sie den Kanal ändern möchten, der in der Umgebung eines Modells verwendet wird, können Sie das Modell mit einer neuen Datei conda.yaml erneut bei der Modellregistrierung registrieren. Dazu geben Sie den Kanal im conda_env-Parameter von log_model() an.

Weitere Informationen zur log_model()-API finden Sie in der MLflow-Dokumentation für die Modellvariante, mit der Sie arbeiten, zum Beispiel log_model für scikit-learn.

Weitere Informationen zu conda.yaml-Dateien finden Sie in der MLflow-Dokumentation.

API-Befehle

Verwenden Sie mlflow.<model-type>.log_model(model, ...), um ein Modell auf dem MLflow-Nachverfolgungsserver zu protokollieren.

Verwenden Sie mlflow.<model-type>.load_model(modelpath), um ein zuvor protokolliertes Modell für Rückschlüsse oder die weitere Entwicklung zu laden. Dabei entspricht modelpath einem der folgenden Elemente:

  • Ausführungsrelativer Pfad (z. B. runs:/{run_id}/{model-path})
  • DBFS-Pfad
  • Pfad eines registrierten Modells (z. B. models:/{model_name}/{model_stage})

Eine vollständige Liste der Optionen zum Laden von MLflow-Modellen finden Sie im Abschnitt zum Verweisen auf Artefakte in der MLflow-Dokumentation.

Bei Python-MLflow-Modellen besteht eine zusätzliche Option darin, mlflow.pyfunc.load_model() zum Laden des Modells als generische Python-Funktion zu verwenden. Sie können den folgenden Codeausschnitt verwenden, um das Modell zu laden und Datenpunkte zu bewerten.

model = mlflow.pyfunc.load_model(model_path)
model.predict(model_input)

Alternativ können Sie das Modell als benutzerdefinierte Apache Spark-Funktion exportieren, um es für die Bewertung in einem Spark-Cluster zu verwenden (entweder als Batchauftrag oder als Spark-Streamingauftrag in Echtzeit).

# load input data table as a Spark DataFrame
input_data = spark.table(input_table_name)
model_udf = mlflow.pyfunc.spark_udf(spark, model_path)
df = input_data.withColumn("prediction", model_udf())

Protokollieren von Modellabhängigkeiten

Um ein Modell ordnungsgemäß zu laden, müssen Sie sicherstellen, dass die Modellabhängigkeiten mit den richtigen Versionen in die Notebookumgebung geladen werden. In der Databricks Runtime 10.5 ML und höher warnt MLflow Sie, wenn die aktuelle Umgebung und die Abhängigkeiten des Modells nicht übereinstimmen.

Zusätzliche Funktionen zum Vereinfachen der Wiederherstellung von Modellabhängigkeiten sind in Databricks Runtime 11.0 ML und höher enthalten. In Databricks Runtime 11.0 ML und höher können Sie für pyfunc-Modellvarianten mlflow.pyfunc.get_model_dependencies aufrufen, um die Modellabhängigkeiten abzurufen und herunterzuladen. Diese Funktion gibt einen Pfad zur Abhängigkeitsdatei zurück, die Sie dann mithilfe von %pip install <file-path> installieren können. Wenn Sie ein Modell als PySpark-UDF laden, geben Sie im mlflow.pyfunc.spark_udf-Aufruf env_manager="virtualenv" an. Dadurch werden Modellabhängigkeiten im Kontext der PySpark-UDF wiederhergestellt. Dies hat keine Auswirkungen auf die externe Umgebung.

Sie können diese Funktionalität auch in Databricks Runtime 10.5 oder niedriger verwenden, indem Sie MLflow, Version 1.25.0 oder höher manuell installieren:

%pip install "mlflow>=1.25.0"

Weitere Informationen zum Protokollieren von Modellabhängigkeiten (Python und Nicht-Python) und Artefakten finden Sie unter Modellabhängigkeiten protokollieren.

Erfahren Sie, wie Sie Modellabhängigkeiten und benutzerdefinierte Artefakte für die Modellbereitstellung protokollieren:

Automatisch generierte Codeausschnitte auf der MLflow-Benutzeroberfläche

Wenn Sie ein Modell in einem Azure Databricks-Notebook protokollieren, generiert Azure Databricks automatisch Codeschnipsel, die Sie kopieren und zum Laden und Ausführen des Modells verwenden können. Gehen Sie wie folgt vor, um diese Codeausschnitte anzuzeigen:

  1. Navigieren Sie zum Bildschirm „Ausführungen“ für die Ausführung, die das Modell generiert hat. (Informationen zum Anzeigen des Bildschirms „Ausführungen“ finden Sie unter Anzeigen von Notebookexperimenten.)
  2. Scrollen Sie zum Abschnitt Artefakte.
  3. Klicken Sie auf den Namen des protokollierten Modells. Rechts wird ein Bereich mit Code geöffnet, mit dem Sie das protokollierte Modell laden und Vorhersagen für Spark- oder Pandas-Dataframes treffen können.

Artifact panel code snippets

Beispiele

Beispiele für Protokollierungsmodelle finden Sie in den Beispielen unter Nachverfolgen von Machine Learning-Trainingsausführungen. Ein Beispiel für das Laden eines protokollierten Modells für Rückschlüsse finden Sie im Beispielmodell für Rückschlüsse.

Registrieren von Modellen bei der Modellregistrierung

Sie können Modelle bei der MLflow-Modellregistrierung registrieren. Dabei handelt es sich um einen zentralisierten Modellspeicher, der eine Benutzeroberfläche und eine Reihe von APIs bereitstellt, um den gesamten Lebenszyklus von MLflow-Modellen zu verwalten. Anweisungen zur Verwendung der Modellregistrierung zum Verwalten von Modellen in Databricks Unity Catalog finden Sie unter Verwalten des Modelllebenszyklus in Unity Catalog. Informationen zur Verwendung der Arbeitsbereichsmodellregistrierung finden Sie unter Verwalten des Modelllebenszyklus mithilfe der Arbeitsbereichsmodellregistrierung.

Verwenden Sie mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}") zum Registrieren eines Modells mithilfe der API.

Speichern von Modellen in DBFS

Verwenden Sie mlflow.<model-type>.save_model(model, modelpath), um ein Modell lokal zu speichern. modelpath muss ein DBFS-Pfad sein. Wenn Sie beispielsweise den DBFS-Speicherort dbfs:/my_project_models zum Speichern Ihrer Projektarbeit verwenden, müssen Sie den Modellpfad /dbfs/my_project_models verwenden:

modelpath = "/dbfs/my_project_models/model-%f-%f" % (alpha, l1_ratio)
mlflow.sklearn.save_model(lr, modelpath)

Verwenden Sie für MLlib-Modelle ML-Pipelines.

Herunterladen von Modellartefakten

Sie können die protokollierten Modellartefakte (z. B. Modelldateien, Plots und Metriken) für ein registriertes Modell mit verschiedenen APIs herunterladen.

Beispiel für Python-API:

from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository

model_uri = MlflowClient.get_model_version_download_uri(model_name, model_version)
ModelsArtifactRepository(model_uri).download_artifacts(artifact_path="")

Beispiel für Java-API:

MlflowClient mlflowClient = new MlflowClient();
// Get the model URI for a registered model version.
String modelURI = mlflowClient.getModelVersionDownloadUri(modelName, modelVersion);

// Or download the model artifacts directly.
File modelFile = mlflowClient.downloadModelVersion(modelName, modelVersion);

Beispiel für CLI-Befehl:

mlflow artifacts download --artifact-uri models:/<name>/<version|stage>

Bereitstellen von Modellen für die Onlinebereitstellung

Sie können die Modellbereitstellung verwenden, um Machine Learning-Modelle aus der Modellregistrierung als REST-Endpunkte zu hosten. Diese Endpunkte werden basierend auf der Verfügbarkeit von Modellversionen und deren Phasen automatisch aktualisiert.

Sie können mithilfe der in Mlflow integrierten Bereitstellungstools auch ein Modell für Bereitstellungsframeworks von Drittanbietern bereitstellen. Siehe folgendes Beispiel.