如果我已经将模型作为pickle,为什么我需要docker容器中的sklearn?

2024-06-16 09:57:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我pickle了一个模型,只想公开用Flask编写的predictionapi。但是,当我编写一个dockerfile来生成一个没有sklearn的图像时,我得到了一个错误ModuleNotFoundError: No module named 'sklearn.xxxx',其中xxx引用了sklearn的ML算法类,此时我使用pickle likeclassifier = pickle.load(f)加载模型。在

当我重写dockerfile以生成包含sklearn的图像时,即使在API中Ineverimportsklearn,我也不会得到错误。
我的pickling概念非常简单,它将用它的所有数据序列化分类器类。所以当我们取消拾取它时,因为分类器类已经有了一个predict属性,我们可以直接调用它。为什么环境中需要sklearn?在


Tags: no模型图像dockerfileflask分类器错误sklearn
2条回答

pickle只是模型中数据的表示。您仍然需要代码来使用它,这就是为什么您需要在容器中包含sklearn。在

你对pickle的工作原理有误解。在

除了实例状态(默认情况下是__dict__或自定义实现),它不会对任何内容进行seralize。当取消pickle时,它只尝试创建相应类的实例(这里是导入错误)并设置pickled状态。在

这是有原因的:您事先不知道在load之后将使用什么方法,所以您不能pickle实现。除此之外,在pickle时间内,您不能构建一些AST来查看反序列化后需要哪些方法/模块,这主要是因为python的动态特性——您的实现实际上可以根据输入而变化。在

毕竟,即使假设理论上我们有智能的自包含pickle序列化,它也将是实际的model+sklearn在单个文件中,没有适当的方法来管理它。在

相关问题 更多 >