【问题标题】:Run Caffe as CPU-only after a successful GPU Caffe installation成功安装 GPU Caffe 后将 Caffe 作为 CPU-only 运行
【发布时间】:2017-10-25 00:41:32
【问题描述】:

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

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

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

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

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

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 或必要的驱动程序依赖项的主机之间移植。

【问题讨论】:

  • 看起来您正在使用的网络明确定义了一个应该使用 cuda udnn_conv_layer.cp 运行的层,F0523 21:09:42.177079 14 cudnn_conv_layer.cpp:52] 检查失败:错误 == cudaSuccess ( 35 vs. 0) 这是我能找到的与您的问题最接近的讨论..它建议将引擎切换到 caffe ..如果您可以在此处发布您的 prototxt 文件会更有帮助...groups.google.com/forum/#!msg/caffe-users/Hc6c4KVaXkQ/…
  • 网络没有定义任何依赖于 GPU 或 CUDA 的属性。如果我使用 CPU_ONLY 标志,则使用完全相同的训练网络,一切都会按预期工作。请注意,尽管有caffe.set_mode_cpu(),但Caffe 选择使用cudnn_conv_layer - 在CPU_ONLY 模式下在网络上进行前向传递时不会发生这种情况。
  • 不幸的是,我无法共享 prototxt 文件,因为它是用于与工作相关的项目,但使用任何不依赖 GPU 求解器等的预训练模型很容易重现. 只需在安装了 cudnn 支持的 Caffe 的 GPU 主机中运行它,但尝试普通的 dockerset_mode_cpu
  • 好吧..不确定...但我认为这可能是类似的问题github.com/happynear/caffe-windows/issues/37
  • @Eliethesaiyan 很有帮助——如果在最近的 Caffe 版本中没有改变,这表明 USE_CUDNNCPU_ONLY 的使用是互斥的,这很疯狂,但我猜很高兴知道 Caffe 固有的限制。

标签: docker caffe nvidia nvidia-docker


【解决方案1】:

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

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

【讨论】:

  • 我不清楚这一点。即使在安装了 CUDA 的环境中,如果不允许这样做,set_mode_cpu() 会做什么?换句话说,set_mode_cpu 是如何将所有东西都路由到 CPU 上的,但仍然对 CUDA 有一定的依赖?
  • 去年秋天我在代码中陷入困境,但恐怕我不记得那个绊脚石在哪里了。
  • answer I provided 是否与您之前在 Caffe 代码中的经验一致?
  • 是的,确实如此。我禁用了检查宏,因为该编译永远不会使用 GPU。
  • 那么,唯一的选择是在没有 GPU 支持的情况下重新构建 caffe?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多