Freigeben über


Verwenden eines benutzerdefinierten Containers zum Bereitstellen eines Modells für einen Onlineendpunkt

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

In Azure Machine Learning können Sie einen benutzerdefinierten Container verwenden, um ein Modell auf einem Onlineendpunkt bereitzustellen. Benutzerdefinierte Containerbereitstellungen können andere Webserver als den standardmäßigen Python Flask-Server verwenden, der Azure Machine Learning verwendet.

Wenn Sie eine benutzerdefinierte Bereitstellung verwenden, können Sie:

  • Verwenden Sie verschiedene Tools und Technologien wie TensorFlow Serving (TF Serving), TorchServe, Triton Inference Server, das Plumber R-Paket und das Azure Machine Learning Minimal-Image.
  • Nutzen Sie dennoch die integrierte Überwachung, Skalierung, Warnung und Authentifizierung, die Azure Machine Learning bietet.

In diesem Artikel wird erklärt, wie Sie ein TF Serving-Image verwenden, um ein TensorFlow-Modell bereitzustellen.

Prerequisites

  • Ein Azure Machine Learning Arbeitsbereich. Anweisungen zum Erstellen eines Arbeitsbereichs finden Sie unter Erstellen des Arbeitsbereichs.

  • Die Azure CLI und die erweiterung ml oder das Azure Machine Learning Python SDK v2:

    Informationen zum Installieren des Azure CLI und der erweiterung ml finden Sie unter Install und Einrichten der CLI (v2).

    In den Beispielen in diesem Artikel wird davon ausgegangen, dass Sie eine Bash-Shell oder eine kompatible Shell verwenden. Sie können beispielsweise eine Shell auf einem Linux-System oder Windows Subsystem for Linux verwenden.

  • Eine Azure-Ressourcengruppe, die Ihren Arbeitsbereich enthält und zu der entweder Sie oder Ihr Dienstprinzipal Mitwirkender-Zugriff haben. Wenn Sie die Schritte unter "Arbeitsbereich erstellen" verwenden, um Ihren Arbeitsbereich zu konfigurieren, erfüllen Sie diese Anforderung.

  • Docker-Modul, lokal installiert und ausgeführt. Diese Voraussetzung wird dringend empfohlen. Sie benötigen es, um ein Modell lokal bereitzustellen, und es ist hilfreich für das Debuggen.

Bereitstellungsbeispiele

In der folgenden Tabelle sind Deployment examples aufgeführt, die benutzerdefinierte Container verwenden und verschiedene Tools und Technologien nutzen.

Example Azure CLI-Skript Description
minimal/multimodel deploy-custom-container-minimal-multimodel Stellt mehrere Modelle in einer einzelnen Bereitstellung bereit, indem das Rückschluss-Minimalimage für Azure Machine Learning erweitert wird
minimal/single-model deploy-custom-container-minimal-single-model Stellt ein einzelnes Modell bereit, indem das minimale Inferenzimage von Azure Machine Learning erweitert wird.
mlflow/multideployment-scikit deploy-custom-container-mlflow-multideployment-scikit Stellt zwei MLFlow-Modelle mit unterschiedlichen Python Anforderungen für zwei separate Bereitstellungen hinter einem einzelnen Endpunkt bereit. Verwendet das Rückschluss-Minimalimage für Azure Machine Learning.
r/multimodel-plumber deploy-custom-container-r-multimodel-plumber Stellt drei Regressionsmodelle auf einem Endpunkt bereit. Verwendet das Plumber R-Paket.
tfserving/half-plus-two deploy-custom-container-tfserving-half-plus-two Stellt ein Half Plus Two-Modell mithilfe eines benutzerdefinierten TF Serving-Containers bereit. Verwendet den Standardmodellregistrierungsprozess.
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated Stellt ein Half Plus Two-Modell bereit, indem ein benutzerdefinierter Container für TF Serving verwendet wird, in dem das Modell in das Image integriert ist.
torchserve/densenet deploy-custom-container-torchserve-densenet Stellt ein einzelnes Modell mithilfe eines benutzerdefinierten TorchServe-Containers bereit.
triton/single-model maßgeschneiderten Container-Trition-Einzelmodell bereitstellen Stellt ein Triton-Modell mithilfe eines benutzerdefinierten Containers bereit.

