【问题标题】:Exception has occurred: ModuleNotFoundError when unpickling objects (using dill or pickle or joblib)发生异常:Unpickling 对象时出现 ModuleNotFoundError(使用 dill 或 pickle 或 joblib)
【发布时间】:2019-03-22 21:38:34
【问题描述】:

我已经安装了一个 sklearn 管道,现在我需要部署它,我已经腌制了我的管道(也尝试了 joblib 和 dill)。当我在具有相同版本的 dill、pickle 和 python 的其他环境中 unpickle 时,出现此错误:

exception has occurred: ModuleNotFoundError
No module named '_regex'
  File "\opt\miniconda\lib\python3.6\site-packages\dill\_dill.py", line 832, in _import_module
  File "\opt\miniconda\lib\python3.6\site-packages\dill\_dill.py", line 305, in load
  File "C:\<edited>\score.py", line 40, in init
  File "C:\<edited>\score.py", line 90, in <module>
  File "\opt\miniconda\lib\python3.6\runpy.py", line 85, in _run_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 96, in _run_module_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 263, in run_path
  File "\opt\miniconda\lib\python3.6\runpy.py", line 85, in _run_code
  File "\opt\miniconda\lib\python3.6\runpy.py", line 193, in _run_module_as_main

我不清楚这是什么原因造成的。我可以在我的本地环境中取消文件,但不知何故不能在目标环境中。

import dill as pickle
pickle._dill._reverse_typemap['ClassType'] = type

with open(prep_transformer_path, 'rb') as file:
    prep_transformer = pickle.loads(file)

这基本上是在生活中导致错误的代码。有什么线索我可能会忽略吗?由于我在此之前解决了另一个问题,所以我确实添加了 typemap 的东西。

它正在腌制十几个自制的 Transformer 安装类。

酸洗代码如下:

import dill as pickle

# Dump the prep pkl file
with open(os.path.join(output_models_directory, 'prep.pkl'), 'wb') as file:
    pickle.dump(trainingPrepPipe, file, protocol=pickle.HIGHEST_PROTOCOL)

提前感谢您的帮助!

【问题讨论】:

    标签: python scikit-learn pickle joblib dill


    【解决方案1】:

    我在保存管道时遇到了类似的问题(使用 sklearn.joblib)。事实证明,joblib 不存储您的管道使用的任何代码。在我的情况下,通过确保在生产中,管道和/或分类器中使用的所有 python 模块都可用并且相对于管道创建模块位于相同的位置来解决问题。

    对我来说,这意味着复制并保存 my_transformers.py 以及管道和分类器作业库。然后在生产中使用/安装它们时,将 my_transformers.py 放置在与创建我的管道的模块相关的相同位置。

    【讨论】:

    • 最初,我没有包含我自己的自定义类,并且由于许多其他原因它失败了,所以我按照你的建议将它们全部包含在一个 transformer.py 中,它解决了很多问题的问题,但我仍然坚持这个问题。但是,我没有在我的训练代码中包含所有导入(那些没有被转换器引用的导入不存在。也许我在那里遗漏了一些东西,但例如import re 就在那里。 ..
    • 你的生产环境和你的训练环境一样吗?即具有所有相同的依赖项和相同版本的依赖项。那将是我要检查以解决此问题的下一个地方。
    • 我在两个环境中都运行了 pip freeze,这在重要的包(numpy、spacy 和其他)上有很多差异。我没有尝试修复它的所有软件包组合,但明显的最佳实践有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多