你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

关于 MLflow 模型部署的指南

适用于:Azure CLI ml 扩展 v2(当前版本)

本文介绍如何将 MLflow 模型部署到 Azure 机器学习以进行实时和批处理推理。 本文还将介绍可用于管理部署的不同工具。

部署 MLflow 模型与自定义模型

与 Azure 机器学习中的自定义模型部署不同,将 MLflow 模型部署到 Azure 机器学习时,无需提供评分脚本或部署环境。 相反,Azure 机器学习会自动生成评分脚本和环境。 此功能称为“无代码部署”

对于无代码部署,Azure 机器学习:

  • 确保满足 MLflow 模型中指示的所有包依赖项。
  • 提供 MLflow 基础映像或策展环境,其中包含以下各项:
    • Azure 机器学习执行推理所需的包,包括 mlflow-skinny
    • 用于执行推理的评分脚本。

提示

没有公用网络访问权限的工作区:必须打包模型(预览版),然后才能在没有传出连接的情况下将 MLflow 模型部署到联机终结点。 通过使用模型打包,可以不必使用 Internet 连接,否则 Azure 机器学习需要使用 Internet 连接才能为 MLflow 模型动态安装必要的 Python 包。

Python 包和依赖项

Azure 机器学习自动生成环境来运行 MLflow 模型推理。 为生成环境,Azure 机器学习会读取 MLflow 模型中指定的 conda 依赖项,并添加运行推理服务器所需的包。 这些额外的包因部署类型而异。

以下 conda.yaml 文件显示了 MLflow 模型中指定的 conda 依赖项示例

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

警告

MLflow 会在记录模型时自动检测包,并将包版本固定到模型的 conda 依赖项中。 但是,这种自动包检测可能并不总是符合你的意图或要求。 在这些情况下,请考虑使用具有自定义 conda 依赖项定义的日志记录模型

使用具有签名的模型的影响

MLflow 模型可以包含一个签名,用于指示预期的输入及其类型。 将此类模型部署到联机终结点或批处理终结点时,Azure 机器学习会强制数据输入的数量和类型符合签名。 如果无法正常分析输入数据,则模型调用将失败。

可以通过打开与模型关联的 MLmodel 文件来检查 MLflow 模型的签名。 有关签名如何在 MLflow 中发挥作用的详细信息,请参阅 MLflow 中的签名

以下文件显示了与 MLflow 模型关联的 MLmodel 文件。

MLmodel

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

提示

MLflow 模型中的签名是可选的,但强烈建议使用它们,因为它们提供了一种提前检测数据兼容性问题的简便方法。 有关如何使用签名记录模型的详细信息,请参阅使用自定义签名、环境或示例记录模型

Azure 机器学习中部署的模型与 MLflow 内置服务器中部署的模型

MLflow 包括内置部署工具,模型开发人员可以使用这些工具在本地测试模型。 例如,可以使用 mlflow models serve -m my_model 运行在 MLflow 服务器注册表中注册的模型的本地实例,也可以使用 MLflow CLI mlflow models predict

使用批处理终结点与联机终结点进行推理

Azure 机器学习支持将模型部署到联机终结点和批处理终结点。 这些终结点运行不同的推理技术,可以具有不同的功能。

联机终结点类似于 MLflow 内置服务器,提供了一种可缩放、同步且轻型的方式来运行模型以进行推理。

另一方面,批处理终结点能够通过长期推理进程运行异步推理,这些进程可以扩展到大量数据。 MLflow 服务器中目前缺少此功能,不过可以使用 Spark 作业实现类似的功能。 若要详细了解批处理终结点和 MLflow 模型,请参阅在批处理部署中使用 MLflow 模型

以下部分将重点介绍部署到 Azure 机器学习联机终结点的 MLflow 模型。

输入格式

输入类型 MLflow 内置服务器 Azure 机器学习联机终结点
拆分方向的 JSON 序列化 pandas 数据帧
记录方向的 JSON 序列化 pandas 数据帧 已放弃
CSV 序列化 pandas 数据帧 使用批处理1
格式为 JSON 序列化列表(张量)和列表字典(命名张量)的张量输入
张量输入的格式如“TF 服务的 API”所述

1 考虑使用批量推理来处理文件。 有关详细信息,请参阅将 MLflow 模型部署到批处理终结点

输入结构

