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

将自定义 ML 模型转换为 MLflow 格式化模型

本文介绍如何将自定义 ML 模型转换为 MLflow 格式。 MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 在某些情况下,你可能会使用没有内置 MLflow 模型风格支持的机器学习框架。 由于缺少内置的 MLflow 模型风格,你无法使用 MLflow 模型 Fluent API 记录或注册模型。 若要解决此问题,可以将模型转换为 MLflow 格式,这样就可以利用 Azure 机器学习和 MLflow 模型的以下优势。

借助 Azure 机器学习,MLflow 模型可获得以下优势:

  • 无代码部署
  • 采用开放源代码标准格式的可移植性
  • 能够部署在本地和云上

MLflow 支持各种机器学习框架(scikit-learn、Keras 和 Pytorch 等)。但是,它可能不会涵盖每个用例。 例如,你可能想要使用 MLflow 本机不支持的框架创建 MLflow 模型,或者想要在运行作业时更改模型进行预处理或后处理的方式。 若要详细了解 MLflow 模型,请阅读从项目到 MLflow 中的模型

如果未使用 MLFlow 训练模型,并且想要使用 Azure 机器学习的 MLflow 无代码部署产品/服务,则需要将自定义模型转换为 MLFLow。 详细了解自定义 Python 模型和 MLflow

先决条件

只需要安装的 mlflow 包即可将自定义模型转换为 MLflow 格式。

为模型创建 Python 包装器

必须先为模型创建 Python 包装器,然后才能将模型转换为 MLflow 支持的格式。 以下代码展示了如何为 sklearn 模型创建 Python 包装器。


# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc


PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
                                                  minor=version_info.minor,
                                                  micro=version_info.micro)

# Train and save an SKLearn model
sklearn_model_path = "model.pkl"

artifacts = {
    "sklearn_model": sklearn_model_path
}

# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):

    def load_context(self, context):
        import pickle
        self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
    
    def predict(self, model, data):
        return self.sklearn_model.predict(data)

创建 Conda 环境

接下来,需要为包含所有必要依赖项的新 MLflow 模型创建 Conda 环境。 如果未指定,则会从当前安装推断环境。 如果没有,也可以指定它。


import cloudpickle
conda_env = {
    'channels': ['defaults'],
    'dependencies': [
      'python={}'.format(PYTHON_VERSION),
      'pip',
      {
        'pip': [
          'mlflow',
          'scikit-learn=={}'.format(sklearn.__version__),
          'cloudpickle=={}'.format(cloudpickle.__version__),
        ],
      },
    ],
    'name': 'sklearn_env'
}

加载 MLFlow 格式化模型并测试预测

在环境准备就绪后,可以将 SKlearnWrapper、Conda 环境和新创建的项目字典传递给 mlflow.pyfunc.save_model() 方法。 这样做可以将模型保存到磁盘中。

mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)

为了确保新保存的 MLflow 格式化模型在保存期间未更改,可以加载模型并打印测试预测来比较原始模型。

以下代码从 mlflow 格式化模型打印测试预测,并且从保存到磁盘的 sklearn 模型打印测试预测,供你进行比较。

loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)

input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)

# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)

注册 MLflow 格式化模型

确认模型正确保存后,可以创建测试运行,以便将 MLflow 格式化模型注册并保存到模型注册表。


mlflow.start_run()

mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path, 
                        loader_module=None, 
                        data_path=None, 
                        code_path=None,
                        python_model=SKLearnWrapper(),
                        registered_model_name="Custom_mlflow_model", 
                        conda_env=conda_env,
                        artifacts=artifacts)
mlflow.end_run()

重要

在某些情况下,你可能会使用没有内置 MLflow 模型风格支持的机器学习框架。 例如,vaderSentiment 库是用于情绪分析的标准自然语言处理 (NLP) 库。 由于它缺少内置的 MLflow 模型风格,你无法使用 MLflow 模型 Fluent API 记录或注册模型。 请在如何保存、记录和注册没有受支持的内置 MLflow 模型风格的模型中查看相关示例。

后续步骤