Compartir a través de

使用 REST 来部署模型

本文介绍如何使用 Azure 机器学习 REST API 通过联机终结点部署模型。 通过联机终结点,无需创建和管理底层基础结构以及 Kubernetes 群集即可部署模型。 以下过程演示如何创建联机终结点和部署,并通过调用终结点来验证终结点。

可以通过多种方式创建 Azure 机器学习联机终结点。 可以使用 Azure CLIAzure 机器学习工作室或 REST API。 REST API 使用标准 HTTP 谓词创建、检索、更新和删除资源。 它适用于可发出 HTTP 请求的任何语言或工具。 REST API 的简洁结构使其非常适合用于脚本环境和机器学习操作自动化。

先决条件

设置终结点名称

终结点名称在 Azure 区域级别必须是唯一的。 终结点名称(如 my-endpoint)必须是指定区域中唯一具有该名称的终结点。

通过调用 RANDOM 实用工具创建唯一的终结点名称,该实用工具将一个随机数作为后缀添加到值 endpt-rest

Azure 机器学习联机终结点

通过联机终结点,无需创建和管理底层基础结构以及 Kubernetes 群集即可部署模型。 在本文中,你将创建一个联机终结点和部署,并通过调用它来对其进行验证。 但首先必须注册部署所需的资产,包括模型、代码和环境。

有多种方法可以创建 Azure 机器学习联机终结点,包括使用 Azure CLI 创建,以及在工作室中以可视方式创建。 下面的示例使用 REST API 部署联机终结点。

创建机器学习资产

若要准备部署,请设置 Azure 机器学习资产并配置作业。 注册部署所需的资产,包括模型、代码和环境。

提示

以下过程中的 REST API 调用使用 $SUBSCRIPTION_ID$RESOURCE_GROUP $LOCATION(区域)和 Azure 机器学习 $WORKSPACE 作为某些参数的占位符。 为部署实现代码时,要将参数占位符替换为特定的部署值。

管理 REST 请求一个服务主体身份验证令牌。 为部署实现代码时,要将 $TOKEN 占位符的实例替换为部署的服务主体令牌。 可使用以下命令检索此令牌:

response=$(curl -H "Content-Length: 0" --location --request POST "https://management.chinacloudapi.cn/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.chinacloudapi.cn/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')

上传和注册代码

获取数据存储后,可以上传评分脚本。 使用 Azure 存储 CLI 将 Blob 上传到默认容器中:

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.chinacloudapi.cn/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.chinacloudapi.cn/$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.chinacloudapi.cn/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/sklearn_regression_model.pkl\"
    }
}"

创建环境

部署需要在具有所需依赖关系的环境中运行。 使用 PUT 请求创建环境。 使用 Microsoft Container Registry 中的 Docker 映像。 可以使用 docker 命令配置 Docker 映像,并使用 condaFile 命令添加 conda 依赖项。

以下代码将 Conda 环境的内容(YAML 文件)读取到环境变量中:

ENV_VERSION=$RANDOM
curl --location --request PUT "https://management.chinacloudapi.cn/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.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint?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.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint/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.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint?api-version=$API_VERSION"
--header "Content-Type: application/json"
--header "授权: 持有者 $TOKEN")

scoringUri=$(echo $response | jq -r '.properties' | jq -r '.scoringUri')


Next, get the endpoint access token:

```rest-api
response=$(curl -H "Content-Length: 0" --location --request POST "https://management.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint/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.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint/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.chinacloudapi.cn/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/onlineEndpoints/my-first-endpoint?api-version=$API_VERSION" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $TOKEN" || true