无论使用的输入类型如何,Azure 机器学习都要求在 JSON 有效负载中的字典键 input_data 中提供输入。 由于使用 mlflow models serve 命令为模型提供服务时不需要此密钥,因此不能将 Azure 机器学习联机终结点和 MLflow 内置服务器使用的有效负载互换。

重要

MLflow 2.0 公告:请注意,MLflow 2.0 中有效负载的结构已更改。

本部分显示了不同的有效负载示例,以及 MLflow 内置服务器与 Azure 机器学习推理服务器中部署的模型的差异。

拆分方向中 JSON 序列化 pandas 数据帧的有效负载示例

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

张量输入的有效负载示例

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

命名张量输入的有效负载示例

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

有关 MLflow 内置部署工具的详细信息,请参阅 MLflow 文档中的内置部署工具

部署 MLflow 模型时自定义推理

你可能习惯于创作评分脚本,以对为自定义模型执行推理的方式进行自定义。 但是,将 MLflow 模型部署到 Azure 机器学习时,执行推理的方式由模型生成者(生成模型的人员)决定,而不是由 DevOps 工程师(尝试部署模型的人员)决定。 每个模型框架都可以自动应用特定的推理例程。

在任何时候,如果需要更改 MLflow 模型的推理执行方式,可以执行以下两项操作之一:

  • 更改在训练例程中记录模型的方式。
  • 在部署时使用评分脚本自定义推理。

更改训练期间记录模型的方式

使用 mlflow.autologmlflow.<flavor>.log_model 记录某个模型时,用于该模型的风格决定应执行推理的方式以及该模型返回的结果。 MLflow 不会在 predict() 函数如何生成结果方面强制实施任何特定行为。

但在某些情况下,你可能希望在执行模型前后进行一些预处理或后处理。 在其他情况下,你可能希望更改返回的内容(例如概率与类)。 一种解决方案是实现从输入直接移动到输出的机器学习管道。 例如,sklearn.pipeline.Pipelinepyspark.ml.Pipeline 是实现管道的常用方法,有时出于性能考虑而推荐使用。 另一种方法是使用自定义模型风格自定义模型执行推理的方式

使用评分脚本自定义推理

尽管 MLflow 模型不需要评分脚本,但在需要时也可以提供一个。 可以使用评分脚本来自定义如何为 MLflow 模型执行推理。 有关如何自定义推理的详细信息,请参阅自定义 MLflow 模型部署(联机终结点)自定义 MLflow 模型部署(批处理终结点)

重要

如果选择指定为 MLflow 模型部署指定评分脚本,还需要为部署提供一个环境。

部署工具

Azure 机器学习提供了多种将 MLflow 模型部署到联机终结点和批处理终结点的方法。 可以使用以下工具部署模型:

  • MLflow SDK
  • Azure 机器学习 CLI
  • 适用于 Python 的 Azure 机器学习 SDK
  • Azure 机器学习工作室

每个工作流都具有不同的功能,尤其是对于它们可用于的计算类型。 下表显示了不同的功能。

场景 MLflow SDK Azure 机器学习 CLI/SDK Azure 机器学习工作室
部署到托管联机终结点 查看示例1 查看示例1 查看示例1
部署到托管联机终结点(使用评分脚本) 不支持3 查看示例 查看示例
部署到批处理终结点 不支持3 查看示例 查看示例
部署到批处理终结点(使用评分脚本) 不支持3 查看示例 查看示例
部署到 Web 服务 (ACI/AKS) 旧版支持2 不支持2 不支持2
部署到 Web 服务(ACI/AKS - 使用评分脚本) 不支持3 旧版支持2 旧版支持2

1 部署到启用了专用链接的工作区中的联机终结点时,需要在部署之前打包模型(预览版)

2 建议改为切换到托管联机终结点

3 MLflow (OSS) 没有评分脚本的概念,并且目前不支持批量执行。

要使用哪个部署工具?

  • 如果以下两个条件均符合,可以使用 MLflow SDK

    • 你熟悉 MLflow,或者你使用的是本机支持 MLflow 的平台(例如 Azure Databricks)。
    • 你希望继续使用 MLflow 中的同一组方法。
  • 如果符合以下任一条件,可以使用 Azure 机器学习 CLI v2

    • 你更熟悉 Azure 机器学习 CLI v2
    • 你需要使用自动化管道自动执行部署。
    • 你需要在 Git 存储库中保留部署配置。
  • 如果要快速部署和测试使用 MLflow 训练的模型,请使用 Azure 机器学习工作室 UI 部署。