Dela via


Distribuera modeller med REST

Den här artikeln beskriver hur du använder Rest-API:et för Azure Mašinsko učenje för att distribuera modeller med hjälp av onlineslutpunkter. Med onlineslutpunkter kan du distribuera din modell utan att behöva skapa och hantera den underliggande infrastrukturen och Kubernetes-kluster. Följande procedurer visar hur du skapar en onlineslutpunkt och distribution och validerar slutpunkten genom att anropa den.

Det finns många sätt att skapa en Azure-Mašinsko učenje onlineslutpunkt. Du kan använda Azure CLI, Azure Mašinsko učenje Studio eller REST-API:et. REST-API:et använder HTTP-standardverb för att skapa, hämta, uppdatera och ta bort resurser. Den fungerar med valfritt språk eller verktyg som kan göra HTTP-begäranden. Rest-API:ets enkla struktur gör det till ett bra val i skriptmiljöer och för automatisering av maskininlärningsåtgärder.

Förutsättningar

  • En Azure-prenumeration som du har administratörsbehörighet för. Om du inte har en sådan prenumeration kan du prova den kostnadsfria eller betalda personliga prenumerationen.

  • En Azure Mašinsko učenje-arbetsyta.

  • Ett huvudnamn för tjänsten på din arbetsyta. Administrativa REST-begäranden använder autentisering med tjänstens huvudnamn.

  • En autentiseringstoken för tjänstens huvudnamn. Du kan hämta token genom att följa stegen i Hämta en autentiseringstoken för tjänstens huvudnamn.

  • Curl-verktyget.

    • Alla installationer av Microsoft Windows 10 och Windows 11 har curl installerat som standard. I PowerShell är curl ett alias för Invoke-WebRequest och curl -d "key=val" -X POST uri blir Invoke-WebRequest -Body "key=val" -Method POST -Uri uri.

    • För UNIX-plattformar är curl-programmet tillgängligt i Windows podsistem za Linux eller någon UNIX-distribution.

Ange slutpunktsnamn

Slutpunktsnamn måste vara unika på Azure-regionnivå. Ett slutpunktsnamn som my-endpoint måste vara den enda slutpunkten med det namnet inom en angiven region.

Skapa ett unikt slutpunktsnamn genom att anropa RANDOM verktyget, vilket lägger till ett slumpmässigt tal som ett suffix till värdet endpt-rest:

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

Skapa maskininlärningstillgångar

Förbered för distributionen genom att konfigurera dina Azure Mašinsko učenje-tillgångar och konfigurera ditt jobb. Du registrerar de tillgångar som krävs för distribution, inklusive modell, kod och miljö.

Dricks

REST API-anropen i följande procedurer använder $SUBSCRIPTION_ID, $RESOURCE_GROUP, $LOCATION (region) och Azure Mašinsko učenje $WORKSPACE som platshållare för vissa argument. När du implementerar koden för distributionen ersätter du argumentplatshållarna med dina specifika distributionsvärden.

Administrativ REST begär en autentiseringstoken för tjänstens huvudnamn. När du implementerar koden för distributionen ersätter du instanser av $TOKEN platshållaren med tjänstens huvudnamnstoken för distributionen. 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 variabeln så att den API_version passar framtida versioner:

API_VERSION="2022-05-01"

Hämta information om lagringskonto

Om du vill registrera modellen och koden måste du först ladda upp dessa objekt till ett Azure Storage-konto. Information om Azure Storage-kontot finns i datalagret. I det här exemplet får du standarddatalagret och Azure Storage-kontot 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 jq-verktyget 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 datalagret 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 använda andra metoder för att slutföra uppladdningen, 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 identifieraren 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

Ladda upp modellfilerna med ett liknande REST API-anrop:

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

När uppladdningen är klar registrerar du 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 docker med kommandot och lägga till conda-beroenden med condaFile kommandot .

Följande kod läser innehållet i en Conda-miljö (YAML-fil) 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 modellen

Du behöver bedömnings-URI och åtkomsttoken för att anropa distributionsslutpunkten.

Hämta först bedömnings-URI:n:

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 sedan å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 slutligen slutpunkten med hjälp av curl-verktyget:

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

Kontrollera distributionsloggar

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 slutpunkt

Om du inte ska använda distributionen ytterligare tar du bort resurserna.

Kör följande kommando, som 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