Bereitstellen von Modellen mit REST

Erfahren Sie, wie Sie die Azure Machine Learning-REST-API zum Bereitstellen von Modellen verwenden.

Von der REST-API werden HTTP-Standardverben genutzt, um Ressourcen zu erstellen, abzurufen, zu aktualisieren und zu löschen. Die REST-API funktioniert mit jeder Sprache oder jedem Tool, die bzw. das HTTP-Anforderungen ausführen kann. Durch die unkomplizierte Struktur von REST sind diese APIs eine gute Wahl in Skriptumgebungen und für die MLOps-Automatisierung.

In diesem Artikel wird beschrieben, wie Sie die neuen REST-APIs für folgende Zwecke verwenden:

  • Erstellen von Machine Learning-Ressourcen
  • Erstellen eines einfachen Trainingsauftrags
  • Erstellen eines Sweep-Auftrags für die Hyperparameteroptimierung

Voraussetzungen

Festlegen von Endpunktnamen

Hinweis

Endpunktnamen müssen auf Azure-Regionsebene eindeutig sein. Beispielsweise kann es nur einen Endpunkt namens „my-endpoint“ in „westus2“ geben.

export ENDPOINT_NAME=endpt-rest-`echo $RANDOM`

Onlineendpunkte für Azure Machine Learning

Onlineendpunkte gestatten Ihnen die Bereitstellung Ihres Modells, ohne dass Sie die zugrunde liegende Infrastruktur oder Kubernetes-Cluster erstellen und verwalten müssen. In diesem Artikel erstellen Sie einen Onlineendpunkt und eine Bereitstellung und überprüfen ihn, indem Sie ihn aufrufen. Zunächst müssen Sie jedoch die für die Bereitstellung erforderlichen Ressourcen registrieren, einschließlich Modell, Code und Umgebung.

Es gibt viele Möglichkeiten, einen Azure Machine Learning-Onlineendpunkt zu erstellen, einschließlich Azure CLI und visuell über Studio. Im folgenden Beispiel wird ein Onlineendpunkt mit der REST-API verwendet.

Erstellen von Machine Learning-Ressourcen

Richten Sie zunächst Ihre Azure Machine Learning-Ressourcen ein, um Ihren Auftrag zu konfigurieren.

In den folgenden REST-API-Aufrufen verwenden wir SUBSCRIPTION_ID, RESOURCE_GROUP, LOCATION und WORKSPACE als Platzhalter. Ersetzen Sie die Platzhalter durch Ihre eigenen Werte.

Für administrative REST-Anforderungen wird ein Token für die Dienstprinzipalauthentifizierung angefordert. Ersetzen Sie TOKEN durch Ihren eigenen Wert. Sie können dieses Token mit dem folgenden Befehl abrufen:

response=$(curl -H "Content-Length: 0" --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/token?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN")
accessToken=$(echo $response | jq -r '.accessToken')

Der Dienstanbieter verwendet das api-version-Argument, um Kompatibilität zu gewährleisten. Das api-version-Argument variiert von Dienst zu Dienst. Legen Sie die API-Version zur Vorbereitung für zukünftige Versionen als Variable fest:

API_VERSION="2022-05-01"

Abrufen von Speicherkontodetails

Um das Modell und den Code zu registrieren, müssen sie zuerst in ein Speicherkonto hochgeladen werden. Die Details des Speicherkontos sind im Datenspeicher verfügbar. In diesem Beispiel rufen Sie den Standarddatenspeicher und das Azure Storage-Konto für Ihren Arbeitsbereich ab. Fragen Sie Ihren Arbeitsbereich mit einer GET-Anforderung ab, um eine JSON-Datei mit den Informationen abzurufen.

Sie können das Tool jq verwenden, um das JSON-Ergebnis zu analysieren und die erforderlichen Werte zu ermitteln. Sie können diese Informationen auch über das Azure-Portal ermitteln:

# Get values for storage account
response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \
--header "Authorization: Bearer $TOKEN")
AZUREML_DEFAULT_DATASTORE=$(echo $response | jq -r '.value[0].name')
AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName')
export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName')

Hochladen und Registrieren des Codes

