我pickle了一个模型,只想公开用Flask
编写的prediction
api。但是,当我编写一个dockerfile来生成一个没有sklearn
的图像时,我得到了一个错误ModuleNotFoundError: No module named 'sklearn.xxxx'
,其中xxx
引用了sklearn的ML算法类,此时我使用pickle likeclassifier = pickle.load(f)
加载模型。在
当我重写dockerfile以生成包含sklearn
的图像时,即使在API中Ineverimportsklearn
,我也不会得到错误。
我的pickling概念非常简单,它将用它的所有数据序列化分类器类。所以当我们取消拾取它时,因为分类器类已经有了一个predict
属性,我们可以直接调用它。为什么环境中需要sklearn
?在
pickle只是模型中数据的表示。您仍然需要代码来使用它,这就是为什么您需要在容器中包含
sklearn
。在你对pickle的工作原理有误解。在
除了实例状态(默认情况下是
__dict__
或自定义实现),它不会对任何内容进行seralize。当取消pickle时,它只尝试创建相应类的实例(这里是导入错误)并设置pickled状态。在这是有原因的:您事先不知道在
load
之后将使用什么方法,所以您不能pickle实现。除此之外,在pickle时间内,您不能构建一些AST来查看反序列化后需要哪些方法/模块,这主要是因为python的动态特性——您的实现实际上可以根据输入而变化。在毕竟,即使假设理论上我们有智能的自包含pickle序列化,它也将是实际的model+sklearn在单个文件中,没有适当的方法来管理它。在
相关问题 更多 >
编程相关推荐