关于 MLflow 模型部署的指南
本文介绍如何将 MLflow 模型部署到 Azure 机器学习以进行实时和批处理推理。 本文还将介绍可用于管理部署的不同工具。
部署 MLflow 模型与自定义模型
与 Azure 机器学习中的自定义模型部署不同,将 MLflow 模型部署到 Azure 机器学习时,无需提供评分脚本或部署环境。 相反,Azure 机器学习会自动生成评分脚本和环境。 此功能称为“无代码部署”。
对于无代码部署,Azure 机器学习:
- 确保满足 MLflow 模型中指示的所有包依赖项。
- 提供 MLflow 基础映像或策展环境,其中包含以下各项:
- Azure 机器学习执行推理所需的包,包括
mlflow-skinny
。 - 用于执行推理的评分脚本。
- Azure 机器学习执行推理所需的包,包括
提示
没有公用网络访问权限的工作区:必须打包模型(预览版),然后才能在没有传出连接的情况下将 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.autolog
或 mlflow.<flavor>.log_model
记录某个模型时,用于该模型的风格决定应执行推理的方式以及该模型返回的结果。 MLflow 不会在 predict()
函数如何生成结果方面强制实施任何特定行为。
但在某些情况下,你可能希望在执行模型前后进行一些预处理或后处理。 在其他情况下,你可能希望更改返回的内容(例如概率与类)。 一种解决方案是实现从输入直接移动到输出的机器学习管道。 例如,sklearn.pipeline.Pipeline
或 pyspark.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 部署。