Bereitstellen von MLflow-Modellen für Onlineendpunkte

GILT FÜRAzure 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:

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:


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

  1. 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
    
  2. Erstellen des Endpunkts:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. 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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Hinweis

    Die automatische Generierung von scoring_script und environment wird nur für die Modellvariante pyfunc unterstützt. Informationen zur Verwendung einer anderen Modellvariante finden Sie unter Anpassen von Bereitstellungen von MLflow-Modellen.

  4. 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
    
  5. 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 Befehl az ml online-endpoint update --traffic verwenden. Weitere Informationen zum Aktualisieren des Datenverkehrs finden Sie unter Schrittweises Aktualisieren des Datenverkehrs.

  6. 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 Befehl az 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:

  1. 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.

    Screenshot: Ordner, in dem die Modellartefakte platziert werden

  2. Erstellen Sie ein Bewertungsskript. Beachten Sie, dass der zuvor identifizierte Ordnername model in die Funktion init() 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.

  3. 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.

  4. 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
    
  5. 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