使用联机终结点部署机器学习模型并对其进行评分

适用于:Azure CLI ml 扩展 v2 (当前)Python SDK azure-ai-ml v2 (当前)

本文介绍如何将模型部署到联机终结点以用于实时推理。 首先在本地计算机上部署一个模型以调试任何错误。 然后,在 Azure 中部署和测试模型,查看部署日志,并监视服务级别协议 (SLA)。 本文结束时,你有一个可缩放的 HTTPS/REST 终结点,可用于实时推理。

联机终结点是用于实时推理的终结点。 有两种类型的联机终结点:托管联机终结点和 Kubernetes 联机终结点。 关于差异的更多信息,请参阅 托管在线端点与 Kubernetes 在线端点

托管联机终结点有助于以统包方式部署机器学习模型。 托管联机终结点在 Azure 中以一种可缩放的、完全托管的方式使用功能强大的 CPU 和 GPU 计算机。 托管在线端点负责服务、扩展、安全和监控模型。 此帮助可让你免于设置和管理底层基础结构的开销。

本文中的主要示例使用托管联机终结点进行部署。 若要改用 Kubernetes,请参阅本文档中与托管联机终结点讨论内联的注释。

先决条件

适用于Python SDK azure-ai-ml v2 (当前)

  • Azure 机器学习工作区。 有关创建工作区的步骤,请参阅 “创建工作区”。

  • 适用于 Python v2 的 Azure 机器学习 SDK。 若要安装 SDK,请使用以下命令:

    pip install azure-ai-ml azure-identity
    

    要将 SDK 的现有安装更新到最新版本,请使用以下命令:

    pip install --upgrade azure-ai-ml azure-identity
    

    有关详细信息,请参阅 适用于 Python 的 Azure 机器学习包客户端库

  • Azure RBAC 用于授予对 Azure 机器学习中操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的“所有者”或“参与者”角色,或者必须允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*自定义角色。 有关详细信息,请参阅管理对 Azure 机器学习工作区的访问

  • (可选)在本地部署时,您必须在自己的计算机上安装 Docker 引擎。 我们 强烈建议 使用此选项,这样可以更轻松地调试问题。

  • 确保为部署分配了足够的虚拟机 (VM) 配额。 Azure 机器学习会保留 20% 的计算资源,用于对某些 VM 版本进行升级。 例如,如果在部署中请求 10 个实例,则必须为 VM 版本的每个核心数指定 12 个配额。 未能考虑额外的计算资源会导致错误。 某些 VM 版本不受额外的配额预留限制。 有关配额分配的详细信息,请参阅 用于部署的虚拟机配额分配

  • 或者,可以在有限的时间内使用 Azure 机器学习共享配额池中的配额。 Azure 机器学习提供了一个共享配额池,不同区域中的用户可以根据可用性从中访问配额以执行有限时间的测试。 使用工作室将 Llama-2、Phi、Nemotron、Mistral、Dolly 和 Deci-DeciLM 模型从模型目录部署到托管联机终结点时,Azure 机器学习允许你在短时间访问其共享配额池,以便执行测试。 有关共享配额池的详细信息,请参阅 Azure 机器学习共享配额

准备你的系统

克隆示例存储库

若要运行训练示例,请先克隆 azureml-examples 存储库,然后更改为 azureml-examples/sdk/python/endpoints/online/managed directory:

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples/sdk/python/endpoints/online/managed

使用 --depth 1 仅克隆最新提交到目录,这将减少操作完成的时间。

本文中的信息来源于online-endpoints-simple-deployment.ipynb笔记本。 该笔记本包含与本文相同的内容,尽管代码的顺序略有不同。

连接到 Azure 机器学习工作区

