适用范围: Azure CLI ml 扩展 v2(最新版) Python SDK azure-ai-ml v2(最新版)

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

联机终结点是用于实时推理的终结点。 有两种类型的联机终结点:托管联机终结点和 Kubernetes 联机终结点。 有关终结点的详细信息以及托管联机终结点与 Kubernetes 联机终结点之间的差异,请参阅 什么是 Azure 机器学习终结点?

托管联机终结点有助于以统包方式部署 ML 模型。 托管联机终结点在 Azure 中以一种可缩放的、完全托管的方式使用功能强大的 CPU 和 GPU 计算机。 托管联机终结点负责处理、缩放、保护和监视你的模型,使你没有设置和管理底层基础结构的开销。

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

Azure CLI Python ARM 模板
  • Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure 机器学习中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配 Azure 机器学习工作区的所有者或参与者角色,或者分配一个允许 Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* 的自定义角色。 如果使用工作室创建/管理联机终结点/部署,则需要资源组所有者提供的附加权限“Microsoft.Resources/deployments/write”。 有关详细信息,请参阅 管理对 Azure 机器学习工作区的访问

  • (可选)若要在本地部署,必须在本地计算机上 安装 Docker 引擎 。 强烈建议选择此选项,以便更轻松地调试问题。

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

  • (可选)若要在本地部署,必须在本地计算机上 安装 Docker 引擎 。 强烈建议选择此选项,以便更轻松地调试问题。

    在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • Azure 订阅。 如果没有 Azure 订阅,请在开始操作前先创建一个免费帐户。 试用 免费版或付费版 Azure 机器学习

  • 一个 Azure 机器学习工作区和一个计算实例。 如果没有,请使用 快速入门:创建工作区资源 一文中的步骤创建它们。

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

    虽然这些步骤中使用了用于机器学习的 Azure CLI 和 CLI 扩展,但它们不是主要重点。 它们更多地用作实用工具,将模板传递到 Azure 并检查模板部署的状态。

    在按照本文中的步骤操作之前,请确保满足以下先决条件:

  • Azure CLI 和 Azure CLI 的 ml 扩展。 有关详细信息,请参阅 安装、设置和使用 CLI (v2)

    本文中的 CLI 示例假定你使用的是 Bash(或兼容的)shell。 例如,从 Linux 系统或者 适用于 Linux 的 Windows 子系统

  • Azure 机器学习工作区。 如果没有,请使用 安装、设置和使用 CLI (v2) 中的步骤创建一个。

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

    对于托管联机终结点,Azure 机器学习将保留 20% 的计算资源用于执行升级。 因此,如果在部署中请求给定数量的实例,则必须为 ceil(1.2 * number of instances requested for deployment) * number of cores for the VM SKU 提供可用配额以避免出现错误。 例如,如果在部署中请求 Standard_DS3_v2 VM(带有 4 个内核)的 10 个实例,则应该为 48 个内核 ( 12 instances * 4 cores ) 提供可用配额。 若要查看使用情况和请求增加配额,请参阅 在 Azure 门户中查看使用情况和配额

    准备你的系统

    Azure CLI Python ARM 模板

    设置环境变量。

    如果尚未为 Azure CLI 指定默认设置,则应保存默认设置。 若要避免多次传入订阅、工作区和资源组的值,请运行此代码:

    az account set --subscription <subscription ID>
    az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
    

    克隆示例存储库

    若要按照本文的说明进行操作,请先克隆示例存储库 (azureml-examples)。 然后,运行以下代码,以转至存储库的 cli/ 目录:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples
    cd cli
    

    使用 --depth 1 仅克隆最新提交到存储库的内容,从而减少完成操作所需的时间。

    本教程中的命令位于 cli 目录中的文件 deploy-local-endpoint.shdeploy-managed-online-endpoint.sh 内,YAML 配置文件位于 endpoints/online/managed/sample/ 子目录中。

    Kubernetes 联机终结点的 YAML 配置文件位于 endpoints/online/kubernetes/ 子目录中。

    克隆示例存储库

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

    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 笔记本。

  • 导入所需的库:

    # 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 联机终结点,请从 azure.ai.ml.entities 库导入 KubernetesOnlineEndpointKubernetesOnlineDeployment 类。

  • 配置工作区详细信息并获取工作区句柄:

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

    # enter details of your Azure Machine Learning workspace
    subscription_id = "<SUBSCRIPTION_ID>"
    resource_group = "<RESOURCE_GROUP>"
    workspace = "<AZUREML_WORKSPACE_NAME>"
    
    # get a handle to the workspace
    ml_client = MLClient(
        DefaultAzureCredential(), subscription_id, resource_group, workspace
    

    如果在本地计算机上安装了 Git,则可以按照说明克隆示例存储库。 否则,请按照说明从示例存储库下载文件。

    克隆示例存储库

    若要按照本文的说明进行操作,请先克隆示例存储库 (azureml-examples),然后将其更改为 azureml-examples/cli/endpoints/online/model-1 目录。

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1
    

    使用 --depth 1 仅克隆最新提交到存储库的内容,从而减少完成操作所需的时间。

    从示例存储库下载文件

    如果克隆了示例存储库,则本地计算机已有此示例的文件副本,你可以跳到下一部分。 如果未克隆存储库,则可以将其下载到本地计算机。

  • 转到 https://github.com/Azure/azureml-examples/
  • 转到页面上的“<> 代码”按钮,然后从“本地”选项卡中选择“下载 ZIP”。
  • 找到文件夹 /cli/endpoints/online/model-1/model 和文件 /cli/endpoints/online/model-1/onlinescoring/score.py
  • 设置环境变量。

    设置以下环境变量,因为本文中的示例会用到它们。 将这些值替换为 Azure 订阅 ID、工作区所在的 Azure 区域、包含工作区的资源组和工作区名称:

    export SUBSCRIPTION_ID="your Azure subscription ID"
    export LOCATION="Azure region where your workspace is located"
    export RESOURCE_GROUP="Azure resource group that contains your workspace"
    export WORKSPACE="Azure Machine Learning workspace name"
    

    几个模板示例要求将文件上传到工作区的 Azure Blob 存储。 以下步骤可查询工作区,并将此信息存储在示例中使用的环境变量中:

  • 获取访问令牌:

    TOKEN=$(az account get-access-token --query accessToken -o tsv)
  • 设置 REST API 版本:

    API_VERSION="2022-05-01"
  • 获取存储信息:

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

    克隆示例存储库

    若要按照本文的说明进行操作,请先克隆示例存储库 (azureml-examples)。 然后,运行以下代码,以转至示例目录:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples
    

    使用 --depth 1 仅克隆最新提交到存储库的内容,从而减少完成操作所需的时间。

    定义终结点

    若要定义终结点,需要指定:

  • 终结点名称:终结点的名称。 在 Azure 区域中必须具有唯一性。 有关命名规则的详细信息,请参阅托管联机终结点限制
  • 身份验证模式:终结点的身份验证方法。 在基于密钥的身份验证和基于 Azure 机器学习令牌的身份验证之间进行选择。 密钥不会过期,但令牌会过期。 有关身份验证的详细信息,请参阅向联机终结点进行身份验证
  • (可选)可以向终结点添加说明和标记。
  • 以下代码段显示了 endpoints/online/managed/sample/endpoint.yml 文件:

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

    下表描述了 YAML 格式的终结点的参考资料。 若要了解如何指定这些属性,请参阅联机终结点 YAML 参考。 有关托管终结点相关限制的信息,请参阅管理和提高 Azure 机器学习资源的配额

    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

    配置终结点

    部署到 Azure 时,将创建一个终结点和一个要添加到其中的部署。 此时,系统会提示你提供终结点和部署的名称。

    设置终结点名称

    要设置你的终结点名称,请运行以下命令(将 YOUR_ENDPOINT_NAME 替换为唯一名称)。

    对于 Linux,请运行以下命令:

    export ENDPOINT_NAME=endpoint-`echo $RANDOM`

    配置终结点

    为了定义终结点和部署,本文使用 Azure 资源管理器模板 online-endpoint.jsononline-endpoint-deployment.json。 若要使用模板定义联机终结点和部署,请参阅“部署到 Azure”部分。

    部署是一组资源,用于承载执行实际推理的模型。 若要部署模型,必须具备:

  • 模型文件(或者已在工作区中注册的模型的名称和版本)。 本示例中有一个执行回归的 scikit-learn 模型。
  • 评分脚本,即根据给定输入请求执行模型的代码。 评分脚本接收提交到已部署的 Web 服务的数据,并将此数据传递给模型。 然后,该脚本执行模型并将其响应返回给客户端。 评分脚本特定于你的模型,必须理解模型期望作为输入和作为输出返回的数据。 在此示例中,我们有一个 score.py 文件。
  • 运行模型的环境。 环境可以是包含 Conda 依赖项的 Docker 映像,也可以是 Dockerfile。
  • 用于指定实例类型和缩放容量的设置。
  • 下表介绍了部署的关键属性:

    源代码目录中评分文件的相对路径。 此 Python 代码必须具有 init() 函数和 run() 函数。 在创建或更新模型后将调用 init() 函数(例如,可以使用该函数在内存中缓存模型)。 每次调用终结点时,都将调用 run() 函数来执行实际评分和预测。 用于承载模型和代码的环境。 此值可以是对工作区中现有版本受控环境的引用,也可以是对内联环境规范的引用。 用于部署的 VM 大小。 有关支持的大小列表,请参阅托管联机终结点 SKU 列表。 用于部署的实例数。 请根据预期的工作负载确定值。 为实现高可用性,建议将值至少设置为 3。 我们保留额外的 20% 来执行升级。 有关详细信息,请参阅托管联机终结点配额
  • 使用安全修补程序和/或其他恢复操作对部署后面的实例进行修复后,部署可以随时再次引用模型和容器映像(如环境中所定义)。 如果在 Azure 容器注册表中使用已注册的模型或容器映像进行部署,并移除了模型或容器映像,则重置映像后,依赖于这些资产的部署可能会失败。 如果移除了模型或容器映像,请确保使用备用模型或容器映像重新创建或更新依赖的部署。
  • 仅当终结点标识有权通过 Azure Active Directory 身份验证和 Azure RBAC 进行访问时,环境所引用的容器注册表才能是专用的。 出于同样的原因,不支持 Azure 容器注册表以外的专用 Docker 注册表。
  • 以下代码片段显示了 endpoints/online/managed/sample/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 指定了内联模型属性。 将自动上传模型文件并使用自动生成的名称注册。
  • environment - 在此示例中,我们具有包含 path 的内联定义。 我们将为映像使用 environment.docker.image。 将在映像之上安装 conda_file 依赖项。
  • 在部署期间,本地文件(如评分模型的 Python 源)是从开发环境上传的。

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

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

  • 使用 Azure 机器学习工作室创建 Kubernetes 群集并将其作为计算目标附加到 Azure 机器学习工作区。
  • 使用终结点 YAML 而不是托管终结点 YAML,将 Kubernetes 指定为目标。 需要编辑 YAML,以将 target 的值更改为已注册的计算目标的名称。 可以使用此 deployment.yaml,它具有其他适用于 Kubernetes 部署的属性。
  • 本文中使用的所有命令(除了可选 SLA 监视和 Azure Log Analytics 集成)可以与托管终结点或 Kubernetes 终结点一起使用。

    若要配置部署,请执行以下操作:

    model = Model(path="../model-1/model/sklearn_regression_model.pkl")
    env = Environment(
        conda_file="../model-1/environment/conda.yml",
        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,
    

    部署到 Azure 时,将创建一个终结点和一个要添加到其中的部署。 此时,系统会提示你提供终结点和部署的名称。

    为了定义终结点和部署,本文使用 Azure 资源管理器模板 online-endpoint.jsononline-endpoint-deployment.json。 若要使用模板定义联机终结点和部署,请参阅“部署到 Azure”部分。

    单独注册模型和环境

    Azure CLI Python ARM 模板

    在此示例中,我们以内联方式指定 path(从何处上传文件)。 CLI 会自动上传文件并注册模型和环境。 适用于生产的最佳做法是注册模型和环境,并在 YAML 中指定已注册的名称和版本。 使用格式 model: azureml:my-model:1environment: azureml:my-env:1

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

    有关将模型注册为资产的详细信息,请参阅使用 CLI 在机器学习中将模型注册为资产。 有关创建环境的详细信息,请参阅使用 CLI & SDK (v2) 管理 Azure 机器学习环境

    在此示例中,我们以内联方式指定 path(从何处上传文件)。 SDK 会自动上传文件并注册模型和环境。 适用于生产的最佳做法是注册模型和环境,并在代码中指定已注册的名称和版本。

    有关将模型注册为资产的详细信息,请参阅使用 SDK 在机器学习中将模型注册为资产

    有关创建环境的详细信息,请参阅使用 CLI & SDK (v2) 管理 Azure 机器学习环境

    模型注册是工作区中的逻辑实体,可能包含单个模型文件或多个文件的目录。 作为生产最佳做法,你应该注册模型和环境。 在本文中创建终结点和部署时,我们假设你已注册包含该模型的模型文件夹

    若要注册示例模型,请执行以下步骤:

  • 转到 Azure 机器学习工作室

  • 在左侧导航栏中,选择“模型”页。

  • 选择“注册”,然后选择“从本地文件”。

  • 为“模型类型”选择“未指定的类型”。

  • 选择“浏览”,然后选择“浏览文件夹”。

  • 从之前克隆或下载的存储库的本地副本选择 \azureml-examples\cli\endpoints\online\model-1\model 文件夹。 出现提示时,请选择“上传”并等待上传完成。

  • 文件夹上传完成后,请选择“下一步”。

  • 为模型输入一个易记名称。 本文中的步骤假定模型已命名为 model-1

  • 选择“下一步”,然后选择“注册”以完成注册。

    若要详细了解如何使用已注册模型,请参阅注册并使用模型

    有关在工作室中创建环境的信息,请参阅创建环境

  • 若要使用模板注册模型,必须先将模型文件上传到 Azure Blob 存储。 以下示例使用 az storage blob upload-batch 命令将文件上传到工作区的默认存储:

    az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/model -s cli/endpoints/online/model-1/model --account-name $AZURE_STORAGE_ACCOUNT
  • 上传文件后,使用模板创建模型注册。 在以下示例中,modelUri 参数包含模型的路径:

    az deployment group create -g $RESOURCE_GROUP \ --template-file arm-templates/model-version.json \ --parameters \ workspaceName=$WORKSPACE \ modelAssetName="sklearn" \ modelUri="azureml://subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/workspaces/$WORKSPACE/datastores/$AZUREML_DEFAULT_DATASTORE/paths/model/sklearn_regression_model.pkl"
  • 环境的一部分是 conda 文件,该文件指定托管模型所需的模型依赖项。 以下示例演示如何将 conda 文件的内容读取到环境变量中:

    CONDA_FILE=$(cat cli/endpoints/online/model-1/environment/conda.yaml)
  • 以下示例演示如何使用模板注册环境。 使用 condaFile 参数将上一步中的 conda 文件的内容传递到模板:

    ENV_VERSION=$RANDOM az deployment group create -g $RESOURCE_GROUP \ --template-file arm-templates/environment-version.json \ --parameters \ workspaceName=$WORKSPACE \ environmentAssetName=sklearn-env \ environmentAssetVersion=$ENV_VERSION \ dockerImage=mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1 \ condaFile="$CONDA_FILE"

    blue-deployment.yml 文件中的上述定义使用常规用途类型 Standard_DS3_v2 实例和非 GPU Docker 映像 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest。 对于 GPU 计算,应选择 GPU 计算类型 SKU 和 GPU Docker 映像。

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

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

    blue_deployment 的上述定义使用常规用途类型 Standard_DS3_v2 实例和非 GPU Docker 映像 mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest。 对于 GPU 计算,应选择 GPU 计算类型 SKU 和 GPU Docker 映像。

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

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

    通过使用 dockerImage 参数将值传递给 environment-version.json 模板,上述环境注册指定了非 GPU Docker 映像 mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04。 对于 GPU 计算,请为模板提供 GPU Docker 映像的值(使用 dockerImage 参数)并为模板 online-endpoint-deployment.json 提供 GPU 计算类型 SKU(使用 skuName 参数)。

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

    在部署中使用多个模型

    目前,在使用 Azure CLI、Python SDK 或任何其他客户端工具时,只能在部署定义中为每个部署指定一个模型。

    若要在部署中使用多个模型,请注册一个将所有模型作为文件或子目录包含在内的模型文件夹。 在评分脚本中,使用环境变量 AZUREML_MODEL_DIR 获取模型根文件夹的路径。 将保留基础目录结构。 有关将多个模型部署到一个部署的示例,请参阅将多个模型部署到一个部署(CLI 示例)将多个模型部署到一个部署(SDK 示例)

    如果要注册的文件超过 1500 个,则可以考虑在注册模型时将文件或子目录压缩为 .tar.gz。 若要使用模型,可以从评分脚本中解压缩 init() 函数中的文件或子目录。 或者,在注册模型时,将 azureml.unpack 属性设置为 True,这将允许自动解压缩。 在任何一种情况下,解压缩都在初始化阶段发生一次。

    了解评分脚本

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

    评分脚本必须具有一个 init() 函数和一个 run() 函数。 此示例使用 score.py 文件

    使用模板进行部署时,必须先将评分文件上传到 Azure Blob 存储,然后注册它:

  • 以下示例使用 Azure CLI 命令 az storage blob upload-batch 上传评分文件:

    az storage blob upload-batch -d $AZUREML_DEFAULT_CONTAINER/score -s cli/endpoints/online/model-1/onlinescoring --account-name $AZURE_STORAGE_ACCOUNT
  • 以下示例演示如何使用模板注册代码:

    az deployment group create -g $RESOURCE_GROUP \ --template-file arm-templates/code-version.json \ --parameters \ workspaceName=$WORKSPACE \ codeAssetName="score-sklearn" \ codeUri="https://$AZURE_STORAGE_ACCOUNT.blob.core.windows.net/$AZUREML_DEFAULT_CONTAINER/score" 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 函数编写逻辑以执行全局初始化操作,例如在内存中高速缓存模型(如本示例中的执行)。

    每次调用终结点时,都将调用 run() 函数,该函数执行实际的评分和预测。 在此示例中,我们将从 JSON 输入提取数据,调用 scikit-learn 模型的 predict() 方法,并返回结果。

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

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

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

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

    本地终结点具有以下限制:

  • 它们支持流量规则、身份验证或探测设置。
  • 它们仅支持每个终结点一个部署。
  • 它们仅支持本地模型文件。 如果要测试已注册的模型,请先使用 CLISDK 下载它们,然后在部署定义中使用 path 来引用父文件夹。
  • 有关在部署到 Azure 之前以本地方式调试联机终结点的详细信息,请参阅在 Visual Studio Code 中对联机终结点进行本地调试

    在本地部署模型

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

    Azure CLI Python ARM 模板 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 环境中部署终结点。

    工作室不支持本地终结点。 请参阅 Azure CLI 或 Python 选项卡,了解在本地测试终结点的步骤。

    模板不支持本地终结点。 请参阅 Azure CLI 或 Python 选项卡,了解在本地测试终结点的步骤。

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

    验证本地部署是否成功

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

    Azure CLI Python ARM 模板 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})
    

    使用便捷命令 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 属性。 本文档后面提供了基于 curl 的示例命令。

    使用便捷命令 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 属性。 本文档后面提供了基于 curl 的示例命令。

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

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

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

    若要在云中创建终结点,请运行以下代码:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml

    若要在终结点下创建名为 blue 的部署,请运行以下代码:

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

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

  • 如果你不希望阻塞 CLI 控制台,可以将 --no-wait 标志添加到命令中。 但是,这会停止以交互方式显示部署状态。
  • 上述 az ml online-deployment create 中的 --all-traffic 标志会将 100% 的终结点流量分配给新创建的蓝色部署。 尽管这对开发和测试非常有用,但对于生产,你可能想要通过显式命令开放到新部署的流量。 例如,az ml online-endpoint update -n $ENDPOINT_NAME --traffic "blue=100"

  • 创建终结点:

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

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

    使用前面定义的 blue_deployment 和之前创建的 MLClient,我们现在将在工作区中创建部署。 此命令将启动部署创建操作,并在部署创建操作继续时返回确认响应。

    ml_client.online_deployments.begin_create_or_update(blue_deployment)
    
  • 如果你不希望阻塞 Python 控制台,可以将 no_wait=True 标志添加到参数中。 但是,这会停止以交互方式显示部署状态。
  • # blue deployment takes 100 traffic
    endpoint.traffic = {"blue": 100}
    ml_client.online_endpoints.begin_create_or_update(endpoint)
    

    创建托管联机终结点和部署

    直接在浏览器中使用工作室创建托管联机终结点。 在工作室中创建托管联机终结点时,必须定义初始部署。 不能创建空的托管联机终结点。

    在工作室中创建托管联机终结点的一种方法是从“模型”页面创建。 此方法也提供将模型添加到现有托管联机部署的简单方法。 若要部署之前在“注册模型”部分中注册的名为 model-1 的模型,请执行以下操作:

  • 转到 Azure 机器学习工作室

  • 在左侧导航栏中,选择“模型”页。

  • 通过选中名称旁边的圆圈来选择名为 model-1 的模型。

  • 选择“部署”>“部署到实时终结点”。

    此操作将打开一个窗口,可在其中指定有关终结点的详细信息。

  • 输入终结点名称

  • 终结点名称:终结点的名称。 在 Azure 区域中必须具有唯一性。 有关命名规则的详细信息,请参阅托管联机终结点限制
  • 身份验证类型:终结点的身份验证方法。 在基于密钥的身份验证和基于 Azure 机器学习令牌的身份验证之间进行选择。 key 不会过期,但令牌会过期。 有关身份验证的详细信息,请参阅向联机终结点进行身份验证
  • (可选)可以向终结点添加说明和标记。
  • 保留默认选择:对于计算类型为“托管”,对于身份验证类型为“基于密钥的身份验证”。

  • 选择“下一步”,直到出现“部署”页。 在此处,将“Application Insights 诊断”切换为“已启用”,以便稍后在工作室中查看终结点活动的图形,并使用 Application Insights 分析指标和日志。

  • 选择“下一步”以转到“环境”页。 在这里,请选择以下选项:

  • 选择评分文件和依赖项:浏览之前克隆或下载的存储库并从中选择 \azureml-examples\cli\endpoints\online\model-1\onlinescoring\score.py 文件。
  • “选择环境”部分:选择 Scikit-learn 0.24.1 特选环境。
  • 选择“下一步”,接受默认值,直到系统提示你创建部署。

  • 查看你的部署设置,然后选择“创建”按钮。

    或者,也可以通过工作室中的“终结点”页创建托管联机终结点。

  • 转到 Azure 机器学习工作室

  • 在左侧导航栏中,选择“终结点”页。

  • 选择“+ 新建”。

    az deployment group create -g $RESOURCE_GROUP \ --template-file arm-templates/online-endpoint.json \ --parameters \ workspaceName=$WORKSPACE \ onlineEndpointName=$ENDPOINT_NAME \ identityType=SystemAssigned \ authMode=AMLToken \ location=$LOCATION
  • 创建终结点后,以下示例演示如何将模型部署到终结点:

    resourceScope="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices" az deployment group create -g $RESOURCE_GROUP \ --template-file arm-templates/online-endpoint-deployment.json \ --parameters \ workspaceName=$WORKSPACE \ location=$LOCATION \ onlineEndpointName=$ENDPOINT_NAME \ onlineDeploymentName=blue \ codeId="$resourceScope/workspaces/$WORKSPACE/codes/score-sklearn/versions/1" \ scoringScript=score.py \ environmentId="$resourceScope/workspaces/$WORKSPACE/environments/sklearn-env/versions/$ENV_VERSION" \ model="$resourceScope/workspaces/$WORKSPACE/models/score-sklearn/versions/1" \ endpointComputeType=Managed \ skuName=Standard_F2s_v2 \ skuCapacity=1

    可以使用 list 方法以表格格式列出工作区中的所有终结点:

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

    该方法返回 ManagedOnlineEndpoint 实体的列表(迭代器)。 你可以通过指定参数来获取其他信息。

    例如,像表格一样输出终结点列表:

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

    查看托管联机终结点

    可以在“终结点”页中查看所有托管联机终结点。 转到终结点的“详细信息”页查找关键信息,包括终结点 URI、状态、测试工具、活动监视器、部署日志和示例使用代码:

  • 在左侧导航栏中,选择“终结点”。 在这里,可以看到工作区中所有终结点的列表。
  • (可选)创建一个基于“计算类型”的筛选器,以便仅显示“托管”计算类型 。
  • 选择一个终结点名称以查看该终结点的“详细信息”页。
  • 虽然模板可用于部署资源,但它们不能用于列出、显示或调用资源。 使用 Azure CLI、Python SDK 或工作室执行这些操作。 以下代码使用 Azure CLI。

    对于终结点和部署,show 命令包含 provisioning_state 中的信息:

    az ml online-endpoint show -n $ENDPOINT_NAME

    可以使用 list 命令以表格格式列出工作区中的所有终结点:

    az ml online-endpoint list --output table
    

    检查联机部署的状态

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

    Azure CLI Python ARM 模板

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

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

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

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

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

    默认情况下,日志是从推理服务器容器拉取的。 若要查看存储初始化表达式容器中的日志,请添加 container_type="storage-initializer" 选项。 有关部署日志的更多信息,请参阅获取容器日志

    ml_client.online_deployments.get_logs(
        name="blue", endpoint_name=endpoint_name, lines=50, container_type="storage-initializer"
    az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
    

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

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

    Azure CLI Python ARM 模板

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

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

    以下示例显示了如何获取用于对终结点进行身份验证的密钥:

    你可以对哪些 Azure Active Directory 安全主体能够获取身份验证密钥进行控制,方法是将其分配到一个允许 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)

    接下来,使用 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 标志来筛选特性,以便仅显示所需的特性。 可以在查询 Azure CLI 命令输出中详细了解 --query

    若要查看调用日志,请再次运行 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",
    

    虽然模板可用于部署资源,但它们不能用于列出、显示或调用资源。 使用 Azure CLI、Python SDK 或工作室执行这些操作。 以下代码使用 Azure CLI。

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

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

    (可选)更新部署

    Azure CLI Python ARM 模板

    如果你在单个 update 命令中更新实例计数(以缩放你的部署)和其他模型设置(例如代码、模型或环境),则首先将执行缩放操作,然后将应用其他更新。 在生产环境中单独执行这些操作是一个很好的做法。

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

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

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

  • 保存文件。

  • 运行以下命令:

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

    使用 YAML 进行更新是声明性的。 也就是说,YAML 中的更改反映在基础资源 Azure 资源管理器资源(终结点和部署)中。 声明性方法有助于 GitOps:对终结点和部署的所有更改都将通过 YAML 进行(甚至包括 instance_count)。

  • 可以将泛型更新参数(例如 --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 的操作。 这将保留所有现有配置,但仅更新指定的参数。
  • 由于修改了在创建或更新终结点时运行的 init() 函数,因此日志中会包含消息 Updated successfully。 运行以下命令检索日志:

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

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

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

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

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

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

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

  • 保存文件。

  • 运行方法:

    ml_client.online_deployments.begin_create_or_update(blue_deployment)
    
  • 由于修改了在创建或更新终结点时运行的 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 集成

    CLI 的 get-logs 命令或 SDK 的 get_logs 方法只提供自动选择的实例最近发出的几百行日志。 但是,Log Analytics 提供一种用于持久存储和分析日志的方式。 有关使用日志记录的详细信息,请参阅监视联机终结点

    删除终结点和部署

    Azure CLI Python ARM 模板
  •