In diesem Artikel erfahren Sie, wie Sie das tfserving/half-plus-two Beispiel verwenden.

Warning

Microsoft-Supportteams können möglicherweise nicht helfen, Probleme zu beheben, die durch ein benutzerdefiniertes Image verursacht werden. Wenn Probleme auftreten, werden Sie möglicherweise aufgefordert, das Standardbild oder eines der Von Microsoft bereitgestellten Bilder zu verwenden, um festzustellen, ob das Problem für Ihr Bild spezifisch ist.

Herunterladen des Quellcodes

Die Schritte in diesem Artikel verwenden Codebeispiele aus dem Repository azureml-examples. Führen Sie die folgenden Befehle aus, um das Repository zu klonen:

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

Initialisieren von Umgebungsvariablen

Um ein TensorFlow-Modell zu verwenden, benötigen Sie mehrere Umgebungsvariablen. Führen Sie die folgenden Befehle aus, um diese Variablen zu definieren:

BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1

Herunterladen eines TensorFlow-Modells

Laden Sie ein Modell herunter, und entpacken Sie ein Modell, das einen Eingabewert durch zwei dividiert, und fügt dem Ergebnis zwei hinzu:

wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH

Lokales Testen eines TF Serving-Images

Verwenden Sie Docker, um Ihr Image lokal zum Testen auszuführen:

docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
 -e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
 --name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10

Verfügbarkeits- und Bewertungsanforderungen an das Image senden

Senden Sie eine Liveness-Anforderung, um zu überprüfen, ob der Prozess innerhalb des Containers ausgeführt wird. Sie sollten den Antwortstatuscode 200 OK erhalten.

curl -v http://localhost:8501/v1/models/$MODEL_NAME

Senden Sie eine Bewertungsanforderung, um zu überprüfen, ob Sie Vorhersagen für nicht bezeichnete Daten erhalten können:

curl --header "Content-Type: application/json" \
  --request POST \
  --data @$BASE_PATH/sample_request.json \
  http://localhost:8501/v1/models/$MODEL_NAME:predict

Beenden des Images

Wenn Sie den Test lokal abgeschlossen haben, beenden Sie das Bild:

docker stop tfserving-test

Bereitstellen Ihres Onlineendpunkts zum Azure

Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihren Onlineendpunkt für Azure bereitzustellen.

Erstellen von YAML-Dateien für Ihren Endpunkt und die Bereitstellung

Sie können Ihre Cloudbereitstellung mithilfe von YAML konfigurieren. Um beispielsweise Ihren Endpunkt zu konfigurieren, erstellen Sie eine YAML-Datei mit dem Namen tfserving-endpoint.yml , die die folgenden Zeilen enthält:

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token

Um Ihre Bereitstellung zu konfigurieren, erstellen Sie eine YAML-Datei mit dem Namen tfserving-deployment.yml , die die folgenden Zeilen enthält:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: <model-version>
  path: ./half_plus_two
environment_variables:
  MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/<model-version>
  MODEL_NAME: half_plus_two
environment:
  #name: tfserving
  #version: 1
  image: docker.io/tensorflow/serving:latest
  inference_config:
    liveness_route:
      port: 8501
      path: /v1/models/half_plus_two
    readiness_route:
      port: 8501
      path: /v1/models/half_plus_two
    scoring_route:
      port: 8501
      path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1

In den folgenden Abschnitten werden wichtige Konzepte zu den PARAMETERn YAML und Python erläutert.

Basisbild

Geben Sie im Abschnitt environment in YAML oder im Environment-Konstruktor in Python das Basisbild als Parameter an. In diesem Beispiel wird docker.io/tensorflow/serving:latest als Wert für image verwendet.

Wenn Sie Ihren Container überprüfen, können Sie sehen, dass dieser Server ENTRYPOINT-Befehle verwendet, um ein Einstiegsskript zu starten. Dieses Skript verwendet Umgebungsvariablen wie MODEL_BASE_PATH und MODEL_NAME, und es macht Ports wie 8501 verfügbar. Diese Details beziehen sich alle auf diesen Server, und Sie können diese Informationen verwenden, um zu bestimmen, wie Ihre Bereitstellung definiert wird. Wenn Sie beispielsweise die MODEL_BASE_PATH Variablen und MODEL_NAME Umgebungsvariablen in Ihrer Bereitstellungsdefinition festlegen, verwendet TF Serving diese Werte, um den Server zu initiieren. Ebenso werden Benutzeranfragen bei Festlegung des Ports für jede Route auf 8501 in der Bereitstellungsdefinition ordnungsgemäß an den TF-Serving-Server weitergeleitet.

