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

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

我想在使用nvidia-docker 情况下运行相同的映像,只需将Caffe设置为CPU模式即可。 但是,当我这样做,我仍然看到错误,正确的Nvidia驱动程序无法find。 就像用cudnn支持来构buildCaffe导致Caffe 需要 GPU驱动程序一样。 这对于我的用例来说是有问题的:提供一个单独的Docker镜像,它可以交替使用,既可以是基于CPU的镜像,也可以是基于GPU的镜像。

我如何在启用cudnn / GPU支持的情况下安装Caffe,但是仍然运行它,而不依赖于任何CUDA / GPU依赖关系?

注意:这不是在Caffe构build时使用CPU_ONLY标志禁止GPU支持的问题。 相反,它需要将Caffe构build成能够使用GPU,然后以一种不需要任何驱动程序,CUDA库等的方式,在仅CPU 运行模式下运行它

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

 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模式下编译,一切正常,或者如果我真的在托pipe正确驱动程序的机器上运行nvidia-docker。 但是我正在寻找一个单一的Docker镜像,这个镜像可以在主机之间移植,既可以不用GPU,也不需要驱动程序依赖。

我同意你应该可以通过设置solver_mode中的solver.prototxt或者类似的设置来做出select。 但是,这不是BVLCdeviseCaffe的方式; 代码中有各种其他的链接,假设它可以利用CUDA代码所呈现的GPU。

解决方法是挖掘代码,find对CUDA存在标志的引用,并在设置CPU标志时更改代码以dynamic使用“CPU_ONLY”分支。

经过更多的挖掘之后, 这个参考文献暗示它是造成问题的特定卷积层的LayerSetup函数。

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

看起来像Caffe编译时支持cudnn,如果尝试以CPU模式执行,即使在set_mode_cpu()之后,这些检查也会失败。 我不确定对CUDNN_CHECKmacros的更改是否足够,或者是否需要编写一个全新的Caffe层来检查运行时模式,然后再确定执行哪些资源检查。 这两种情况都不适合我目前的情况,所以我将CPU和GPUfunction拆分为两个独立的Docker文件。