【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?

原因

    • 1.CUDA、cudnn、Tensorflow、python版本并不配套!!!(大多都是这个原因)
    • 2.CUDA没有装好:
    • 3.环境变量没配置好
    • 4.NVDIA驱动版本太低不合要求
    • 5.以前的tensorflow没有卸载干净
    • 6.装了多个Tensorflow(少见,但我就是这个原因!!!)
    • 其它问题
      • 1.VS20XX,如VS2017必须要装吗?
      • 2.CUDA是精简安装还是自定义安装?
      • 3.CUDA Driver Version / Runtime Version不一致有没有问题?
      • 4.为什么tensorflow的GPU运算比CPU还慢?
      • 5.如何看GPU是否运行?
      • 6.GPU运行报错:Resource exhausted: OOM when allocating tensor with shape
      • 7.测试代码的报错分析

当我们把CUDA、cudnn、tensorflow-GPU都装好,但在tensorflow GPU测试tf.test.is_gpu_avaiable()却始终返回false,怎么办?

import tensorflow as tf
tf.test.is_gpu_available()

FALSE

可能的原因如下:
————————————————————————————————

1.CUDA、cudnn、Tensorflow、python版本并不配套!!!(大多都是这个原因)

查看tensorflow官网的版本要求:https://tensorflow.google.cn/install/source_windows(见【经过测试的构建配置】)
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第1张图片
请仔细核对你的版本是否符合要求。
eg:我的环境配置:

  • python: 3.7.1
  • CUDA:10.0.132
  • cudnn:V7.4.1.5(根据cuda版本和tf版本来选)
  • tensorflow-gpu-2.0.0

2.CUDA没有装好:

验证方式一:nvcc -V
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第2张图片
正确输出版本表示成功,否则没装好。

验证方式二:运行demo

打开 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite

(若是自定义安装,则换成相对应的路径)

在此路径下打开powershell

执行:.\bandwidthTest.exe
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第3张图片
输出如图,表示CUDA安装成功,否则CUDA没装好

若CUDA可运行,且版本没问题,那么可能是一下的原因:

3.环境变量没配置好

参考这里:https://blog.csdn.net/u010618587/article/details/82940528?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

4.NVDIA驱动版本太低不合要求

参考:https://blog.csdn.net/flana/article/details/104772614

可以尝试更新一下NVDIA驱动,看是否成功。不成功也没有影响。

5.以前的tensorflow没有卸载干净

这个也是有可能的,若是以前安装过tensorflow其它版本,如CPU版本,一定要卸载干净后再装新的版本!

看写没卸载干净,

方式一:pip list 看是否有带tensorflow名称的库

方式二:到对应的文件夹下看,eg:Anaconda就到Anaconda3\Lib\site-packages的目录下看是否还有tensorflow相关的文件夹

有的话用pip uninstall的方式卸载掉

6.装了多个Tensorflow(少见,但我就是这个原因!!!)

我在anaconda环境下装了tensorflow-CPU,另外再系统内又直接装了一个tensorflow-CPU,两套是独立的,系统的那一套可以用Pycharm调用。
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第4张图片

然后我在anaconda环境下安装tensorflow-GPU,结果在Pycharm中运行测试程序调用另一套tensorflow-CPU,所以始终FALSE。(装了太久,自己都忘了)

突然想到查看tensorflow运行时的版本,这才发现问题。切换到anaconda环境下的执行程序,问题解决。

这里给一个完整的验证tensorflow-GPU是否可用的程序

import tensorflow as tf

print(tf.__version__)  # 查看tensorflow版本
print(tf.__path__)     # 查看tensorflow安装路径

a = tf.test.is_built_with_cuda()  # 判断CUDA是否可以用
b = tf.test.is_gpu_available(
    cuda_only=False,
    min_cuda_compute_capability=None
)  # 判断GPU是否可以用

print(a) # 显示True表示CUDA可用
print(b) # 显示True表示GPU可用

# 查看驱动名称
if tf.test.gpu_device_name():
    print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
else:
    print("Please install GPU version of TF")

网上看了那么多,我可能是第一个提醒:在验证tensorflow-GPU是否可用前,先查看一下tensorflow版本和安装路径

——————————————补充——————————————————

其它问题

1.VS20XX,如VS2017必须要装吗?

不用,虽然tensorflow官网也有说让装,其实可以不用装,VS2017是用于编译tensorflow的,我们直接用编译好的,就不用装它。

2.CUDA是精简安装还是自定义安装?

推荐自定义安装,可以选择安装路径,教程如下:

https://blog.csdn.net/u010618587/article/details/82940528?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

3.CUDA Driver Version / Runtime Version不一致有没有问题?

只要CUDA Driver Version > Runtime Version就没有问题。

我把NVDIA Driver(不是CUDA)升级了,结果GPU还是可以用。

如何查看这两个的版本:
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第5张图片

4.为什么tensorflow的GPU运算比CPU还慢?

参考:https://www.cnblogs.com/liuhuacai/p/12328020.html
【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第6张图片

结论:1.在计算量较小的情况下,cpu的计算速度比gpu计算速度快,但是都是微量级别的差异

2.随着计算量的增加,cpu的计算时间逐步增加,而gpu的计算时间相对平缓,在计算量达到一定程度之后,gpu的优势就出来了。

5.如何看GPU是否运行?

最简单的就是直接在任务管理器-性能中查看。在进程里可以看到哪些程序在使用GPU。

6.GPU运行报错:Resource exhausted: OOM when allocating tensor with shape

参考:https://www.jianshu.com/p/f29dbb13bb07
OOM表示分配的显存超过GPU可用的最大显存,显存不足(OOM, Out of Memory)
可能的原因:
(1)batchsize太大,这种只需要将batchsize减小就行了
(2)GPU的显存太小,或者剩余的显存太少了

7.测试代码的报错分析

【tensorflow】为什么CUDA装好了,Tensorflow-GPU不能用?_第7张图片
这是一个朋友运行测试代码后的报错情况,若是你也遇到这样的问题,那么可以仔细分析看一下报错中的第2、3行,主要问题在于“cudnn64_8.dll not found”,你可以在电脑中搜索一下是否存在这个文件,若没有,一个简单的办法就是去下载对应的文件,然后放到指定的目录中,具体可以参考:https://blog.csdn.net/a1456123a/article/details/115098630;若有,那么可能是路径不正确或其他的问题。

你可能感兴趣的:(算法篇,tensorflow,gpu,cuda)