Share via


Anpassen von Ausgaben in Batchbereitstellungen

GILT FÜR:Azure CLI ML-Erweiterung v2 (aktuell)Python SDK azure-ai-ml v2 (aktuell)

In dieser Anleitung wird erläutert, wie Sie Bereitstellungen erstellen, die benutzerdefinierte Ausgaben und Dateien generieren. Manchmal benötigen Sie mehr Kontrolle darüber, was als Ausgabe von Batch-Rückschlussaufträgen geschrieben wurde. Zu diesen Fällen gehören die folgenden Situationen:

  • Sie müssen steuern, wie Vorhersagen in der Ausgabe geschrieben werden. Sie möchten beispielsweise die Vorhersage an die ursprünglichen Daten anfügen, wenn die Daten tabellarisch sind.
  • Sie müssen Ihre Vorhersagen in einem anderen Dateiformat als dem schreiben, das standardmäßig von Batchbereitstellungen unterstützt wird.
  • Ihr Modell ist ein generatives Modell, das die Ausgabe nicht in einem tabellarischen Format schreiben kann. Beispielsweise Modelle, die Bilder als Ausgabe erzeugen.
  • Ihr Modell erzeugt mehrere tabellarische Dateien anstelle einer einzelnen Datei. Beispielsweise Modelle, die Vorhersagen unter Berücksichtigung mehrerer Szenarien erstellen.

Batchbereitstellungen ermöglichen es Ihnen, die Ausgabe der Aufträge zu steuern, indem Sie direkt in die Ausgabe des Batch-Bereitstellungsauftrags schreiben können. In diesem Tutorial erfahren Sie, wie Sie ein Modell bereitstellen, um Batchrückschlüsse durchzuführen und die Ausgaben im Format Parquet zu schreiben, indem Sie die Vorhersagen an die ursprünglichen Eingabedaten anfügen.

Informationen zu diesem Beispiel

Dieses Beispiel zeigt, wie Sie ein Modell bereitstellen können, um einen Batchrückschluss durchzuführen und anzupassen, wie Ihre Vorhersagen in der Ausgabe geschrieben werden. Das Modell basiert auf dem UCI Heart Disease-Dataset. Die Datenbank enthält 76 Attribute, aber in diesem Beispiel wird eine Teilmenge von 14 verwendet. Das Modell versucht, das Vorhandensein einer Herzerkrankung bei einem Patienten vorherzusagen. Der Wert ist eine ganze Zahl zwischen 0 (nicht vorhanden) und 1 (vorhanden).

Das Modell wurde mit einem XGBBoost-Klassifizierer trainiert, und alle erforderlichen Vorverarbeitungen wurden in einer scikit-learn-Pipeline zusammengefasst, was dieses Modell zu einer End-to-End-Pipeline macht, die von Rohdaten bis zu Vorhersagen reicht.

Das Beispiel in diesem Artikel basiert 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, klonen Sie zunächst das Repository, und ändern Sie dann die Verzeichnisse zum Ordner:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Die Dateien für dieses Beispiel befinden sich in:

cd endpoints/batch/deploy-models/custom-outputs-parquet

Nachvollziehen in einem Jupyter Notebook