Dieses Beispiel basiert auf dem TF Serving-Fall. Sie können jedoch jeden Container verwenden, der aktiv bleibt und auf Anforderungen reagiert, die an Routen für Verfügbarkeit, Bereitschaft und Bewertung gesendet werden. Um zu sehen, wie man eine Dockerfile erstellt, um einen Container zu erstellen, schauen Sie sich andere Beispiele an. Einige Server verwenden CMD Anweisungen anstelle von ENTRYPOINT Anweisungen.

Tipp

Für Produktionsbereitstellungen fixieren Sie sich auf eine bestimmte Image-Version (z. B. docker.io/tensorflow/serving:2.18.0), anstatt :latest zu verwenden, um reproduzierbare Bereitstellungen sicherzustellen.

Der Parameter „inference_config“

Im environment Abschnitt oder in der Environment Klasse ist inference_config ein Parameter. Gibt den Port und Pfad für drei Arten von Routen an: Verfügbarkeits-, Bereitschafts- und Bewertungsrouten. Der inference_config Parameter ist erforderlich, wenn Sie Ihren eigenen Container mit einem verwalteten Onlineendpunkt ausführen möchten.

Bereitschaftsrouten im Vergleich zu Liveness-Routen

Einige API-Server bieten eine Möglichkeit, den Status des Servers zu überprüfen. Es gibt zwei Arten von Routen, die Sie für die Überprüfung des Status angeben können:

  • Liveness-Routen: Um zu überprüfen, ob ein Server läuft, verwenden Sie eine Liveness-Route.
  • Bereitschaftsrouten : Verwenden Sie eine Bereitschaftsroute, um zu überprüfen, ob ein Server für die Arbeit bereit ist.

Im Kontext der Ableitung des maschinellen Lernens reagiert ein Server möglicherweise mit einem Statuscode von 200 OK auf eine Livenessanforderung, bevor ein Modell geladen wird. Der Server antwortet möglicherweise mit einem Statuscode von 200 OK auf eine Bereitschaftsanforderung, nachdem es das Modell in den Arbeitsspeicher geladen hat.

Weitere Informationen zu Verfügbarkeits- und Bereitschaftstests finden Sie unter Konfigurieren von Verfügbarkeits-, Bereitschafts- und Starttests.

Der von Ihnen ausgewählte API-Server bestimmt die Verfügbarkeits- und Bereitschaftsrouten. Sie identifizieren diesen Server in einem früheren Schritt, wenn Sie den Container lokal testen. In diesem Artikel verwendet die Beispielbereitstellung denselben Pfad für die Verfügbarkeits- und Bereitschaftsrouten, da TF Serving nur eine Verfügbarkeitsroute definiert. Weitere Möglichkeiten zum Definieren der Routen finden Sie in anderen Beispielen.

Punktevergabevorgänge

Der verwendete API-Server bietet eine Möglichkeit, die Nutzdaten zu empfangen, um daran zu arbeiten. Im Kontext der Machine Learning-Ableitung empfängt ein Server die Eingabedaten über eine bestimmte Route. Identifizieren Sie diese Route für Ihren API-Server, wenn Sie den Container lokal in einem früheren Schritt testen. Geben Sie diese Route als Bewertungsroute an, wenn Sie die zu erstellende Bereitstellung definieren.

Die erfolgreiche Erstellung der Bereitstellung aktualisiert auch den scoring_uri-Parameter des Endpunkts. Sie können diese Tatsache überprüfen, indem Sie den folgenden Befehl ausführen: az ml online-endpoint show -n <endpoint-name> --query scoring_uri.

Suchen des eingebundenen Modells

