GPU 上的 tensorflow:没有已知设备,尽管 cuda 的 deviceQuery 返回“PASS”结果

Posted

技术标签:

【中文标题】GPU 上的 tensorflow:没有已知设备,尽管 cuda 的 deviceQuery 返回“PASS”结果【英文标题】:tensorflow on GPU: no known devices, despite cuda's deviceQuery returning a "PASS" result 【发布时间】:2017-07-08 16:20:23 【问题描述】:

注意:这个问题最初是asked on github,但它被要求在这里代替

我在 gpu 上运行 tensorflow 时遇到问题,这似乎不是 cuda 的常见配置问题,因为一切似乎都表明 cuda 已正确设置。

主要症状:运行tensorflow时,我的gpu没有被检测到(the code being run和its output)。

与常见问题不同的是,cuda 似乎已正确安装并且从 cuda 示例运行 ./deviceQuery 是成功的 (output)。

我有两张图形卡:

一个旧的 GTX 650 用于我的显示器(我不想在 tensorflow 中使用那个) 我想专用于 tensorflow 的 GTX 1060

我用:

tensorflow-1.0.0 cuda-8.0 (ls -l /usr/local/cuda/lib64/libcud*) cudnn-5.1.10 python-2.7.12 nvidia-drivers-375.26(由 cuda 安装并替换了我的发行版驱动程序包)

我试过了:

/usr/local/cuda/bin/ 添加到$PATH 使用 with tf.device('/gpu:1'): 强制在 tensorflow 脚本中放置 gpu(以及当它失败时使用 with tf.device('/gpu:0'):,这是很好的衡量标准) 将我想与 CUDA_VISIBLE_DEVICES 一起使用的 gpu 列入白名单,以防我的旧卡的存在确实导致问题 使用 sudo 运行脚本(因为为什么不这样做)

这里是nvidia-smi 和nvidia-debugdump -l 的输出,以防有用。

在这一点上,我觉得我已经遵循了所有的面包屑,不知道我还能尝试什么。我什至不确定我是在考虑错误还是配置问题。任何有关如何调试的建议将不胜感激。谢谢!

更新:在 github 上 Yaroslav 的帮助下,我通过提高日志级别收集了更多的调试信息,但似乎并没有说明设备选择:https://gist.github.com/oelmekki/760a37ca50bf58d4f03f46d104b798bb

更新 2:使用 theano 可以正确检测 gpu,但有趣的是它抱怨 cuDNN 太新,然后回退到 cpu (code ran, output)。也许这也可能是 tensorflow 的问题?

【问题讨论】:

作为另一个健全性检查,您可以尝试使用 GPU 的另一个框架(如 Theano)以查看它是否有效,也许您的 GPU 设置因某种原因被 deviceQuery 检测不到而损坏 好主意,谢谢。我会尝试并在问题正文中报告。 输出非常小,这是我使用 VLOG=1 运行时看到的结果 -- pastebin.com/LQF0j3Ri 是的,我已经将它截断到设备选择之外,因为其余的可能无关紧要。这是完整的日志:gist.github.com/oelmekki/25ea3b1186c2ee7aaa23448547bc23b2 【参考方案1】:

从日志输出看来,您运行的是 TensorFlow 的 CPU 版本(PyPI:tensorflow),而不是 GPU 版本(PyPI:tensorflow-gpu)。运行 GPU 版本会记录有关 CUDA 库的信息,或者如果无法加载它们或打开驱动程序会出错。

如果您运行以下命令,您应该能够在后续运行中使用 GPU:

$ pip uninstall tensorflow
$ pip install tensorflow-gpu

【讨论】:

哦,确实。我在安装 tensorflow 时关注了这个文档 [1],但我不知道它需要其他包。谢谢! -- [1] tensorflow.org/tutorials/using_gpu 每当我安装 tensorflow-gpu 时,它都会重新安装 tensorflow。这应该发生吗?我无法让它检测到我的设备.. 我有同样的问题,我按照你的步骤,“卸载 tensorlow”和“安装 tensorflow-gpu”我得到了这个错误:AttributeError: 'module' object has no attribute 'Session'跨度> 哈利路亚,我一直在努力让我的笔记本电脑 GeForce 940MX 正常工作并且上面的卸载工作正常。从来没有想过要尝试。 这个答案很可能在 2021 年被弃用......还有其他解决方案吗?【参考方案2】:

这里没有其他答案对我有用。经过一番修改后,我发现这解决了我在处理从二进制构建的 Tensorflow 时遇到的问题:


第 0 步:卸载 protobuf

pip uninstall protobuf

第 1 步:卸载 tensorflow

pip uninstall tensorflow
pip uninstall tensorflow-gpu

第 2 步:强制重新安装支持 GPU 的 Tensorflow

