Distribuera modeller med REST

Lär dig hur du använder REST-API:et för Azure Machine Learning för att distribuera modeller.

REST-API:et använder HTTP-standardverb för att skapa, hämta, uppdatera och ta bort resurser. REST-API:et fungerar med valfritt språk eller verktyg som kan göra HTTP-begäranden. REST:s enkla struktur gör det till ett bra val i skriptmiljöer och för MLOps-automatisering.

I den här artikeln får du lära dig hur du använder de nya REST-API:erna för att:

  • Skapa maskininlärningstillgångar
  • Skapa ett grundläggande utbildningsjobb
  • Skapa ett justeringsjobb för hyperparametrar

Förutsättningar

Ange slutpunktsnamn

Kommentar

Slutpunktsnamn måste vara unika på Azure-regionnivå. Det kan till exempel bara finnas en slutpunkt med namnet my-endpoint i westus2.

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

Azure Machine Learning-slutpunkter online

Med onlineslutpunkter kan du distribuera din modell utan att behöva skapa och hantera den underliggande infrastrukturen samt Kubernetes-kluster. I den här artikeln skapar du en onlineslutpunkt och distribution och verifierar den genom att anropa den. Men först måste du registrera de tillgångar som behövs för distribution, inklusive modell, kod och miljö.

Det finns många sätt att skapa en Azure Machine Learning-slutpunkt online, inklusive Azure CLI och visuellt med studion. Följande exempel är en onlineslutpunkt med REST-API:et.

Skapa maskininlärningstillgångar

Konfigurera först dina Azure Machine Learning-tillgångar för att konfigurera ditt jobb.

I följande REST API-anrop använder SUBSCRIPTION_IDvi , RESOURCE_GROUP, LOCATIONoch WORKSPACE som platshållare. Ersätt platshållarna med dina egna värden.

Administrativ REST begär en autentiseringstoken för tjänstens huvudnamn. Ersätt TOKEN med ditt eget värde. Du kan hämta den här token med följande kommando:

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')

Tjänstleverantören använder api-version argumentet för att säkerställa kompatibilitet. Argumentet api-version varierar från tjänst till tjänst. Ange API-versionen som en variabel för framtida versioner:

API_VERSION="2022-05-01"

Hämta information om lagringskonto

För att registrera modellen och koden måste de först laddas upp till ett lagringskonto. Information om lagringskontot finns i datalagret. I det här exemplet får du standarddatalager och Azure Storage-konto för din arbetsyta. Fråga din arbetsyta med en GET-begäran för att hämta en JSON-fil med informationen.

Du kan använda verktyget jq för att parsa JSON-resultatet och hämta de värden som krävs. Du kan också använda Azure-portalen för att hitta samma information:

# 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')

Ladda upp och registrera kod

Nu när du har datalagringen kan du ladda upp bedömningsskriptet. Använd Azure Storage CLI för att ladda upp en blob till din standardcontainer:

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

Dricks

Du kan också använda andra metoder för att ladda upp, till exempel Azure-portalen eller Azure Storage Explorer.

När du har laddat upp koden kan du ange koden med en PUT-begäran och referera till datalagret med datastoreId:

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\"
  }
}"

Ladda upp och registrera modell

Ungefär som med koden laddar du upp modellfilerna:

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

Registrera nu modellen:

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\"
    }
}"

Skapa miljö

Distributionen måste köras i en miljö som har nödvändiga beroenden. Skapa miljön med en PUT-begäran. Använd en docker-avbildning från Microsoft Container Registry. Du kan konfigurera docker-avbildningen med Docker och lägga till conda-beroenden med condaFile.

I följande kodfragment har innehållet i en Conda-miljö (YAML-fil) lästs in i en miljövariabel:

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\"
    }
}"

Skapa slutpunkt

Skapa onlineslutpunkten:

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\"
}")

Skapa distribution

Skapa en distribution under slutpunkten:

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\"
    }
}")

Anropa slutpunkten för att poängsätta data med din modell

Vi behöver bedömnings-URI och åtkomsttoken för att anropa slutpunkten. Få först poäng URI:

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')

Hämta åtkomsttoken för slutpunkten:

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')

Anropa nu slutpunkten med hjälp av curl:

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

Kontrollera loggarna

Kontrollera distributionsloggarna:

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 }"

Ta bort slutpunkten

Om du inte använder distributionen bör du ta bort den med kommandot nedan (den tar bort slutpunkten och alla underliggande distributioner):

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ästa steg