mlflow 如何保存一个包含自定义变压器的sklearn管道?

问题描述 投票:2回答:1

我试图用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)

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

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

我以为mlflow提供了一个简单的方法来保存模型并将它们序列化,这样它们就可以在任何地方使用,难道只有当你有本地sklearn模型(或keras,...)时才会这样吗?

这个问题似乎与pickle的功能有关(mlflow使用pickle,pickle需要安装所有的依赖关系)。

到目前为止,我找到的唯一的解决方案是把我的transformer做成一个包,导入到两个项目中。将我的变压器库的版本保存为 conda_env 的论点 log_model当我把模型加载到我的use_project中时,检查它是否是相同的版本,但如果我必须改变我的变压器或在其中调试,这很痛苦...

有人有更好的解决方案吗?更优雅的?也许有一些mlflow的功能是我遗漏的?

其他信息:工作在 linux (ubuntu) mlflow=1.5.0 python=3.7.3。

我在mlflow.sklearn api的测试中看到他们用自定义的变压器做了一个测试,但他们把它加载到同一个文件中,所以它似乎没有解决我的问题,但也许它可以帮助其他用户。

https:/github.commlflowmlflowblobmastertestssklearntest_sklearn_model_export.py。

python machine-learning scikit-learn pickle mlflow
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.