Nachdem Sie über den Datenspeicher verfügen, können Sie das Bewertungsskript hochladen. Verwenden Sie die Azure Storage-CLI, um ein Blob in Ihren Standardcontainer hochzuladen:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s endpoints/online/model-1/onlinescoring

Tipp

Sie können auch andere Uploadmethoden verwenden, z. B. das Azure-Portal oder Azure Storage-Explorer.

Nachdem Sie Ihren Code hochgeladen haben, können Sie ihn mit einer PUT-Anforderung angeben und mit datastoreId auf den Datenspeicher verweisen:

curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
  \"properties\": {
    \"codeUri\": \"https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/score\"
  }
}"

Hochladen und Registrieren des Modells

Laden Sie die Modelldateien ähnlich wie den Code hoch:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/online/model-1/model

Registrieren Sie jetzt das Modell:

curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\": {
        \"modelUri\":\"azureml://subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/workspaces/$WORKSPACE/datastores/$AZUREML_DEFAULT_DATASTORE/paths/model\"
    }
}"

Erstellen der Umgebung

Die Bereitstellung muss in einer Umgebung ausgeführt werden, die über die erforderlichen Abhängigkeiten verfügt. Erstellen Sie die Umgebung mit einer PUT-Anforderung. Verwenden Sie ein Docker-Image aus Microsoft Container Registry. Sie können das Docker-Image mit Docker konfigurieren und Conda-Abhängigkeiten mit condaFile hinzufügen.

Im folgenden Codeausschnitt wurde der Inhalt einer Conda-Umgebung (YAML-Datei) in eine Umgebungsvariable gelesen:

ENV_VERSION=$RANDOM
curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/sklearn-env/versions/$ENV_VERSION?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{
    \"properties\":{
        \"condaFile\": \"$CONDA_FILE\",
        \"image\": \"mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1\"
    }
}"

Endpunkt erstellen

Erstellen Sie den Onlineendpunkt:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"identity\": {
       \"type\": \"systemAssigned\"
    },
    \"properties\": {
        \"authMode\": \"AMLToken\"
    },
    \"location\": \"$LOCATION\"
}")

Bereitstellung erstellen

Erstellen Sie eine Bereitstellung unter dem Endpunkt:

response=$(curl --location --request PUT "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/deployments/blue?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" \
--data-raw "{
    \"location\": \"$LOCATION\",
    \"sku\": {
        \"capacity\": 1,
        \"name\": \"Standard_DS2_v2\"
    },
    \"properties\": {
        \"endpointComputeType\": \"Managed\",
        \"scaleSettings\": {
            \"scaleType\": \"Default\"
        },
        \"model\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/models/sklearn/versions/1\",
        \"codeConfiguration\": {
            \"codeId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/codes/score-sklearn/versions/1\",
            \"scoringScript\": \"score.py\"
        },
        \"environmentId\": \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/environments/sklearn-env/versions/$ENV_VERSION\"
    }
}")

Aufrufen des Endpunkts zum Bewerten von Daten mit Ihrem Modell

Wir benötigen den Bewertungs-URI und das Zugriffstoken, um den Endpunkt aufzurufen. Rufen Sie zunächst den Bewertungs-URI ab:

response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN")

scoringUri=$(echo $response | jq -r '.properties.scoringUri')

Rufen Sie das Zugriffstoken des Endpunkts ab:

response=$(curl -H "Content-Length: 0" --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/token?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN")
accessToken=$(echo $response | jq -r '.accessToken')

Rufen Sie jetzt den Endpunkt mit curl auf:

curl --location --request POST $scoringUri \
--header "Authorization: Bearer $accessToken" \
--header "Content-Type: application/json" \
--data-raw @endpoints/online/model-1/sample-request.json

Überprüfen der Protokolle

Überprüfen Sie die Bereitstellungsprotokolle:

curl --location --request POST "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME/deployments/blue/getLogs?api-version=$API_VERSION" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/json" \
--data-raw "{ \"tail\": 100 }"

Löschen des Endpunkts

Wenn Sie die Bereitstellung nicht verwenden, sollten Sie sie mit dem folgenden Befehl löschen (der Endpunkt und alle zugrunde liegenden Bereitstellungen werden gelöscht):

curl --location --request DELETE "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/$ENDPOINT_NAME?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" || true

Nächste Schritte