python - 如果我已经将模型作为 pickle,为什么还需要在 docker 容器中使用 sklearn?

标签 python python-3.x docker scikit-learn pickle

我 pickle 了一个模型,只想公开用 Flask 编写的 prediction api。然而,当我编写一个 dockerfile 来制作一个没有 sklearn 的图像时,我得到一个错误 ModuleNotFoundError: No module named 'sklearn.xxxx' where xxx 指的是 sklearn 的 ML 算法类,在我使用像 classifier = pickle.load(f) 这样的 pickle 加载模型的时候。

当我重写 dockerfile 来制作一个也有 sklearn 的图像时,即使在 API 中我从不导入,我也没有得到错误sklearn.
我的 pickling 概念非常简单,它将用所有数据序列化分类器类。所以当我们解开它时,由于分类器类已经有一个 predict 属性,我们可以直接调用它。为什么我需要在环境中安装 sklearn

最佳答案

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

不会序列化任何东西,除了实例状态(__dict__ 默认情况下,或自定义实现)。 unpickling 时,它只是尝试创建相应类的实例(这里是你的导入错误)并设置 pickled 状态。

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

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

关于python - 如果我已经将模型作为 pickle,为什么还需要在 docker 容器中使用 sklearn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52929649/

相关文章:

python - 我可以传递包含 '#' 的 Python 命令行参数吗? (不逃?)

python - 使用 Google Cloud Storage python 客户端批量请求

python - 使用分类数据创建维恩图 - matplotlib_venn

python - pycurl 取消传输并尝试 & except

python - 单元测试中的 django-money 表单字段

python - 如何修复 Django 迁移的顺序?

python - PyQt5在两个类之间传递参数: lambda vs partial

python - 为子进程提供 CPU 时间和内存

docker - 多个 docker 在同一主机上运行 pptp 客户端

postgresql - docker springboot 仅通过 docker-compose 连接到 postgres 5432