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

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

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

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

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

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

先决条件

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

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

  • 一个 Azure 机器学习工作区和一个计算实例。 如果没有这些资源并想要创建它们,请按照快速入门:创建工作区资源一文中的步骤操作。

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

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

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

准备你的系统

如果在本地计算机上安装了 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 仅克隆最新提交到存储库的内容,从而减少完成操作所需的时间。

从示例存储库下载文件

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

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

定义终结点

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

配置终结点

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

定义部署

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

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

配置部署

部署配置使用你希望部署的模型的位置。

配置部署

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

了解评分脚本

提示

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

评分脚本必须具有一个 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 引擎。 Docker 引擎通常在计算机启动时启动。 如果它不启动,可以对 Docker 引擎进行故障排除

提示

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

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

在本地部署模型

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

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

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

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

提示

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

验证本地部署是否成功

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

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

下表包含 provisioning_state 的可能值:

说明
Creating 正在创建资源。
更新 正在更新资源。
正在删除 正在删除此资源。
成功 创建/更新操作成功。
已失败 创建/更新/删除操作失败。

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

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

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

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

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

将联机终结点部署到 Azure

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

注册模型和环境

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

备注

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

注册模型

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

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

  1. 转到 Azure 机器学习工作室

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

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

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

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

    “浏览文件夹”选项的屏幕截图。

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

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

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

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

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

创建并注册环境

  1. 在左侧导航栏中,选择“环境”页。

  2. 选择创建

  3. 在“设置”页上,提供一个名称,例如为环境提供 my-env

  4. 对于“选择环境源”,请选择“使用具有可选 conda 源的现有 docker 映像”。

    显示如何创建自定义环境的屏幕截图。

  5. 选择“下一步”转到“自定义”页。

  6. 从之前克隆或下载的存储库的本地副本复制 \azureml-examples\cli\endpoints\online\model-1\environment\conda.yaml 文件的内容。

  7. 将内容粘贴到文本框中。

    显示如何使用 conda 文件自定义环境的屏幕截图。

  8. 选择“下一步”,直到到达“查看”页。

  9. 选择“创建”

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

配置使用注册资产的部署

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

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

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

使用工作室部署到 Azure 时,系统会提示你指定要用于部署的计算属性(实例类型和实例计数)和环境。

可以在托管联机终结点支持的 VM SKU 中查看支持的常规用途类型和 GPU 实例类型。 有关环境的详细信息,请参阅在 Azure 机器学习工作室中管理软件环境

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

“部署到 Azure”

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

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

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

  1. 转到 Azure 机器学习工作室

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

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

  4. 选择“部署”>“实时终结点”。

    从模型 UI 创建托管联机终结点的屏幕截图。

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

    托管联机终结点创建向导的屏幕截图。

  5. 输入在 Azure 区域中唯一的终结点名称 。 有关命名规则的详细信息,请参阅终结点限制

  6. 保留默认选择:计算类型为“托管”。

  7. 保留默认选择:身份验证类型为“基于密钥的身份验证”。 有关身份验证的详细信息,请参阅对联机终结点的客户端进行身份验证

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

  9. 选择“下一步”以转到“代码 + 环境”页。 在这里,请选择以下选项:

    • 选择用于推理的评分脚本:浏览之前克隆或下载的存储库并从中选择 \azureml-examples\cli\endpoints\online\model-1\onlinescoring\score.py 文件。
    • 选择环境 部分:选择“自定义环境”,然后选择前面创建的 my-env:1 环境。

    显示用于部署的自定义环境选项的屏幕截图。

  10. 选择“下一步”,接受默认值,直到系统提示你创建部署。

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

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

  1. 转到 Azure 机器学习工作室

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

  3. 选择“+ 新建”。

    屏幕截图,显示如何从“终结点”选项卡创建托管联机终结点。

此操作将打开一个窗口,供你选择模型并指定有关终结点和部署的详细信息。 按前面所述输入终结点和部署的设置,然后创建部署。

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

检查终结点的状态

查看托管联机终结点

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

  1. 在左侧导航栏中,选择“终结点”。 在这里,可以看到工作区中所有终结点的列表。

  2. (可选)创建一个基于“计算类型”的筛选器,以便仅显示“托管”计算类型。

  3. 选择一个终结点名称以查看该终结点的“详细信息”页。

    托管终结点详细信息视图的屏幕截图。

检查联机部署的状态

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

若要查看日志输出,请从终结点页面中选择“日志”选项卡。 如果终结点中有多个部署,请使用下拉列表选择要查看其日志的部署。

在工作室中观察部署日志的屏幕截图。

默认情况下,日志是从推理服务器拉取的。 若要查看存储初始化表达式容器的日志,请使用 Azure CLI 或 Python SDK(有关详细信息,请参阅每个选项卡)。 存储初始化容器中的日志提供了有关代码和模型数据是否已成功下载到容器的信息。 有关部署日志的更多信息,请参阅获取容器日志

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

使用终结点“详细信息”页中的“测试”选项卡来测试托管联机部署。 提供示例输入并查看结果。

  1. 在终结点的详细信息页中选择“测试”选项卡。

  2. 使用下拉列表选择要测试的部署。

  3. 输入示例输入

  4. 选择“测试”。

    屏幕截图,显示了如何直接在浏览器中提供示例数据来测试部署。

(可选)更新部署

目前,工作室仅允许你对部署的实例计数进行更新。 使用以下说明,通过调整实例数来纵向扩展或缩减单个部署:

  1. 打开终结点的“详细信息”页,找到要更新的部署的卡。
  2. 选择部署名称旁边的编辑图标(铅笔图标)。
  3. 更新与部署关联的实例计数。 对于“部署缩放类型”,可以在“默认”和“目标利用率”之间进行选择。
    • 如果选择“默认”,则还可以为“实例计数”指定一个数值。
    • 如果选择“目标利用率”,则可以指定要在自动缩放部署时用于参数的值。
  4. 选择“更新”以完成部署的实例计数更新。

备注

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

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

(可选)配置自动缩放

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

(可选)使用 Azure Monitor 监视 SLA

若要查看指标并根据 SLA 设置警报,请完成监视联机终结点中所述的步骤。

(可选)与 Log Analytics 集成

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

删除终结点和部署

如果不打算使用终结点和部署,则应该删除它们。 删除终结点时,也会删除其所有基础部署。

  1. 转到 Azure 机器学习工作室
  2. 在左侧导航栏中,选择“终结点”页。
  3. 通过选中模型名称旁边的圆圈来选择终结点。
  4. 选择“删除”。

或者,可以通过选择终结点详细信息页中的“删除”图标,直接删除托管联机终结点。