Поделиться через


Развертывание моделей с помощью REST

В этой статье описывается, как использовать REST API Машинное обучение Azure для развертывания моделей с помощью сетевых конечных точек. Сетевые конечные точки позволяют развертывать модель без необходимости создавать базовую инфраструктуру и кластеры Kubernetes и управлять ими. В следующих процедурах показано, как создать виртуальную конечную точку и развертывание и проверить конечную точку, вызвав ее.

Существует множество способов создания Машинное обучение Azure веб-конечной точки. Вы можете использовать Azure CLI, Студия машинного обучения Azure или REST API. REST API использует обычные HTTP-команды для создания, извлечения, обновления и удаления ресурсов. Он работает с любым языком или средством, которые могут выполнять HTTP-запросы. Простая структура REST API делает его хорошим выбором в средах сценариев и автоматизации операций машинного обучения.

Необходимые компоненты

Установка имени конечной точки

Имена конечных точек должны быть уникальными на уровне региона Azure. Имя конечной точки, например my-endpoint , должно быть единственной конечной точкой с таким именем в указанном регионе.

Создайте уникальное имя конечной точки, вызвав RANDOM служебную программу, которая добавляет случайное число в качестве суффикса к значению endpt-rest:

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

Создание ресурсов Машинного обучения

Чтобы подготовиться к развертыванию, настройте ресурсы Машинное обучение Azure и настройте задание. Вы регистрируете ресурсы, необходимые для развертывания, включая модель, код и среду.

Совет

Вызовы REST API в следующих процедурах используют $SUBSCRIPTION_ID, $RESOURCE_GROUP( $LOCATION регион) и Машинное обучение Azure $WORKSPACE в качестве заполнителей для некоторых аргументов. При реализации кода для развертывания замените заполнители аргументов определенными значениями развертывания.

Административные запросы REST запрашивают маркер проверки подлинности субъекта-службы. При реализации кода для развертывания замените экземпляры $TOKEN заполнителя маркером субъекта-службы для развертывания. Чтобы получить этот маркер, выполните следующую команду:

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

Поставщик услуг использует аргумент api-version для обеспечения совместимости. Аргумент api-version меняется от службы к службе.

API_version Задайте переменную для размещения будущих версий:

API_VERSION="2022-05-01"

Получение сведений об учетной записи хранения

Чтобы зарегистрировать модель и код, необходимо сначала отправить эти элементы в учетную запись служба хранилища Azure. Сведения об учетной записи служба хранилища Azure доступны в хранилище данных. В этом примере вы получите хранилище данных по умолчанию и служба хранилища Azure учетную запись для рабочей области. Отправьте рабочей области запрос GET, чтобы получить JSON-файл с соответствующей информацией.

С помощью средства jq можно проанализировать результат JSON и получить необходимые значения. Для получения тех же сведений также можно использовать портал Azure.

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

Отправка и регистрация кода

Теперь, когда у вас есть хранилище данных, можно отправить скрипт оценки. С помощью интерфейса CLI Службы хранилища Azure отправьте большой двоичный объект в свой контейнер по умолчанию.

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

Совет

Для завершения отправки можно использовать другие методы, такие как портал Azure или обозреватель служба хранилища Azure.

После отправки кода можно указать код с запросом PUT и обратиться к хранилищу данных с идентификатором 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\"
  }
}"

Отправка и регистрация модели

Отправьте файлы модели с аналогичным вызовом REST API:

az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s endpoints/online/model-1/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\"
    }
}"

Создать окружение

Развертывание должно выполняться в среде со всеми необходимыми зависимостями. Создайте среду с помощью запроса PUT. Используйте образ Docker из реестра контейнеров Майкрософт. Образ Docker можно настроить с docker помощью команды и добавить зависимости conda с condaFile помощью команды.

Следующий код считывает содержимое среды Conda (YAML-файл) в переменную среды:

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

Создать конечную точку

Создайте сетевую конечную точку:

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

Создать развертывание

Создайте развертывание для конечной точки:

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

Вызов конечной точки для оценки данных с помощью модели

Для вызова конечной точки развертывания требуется URI оценки и маркер доступа.

Сначала получите универсальный код ресурса (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')

Затем получите маркер доступа к конечной точке:

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

Наконец, вызовите конечную точку с помощью программы curl:

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

Проверка журналов развертывания

Проверьте журналы развертывания:

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

Удаление конечной точки

Если вы еще не собираетесь использовать развертывание, удалите ресурсы.

Выполните следующую команду, которая удаляет конечную точку и все базовые развертывания:

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