mlflow 如何使用自定义转换器保存 sklearn 管道?

2024-05-12

我正在尝试使用 mlflow 保存 sklearn 机器学习模型,这是一个包含我定义的自定义转换器的管道,并将其加载到另一个项目中。 我的自定义转换器继承自 BaseEstimator 和 TransformerMixin。

假设我有 2 个项目:

  • train_project:它在 src.ml.transformers.py 中有自定义变压器
  • use_project:src中有其他东西,或者根本没有src目录

所以在我的 train_project 中我这样做:

mlflow.sklearn.log_model(preprocess_pipe, 'model/preprocess_pipe')

然后当我尝试将其加载到 use_project 时:

preprocess_pipe = mlflow.sklearn.load_model(f'{ref_model_path}/preprocess_pipe')

出现错误:

[...]
File "/home/quentin/anaconda3/envs/api_env/lib/python3.7/site-packages/mlflow/sklearn.py", line 210, in _load_model_from_local_file
    return pickle.load(f)
ModuleNotFoundError: No module named 'train_project'

我尝试使用格式 mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE :

mlflow.sklearn.log_model(preprocess_pipe, 'model/preprocess_pipe', serialization_format=mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE)

但我在加载过程中遇到同样的错误。

我看到了选项代码路径 into mlflow.pyfunc.log_model但我不清楚它的用途和目的。

我认为 mlflow 提供了一种简单的方法来保存模型并序列化它们,以便它们可以在任何地方使用,只有当你有原生 sklearn 模型(或 keras,...)时,这是真的吗?

看来这个问题与pickle功能更相关(mlflow使用它并且pickle需要安装所有依赖项)。

到目前为止,我找到的唯一解决方案是将我的转换器制作为一个包,将其导入两个项目中。保存我的变压器库的版本康达环境的论证日志模型,并在将模型加载到我的 use_project 时检查它是否是相同的版本。 但如果我必须更改变压器或在其中进行调试,那就很痛苦了......

有人有更好的解决方案吗? 更优雅?也许我会错过一些 mlflow 功能?

其他信息:
在 Linux (ubuntu) 上工作
毫升流量=1.5.0
蟒蛇=3.7.3

我在 mlflow.sklearn api 的测试中看到他们使用自定义变压器进行了测试,但他们将其加载到同一个文件中,因此它似乎无法解决我的问题,但也许它可以帮助其他人:

https://github.com/mlflow/mlflow/blob/master/tests/sklearn/test_sklearn_model_export.py https://github.com/mlflow/mlflow/blob/master/tests/sklearn/test_sklearn_model_export.py


您想要做的是序列化您在外部模块中训练过的“定制”内容train.py, 正确的?

您可能需要做的是记录您的模型mlflow.pyfunc.log_modelcode参数,它接受一个字符串列表,其中包含您需要反序列化和进行预测的模块的路径,如文档所示here https://www.mlflow.org/docs/latest/python_api/mlflow.pyfunc.html#mlmodel-configuration.

需要明确的是,每个 mlflow 模型本质上都是 PyFunc。即使您使用以下命令记录模型mlflow.sklearn,你可以加载它mlflow.pyfunc.load_model。 PyFunc 的作用是以独特的方式标准化所有模型和框架,这将保证您始终声明如何:

  1. 反序列化你的模型,用load_context() method
  2. 做出你的预测,与predict() method

如果您确保继承 mlflow 的 PythonModel 类的对象中的这两件事,则可以将模型记录为 PyFunc。

What mlflow.sklearn.log_model所做的基本上总结了声明序列化和反序列化的方式。如果您坚持使用 sklearn 的基本模块,例如基本变压器和管道,您将永远可以使用它。但是当您需要自定义的东西时,您可以参考 Pyfuncs。

你可以找到一个非常有用的例子here https://www.mlflow.org/docs/latest/models.html#example-saving-an-xgboost-model-in-mlflow-format。请注意,它准确地说明了如何进行预测,将输入转换为 XGBoost 的 DMatrix。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mlflow 如何使用自定义转换器保存 sklearn 管道? 的相关文章

随机推荐