工作区是 Azure 机器学习的顶级资源。 它提供了一个集中的位置,用于处理使用 Azure 机器学习时创建的所有项目。 在本部分,你将连接到在其中执行部署任务的工作区。 若要继续操作,请打开您的 online-endpoints-simple-deployment.ipynb 笔记本。

  1. 导入所需的库:

    # import required libraries
    from azure.ai.ml import MLClient
    from azure.ai.ml.entities import (
        ManagedOnlineEndpoint,
        ManagedOnlineDeployment,
        Model,
        Environment,
        CodeConfiguration
    )
    from azure.identity import DefaultAzureCredential
    

    备注

    如果使用 Kubernetes 联机终结点,请从KubernetesOnlineEndpoint库导入KubernetesOnlineDeploymentazure.ai.ml.entities类。

  2. 配置工作区详细信息并获取工作区的句柄。

    若要连接到工作区,需要以下标识符参数:订阅、资源组和工作区名称。 使用 MLClientazure.ai.ml 中的这些详细信息来获取所需的 Azure 机器学习工作区的句柄。 此示例使用默认的 Azure 身份验证。

    # enter details of your Azure Machine Learning workspace
    subscription_id = "<subscription ID>"
    resource_group = "<resource group>"
    workspace = "<workspace name>"
    
    # get a handle to the workspace
    ml_client = MLClient(
        DefaultAzureCredential(), subscription_id, resource_group, workspace
    )
    

定义终结点

若要定义联机终结点,请指定终结点名称和身份验证模式。 有关托管联机终结点的详细信息,请参阅 联机终结点

设置终结点名称

要设置你的终结点名称,请运行以下命令。 将 <YOUR_ENDPOINT_NAME> 替换为在 Azure 区域中唯一的名称。 有关命名规则的详细信息,请参阅 终结点限制

export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"

配置终结点

以下代码片段显示了 endpoints/online/managed/sample/endpoint.yml 文件:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

