关于 MLflow 模型部署的指南
在本文中,你将了解如何将 MLflow 模型部署到 Azure 机器学习以进行实时和批量推理,以及可用于管理部署的不同工具。
无代码部署
将 MLflow 模型部署到 Azure 机器学习时,与自定义模型部署不同,你无需提供评分脚本或环境。 Azure 机器学习会自动为你生成评分脚本和环境。 此功能称为“无代码部署”。
对于无代码部署,Azure 机器学习:
- 确保满足 MLflow 模型中指示的所有包依赖项。
- 提供 MLflow 基础映像或策展环境,其中包含以下各项:
- Azure 机器学习执行推理所需的包,包括
mlflow-skinny
。 - 用于执行推理的评分脚本。
- Azure 机器学习执行推理所需的包,包括
提示
没有公用网络访问权限的工作区:必须打包模型(预览版),然后才能在没有传出连接的情况下将 MLflow 模型部署到联机终结点。 通过使用模型打包,不必进行 Internet 连接;如果使用其他方式,Azure 机器学习则需要进行 Internet 连接才能为 MLflow 模型动态安装必要的 Python 包。
包和依赖项
Azure 机器学习自动生成环境来运行 MLflow 模型推理。 为生成环境,Azure 机器学习会读取 MLflow 模型中指定的 conda 依赖项,并添加运行推理服务器所需的包。 这些额外的包因部署类型而异。
以下示例 conda.yaml 文件显示了 MLflow 模型中指定的 conda 依赖项示例。
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 依赖项中固定包版本。 这种自动包检测可能不会体现你的意图或要求。 也可以使用自定义签名、环境或示例记录模型。
具有签名的模型
MLflow 模型可以包含一个签名,用于指示预期的输入及其类型。 将此类模型部署到联机终结点或批处理终结点时,Azure 机器学习会确保数据输入的数量和类型符合签名。 如果无法按预期分析输入数据,则模型调用将失败。
可以通过打开 MLmodel 文件来检查 MLflow 模型签名。 有关签名如何在 MLflow 中发挥作用的详细信息,请参阅 MLflow 中的签名。
以下示例 MLmodel 文件突出显示了 signature
。
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 模型中的签名,因为它们提供了一种检测数据兼容性问题的便捷方法。 有关如何使用签名记录模型的详细信息,请参阅使用自定义签名、环境或示例记录模型。
MLflow 内置服务器中的部署与 Azure 机器学习推理服务器中的部署
模型开发人员可以使用 MLflow 内置部署工具在本地测试模型。 例如,可以使用 mlflow models serve
或 MLflow CLI mlflow models predict
运行在 MLflow 服务器注册表中注册的模型本地实例。 有关 MLflow 内置部署工具的详细信息,请参阅 MLflow 文档中的内置部署工具。
Azure 机器学习还支持将模型部署到联机终结点和批处理终结点。 这些终结点运行不同的推理技术,可以具有不同的功能。
Azure 机器学习联机终结点类似于 MLflow 内置服务器,提供了一种可缩放、同步且轻型的方式来运行模型以进行推理。
Azure 机器学习批处理终结点可以通过长期运行的推理过程运行异步推理,这些推理过程可以扩展到大量数据。 MLflow 服务器缺少此功能,尽管可以使用 Spark 作业实现类似的功能。 若要详细了解批处理终结点和 MLflow 模型,请参阅在批处理部署中使用 MLflow 模型。
输入格式
下表显示了 MLflow 内置服务器与 Azure 机器学习联机终结点支持的输入类型之间的对比。
输入类型 | MLflow 内置服务器 | Azure 机器学习联机终结点 |
---|---|---|
拆分方向的 JSON 序列化 pandas 数据帧 | ✓ | ✓ |
记录方向的 JSON 序列化 pandas 数据帧 | 已放弃 | |
CSV 序列化 pandas 数据帧 | ✓ | 使用批处理推理。 有关详细信息,请参阅将 MLflow 模型部署到批处理终结点。 |
JSON 序列化列表形式的 TensorFlow 输入(张量)和列表字典(命名张量) | ✓ | ✓ |
使用 TensorFlow 服务 API 的 TensorFlow 输入 | ✓ |
以下部分重点介绍部署到 Azure 机器学习联机终结点的 MLflow 模型。
输入结构
无论使用的输入类型如何,Azure 机器学习都要求在字典键 input_data
的 JSON 有效负载中提供输入。 由于使用 mlflow models serve
命令为模型提供服务时不需要此密钥,因此不能将 Azure 机器学习联机终结点和 MLflow 内置服务器使用的有效负载互换。
重要
有效负载结构在 MLflow 2.0 中已更改。
以下有效负载示例显示了在 MLflow 内置服务器中与 Azure 机器学习推理服务器中部署的模型之间的差异。
拆分方向的 JSON 序列化 pandas DataFrame
{
"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.autolog
或 mlflow.<flavor>.log_model
记录模型时,用于模型的风格决定了如何执行推理以及要返回的结果。 MLflow 不会在 predict()
函数如何生成结果方面强制实施任何特定行为。
在某些情况下,你可能希望在模型执行前后进行一些预处理或后期处理。 或者,你可能想要更改返回的内容;例如,概率而不是类。 一种解决方案是实现从输入直接移动到输出的机器学习管道。
例如,sklearn.pipeline.Pipeline
或 pyspark.ml.Pipeline
是实现管道的常用方法,有时会出于性能考虑而推荐使用。 还可以通过记录自定义模型来自定义模型如何执行推理。
使用评分脚本自定义推理
尽管 MLflow 模型不需要使用评分脚本,但仍可以提供一个脚本来自定义 MLflow 模型的推理执行(如果需要)。 有关如何自定义推理的详细信息,请参阅自定义联机终结点的 MLflow 模型部署,或使用评分脚本自定义批处理终结点的模型部署。
重要
如果选择指定为 MLflow 模型部署指定评分脚本,还需要为部署提供一个环境。
部署工具
Azure 机器学习提供了以下将 MLflow 模型部署到联机和批处理终结点的工具:
每个工具都有不同的功能,尤其是对于它可以面向的计算类型。 下表显示了对不同 MLflow 部署方案的支持。
场景 | MLflow SDK | Azure 机器学习 CLI/SDK 或工作室 |
---|---|---|
部署到托管联机终结点1 | 。 请参阅逐步将 MLflow 模型推出到联机终结点 | 。 请参阅将 MLflow 模型部署到联机终结点 |
使用评分脚本部署到托管联机终结点 | 不支持3 | 。 请参阅自定义 MLflow 模型部署 |
部署到批处理终结点 | 不支持3 | 。 请参阅在批处理部署中使用 MLflow 模型 |
使用评分脚本部署到批处理终结点 | 不支持3 | 。 请参阅使用评分脚本自定义模型部署 |
部署到 Web 服务,例如 Azure 容器实例或 Azure Kubernetes 服务 (AKS) | 旧版支持2 | 不支持2 |
使用评分脚本部署到 Web 服务,如容器实例或 AKS | 不支持3 | 旧版支持2 |
1 部署到启用了专用链接的工作区中的联机终结点时,需要在部署之前打包模型(预览版)。
2 如果可能,请切换到托管联机终结点。
3 开放源代码 MLflow 没有评分脚本的概念,并且目前不支持批量执行。
选择部署工具
请在以下情况下使用 MLflow SDK:
- 你熟悉 MLflow,想要继续使用相同的方法,并且
- 你使用的是原生支持 MLflow 的 Azure Databricks 等平台。
在以下情况下,请使用适用于 Python 的 Azure 机器学习 CLI v2 或 SDK:
- 你熟悉它们,或
- 想要使用管道自动部署,或
- 想要在 Git 存储库中保留部署配置。
如果要快速部署和测试使用 MLflow 训练的模型,请使用 Azure 机器学习工作室 UI 部署。