Es gibt ein Jupyter Notebook, das Sie verwenden können, um diesem Beispiel zu folgen. Öffnen Sie in dem geklonten Repository das Notebook mit dem Namen: custom-output-batch.ipynb.

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.

  • Ein Azure Machine Learning-Arbeitsbereich. Wenn Sie keinen haben, führen Sie die Schritte im Artikel Verwalten von Azure Machine Learning-Arbeitsbereichen aus, um einen Arbeitsbereich zu erstellen.

  • Stellen Sie sicher, dass Sie im Arbeitsbereich über die folgenden Berechtigungen verfügen:

    • Erstellen oder Verwalten von Batchendpunkten und Batchbereitstellungen: Verwenden Sie die Rolle für Besitzer*in oder Mitwirkende*r oder eine benutzerdefinierte Rolle, die Microsoft.MachineLearningServices/workspaces/batchEndpoints/* zulässt.

    • Erstellen von ARM-Bereitstellungen in der Arbeitsbereichsressourcengruppe: Verwenden Sie die Rolle für Besitzer*in oder Mitwirkende*r oder eine benutzerdefinierte Rolle, die Microsoft.Resources/deployments/write in der Ressourcengruppe zulässt, in der der Arbeitsbereich bereitgestellt wird.

  • Für die Arbeit mit Azure Machine Learning müssen Sie die folgende Software installieren:

    Die Azure CLI und die ml-Erweiterung für Azure Machine Learning.

    az extension add -n ml
    

    Hinweis

    Bereitstellungen der Pipelinekomponenten für Batchendpunkte wurden in Version 2.7 der Erweiterung ml für die Azure CLI eingeführt. Verwenden Sie az extension update --name ml, um die letzte Version davon zu erhalten.

Herstellen einer Verbindung mit Ihrem Arbeitsbereich

Der Arbeitsbereich ist die Ressource der obersten Ebene für Azure Machine Learning und ein zentraler Ort für die Arbeit mit allen Artefakten, die Sie während der Nutzung von Azure Machine Learning erstellen. In diesem Abschnitt stellen wir eine Verbindung mit dem Arbeitsbereich her, in dem Sie die Bereitstellung vornehmen werden.

Übergeben Sie die Werte für Ihre Abonnement-ID, Ihren Arbeitsbereich, Ihren Standort und Ihre Ressourcengruppe im folgenden Code:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Erstellen einer Batchbereitstellung mit einer benutzerdefinierten Ausgabe

In diesem Beispiel erstellen Sie eine Bereitstellung, die direkt in den Ausgabeordner des Batch-Bereitstellungsauftrags schreiben kann. Die Bereitstellung verwendet dieses Feature, um benutzerdefinierte Parquet-Dateien zu schreiben.

Registrieren des Modells

Sie können registrierte Modelle nur mithilfe eines Batchendpunkts bereitstellen. 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='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

Erstellen Sie ein Bewertungsskript.

Sie müssen ein Bewertungsskript erstellen, das die von der Batchbereitstellung bereitgestellten Eingabedaten lesen und die Scores des Modells zurückgeben kann. Sie werden auch direkt in den Ausgabeordner des Auftrags schreiben. Zusammenfassend führt das vorgeschlagene Bewertungsskript Folgendes aus:

  1. Es liest die Eingabedaten als CSV-Dateien.
  2. Es führt eine predict-Funktion des MLflow-Modells für die Eingabedaten aus.
  3. Es fügt die Vorhersagen zusammen mit den Eingabedaten an einen pandas.DataFrame an.
  4. Es schreibt die Daten in eine Datei, die denselben Namen wie die Eingabedatei trägt, jedoch im Format parquet.

code/batch_driver.py

import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List


def init():
    global model
    global output_path

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # It is the path to the model folder
    # Please provide your model's folder name if there's one:
    output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
    model_path = os.environ["AZUREML_MODEL_DIR"]
    model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]

    with open(model_file, "rb") as file:
        model = pickle.load(file)


def run(mini_batch: List[str]):
    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        data["prediction"] = pred

        output_file_name = Path(file_path).stem
        output_file_path = os.path.join(output_path, output_file_name + ".parquet")
        data.to_parquet(output_file_path)

    return mini_batch

Hinweise:

  • Beachten Sie, wie die Umgebungsvariable AZUREML_BI_OUTPUT_PATH verwendet wird, um Zugriff auf den Ausgabepfad des Bereitstellungsauftrags zu erhalten.
  • Die Funktion init() füllt eine globale Variable mit dem Namen output_path aus, die später verwendet werden kann, um zu ermitteln, wohin geschrieben werden soll.
  • Die Methode run gibt eine Liste der verarbeiteten Dateien zurück. Es ist erforderlich, dass die Funktion run ein list- oder ein pandas.DataFrame-Objekt zurückgibt.

Warnung

Berücksichtigen Sie, dass alle Batch-Executors gleichzeitig Schreibzugriff auf diesen Pfad haben. Das bedeutet, dass Sie Parallelität berücksichtigen müssen. Stellen Sie in diesem Fall sicher, dass jeder Executor seine eigene Datei unter Verwendung des Namens der Eingabedatei als Namen des Ausgabeordners schreibt.

Erstellen des Endpunkts

Sie erstellen nun einen Batchendpunkt mit dem Namen heart-classifier-batch, in dem das Modell bereitgestellt wird.

  1. Entscheiden Sie sich für den Namen des Endpunkts. Der Name des Endpunkts wird im dem Endpunkt zugeordneten URI angezeigt, sodass Batch-Endpunktnamen innerhalb einer Azure-Region eindeutig sein müssen. Beispielsweise kann es nur einen Endpunkt namens mybatchendpoint in westus2 geben.

    Platzieren Sie in diesem Fall den Namen des Endpunkts in einer Variablen, damit Sie später problemlos darauf verweisen können.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Konfigurieren Sie Ihren Batchendpunkt.

    Die folgende YAML-Datei definiert einen Batchendpunkt:

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: heart-classifier-batch
    description: A heart condition classifier for batch inference
    auth_mode: aad_token
    
  3. Erstellen des Endpunkts:

    az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    

Erstellen Sie die Bereitstellung

Führen Sie die nächsten Schritte aus, um eine Bereitstellung mithilfe des vorherigen Bewertungsskripts zu erstellen:

  1. Erstellen Sie zunächst eine Umgebung, in der das Bewertungsskript ausgeführt werden kann:

    Für die Azure Machine Learning CLI sind keine weiteren Schritte erforderlich. Die Umgebungsdefinition wird in die Bereitstellungsdatei aufgenommen.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Erstellen Sie die Bereitstellung. Beachten Sie, dass output_action jetzt auf SUMMARY_ONLY festgelegt ist.

    Hinweis

    In diesem Beispiel wird angenommen, dass Sie über einen Computecluster mit dem Namen batch-cluster verfügen. Ändern Sie diesen Namen entsprechend.

    Um eine neue Bereitstellung unter dem erstellten Endpunkt zu erstellen, erstellen Sie eine YAML-Konfiguration wie die folgende. Sie können das vollständige YAML-Schema des Batchendpunkts auf zusätzliche Eigenschaften überprüfen.

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost and Scikit-Learn pipelines that append predictions on parquet files.
    type: model
    model: azureml:heart-classifier-sklpipe@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: summary_only
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Erstellen Sie dann die Bereitstellung mit dem folgenden Befehl:

    az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. An diesem Punkt ist unser Batchendpunkt zur Verwendung bereit.

Testen der Bereitstellung

Zum Testen Ihres Endpunkts verwenden Sie eine Stichprobe für nicht gekennzeichnete Daten, die sich in diesem Repository befinden, das mit dem Modell verwendet werden kann. Batch-Endpunkte können nur Daten verarbeiten, die sich in der Cloud befinden und über den Azure Machine Learning-Arbeitsbereich zugänglich sind. In diesem Beispiel laden Sie sie in einen Azure Machine Learning-Datenspeicher hoch. Sie erstellen eine Datenressource, die zum Aufrufen des Endpunkts für die Bewertung verwendet werden kann. Beachten Sie jedoch, dass Batchendpunkte Daten akzeptieren, die an mehreren verschiedenen Speicherorten platziert werden können.

  1. Aufrufen des Endpunkts mit Daten aus einem Speicherkonto:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
    

    Hinweis

    Das Hilfsprogramm jq wird möglicherweise nicht bei jeder Installation installiert. Sie können Anweisungen auf GitHub erhalten.

  2. Ein Batchauftrag wird gestartet, sobald der Befehl zurückgegeben wird. Sie können den Status des Auftrags überwachen, bis er abgeschlossen ist:

    az ml job show -n $JOB_NAME --web
    

Analysieren der Ausgaben

Der Auftrag generiert eine benannte Ausgabe mit dem Namen score, in der alle generierten Dateien platziert werden. Da Sie direkt in das Verzeichnis geschrieben haben, eine Datei pro Eingabedatei, können Sie erwarten, dass die gleiche Anzahl von Dateien vorhanden ist. Benennen Sie in diesem Beispiel die Ausgabedateien genauso wie die Eingabedateien, aber mit der Erweiterung „Parquet“.

Hinweis

Beachten Sie, dass eine predictions.csv-Datei auch im Ausgabeordner enthalten ist. Diese Datei enthält die Zusammenfassung der verarbeiteten Dateien.

Sie können die Ergebnisse des Auftrags mithilfe des Auftragsnamens herunterladen:

Verwenden Sie den folgenden Befehl, um die Vorhersagen herunterzuladen:

az ml job download --name $JOB_NAME --output-name score --download-path ./

Nachdem die Datei heruntergeladen wurde, können Sie sie mithilfe Ihres bevorzugten Tools öffnen. Im folgenden Beispiel werden die Vorhersagen mithilfe des Datenrahmens Pandas geladen.

import pandas as pd
import glob

output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score

Die Ausgabe sieht wie folgt aus:

age sex ... Thal prediction
63 1 ... fixed 0
67 1 ... normal 1
67 1 ... umkehrbar 0
37 1 ... normal 0

Bereinigen von Ressourcen

Führen Sie den folgenden Code aus, um den Batchendpunkt und alle zugrundeliegenden Bereitstellungen zu löschen. Batch-Bewertungsaufträge werden nicht gelöscht.

az ml batch-endpoint delete --name $ENDPOINT_NAME --yes