Freigeben über


Bereitstellen von Modellen mit REST

In diesem Artikel wird beschrieben, wie Sie die Azure Machine Learning-REST-API verwenden, um Modelle mithilfe von Onlineendpunkten bereitzustellen. Onlineendpunkte gestatten Ihnen die Bereitstellung Ihres Modells, ohne dass Sie die zugrunde liegende Infrastruktur oder Kubernetes-Cluster erstellen und verwalten müssen. Die folgenden Verfahren veranschaulichen, wie Sie einen Onlineendpunkt und eine Bereitstellung erstellen und den Endpunkt durch Aufrufen überprüfen.

Es gibt zahlreiche Möglichkeiten zum Erstellen eines Azure Machine Learning-Onlineendpunkts. Sie können die Azure CLI, Azure Machine Learning Studio oder die REST-API verwenden. Von der REST-API werden HTTP-Standardverben genutzt, um Ressourcen zu erstellen, abzurufen, zu aktualisieren und zu löschen. Sie funktioniert mit jeder Sprache oder jedem Tool, die bzw. das HTTP-Anforderungen ausführen kann. Durch die unkomplizierte Struktur der REST-API ist sie eine gute Wahl in Skriptumgebungen sowie für Machine Learning Operations-Automatisierung.

Voraussetzungen

Festlegen von Endpunktnamen

Endpunktnamen müssen auf Azure-Regionsebene eindeutig sein. Ein Endpunktname wie my-endpoint muss der einzige Endpunkt mit diesem Namen innerhalb einer angegebenen Region sein.

Erstellen Sie einen eindeutigen Endpunktnamen, indem Sie das Hilfsprogramm RANDOM aufrufen, das dem Wert endpt-rest eine Zufallszahl als Suffix hinzufügt:

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

Erstellen von Machine Learning-Ressourcen

Richten Sie zum Vorbereiten auf die Bereitstellung Ihre Azure Machine Learning-Ressourcen ein, und konfigurieren Sie Ihren Auftrag. Sie registrieren die für die Bereitstellung erforderlichen Ressourcen, einschließlich Modell, Code und Umgebung.

Tipp

Die REST-API-Aufrufe in den folgenden Verfahren verwenden $SUBSCRIPTION_ID, $RESOURCE_GROUP, $LOCATION (Region) und Azure Machine Learning $WORKSPACE als Platzhalter für einige Argumente. Wenn Sie den Code für Ihre Bereitstellung implementieren, ersetzen Sie die Argumentplatzhalter durch Ihre spezifischen Bereitstellungswerte.

Für administrative REST-Anforderungen wird ein Token für die Dienstprinzipalauthentifizierung angefordert. Wenn Sie den Code für Ihre Bereitstellung implementieren, ersetzen Sie Instanzen des $TOKEN-Platzhalters durch das Dienstprinzipaltoken für Ihre Bereitstellung. 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 Variable API_version zur Vorbereitung auf zukünftige Versionen fest:

API_VERSION="2022-05-01"

Abrufen von Speicherkontodetails

Um das Modell und den Code zu registrieren, müssen Sie diese Elemente zunächst in ein Azure Storage-Konto hochladen. Die Details des Azure Storage-Kontos 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 parsen 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 von Code

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 Methoden für den Upload 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 dem Bezeichner 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 mit einem ähnlichen REST-API-Aufruf hoch:

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

Registrieren Sie nach Abschluss des Uploads 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 dem Befehl docker konfigurieren und Conda-Abhängigkeiten mit dem Befehl condaFile hinzufügen.

Der folgende Code liest den Inhalt einer Conda-Umgebung (YAML-Datei) in eine Umgebungsvariable:

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 einem Modell

Sie benötigen den Bewertungs-URI und das Zugriffstoken, um den Bereitstellungsendpunkt 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 dann 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 schließlich den Endpunkt mithilfe des curl-Hilfsprogramms 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 von Bereitstellungsprotokollen

Ü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 eines Endpunkts

Wenn Sie die Bereitstellung nicht weiter verwenden werden, löschen Sie die Ressourcen.

Führen Sie den folgenden Befehl aus, mit dem der Endpunkt und alle zugrunde liegenden Bereitstellungen gelöscht werden:

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