如果我已经将模型作为 pickle,为什么我需要在 docker 容器中使用 sklearn?
Why do I need sklearn in docker container if I already have the model as a pickle?
我腌制了一个模型,只想公开写在 Flask
中的 prediction
api。但是,当我编写一个 dockerfile 来制作其中没有 sklearn
的图像时,我得到一个错误 ModuleNotFoundError: No module named 'sklearn.xxxx'
,其中 xxx
指的是 sklearn 的 ML 算法 classes,在这一点上我正在使用像 classifier = pickle.load(f)
这样的 pickle 加载模型。
当我重写 dockerfile 来制作一个也有 sklearn
的图像时,即使在 API 我 never 导入 sklearn
.
我的酸洗概念非常简单,它会将 classifier class 及其所有数据序列化。所以当我们解开它时,因为 classifier class 已经有一个 predict
属性,我们可以直接调用它。为什么我需要在环境中有sklearn
?
泡菜只是模型内部数据的表示。您仍然需要代码才能使用它,这就是为什么您需要在容器中包含 sklearn
。
你对 pickle 的工作原理有误解。
它不会 序列化任何东西,实例状态除外(__dict__
默认情况下,或自定义实现)。取消腌制时,它只是尝试创建相应 class 的实例(这是您的导入错误)并设置腌制状态。
这是有原因的:你事先不知道load
之后会用到什么方法,所以你不能pickle实现。除此之外,在泡菜时间你不能构建一些 AST 来查看反序列化后需要什么 methods/modules ,主要原因是 python 的动态性质 - 你的实现实际上可以根据输入。
毕竟,即使假设理论上我们有智能的独立 pickle 序列化,它也将是单个文件中的实际模型 + sklearn,没有适当的方法来管理它。
我腌制了一个模型,只想公开写在 Flask
中的 prediction
api。但是,当我编写一个 dockerfile 来制作其中没有 sklearn
的图像时,我得到一个错误 ModuleNotFoundError: No module named 'sklearn.xxxx'
,其中 xxx
指的是 sklearn 的 ML 算法 classes,在这一点上我正在使用像 classifier = pickle.load(f)
这样的 pickle 加载模型。
当我重写 dockerfile 来制作一个也有 sklearn
的图像时,即使在 API 我 never 导入 sklearn
.
我的酸洗概念非常简单,它会将 classifier class 及其所有数据序列化。所以当我们解开它时,因为 classifier class 已经有一个 predict
属性,我们可以直接调用它。为什么我需要在环境中有sklearn
?
泡菜只是模型内部数据的表示。您仍然需要代码才能使用它,这就是为什么您需要在容器中包含 sklearn
。
你对 pickle 的工作原理有误解。
它不会 序列化任何东西,实例状态除外(__dict__
默认情况下,或自定义实现)。取消腌制时,它只是尝试创建相应 class 的实例(这是您的导入错误)并设置腌制状态。
这是有原因的:你事先不知道load
之后会用到什么方法,所以你不能pickle实现。除此之外,在泡菜时间你不能构建一些 AST 来查看反序列化后需要什么 methods/modules ,主要原因是 python 的动态性质 - 你的实现实际上可以根据输入。
毕竟,即使假设理论上我们有智能的独立 pickle 序列化,它也将是单个文件中的实际模型 + sklearn,没有适当的方法来管理它。