Bereitstellen von MLflow-Modellen für Onlineendpunkte
GILT FÜR Azure CLI-ML-Erweiterung v2 (aktuell)
In diesem Artikel erfahren Sie, wie Sie Ihr MLflow-Modell auf einem Onlineendpunkt für den Echtzeitrückschluss bereitstellen. Wenn Sie Ihr MLflow-Modell für einen Onlineendpunkt bereitstellen, müssen Sie weder ein Bewertungsskript noch eine Umgebung angeben. Diese Funktion wird als Bereitstellung ohne Code bezeichnet.
Bei einer Bereitstellung ohne Code übernimmt Azure Machine Learning diese Aufgaben:
- Installiert dynamisch Python-Pakete, die in der Datei
conda.yaml
bereitgestellt werden. Abhängigkeiten werden daher während der Containerlaufzeit installiert. - Stellt ein MLflow-Basisimage bzw. eine zusammengestellte Umgebung bereit, das bzw. die folgende Elemente enthält:
azureml-inference-server-http
mlflow-skinny
- Ein Bewertungsskript für Rückschlüsse.
Tipp
Arbeitsbereiche ohne zugriff auf öffentliche Netzwerke: Bevor Sie MLflow-Modelle für Onlineendpunkte ohne Übergabekonnektivität bereitstellen können, müssen Sie die Modelle verpacken (Vorschau). Durch die Verwendung von Modellverpackungen können Sie die Notwendigkeit einer Internetverbindung vermeiden, die sonst erforderlich wäre, um die erforderlichen Python-Pakete für die MLflow-Modelle dynamisch zu installieren.
Informationen zum Beispiel
In dem Beispiel wird gezeigt, wie Sie ein MLflow-Modell für einen Onlineendpunkt bereitstellen können, um Vorhersagen auszuführen. In dem Beispiel wird ein MLflow-Modell verwendet, das auf dem Dataset zu Diabetes basiert. Dieses Dataset enthält zehn Baselinevariablen (Alter, Geschlecht, BMI, durchschnittlicher Blutdruck und sechs Blutserumwerte) von 442 Diabetespatient*innen. Es enthält auch die relevante Antwort: einen quantitativen Messwert der Entwicklung der Krankheit ein Jahr nach der Baseline.
Das Modell wurde mit einem Regressor vom Typ scikit-learn
trainiert, und die gesamte erforderliche Vorverarbeitung wurde in einer Pipeline zusammengefasst, was dieses Modell zu einer End-to-End-Pipeline macht, die von Rohdaten bis zu Vorhersagen reicht.
Die Informationen in diesem Artikel basieren auf Codebeispielen, die im Repository azureml-examples enthalten sind. Um die Befehle lokal auszuführen, ohne YAML und andere Dateien kopieren/einfügen zu müssen, können Sie das Repository klonen und anschließend in das Verzeichnis cli
wechseln, wenn Sie die Azure CLI verwenden. Falls Sie das Azure Machine Learning SDK für Python verwenden, wechseln Sie in das Verzeichnis sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Nachvollziehen in Jupyter Notebook
Sie können die Schritte für die Verwendung des Azure Machine Learning Python SDK nachvollziehen, indem Sie im geklonten Repository das Notebook Deploy MLflow model to online endpoints öffnen.
Voraussetzungen
Stellen Sie vor dem Ausführen der Schritte in diesem Artikel sicher, dass Sie über die folgenden erforderlichen Komponenten verfügen:
Ein Azure-Abonnement. Wenn Sie nicht über ein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen. Probieren Sie die kostenlose oder kostenpflichtige Version von Azure Machine Learning aus.
Die rollenbasierte Zugriffssteuerung in Azure (Azure RBAC) wird verwendet, um Zugriff auf Vorgänge in Azure Machine Learning zu gewähren. Um die Schritte in diesem Artikel ausführen zu können, muss Ihr Benutzerkonto der Rolle „Besitzer“ oder „Mitwirkender“ für den Azure Machine Learning-Arbeitsbereich oder einer benutzerdefinierten Rolle zugewiesen sein, die
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
zulässt. Weitere Informationen zu Rollen finden Sie unter Verwalten des Zugriffs auf Azure Machine Learning-Arbeitsbereiche.In Ihrem Arbeitsbereich muss ein MLflow-Modell registriert sein. In diesem Beispiel wird im Arbeitsbereich ein Modell registriert, das für das Diabetes-Dataset trainiert wurde.
Außerdem erforderlich:
- Installieren Sie die Azure CLI und die
ml
-Erweiterung für die Azure CLI. Weitere Informationen zum Installieren der CLI finden Sie unter Installieren und Einrichten der CLI (v2).
- Installieren Sie die Azure CLI und die
Eine Verbindung mit Ihrem Arbeitsbereich herstellen
Stellen Sie zunächst eine Verbindung mit dem Azure Machine Learning-Arbeitsbereich her, in dem Sie arbeiten.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registrieren des Modells
Nur registrierte Modelle können für Onlineendpunkte bereitgestellt werden. In diesem Fall ist bereits eine lokale Kopie des Modells im Repository vorhanden, daher muss das Modell nur in der Registrierung im Arbeitsbereich veröffentlicht werden. Sie können diesen Schritt überspringen, wenn das Modell, das Sie bereitstellen möchten, bereits registriert ist.
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Was, wenn Ihr Modell innerhalb einer Ausführung protokolliert wurde?
Wenn Ihr Modell innerhalb einer Ausführung protokolliert wurde, können Sie es direkt registrieren.
Um das Modell zu registrieren, müssen Sie seinen Speicherort kennen. Wenn Sie das autolog
-Feature von MLflow verwenden, hängt der Pfad zum Modell vom Modelltyp und Framework ab. Überprüfen Sie die Auftragsausgabe, um den Ordnernamen des Modells zu ermitteln. Dieser Ordner enthält eine Datei mit dem Namen MLModel
.
Wenn Sie die log_model
-Methode zum manuellen Protokollieren Ihrer Modelle verwenden, übergeben Sie den Pfad zum Modell als Argument an die Methode. Wenn Sie das Modell also beispielsweise mit mlflow.sklearn.log_model(my_model, "classifier")
protokollieren, ist classifier
der Pfad, an dem das Modell gespeichert ist.
Verwenden Sie die Azure Machine Learning CLI v2, um ein Modell aus einer Trainingsauftragsausgabe zu erstellen. Im folgenden Beispiel wird ein Modell mit dem Namen $MODEL_NAME
mithilfe der Artefakte eines Auftrags mit der ID $RUN_ID
registriert. Der Pfad, in dem das Modell gespeichert ist, ist $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Hinweis
Der Pfad $MODEL_PATH
ist der Speicherort, an dem das Modell in der Ausführung gespeichert wurde.
Bereitstellen eines MLflow-Modells an einem Onlineendpunkt
Konfigurieren Sie den Endpunkt, auf dem das Modell bereitgestellt werden soll. Im folgenden Beispiel werden der Name und der Authentifizierungsmodus des Endpunkts konfiguriert:
Legen Sie einen Endpunktnamen fest, indem Sie den folgenden Befehl ausführen und dabei
YOUR_ENDPOINT_NAME
durch einen eindeutigen Namen ersetzen:export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Konfigurieren des Endpunkts:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Erstellen des Endpunkts:
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Konfigurieren Sie die Bereitstellung. Eine Einrichtung ist ein Satz von Ressourcen, die für das Hosting des Modells erforderlich sind, das die eigentliche Inferenz durchführt.
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Hinweis
Die automatische Generierung von
scoring_script
undenvironment
wird nur für die Modellvariantepyfunc
unterstützt. Informationen zur Verwendung einer anderen Modellvariante finden Sie unter Anpassen von Bereitstellungen von MLflow-Modellen.Erstellen Sie die Bereitstellung:
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Wenn Ihr Endpunkt keine ausgehende Verbindung hat, können Sie Ihre Modelle packen (Vorschau), indem Sie das Flag
--with-package
einschließen:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Weisen Sie den gesamten Datenverkehr der Bereitstellung zu. Bisher verfügt der Endpunkt über genau eine Bereitstellung, es ist aber kein Datenverkehr zugewiesen.
Dieser Schritt ist in der Azure CLI nicht erforderlich, da Sie bei der Erstellung das Flag
--all-traffic
verwendet haben. Wenn Sie den Datenverkehr ändern müssen, können Sie den Befehlaz ml online-endpoint update --traffic
verwenden. Weitere Informationen zum Aktualisieren des Datenverkehrs finden Sie unter Schrittweises Aktualisieren des Datenverkehrs.Aktualisieren Sie die Endpunktkonfiguration:
Dieser Schritt ist in der Azure CLI nicht erforderlich, da Sie bei der Erstellung das Flag
--all-traffic
verwendet haben. Wenn Sie den Datenverkehr ändern müssen, können Sie den Befehlaz ml online-endpoint update --traffic
verwenden. Weitere Informationen zum Aktualisieren des Datenverkehrs finden Sie unter Schrittweises Aktualisieren des Datenverkehrs.
Aufrufen des Endpunkts
Sobald Ihre Bereitstellung bereit ist, können Sie sie für Anforderungen verwenden. Eine Möglichkeit zum Testen der Bereitstellung ist die Verwendung der integrierten Aufruffunktion im verwendeten Bereitstellungsclient. Der folgende JSON-Code ist eine Beispielanforderung für die Bereitstellung.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Hinweis
In diesem Beispiel wird input_data
verwendet (anstelle von inputs
wie bei der MLflow-Bereitstellung). Das liegt daran, dass Azure Machine Learning ein anderes Eingabeformat benötigt, um die Swagger-Verträge für die Endpunkte automatisch generieren zu können. Weitere Informationen zu erwarteten Eingabeformaten finden Sie unter Unterschiede zwischen Modellen, die in Azure Machine Learning und dem integrierten MLflow-Server bereitgestellt werden.
Übermitteln Sie wie folgt eine Anforderung an den Endpunkt:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Die Antwort sieht in etwa wie folgender Text aus:
[
11633.100167144921,
8522.117402884991
]
Wichtig
Für die Bereitstellung ohne Code in MLflow wird das Testen über lokale Endpunkte derzeit nicht unterstützt.
Anpassen von MLflow-Modellbereitstellungen
Sie müssen kein Bewertungsskript in der Bereitstellungsdefinition eines MLflow-Modells für einen Onlineendpunkt angeben. Sie können diesen Schritt jedoch optional ausführen und anpassen, wie der Rückschlüsse durchgeführt werden.
Eine Anpassung Ihrer MLflow-Modellbereitstellung empfiehlt sich in der Regel in folgenden Fällen:
- Das Modell verfügt nicht keine
PyFunc
-Variante. - Sie müssen die Ausführung des Modells anpassen (etwa, um mithilfe von
mlflow.<flavor>.load_model()
eine bestimmte Variante zum Laden des Modells zu verwenden). - Sie müssen die Vorab-/Nachverarbeitung in Ihrer Bewertungsroutine durchführen, wenn sie nicht vom Modell selbst durchgeführt wird.
- Die Ergebnisse des Modells lassen sich nicht gut in Tabellenform darstellen. Beispielsweise, wenn es sich um einen Tensor handelt, der ein Bild darstellt.
Wichtig
Wenn Sie ein Bewertungsskript für eine MLflow-Modellimplementierung angeben möchten, müssen Sie auch die Umgebung angeben, in der die Bereitstellung ausgeführt wird.
Schritte
So stellen Sie ein MLflow-Modell mit einem benutzerdefinierten Bewertungsskript bereit:
Identifizieren Sie den Ordner, in dem sich Ihr MLflow-Modell befindet.
a. Wechseln Sie zum Azure Machine Learning-Studio.
b. Navigieren Sie zum Abschnitt Modelle.
c. Wählen Sie das Modell aus, das Sie bereitstellen möchten, und navigieren Sie zur zugehörigen Registerkarte Artefakte.
d. Beachten Sie den angezeigten Ordner. Dieser Ordner wurde beim Registrieren des Modells angegeben.
Erstellen Sie ein Bewertungsskript. Beachten Sie, dass der zuvor identifizierte Ordnername
model
in die Funktioninit()
eingeschlossen wurde.Tipp
Das folgende Bewertungsskript wird als Beispiel für die Generierung von Rückschlüssen mit einem MLflow-Modell bereitgestellt. Sie können dieses Skript an Ihre Anforderungen anpassen oder die einzelnen Komponenten entsprechend Ihrem Szenario ändern.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Warnung
MLflow 2.0-Empfehlung: Das bereitgestellte Bewertungsskript funktioniert sowohl mit MLflow 1.x als auch mit MLflow 2.x. Beachten Sie jedoch, dass die erwarteten Eingabe-/Ausgabeformate für diese Versionen variieren können. Überprüfen Sie die aktuelle Umgebungsdefinition, um sicherzustellen, dass Sie die erwartete MLflow-Version verwenden. Beachten Sie, dass MLflow 2.0 nur ab Python 3.8 unterstützt wird.
Erstellen Sie eine Umgebung, in der das Bewertungsskript ausgeführt werden kann. Da das Modell ein MLflow-Modell ist, werden die Conda-Anforderungen auch im Modellpaket angegeben. Weitere Informationen zu den Dateien, die in einem MLflow-Modell enthalten sind, finden Sie unter Das MLModel-Format. Als Nächstes erstellen Sie die Umgebung unter Verwendung der Conda-Abhängigkeiten aus der Datei. Sie müssen allerdings auch das Paket
azureml-inference-server-http
einschließen, das für Onlinebereitstellungen in Azure Machine Learning erforderlich ist.Die Conda-Definitionsdatei sieht wie folgt aus:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Hinweis
Das Paket
azureml-inference-server-http
wurde der ursprünglichen Conda-Abhängigkeitsdatei hinzugefügt.Diese Conda-Abhängigkeitsdatei wird zum Erstellen der Umgebung verwendet:
Die Umgebung wird inline in der Bereitstellungskonfiguration erstellt.
Erstellen Sie die Bereitstellung:
Erstellen Sie eine Bereitstellungskonfigurationsdatei namens deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Erstellen Sie die Bereitstellung:
az ml online-deployment create -f deployment.yml
Nach Abschluss des Bereitstellungsvorgangs kann die Bereitstellung für Anforderungen verwendet werden. Eine Möglichkeit zum Testen der Bereitstellung ist die Verwendung einer Beispielanforderungsdatei in Verbindung mit der
invoke
-Methode.sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Übermitteln Sie wie folgt eine Anforderung an den Endpunkt:
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
Die Antwort sieht in etwa wie folgender Text aus:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Warnung
MLflow 2.0-Empfehlung: In MLflow 1.x fehlt der Schlüssel
predictions
.
Bereinigen von Ressourcen
Wenn Sie den Endpunkt nicht mehr benötigen, löschen Sie die zugeordneten Ressourcen:
az ml online-endpoint delete --name $ENDPOINT_NAME --yes