本文介绍如何将自定义 ML 模型转换为 MLflow 格式。 MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 在某些情况下,你可能会使用没有内置 MLflow 模型风格支持的机器学习框架。 由于缺少内置的 MLflow 模型风格,你无法使用 MLflow 模型 Fluent API 记录或注册模型。 若要解决此问题,可以将模型转换为 MLflow 格式,这样就可以利用 Azure 机器学习和 MLflow 模型的以下优势。
借助 Azure 机器学习,MLflow 模型可获得以下附加优势:
- 无代码部署
- 采用开放源代码标准格式的可移植性
- 能够部署在本地和云上
MLflow 支持各种机器学习框架,例如 scikit-learn、Keras 和 Pytorch。 MLflow 可能不会涵盖每个用例。 例如,你可能想要创建带有 MLflow 无法原生支持的框架的 MLflow 模型。 在运行作业时,可能需要更改模型执行预处理或后处理的方式。 若要详细了解 MLflow 模型,请参阅 MLflow 中从工件到模型。
如果未使用 MLFlow 训练模型,并且想要使用 Azure 机器学习的 MLflow 无代码部署产品/服务,则需要将自定义模型转换为 MLFLow。 有关详细信息,请参阅自定义 Python 模型。
先决条件
- 安装
mlflow
包
为模型创建 Python 包装器
将模型转换为 MLflow 支持的格式之前,需要为模型创建 Python 包装器。 以下代码展示了如何为 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 模型风格的模型的示例,请参阅注册不受支持的机器学习模型。