The reference for the endpoint YAML format is described in the following table. To learn how to specify these attributes, see the [online endpoint YAML reference](reference-yaml-endpoint-online.md). For information about limits related to managed endpoints, see [Azure Machine Learning online endpoints and batch endpoints](how-to-manage-quotas.md#azure-machine-learning-online-endpoints-and-batch-endpoints).

| Key         | Description          |
| ----------- | -------------------- |
| `$schema`   | (Optional) The YAML schema. To see all available options in the YAML file, you can view the schema in the preceding code snippet in a browser.   |
| `name`      | The name of the endpoint.                                               |
| `auth_mode` | Use `key` for key-based authentication.<br>Use `aml_token` for Azure Machine Learning token-based authentication.<br>Use `aad_token` for Microsoft Entra token-based authentication (preview). <br>For more information on authenticating, see [Authenticate clients for online endpoints](how-to-authenticate-online-endpoint.md). |

# [Python SDK](#tab/python)

### Configure an endpoint

First define the name of the online endpoint, and then configure the endpoint.

Replace `<YOUR_ENDPOINT_NAME>` with a name that's unique in the Azure region, or use the example method to define a random name. Be sure to delete the method that you don't use. For more information on the naming rules, see [Endpoint limits](how-to-manage-quotas.md#azure-machine-learning-online-endpoints-and-batch-endpoints).

```python
# method 1: define an endpoint name
endpoint_name = "<YOUR_ENDPOINT_NAME>"

# method 2: example way to define a random name
import datetime

endpoint_name = "endpt-" + datetime.datetime.now().strftime("%m%d%H%M%f")

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name = endpoint_name, 
    description="this is a sample endpoint",
    auth_mode="key"
)

前面的代码使用 key 进行基于密钥的身份验证。 若要使用基于 Azure 机器学习令牌的身份验证,请使用 aml_token。 若要使用基于 Microsoft Entra 令牌的身份验证(预览版),请使用 aad_token。 有关身份验证的详细信息,请参阅 对联机终结点的客户端进行身份验证

定义部署

部署是一组资源,用于承载执行实际推理的模型。 在此示例中,你将部署一个 scikit-learn 执行回归的模型,并使用评分脚本 score.py 在特定输入请求上运行模型。

若要了解部署的关键属性,请参阅 联机部署

配置部署

部署配置使用要部署的模型的位置。

以下代码片段显示了 endpoints/online/managed/sample/blue-deployment.yml 文件,其中包含配置部署所需的所有输入:

blue-deployment.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

blue-deployment.yml文件指定以下部署属性:

  • model - 使用 path 参数(上传文件的位置)指定模型属性内联。 CLI 自动上传模型文件并使用自动生成的名称注册模型。
  • environment:使用内联定义,包括从何处上传文件。 CLI 会自动上传 conda.yaml 文件并注册环境。 稍后,为了构建环境,部署使用 image 参数来指定基础映像。 在此示例中,它是 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest。 依赖项 conda_file 安装在基础映像之上。
  • code_configuration:在部署期间,从开发环境上传本地文件,例如评分模型的 Python 源。

有关 YAML 架构的详细信息,请参阅 联机终结点 YAML 参考

备注

若要使用 Kubernetes 终结点而不是托管联机终结点作为计算目标:

  1. 使用 Azure 机器学习工作室创建 Kubernetes 群集并将其作为计算目标附加到 Azure 机器学习工作区。
  2. 使用 终结点 YAML 以 Kubernetes 而不是托管终结点 YAML 为目标。 需要编辑 YAML,将 compute 的值更改为注册的计算目标的名称。 可以使用此 deployment.yaml 文件,它具有适用于 Kubernetes 部署的其他属性。

本文中针对托管联机终结点使用的所有命令也适用于 Kubernetes 终结点,但以下功能不适用于 Kubernetes 终结点:

使用以下代码配置部署:

model = Model(path="../model-1/model/sklearn_regression_model.pkl")
env = Environment(
    conda_file="../model-1/environment/conda.yaml",
    image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
)

blue_deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name=endpoint_name,
    model=model,
    environment=env,
    code_configuration=CodeConfiguration(
        code="../model-1/onlinescoring", scoring_script="score.py"
    ),
    instance_type="Standard_DS3_v2",
    instance_count=1,
)
  • Model - 使用 path 参数(上传文件的位置)指定模型属性内联。 SDK 会自动上传模型文件并使用自动生成的名称注册模型。
  • Environment:使用内联定义,包括从何处上传文件。 SDK 会自动上传 conda.yaml 文件并注册环境。 稍后,为了构建环境,部署使用 image 参数来指定基础映像。 在此示例中,它是 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest。 依赖项 conda_file 安装在基础映像之上。
  • CodeConfiguration:在部署期间,从开发环境上传本地文件,例如评分模型的 Python 源。

关于在线部署定义的详细信息,请参阅 OnlineDeployment 类

了解评分脚本

联机终结点的评分脚本格式与早期版本的 CLI 和 Python SDK 中使用的格式相同。

code_configuration.scoring_script 中指定的评分脚本必须具有一个 init() 函数和一个 run() 函数。

评分脚本必须具有一个 init() 函数和一个 run() 函数。

此示例使用前面克隆或下载的存储库中的 score.py 文件

score.py

import os
import logging
import json
import numpy
import joblib


def init():
    """
    This function is called when the container is initialized/started, typically after create/update of the deployment.
    You can write the logic here to perform init operations like caching the model in memory
    """
    global model
    # AZUREML_MODEL_DIR is an environment variable created during deployment.
    # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
    # Please provide your model's folder name if there is one
    model_path = os.path.join(
        os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl"
    )
    # deserialize the model file back into a sklearn model
    model = joblib.load(model_path)
    logging.info("Init complete")


def run(raw_data):
    """
    This function is called for every invocation of the endpoint to perform the actual scoring/prediction.
    In the example we extract the data from the json input and call the scikit-learn model's predict()
    method and return the result back
    """
    logging.info("model 1: request received")
    data = json.loads(raw_data)["data"]
    data = numpy.array(data)
    result = model.predict(data)
    logging.info("Request processed")
    return result.tolist()

初始化或启动容器时,将调用函数 init()。 初始化通常在创建或更新部署后立即发生。 可以通过 init 函数编写逻辑来执行全局初始化操作,例如在内存中缓存模型(如 score.py 文件所示)。

每次调用终结点时都会调用该 run() 函数。 它执行实际评分和预测。 在此 score.py 文件中,run() 函数从 JSON 输入中提取数据,调用 scikit-learn 模型的 predict() 方法,然后返回预测结果。

使用本地终结点在本地部署和调试

强烈建议在部署到 Azure 之前在本地测试运行终结点,以验证和调试代码和配置。 Azure CLI 和 Python SDK 支持本地终结点和部署,但 Azure 机器学习工作室和 ARM 模板不支持。

若要在本地部署,必须安装并运行 Docker Engine。 Docker 引擎通常在计算机启动时启动。 如果它不启动,可以对 Docker 引擎进行故障排除

可以使用 Azure 机器学习推理 HTTP 服务器 Python 包 在本地调试评分脚本, 而无需 Docker 引擎。 使用推理服务器进行调试有助于在部署到本地终结点之前调试评分脚本,以便无需受部署容器配置影响即可进行调试。

有关在部署到 Azure 之前在本地调试联机终结点的详细信息,请参阅 联机终结点调试

在本地部署模型

首先,创建终结点。 (可选)对于本地终结点,可以跳过此步骤。 可以直接创建部署(下一步),进而创建所需的元数据。 在本地部署模型对于开发和测试目的很有用。

az ml online-endpoint create --local -n $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
ml_client.online_endpoints.begin_create_or_update(endpoint, local=True)

现在,在终结点下面创建一个名为 blue 的部署。

az ml online-deployment create --local -n blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml

--local 标志指示 CLI 在 Docker 环境中部署终结点。

ml_client.online_deployments.begin_create_or_update(
    deployment=blue_deployment, local=True
)

local=True 标志指示 SDK 在 Docker 环境中部署终结点。

提示

使用 Visual Studio Code 在本地测试和调试终结点。 有关详细信息,请参阅在 Visual Studio Code 中以本地方式调试联机终结点

验证本地部署是否成功

检查部署状态,查看模型是否已部署且未出错:

az ml online-endpoint show -n $ENDPOINT_NAME --local

输出应类似于以下 JSON。 参数 provisioning_stateSucceeded.

{
  "auth_mode": "key",
  "location": "local",
  "name": "docs-endpoint",
  "properties": {},
  "provisioning_state": "Succeeded",
  "scoring_uri": "http://localhost:49158/score",
  "tags": {},
  "traffic": {}
}
ml_client.online_endpoints.get(name=endpoint_name, local=True)

该方法返回 ManagedOnlineEndpoint 实体。 参数 provisioning_stateSucceeded.

ManagedOnlineEndpoint({'public_network_access': None, 'provisioning_state': 'Succeeded', 'scoring_uri': 'http://localhost:49158/score', 'swagger_uri': None, 'name': 'endpt-10061534497697', 'description': 'this is a sample endpoint', 'tags': {}, 'properties': {}, 'id': None, 'Resource__source_path': None, 'base_path': '/path/to/your/working/directory', 'creation_context': None, 'serialize': <msrest.serialization.Serializer object at 0x7ffb781bccd0>, 'auth_mode': 'key', 'location': 'local', 'identity': None, 'traffic': {}, 'mirror_traffic': {}, 'kind': None})

下表包含 provisioning_state 的可能值:

说明
Creating 正在创建资源。
Updating 正在更新资源。
Deleting 正在删除此资源。
Succeeded 创建或更新操作成功。
Failed 创建、更新或删除操作失败。

调用本地终结点以使用模型为数据评分

使用 invoke 命令并传递 JSON 文件中存储的查询参数,调用终结点来为模型评分:

az ml online-endpoint invoke --local --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

如果要使用 REST 客户端(例如 curl),必须具有评分 URI。 如要获取评分 URI,需要运行 az ml online-endpoint show --local -n $ENDPOINT_NAME。 在返回的数据中,找到 scoring_uri 属性。

使用 invoke 命令并传递 JSON 文件中存储的查询参数,调用终结点来为模型评分。

ml_client.online_endpoints.invoke(
    endpoint_name=endpoint_name,
    request_file="../model-1/sample-request.json",
    local=True,
)

如果要使用 REST 客户端(例如 curl),必须具有评分 URI。 要获取评分 URI,请运行以下代码。 在返回的数据中,找到 scoring_uri 属性。

endpoint = ml_client.online_endpoints.get(endpoint_name, local=True)
scoring_uri = endpoint.scoring_uri

在日志中查看 invoke 操作的输出

在示例 score.py 文件中, 方法将一些输出记录到控制台run()

可以使用 get-logs 命令查看此输出:

az ml online-deployment get-logs --local -n blue --endpoint $ENDPOINT_NAME

可以使用 get_logs 方法查看此输出:

ml_client.online_deployments.get_logs(
    name="blue", endpoint_name=endpoint_name, local=True, lines=50
)

将联机终结点部署到 Azure

接下来,将联机终结点部署到 Azure。 作为生产最佳做法,我们建议注册部署中使用的模型和环境。

注册模型和环境

建议在部署到 Azure 之前注册模型和环境,以便在部署期间指定它们的注册名称和版本。 注册资产后,无需在每次创建部署时上传资产即可重复使用它们。 这种做法可提高可重现性和可追溯性。

与部署到 Azure 不同,本地部署不支持使用注册的模型和环境。 相反,本地部署使用本地模型文件,并且仅使用具有本地文件的环境。

若要部署到 Azure,可以使用本地或注册资产(模型和环境)。 在本文的这一小节中,我们使用注册资产部署到 Azure,但你也可以选择使用本地资产。 有关上传要用于本地部署的本地文件的部署配置示例,请参阅 “配置部署”。

若要注册模型和环境,请使用窗体 model: azureml:my-model:1environment: azureml:my-env:1

对于注册,可以将modelenvironment的 YAML 定义提取到endpoints/online/managed/sample 文件夹中的单独 YAML 文件中,并使用命令az ml model createaz ml environment create。 若要详细了解这些命令,请运行 az ml model create -haz ml environment create -h

  1. 为模型创建 YAML 定义。 将文件命名 为model.yml

    $schema: https://azuremlschemas.azureedge.net/latest/model.schema.json
    name: my-model
    path: ../../model-1/model/
    
  2. 注册模型:

    az ml model create -n my-model -v 1 -f endpoints/online/managed/sample/model.yml
    
  3. 为环境创建 YAML 定义。 将文件命名 为environment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: my-env
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: ../../model-1/environment/conda.yaml
    
  4. 注册环境:

    az ml environment create -n my-env -v 1 -f endpoints/online/managed/sample/environment.yml
    

有关如何将模型注册为资产的详细信息,请参阅 使用 Azure CLI 或 Python SDK 注册模型。 有关创建环境的详细信息,请参阅 “创建自定义环境”。

  1. 注册模型:

    from azure.ai.ml.entities import Model
    from azure.ai.ml.constants import AssetTypes
    
    file_model = Model(
        path="../model-1/model/",
        type=AssetTypes.CUSTOM_MODEL,
        name="my-model",
        description="Model created from local file.",
    )
    ml_client.models.create_or_update(file_model)
    
  2. 注册环境:

    from azure.ai.ml.entities import Environment
    
    env_docker_conda = Environment(
        image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04",
        conda_file="../model-1/environment/conda.yaml",
        name="my-env",
        description="Environment created from a Docker image plus Conda environment.",
    )
    ml_client.environments.create_or_update(env_docker_conda)
    

若要了解如何将模型注册为资产,以便可以在部署期间指定其注册名称和版本,请参阅 使用 Azure CLI 或 Python SDK 注册模型

有关创建环境的详细信息,请参阅 “创建自定义环境”。

重要

为部署定义自定义环境时,请确保 azureml-inference-server-http 包包含在 conda 文件中。 此包对于推理服务器正常运行至关重要。 如果你不熟悉如何创建自己的自定义环境,请使用我们的特选环境之一,例如 minimal-py-inference (对于不使用 mlflow的自定义模型)或 mlflow-py-inference (用于使用 mlflow模型)。 可以在 Azure 机器学习工作室实例的“ 环境 ”选项卡上找到这些特选环境。

配置使用注册资产的部署

部署配置使用要部署的已注册模型和已注册的环境。

在部署定义中使用注册资产(模型和环境)。 以下代码片段显示了 endpoints/online/managed/sample/blue-deployment-with-registered-assets.yml 文件,其中包含配置部署所需的所有输入:

蓝部署带注册资产.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model: azureml:my-model:1
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: azureml:my-env:1
instance_type: Standard_DS3_v2
instance_count: 1

若要配置部署,请使用注册的模型和环境:

model = "azureml:my-model:1"
env = "azureml:my-env:1"
 
blue_deployment_with_registered_assets = ManagedOnlineDeployment(
    name="blue",
    endpoint_name=endpoint_name,
    model=model,
    environment=env,
    code_configuration=CodeConfiguration(
        code="../model-1/onlinescoring", scoring_script="score.py"
    ),
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

使用不同的 CPU 和 GPU 实例类型及映像

可以在部署定义中为本地部署和部署到 Azure 指定 CPU 或 GPU 实例类型和映像。

blue-deployment-with-registered-assets.yml 文件中的部署定义使用了通用型 实例和非 GPU Docker 映像 Standard_DS3_v2mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest 对于 GPU 计算,请选择 GPU 计算类型版本和 GPU Docker 映像。

有关受支持的常规用途和 GPU 实例类型,请参阅 托管联机终结点 SKU 列表。 有关 Azure 机器学习 CPU 和 GPU 基础映像的列表,请参阅 Azure 机器学习基础映像

备注

若要使用 Kubernetes 而不是托管终结点作为计算目标,请参阅 Kubernetes 计算目标简介

可以在部署配置中为本地部署和部署到 Azure 指定 CPU 或 GPU 实例类型和映像。

你先前配置了一个使用通用类型 Standard_DS3_v2 实例和非 GPU Docker 映像 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest 的部署。 对于 GPU 计算,请选择 GPU 计算类型版本和 GPU Docker 映像。

有关受支持的常规用途和 GPU 实例类型,请参阅 托管联机终结点 SKU 列表。 有关 Azure 机器学习 CPU 和 GPU 基础映像的列表,请参阅 Azure 机器学习基础映像

备注

若要使用 Kubernetes 而不是托管终结点作为计算目标,请参阅 Kubernetes 计算目标简介

接下来,将联机终结点部署到 Azure。

“部署到 Azure”

  1. 在 Azure 云中创建终结点:

     az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    
  2. 创建终结点下名为 blue 的部署:

    az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment-with-registered-assets.yml --all-traffic
    

    创建此项部署最多可能需要约 15 分钟,具体取决于是否为首次构建基础环境或映像。 使用相同环境的后续部署将更快完成处理。

    如果你不希望阻塞 CLI 控制台,可将 --no-wait 标志添加到命令中。 但是,此选项停止部署状态的交互式显示。

    用于创建部署的代码 --all-traffic 中的 az ml online-deployment create 标志会将 100% 的终结点流量分配给新创建的蓝色部署。 使用此标志有助于开发和测试目的,但对于生产,你可能希望通过显式命令将流量路由到新部署。 例如,使用 az ml online-endpoint update -n $ENDPOINT_NAME --traffic "blue=100"

  1. 创建终结点:

    通过使用 endpoint 前面定义的参数和 MLClient 之前创建的参数,现在可以在工作区中创建终结点。 此命令会启动终结点创建操作,并在终结点创建操作继续时返回确认响应。

    ml_client.online_endpoints.begin_create_or_update(endpoint)
    
  2. 创建部署:

    通过使用 blue_deployment_with_registered_assets 前面定义的参数和 MLClient 之前创建的参数,现在可以在工作区中创建部署。 此命令将启动部署创建操作,并在部署创建操作继续时返回确认响应。

    ml_client.online_deployments.begin_create_or_update(blue_deployment_with_registered_assets)
    

    如果你不希望阻塞 Python 控制台,可以将 no_wait=True 标志添加到参数中。 但是,此选项停止部署状态的交互式显示。

    # blue deployment takes 100 traffic
    endpoint.traffic = {"blue": 100}
    ml_client.online_endpoints.begin_create_or_update(endpoint)
    

要对部署中的错误进行调试,请参阅联机终结点部署故障排除

检查联机终结点的状态

  1. 对于终结点和部署,使用 show 命令以显示 provisioning_state 中的信息:

     az ml online-endpoint show -n $ENDPOINT_NAME
    
  2. 使用 list 命令以表格格式列出工作区中的所有终结点:

    az ml online-endpoint list --output table
    
  1. 检查终结点的状态,查看模型是否已部署且未出错:

    ml_client.online_endpoints.get(name=endpoint_name)
    
  2. 使用 list 方法以表格格式列出工作区中的所有终结点:

    for endpoint in ml_client.online_endpoints.list():
        print(endpoint.name)
    

    该方法返回 ManagedOnlineEndpoint 实体的列表(迭代器)。

  3. 可以通过指定 更多参数来获取详细信息。 例如,像表格一样输出终结点列表:

    print("Kind\tLocation\tName")
    print("-------\t----------\t------------------------")
    for endpoint in ml_client.online_endpoints.list():
        print(f"{endpoint.kind}\t{endpoint.location}\t{endpoint.name}")
    

检查联机部署的状态

检查日志,查看模型是否已部署且未出错。

若要查看容器的日志输出,请使用以下 CLI 命令:

az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME

默认情况下,日志是从推理服务器容器拉取的。 若要查看存储初始化表达式容器中的日志,请添加 --container storage-initializer 标志。 有关部署日志的详细信息,请参阅 “获取容器日志”。

  1. 可以使用 get_logs 方法查看日志输出:

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=endpoint_name, lines=50
    )
    
  2. 默认情况下,日志是从推理服务器容器拉取的。 若要查看存储初始化表达式容器中的日志,请添加 container_type="storage-initializer" 选项。 有关部署日志的详细信息,请参阅 “获取容器日志”。

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=endpoint_name, lines=50, container_type="storage-initializer"
    )
    

调用终结点,以使用模型为数据评分

  1. 使用 invoke 命令或你选择的 REST 客户端来调用终结点并为一些数据评分:

     az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
    
  2. 获取用于向终结点进行身份验证的密钥:

    你可以对哪些 Microsoft Entra 安全主体能够获取身份验证密钥进行控制,方法是将其分配到一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/token/actionMicrosoft.MachineLearningServices/workspaces/onlineEndpoints/listkeys/action 的自定义角色。 有关如何管理对工作区的授权的详细信息,请参阅 管理对 Azure 机器学习工作区的访问权限

     ENDPOINT_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME -o tsv --query primaryKey)
     SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
    
     curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @endpoints/online/model-1/sample-request.json
    
  3. 使用 curl 对数据进行评分。

     SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
    
     curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @endpoints/online/model-1/sample-request.json
    

    请注意,使用 showget-credentials 命令获取身份验证凭据。 另请注意,使用 --query 标志仅筛选所需的属性。 若要详细了解 --query 标志的信息,请参阅 查询 Azure CLI 命令输出

  4. 若要查看调用日志,请再次运行 get-logs

通过使用之前创建的 MLClient 参数,可以获得指向终结点的句柄。 然后,可以通过使用invoke命令结合以下参数来调用终结点:

  • endpoint_name:终结点的名称。
  • request_file:包含请求数据的文件。
  • deployment_name:用于在终结点测试的特定部署名称。

使用 JSON 文件发送示例请求。

# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
    endpoint_name=endpoint_name,
    deployment_name="blue",
    request_file="../model-1/sample-request.json",
)

(可选)更新部署

如果要更新代码、模型或环境,请更新 YAML 文件。 然后运行 命令 az ml online-endpoint update

如果在单个 update 命令中更新实例数量(以扩展您的部署)以及其他模型设置(如代码、模型或环境),则首先执行扩展操作。 接下来将应用其他更新。 在生产环境中单独执行这些操作是一个很好的做法。

若要了解 update 的工作原理,请执行以下操作:

  1. 打开 文件 online/model-1/onlinescoring/score.py

  2. 更改 init() 函数的最后一行:在 logging.info("Init complete") 后面,添加 logging.info("Updated successfully")

  3. 保存文件。

  4. 运行以下命令:

    az ml online-deployment update -n blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment-with-registered-assets.yml
    

    使用 YAML 进行更新是声明性的。 也就是说,YAML 中的更改反映在基础资源管理器资源(终结点和部署)中。 声明性方法促进了 GitOps:所有对终结点和部署的更改(即使是 )都通过 YAML 实现。

    可以使用 泛型更新参数(如 --set 参数)和 CLI update 命令替代 YAML 中的属性 ,或 设置特定属性,而无需在 YAML 文件中传递它们。 在开发和测试方案中,为单个特性使用 --set,这种做法特别有用。 例如,若要纵向扩展第一个部署的 instance_count 值,可以使用标志 --set instance_count=2。 由于 YAML 未更新,这种技术并不支持 GitOps。

    指定 YAML 文件 并不 是必需的。 例如,如果想要测试特定部署的不同并发设置,可以尝试类似 az ml online-deployment update -n blue -e my-endpoint --set request_settings.max_concurrent_requests_per_instance=4 environment_variables.WORKER_COUNT=4的东西。 此方法保留所有现有配置,但仅更新指定的参数。

  5. 由于修改了 init() 在创建或更新终结点时运行的函数,因此消息 Updated successfully 将显示在日志中。 运行以下命令检索日志:

    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    

update 命令也适用于本地部署。 将同一个 az ml online-deployment update 命令与标志 --local 配合使用。

如果要更新代码、模型或环境,请更新配置,然后运行 MLClient's online_deployments.begin_create_or_update 方法来创建 或更新部署

如果在单个 begin_create_or_update 方法中同时更新实例计数(以扩展您的部署)以及其他模型设置(例如代码、模型或环境),那么将首先执行扩展操作。 然后应用其他更新。 在生产环境中单独执行这些操作是一个很好的做法。

若要了解 begin_create_or_update 的工作原理,请执行以下操作:

  1. 打开 文件 online/model-1/onlinescoring/score.py

  2. 更改 init() 函数的最后一行:在 logging.info("Init complete") 后面,添加 logging.info("Updated successfully")

  3. 保存文件。

  4. 运行方法:

    ml_client.online_deployments.begin_create_or_update(blue_deployment_with_registered_assets)
    
  5. 由于修改了 init() 在创建或更新终结点时运行的函数,因此消息 Updated successfully 将显示在日志中。 运行以下命令检索日志:

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=endpoint_name, lines=50
    )
    

begin_create_or_update 方法也适用于本地部署。 将同一方法与 local=True 标志配合使用。

备注

本部分中的部署更新是就地滚动更新的示例。

  • 对于托管联机终结点,系统会将部署一次更新为具有 20% 节点的新配置。 也就是说,如果部署有 10 个节点,则一次将更新 2 个节点。
  • 对于 Kubernetes 联机终结点,系统将使用新配置以迭代方式创建新的部署实例,并删除旧部署实例。
  • 对于生产使用情况,请考虑 使用蓝绿部署,该部署为更新 Web 服务提供了更安全的替代方法。

(可选)配置自动缩放

自动缩放会自动运行适量的资源来处理应用程序的负载。 托管联机终结点支持通过与 Azure Monitor 自动缩放功能的集成进行自动缩放。 若要配置自动缩放,请参阅自动缩放联机终结点

(可选)使用 Azure Monitor 监视 SLA

若要查看指标并基于 SLA 设置警报,请遵循 “监视联机终结点”中所述的步骤。

(可选)与 Log Analytics 集成

get-logs CLI 的命令或 get_logs SDK 方法仅提供自动选择实例的最后几百行日志。 但是,Log Analytics 提供一种用于持久存储和分析日志的方式。 有关如何使用日志记录的详细信息,请参阅 “使用日志”。

删除终结点和部署

使用以下命令删除终结点及其所有基础部署:

az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait

使用以下命令删除终结点及其所有基础部署:

ml_client.online_endpoints.begin_delete(name=endpoint_name)