pip install --upgrade --force-reinstall tensorflow-gpu

第 3 步:如果尚未设置,请设置 CUDA_VISIBLE_DEVICES

所以对于拥有 2 个 GPU 的我来说

export CUDA_VISIBLE_DEVICES=0,1

【讨论】:

你拯救了我的一天! 很高兴听到它:)【参考方案3】:

就我而言:

pip3 uninstall tensorflow

还不够。因为重新安装时:

pip3 install tensorflow-gpu

它仍然是用 cpu 而不是 gpu 重新安装 tensorflow。 所以,在安装 tensorflow-gpu 之前,我尝试在 site-packages 卸载 protobuf 中删除所有相关的 tensor 文件夹,并且成功了!

结论:

pip3 uninstall tensorflow

删除 ~\Python35\Lib\site-packages 中的所有张量文件夹

pip3 uninstall protobuf
pip3 install tensorflow-gpu

【讨论】:

错字建议:我建议您在帖子中到处使用pip3。就我而言,我从 dist-packages 中删除了 tensorboard 和 tensorflow-1.3.0.dist-info 并解决了这个问题。【参考方案4】:

可能看起来很愚蠢,但 sudo reboot 为我和其他几个人解决了完全相同的问题。

【讨论】:

我也只需要重启。 ^^ 拯救了我的一天^_^【参考方案5】:

Mark Sonn 给出了拯救我一天的答案。只需将此添加到.bashrcsource ~/.bashrc 如果你在 Linux 上:

export CUDA_VISIBLE_DEVICES=0,1

以前我必须使用这个解决方法来让 tensorflow 识别我的 GPU:

import tensorflow as tf

gpus = tf.config.experimental.list_physical_devices(device_type="GPU")
tf.config.experimental.set_visible_devices(devices=gpus[0], device_type="GPU")
tf.config.experimental.set_memory_growth(device=gpus[0], enable=True)

即使代码仍然有效,但每次都添加这些行显然不是我想要的。 我的tensorflow 版本是根据the documentation 从源代码构建的,以获得v2.3 支持CUDA 10.2 和cudnn 7.6.5。

如果有人对此有疑问,我建议您快速浏览一下文档。用 bazel 构建需要 1.5 小时。确保您已安装 gcc7 和 bazel。

【讨论】:

【参考方案6】:

这个错误可能是你的GPU的计算能力导致的,CUDA官方支持3.5~5.0的GPU计算能力,你可以看这里:https://en.wikipedia.org/wiki/CUDA

就我而言,错误是这样的:

忽略具有 Cuda 计算能力 3.0 的可见 gpu 设备(设备:0,名称:GeForce GT 640M,pci 总线 ID:0000:01:00.0,计算能力:3.0)。所需的最低 Cuda 能力为 3.5。

目前我们只能在 Linux(或 mac OS)上从源代码编译以打破“3.5~5.0”的限制。

【讨论】:

【参考方案7】:

存在各种系统不兼容问题。

对库的要求可能因 TensorFlow 版本而异。

在交互模式下使用 python 时,很多有用的信息被打印到 stderr 中。我对 TensorFlow 2.0 或更高版本的建议:

python3.8 -c "import tensorflow as tf; print('tf version:', tf.version); tf.config.list_physical_devices()"

执行此命令后,除了要求之外,您还将观察到缺少的库(或其版本)与 GPU 一起使用:

https://www.tensorflow.org/install/gpu#software_requirements https://www.tensorflow.org/install/gpu#hardware_requirements

附言CUDA_VISIBLE_DEVICES 不应该与 TensorFlow 有真正的联系,或者它更通用 - 它是一种为所有启动的进程定制可用 GPU 的方法。

【讨论】:

【参考方案8】:

适用于 anaconda 用户。我使用 Anaconda Navigator 通过 GUI 安装了tensorflow-gpu,并在tensorflow guide 中配置了 NVIDIA GPU,但 tensorflow 无论如何都找不到 GPU。然后我卸载了 tensorflow,总是通过 GUI(参见here)并在 anaconda 提示符下通过命令行重新安装它:

conda install -c anaconda tensorflow-gpu

然后tensorflow可以正确找到GPU。

【讨论】:

以上是关于GPU 上的 tensorflow:没有已知设备,尽管 cuda 的 deviceQuery 返回“PASS”结果的主要内容,如果未能解决你的问题,请参考以下文章

GPU 上的张量流

Tensorflow 未检测到 GPU - 添加可见 gpu 设备:0

为啥带有 TensorFlow 的 Keras 没有使用所有 GPU 内存

已安装 Tensorflow-gpu、CUDA 和 cudnn,但发现 GPU 设备但未使用 [重复]

Tensorflow-gpu 问题(CUDA 运行时错误:设备内核映像无效)

阻止TensorFlow访问GPU? [复制]