你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍 MLflow 工件和 MLflow 模型,以及 MLflow 模型相比其他工件有何不同。 本文还介绍了 Azure 机器学习如何使用 MLflow 模型的特征来实现简化的部署工作流。
工件和模型
在 MLflow 中,记录简单文件工件与记录 MLflow 模型之间存在根本差异。
项目
工件是从试验的运行或作业中生成和捕获的任何文件。 工件可以是序列化为 pickle 文件的模型、PyTorch 或 TensorFlow 模型的权重,或包含线性回归系数的文本文件。 某些工件与模型本身无关,但包含运行配置、预处理信息或示例数据。 工件可以采用多种格式。
以下示例记录了文件工件。
filename = 'model.pkl'
with open(filename, 'wb') as f:
pickle.dump(model, f)
mlflow.log_artifact(filename)
模型
MLflow 模型是一个工件,你可对其作出更强的假设,以在所保存的文件与其含义之间提供明确的约定。 如果仅将模型文件简单地记录为工件,则需要了解每个文件的作用以及如何加载它们用于推理。
可以使用 MLflow SDK 记录 MLflow 模型,例如:
import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")
在 Azure 机器学习中记录 MLflow 模型具有以下好处:
- 可以将 MLflow 模型部署到实时或批处理终结点,而无需提供评分脚本或环境。
- 部署 MLflow 模型时,部署会自动生成一个 swagger 文件,以便你可以使用 Azure 机器学习工作室中的“测试”功能。
- 可以直接将 MLflow 模型用作管道输入。
- 可以将负责任 AI 仪表板与 MLflow 模型结合使用。
MLModel 格式
对于记录为简单工件文件的模型,在加载模型以进行推理之前,需要知道模型生成器对于每个文件的预期。 但对于 MLflow 模型,可通过使用 MLmodel 格式加载模型,以指定工件之间的协定及其表示的内容。
MLmodel 格式会将资产存储在没有特定命名要求的文件夹中。 资产中存在一个名为 MLmodel 的文件,它是有关如何加载和使用模型的单一事实来源。
下图显示了 Azure 机器学习工作室中名为 credit_defaults_model 的 MLflow 模型文件夹。 该文件夹包含 MLmodel 文件和其他模型工件。
以下示例显示了一个使用 fastai 训练的计算机视觉模型的 MLmodel:
artifact_path: classifier
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
模型风格
考虑到可用的机器学习框架数量众多,MLflow 引入了风格的概念,作为向所有机器学习框架提供唯一协定的方式。 风格指示使用特定框架创建的给定模型的预期情况。 例如,TensorFlow 拥有自己的风格,该风格指定了保留和加载 TensorFlow 模型的方式。
由于每个模型风格都指示如何持久保存和加载给定框架的模型,因此 MLmodel 格式不会强制实施所有模型必须支持的单个序列化机制。 因此,每种风格都可以根据其最佳做法使用可提供最佳性能或最佳支持的方法,而不会影响与 MLmodel 标准的兼容性。
以下示例显示了 fastai 模型的 flavors 节。
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
模型签名
MLflow 模型签名 是模型规范的重要组成部分,因为它充当模型与运行模型的服务器之间的数据协定。 模型签名对于在部署时分析和强制实施模型的输入类型也很重要。 如果签名可用,则 MLflow 会在将数据提交到模型时强制执行输入类型。 有关详细信息,请参阅 MLflow 签名强制实施。
你在记录模型时指明签名后,MLflow 会将其保存在 MLmodel 文件的 signature 部分中。 MLflow 中的“自动记录”功能会自动尽最大努力推断签名。 但如果推断的签名不是所需的签名,则可以手动记录模型。 有关详细信息,请参阅如何使用签名记录模型。
有两种类型的签名:
-
基于列的签名在表格数据上运行。 对于具有此签名的模型,MLflow 提供
pandas.DataFrame对象作为输入。 -
基于张量的签名可处理 n 维数组或张量。 对于使用此签名的模型,MLflow 提供
numpy.ndarray作为输入,或为命名张量提供numpy.ndarray的字典。
以下示例显示了使用 fastai 训练的计算机视觉模型的 signature 部分。 此模型会接收一批表示为形状 (300, 300, 3) 的张量的图像,其 RGB 表示形式为无符号整数。 该模型会将预测批输出为两个类的概率。
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
提示
Azure 机器学习会为具有可用签名的 MLflow 模型部署生成一个 swagger 文件。 通过此文件,可以使用 Azure 机器学习工作室更轻松地测试部署。
模型环境
指定模型在 conda.yaml 文件中运行的要求。 MLflow 可以自动检测依赖项,你也可以通过调用 mlflow.<flavor>.log_model() 方法来手动指示依赖项。 如果 MLflow 在环境中包含的库不是想要使用的库,则调用该方法可能会非常有用。
以下 conda.yaml 示例显示了使用 fastai 框架创建的模型的环境:
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- astunparse==1.6.3
- cffi==1.15.0
- configparser==3.7.4
- defusedxml==0.7.1
- fastai==2.4.1
- google-api-core==2.7.1
- ipython==8.2.0
- psutil==5.9.0
name: mlflow-env
注意
MLflow 环境在模型级别运行,而 Azure Machine Learning 的环境在已注册环境的工作区级别或匿名环境的作业和部署级别运行。 部署 MLflow 模型时,Azure 机器学习会生成模型环境并将其用于部署。 可以使用 Azure 机器学习 CLI 来替代此行为,并将 MLflow 模型部署到特定 Azure 机器学习环境。
Predict 函数
所有 MLflow 模型都包含一个 predict 函数。 在使用无代码部署方法部署模型时,将调用predict函数。 函数 predict 返回的内容(如类、概率或预测)取决于用于训练的框架或风格。 每种风格的文档都描述了其返回的内容。
可以自定义 predict 函数,以更改推理的执行方式。 可以记录具有不同行为的模型,也可以记录自定义模型风格。
用于加载 MLflow 模型的工作流
可以从以下位置加载 MLflow 模型:
- 直接从记录模型的运行中提取
- 从保存模型的文件系统中
- 从注册模型的模型注册表中
MLflow 提供了一种加载这些模型的一致方法,而无需考虑位置。
可将两个工作流用于加载模型:
重写加载所记录的相同对象和类型。 可以使用 MLflow SDK 加载模型,并获取属于训练库的类型的模型的实例。 例如,Open Neural Network Exchange (ONNX) 模型会返回一个
ModelProto对象,而使用scikit-learn训练的决策树模型会返回一个DecisionTreeClassifier对象。 使用mlflow.<flavor>.load_model()加载回您记录的相同模型对象和类型。重新加载用于运行推理的模型。 可以使用 MLflow SDK 加载模型,并获取一个保证具有
predict函数的封装器。 使用哪种风格并不重要,因为每个 MLflow 模型都有一个predict函数。MLflow 保证你可以使用类型为
pandas.DataFrame、numpy.ndarray或dict[string, numpyndarray]的参数调用此函数,具体取决于模型签名。 MLflow 会将类型转换为模型预期的输入类型。 使用mlflow.pyfunc.load_model()加载回模型以运行推理。