在成功安装 GPU Caffe 后,将 Caffe 作为仅 CPU 运行



我有一个 Docker 镜像,其中 Caffe 编译了 cudnn 支持。CUDA 和所有其他依赖项在映像中正确安装,并且在使用nvidia-docker从主机提供驱动程序时正常工作。

我想在不使用nvidia-docker的情况下运行相同的映像,只需将 Caffe 设置为 CPU 模式。但是,当我这样做时,我仍然看到找不到正确的 Nvidia 驱动程序的错误。就好像构建带有 cudnn 支持的 Caffe 会导致 Caffe需要GPU 驱动程序。这对我的用例来说是有问题的:提供一个可以互换用作基于 CPU 的映像或基于 GPU 的映像的单个 Docker 映像。

如何在启用 cudnn/GPU 支持的情况下安装 Caffe,但仍在不依赖任何 CUDA/GPU 依赖项的运行时的情况下运行它?

注意:这不是关于在 Caffe 构建期间使用CPU_ONLY标志禁用 GPU 支持的问题。相反,它是关于采用能够使用 GPU 的 Caffe,然后在仅 CPU运行时模式下以不需要任何驱动程序、CUDA 库等的方式运行它。

我在运行时看到的错误类型如下:

I0523 21:09:42.175459    14 layer_factory.hpp:77] Creating layer conv1
I0523 21:09:42.175561    14 net.cpp:84] Creating Layer conv1
I0523 21:09:42.175606    14 net.cpp:406] conv1 <- data
I0523 21:09:42.175660    14 net.cpp:380] conv1 -> conv1
F0523 21:09:42.177079    14 cudnn_conv_layer.cpp:52] Check failed: error == cudaSuccess (35 vs. 0)  CUDA driver version is insufficient for CUDA runtime version
*** Check failure stack trace: ***
Aborted (core dumped)

在这里,我只是在使用Caffe的Python绑定调用caffe.set_mode_cpu()后加载一个prototxt模型。

如果我在CPU_ONLY模式下编译,一切正常,或者如果我实际上在托管正确驱动程序的机器上运行 nvidia-docker。但我专门寻找一个 Docker 映像,该映像可以在具有和没有 GPU 或必要的驱动程序依赖项的主机之间移植。

经过更多的挖掘,这个参考表明它是导致问题的特定卷积层的LayerSetup函数。

特别是,在cudnn_conv_layer.cpp中,LayerSetup 实现调用CUDA_CHECK和CUDNN_CHECK,例如 CUDA 流处理。

看起来当 Caffe 在 cudnn 支持下编译时,如果您尝试在 CPU 模式下执行,这些检查将失败,即使在set_mode_cpu()之后也是如此。我不确定对CUDNN_CHECK宏的更改是否足够,或者是否需要编写一个全新的 Caffe 层,该层在确定要执行的资源检查之前检查运行时模式。这两种情况都不适用于我目前的情况,因此我将 CPU 和 GPU 功能拆分为两个单独的 Dockerfile。

我同意您应该能够通过简单地在solver.prototxt或类似设置中设置solver_mode来做出选择。 然而,这不是BVLC设计Caffe的方式;代码中还有其他各种链接,假设它可以利用 CUDA 代码的存在所暗示的 GPU。

解决方案是挖掘代码,找到对 CUDA 存在标志的引用,并在设置CPU标志时更改代码以动态使用"CPU_ONLY"分支。

最新更新