运行 Caffe as CPU-仅在成功安装 GPU Caffe 之后

Run Caffe as CPU-only after a successful GPU Caffe installation

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

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

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

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

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

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)

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

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

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

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

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

特别是在 cudnn_conv_layer.cpp, the LayerSetup implementation makes calls to CUDA_CHECK and CUDNN_CHECK 中,例如CUDA 流处理。

看起来当 Caffe 编译时支持 cudnn,如果您尝试在 CPU 模式下执行,这些检查将失败,即使在 set_mode_cpu() 之后也是如此。我不确定对 CUDNN_CHECK 宏的更改是否足够,或者它是否需要 writing a totally new Caffe layer 在确定要执行哪些资源检查之前检查运行时模式。这两种情况都不适合我目前的情况,所以我将把 CPU 和 GPU 功能分成两个单独的 Dockerfile。