1

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

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

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

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

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

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 绑定调用后加载一个 prototxt 模型。caffe.set_mode_cpu()

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

4

2 回答 2

1

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

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

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

于 2017-05-28T14:02:00.267 回答
0

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

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

于 2017-05-24T16:28:03.487 回答