Modellen implementeren met REST

Meer informatie over het gebruik van de Azure Machine Learning REST API voor het implementeren van modellen.

De REST API maakt gebruik van standaard HTTP-woorden om resources te maken, op te halen, bij te werken en te verwijderen. De REST API werkt met elke taal of elk hulpprogramma waarmee HTTP-aanvragen kunnen worden ingediend. De eenvoudige structuur van REST maakt het een goede keuze in scriptomgevingen en voor MLOps-automatisering.

In dit artikel leert u hoe u de nieuwe REST API's gebruikt voor het volgende:

  • Machine Learning-assets maken
  • Een basistrainingstaak maken
  • Een taak voor het afstemmen van hyperparameters maken

Vereisten

Eindpuntnaam instellen

Notitie

Eindpuntnamen moeten uniek zijn op het niveau van de Azure-regio. Er kan bijvoorbeeld slechts één eindpunt zijn met de naam mijn eindpunt in westus2.

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

Online-eindpunten voor Azure Machine Learning

Met online-eindpunten kunt u uw model implementeren zonder dat u de onderliggende infrastructuur en Kubernetes-clusters hoeft te maken en beheren. In dit artikel maakt u een online-eindpunt en -implementatie en valideert u het door het aan te roepen. Maar eerst moet u de assets registreren die nodig zijn voor implementatie, inclusief model, code en omgeving.

Er zijn veel manieren om een online-eindpunt voor Azure Machine Learning te maken, waaronder de Azure CLI, en visueel met de studio. In het volgende voorbeeld een online-eindpunt met de REST API.

Machine Learning-assets maken

Stel eerst uw Azure Machine Learning-assets in om uw taak te configureren.

In de volgende REST API-aanroepen gebruiken SUBSCRIPTION_IDwe, RESOURCE_GROUPen LOCATIONWORKSPACE als tijdelijke aanduidingen. Vervang de plaatsaanduidingen door uw eigen waarden.

Beheer istratieve REST vraagt een verificatietoken voor de service-principal aan. Vervang door TOKEN uw eigen waarde. U kunt dit token ophalen met de volgende opdracht:

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

De serviceprovider gebruikt het api-version argument om compatibiliteit te garanderen. Het api-version argument varieert van service tot service. Stel de API-versie in als een variabele voor toekomstige versies:

API_VERSION="2022-05-01"

Details van opslagaccount ophalen

Als u het model en de code wilt registreren, moeten ze eerst worden geüpload naar een opslagaccount. De details van het opslagaccount zijn beschikbaar in het gegevensarchief. In dit voorbeeld krijgt u het standaardgegevensarchief en het Azure Storage-account voor uw werkruimte. Voer een query uit op uw werkruimte met een GET-aanvraag om een JSON-bestand op te halen met de informatie.

U kunt het hulpprogramma jq gebruiken om het JSON-resultaat te parseren en de vereiste waarden op te halen. U kunt azure Portal ook gebruiken om dezelfde informatie te vinden:

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

Code uploaden en registreren

Nu u het gegevensarchief hebt, kunt u het scorescript uploaden. Gebruik de Azure Storage CLI om een blob te uploaden naar uw standaardcontainer:

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

Tip

U kunt ook andere methoden gebruiken om te uploaden, zoals Azure Portal of Azure Storage Explorer.

Zodra u uw code hebt geüpload, kunt u uw code opgeven met een PUT-aanvraag en verwijzen naar het gegevensarchief met 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\"
  }
}"

Model uploaden en registreren

Upload de modelbestanden, vergelijkbaar met de code:

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

Registreer nu het model:

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

Omgeving maken

De implementatie moet worden uitgevoerd in een omgeving met de vereiste afhankelijkheden. Maak de omgeving met een PUT-aanvraag. Gebruik een docker-installatiekopieën uit Microsoft Container Registry. U kunt de docker-installatiekopieën configureren met Docker en conda-afhankelijkheden toevoegen met condaFile.

In het volgende codefragment is de inhoud van een YamL-bestand (Conda Environment) gelezen in een omgevingsvariabele:

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

Eindpunt maken

Maak het online-eindpunt:

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

Implementatie maken

Maak een implementatie onder het eindpunt:

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

Het eindpunt aanroepen om gegevens te scoren met uw model

We hebben de score-URI en het toegangstoken nodig om het eindpunt aan te roepen. Haal eerst de score-URI op:

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

Haal het eindpunttoegangstoken op:

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

Roep nu het eindpunt aan met behulp van curl:

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

De logboeken controleren

Controleer de implementatielogboeken:

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

Het eindpunt verwijderen

Als u de implementatie niet gaat gebruiken, moet u deze verwijderen met de onderstaande opdracht (hiermee worden het eindpunt en alle onderliggende implementaties verwijderd):

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

Volgende stappen