Wenn Sie ein Modell als Onlineendpunkt bereitstellen, Azure Machine Learning mounts Ihr Modell an Ihren Endpunkt. Wenn das Modell bereitgestellt wird, können Sie neue Versionen des Modells bereitstellen, ohne ein neues Docker-Image erstellen zu müssen. Standardmäßig befindet sich ein Modell, das mit dem Namen "my-model " und "Version 1 " registriert ist, im folgenden Pfad innerhalb Ihres bereitgestellten Containers: /var/azureml-app/azureml-models/my-model/1.

Betrachten Sie z. B. die folgende Einrichtung:

  • Eine Verzeichnisstruktur auf Ihrem lokalen Computer von /azureml-examples/cli/endpoints/online/custom-container
  • Modellname half_plus_two

Screenshot einer Strukturansicht einer lokalen Verzeichnisstruktur. Der Pfad

Angenommen, Ihre tfserving-deployment.yml Datei enthält die folgenden Zeilen im model Abschnitt. In diesem Abschnitt bezieht sich der wert name auf den Namen, den Sie zum Registrieren des Modells in Azure Machine Learning verwenden.

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

Wenn Sie eine Bereitstellung erstellen, befindet sich Ihr Modell in diesem Fall unter dem folgenden Ordner: /var/azureml-app/azureml-models/tfserving-mounted/1

Screenshot: Strukturansicht der Bereitstellungsverzeichnisstruktur. Der Pfad „var/azureml-app/azureml-models/tfserving-mounted/1“ist sichtbar.

Sie können optional Ihren model_mount_path Wert konfigurieren. Durch Anpassen dieser Einstellung können Sie den Pfad ändern, in dem das Modell bereitgestellt wird.

Important

Der model_mount_path Wert muss ein gültiger absoluter Pfad in Linux sein (im Gastbetriebssystem des Containerimages).

Important

Sie können model_mount_path nur in einem BYOC-Szenario (Bring your own container) verwenden. In einem BYOC-Szenario muss die Umgebung, die die Online-Bereitstellung verwendet, mit dem inference_config Parameter konfiguriert sein. Verwenden Sie die Azure Machine Learning CLI oder das Python SDK, um den Parameter inference_config beim Erstellen der Umgebung anzugeben. Das Studio unterstützt derzeit die Angabe dieses Parameters nicht.

Wenn Sie den Wert ändern model_mount_path, müssen Sie auch die MODEL_BASE_PATH Umgebungsvariable aktualisieren. Setzen Sie MODEL_BASE_PATH auf denselben Wert wie model_mount_path, um eine fehlgeschlagene Bereitstellung aufgrund eines Fehlers zu vermeiden, dass der Basispfad nicht gefunden wird.

Sie können beispielsweise den model_mount_path Parameter zu Ihrer tfserving-deployment.yml Datei hinzufügen. Sie können den Wert in dieser MODEL_BASE_PATH Datei auch aktualisieren:

name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: 1
  path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
environment_variables:
  MODEL_BASE_PATH: /var/tfserving-model-mount
...

In Ihrer Bereitstellung befindet sich Ihr Modell unter /var/tfserving-model-mount/tfserving-mounted/1. Er befindet sich nicht mehr unter azureml-app/azureml-models, sondern unter dem Einbindungspfad, den Sie angeben.

Screenshot einer Strukturansicht der Bereitstellungsverzeichnisstruktur. Der Pfad /var/tfserving-model-mount/tfserving-mounted/1 ist sichtbar.

Erstellen Sie Ihren Endpunkt und die Bereitstellung

Nachdem Sie ihre YAML-Datei erstellt haben, verwenden Sie den folgenden Befehl, um Ihren Endpunkt zu erstellen:

az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-endpoint.yml

Verwenden Sie den folgenden Befehl, um Ihre Bereitstellung zu erstellen. Dieser Schritt kann einige Minuten dauern.

az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving/half-plus-two/tfserving-deployment.yml --all-traffic

Aufrufen des Endpunkts

Wenn Die Bereitstellung abgeschlossen ist, stellen Sie eine Bewertungsanforderung an den bereitgestellten Endpunkt.

RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

Löschen des Endpunkts

Wenn Sie Ihren Endpunkt nicht mehr benötigen, führen Sie den folgenden Befehl aus, um ihn zu löschen:

az ml online-endpoint delete --name tfserving-endpoint