gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:08:28 27 4
gpt4 key购买 nike

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

假设我有两个项目:

  • 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 提供了一种简单的方法来保存模型并将它们序列化,以便它们可以在任何地方使用,只有当您拥有 native sklearn 模型(或 keras,...)时才这样吗?

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

    到目前为止,我找到的唯一解决方案是将我的转换器制作成一个包,并将其导入到两个项目中。使用 log_model 的 conda_env 参数保存我的转换器库的版本,并在我将模型加载到我的 use_project 中时检查它是否是相同的版本。
    但是如果我必须改变我的变压器或调试它会很痛苦......

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

    其他信息:
    在 linux (ubuntu) 上工作
    毫升流=1.5.0
    python =3.7.3

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

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

    最佳答案

    您可以使用 code_path参数以保存 Python 文件依赖项(或包含文件依赖项的目录)。加载模型时,这些文件被添加到系统路径中。
    模型文件夹将包含一个目录 code其中包括所有这些文件。

    关于python - mlflow 如何使用自定义转换器保存 sklearn 管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60530176/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com