前言

  本篇博客主要解决在安装tensorflow-gpu之后,使用gpu训练模型时报错的问题。

1. 问题描述

软件版本号
OSUbuntu 18.04
CUDA10.1
cuDNN7.6.5
TensorFlow-GPU2.3.0
	# test whether GPU can be used
	import tensorflow as tf

	# 查看版本号
	tf.__version__
	# 查看gpu能否使用
	tf.test.is_gpu_available()
	# tf.config.list_physical_devices('GPU')

  然后报错:Could not load dynamic library 'libcudnn.so.7'; dlerror: libcudnn.so.7: cannot open shared object file: No such file or directory,根据下图可以看出tensorflow检测到了有gpu的存在,并输出了gpu的相关信息,但是缺少gpu的库文件libcudnn.so.7,导致gpu不能正确加载。

在这里插入图片描述

2. 问题原因

  缺少gpu的库文件,因为我使用PyTorch进行GPU训练是可以的,所以猜测是tensorflow的依赖问题,缺少相关库导致gpu加载失败。

3. 解决过程

  理论上来讲,从别的机子上copy一下这个文件,应该也是能用的,但,我的是服务器…不好弄。所以就看了看相关博客,在此做总结如下:

	# 使用conda安装cudnn
	conda install -c anaconda cudnn

在这里插入图片描述
  然后再次进行测试gpu能否使用:

在这里插入图片描述

  这就很ok了,既然通过conda安装之后解决了,说明是虚拟环境中缺少gpu的加载库。
  再回头看一下这条指令是什么意思:conda install -c anaconda cudnn
  有些包在conda默认的channels中不包含,比如cudatoolkitcudnn等,这时只需要在conda install指令后加上-c anaconda 即可。也确实,有时候使用pip install一些库时,会导致相关的依赖没有完全安装完,不知道使用pip install cudnn能否成功,暂未测试 ,已测试,pypi没有cudnn库。

  tensorflow-gpucuDNNCUDA的版本对应关系,请参阅官网文档

4. 补充

  在配置过程中还遇到过相似的问题,不仅仅是'libcudnn.so.7'找不到,cuda相关的动态库也都找不到:

2022-02-28 14:30:14.561975: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562052: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10.0'; dlerror: libcublas.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562167: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcufft.so.10.0'; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562230: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcurand.so.10.0'; dlerror: libcurand.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562291: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusolver.so.10.0'; dlerror: libcusolver.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562353: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10.0'; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory
2022-02-28 14:30:14.562416: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudnn.so.7'; dlerror: libcudnn.so.7: cannot open shared object file: No such file or directory

在这里插入图片描述
  可以看到,CUDA10.0cudnn7相关的库没有找到,去/usr/local目录看一下发现CUDA是已经安装好的,然后查看了一下环境变量,发现CUDA没有加进去:

在这里插入图片描述
  配置一下CUDA的环境变量:

# 编辑 .bashrc 文件,在文件末添加如下内容:
export CUDA_HOME="/usr/local/cuda"
export LD_LIBRARY_PATH="$CUDA_HOME/lib64:$CUDA_HOME/extras/CUPTI/lib64:$LD_LIBRARY_PATH"
export PATH="$CUDA_HOME/bin:$PATH"

# 编辑完成后记得 source 一下
# 注:我这里的 cuda 文件夹是个软连接,cuda-10.0的软连接

  然后再次进行测试gpu能否使用:

在这里插入图片描述
  由此可以得出结论,GPU不能用时,首先要考虑以下问题:

1. CUDA的版本与TensorFlow的版本是否对应`(使用 nvcc -V 查询CUDA版本)`
2. CUDA和cudnn是否安装成功
3. CUDA的环境变量是否配置好了

5. 再次补充

  关于终端执行代码可以使用gpu,而通过pycharm执行仍然出现上述的错误进行解决:

在这里插入图片描述

  在pycharm中添加cuda动态库的环境变量:

# 工具栏:
Run --> Edge Configurations --> Environment variables

# 然后添加 LD_LIBRARY_PATH 信息

在这里插入图片描述

在这里插入图片描述
  然后再次进行测试gpu能否使用:

在这里插入图片描述

6. 最后一次补充

  本次补充的内容是:nvidia-smi显示的CUDA版本与nvcc -V显示的CUDA版本不一致的原因。
  nvidia-smi显示的CUDA版本:

在这里插入图片描述

  nvcc -V显示的CUDA版本:

在这里插入图片描述
  这样就有了一个场景:我需要安装TensorFlow,现有2.6.0(11.2)2.4.0(11.0)2.2.0(10.1)1.15.0(10.0)四个版本可供选择,哪个可以安装?可能小伙伴觉得2.4.0(11.0)版本很合适,但是在使用过程中就会出现Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory。正确的操作是按照nvcc -V显示的CUDA版本来看,可以选择1.15.0(10.0)这个版本(实际测试时,2.2.0(10.1)这个版本也可以)。
  为什么会有两个CUDA版本?这就不得不了解一下driver APIruntime API,按照NVIDIA官方的说法driver APIruntime API非常相似,在很大程度上可以互换使用。然而,两者之间有一些关键的区别值得注意,它们都有着自己的CUDA版本。
  nvidia-smi属于driver API,用于支持driver API的必要文件(比如libcuda.so.xxx)是由NVIDIA Driver安装的,nvcc属于runtime API,用于支持runtime API的必要文件(比如libcudart.so.xxx)是由CUDA Toolkit安装的。它们并不是一一对应的,作为一个工具包,CUDA Toolkit可以同时安装多个版本,比如博主的,同时安装了7个不同的版本,以兼容不同的使用场景:

在这里插入图片描述
  现在将CUDA版本有10.0切换到11.2,使TensorFlow 2.5.0(11.2)能够使用GPU

在这里插入图片描述
  测试GPU能否正常使用:

在这里插入图片描述

在这里插入图片描述

  tips:如果我安装的CUDA版本是10.0,也是可以使用TensorFlow 2.3.0(10.1),目前测试得出的结果是:CUDA的版本和TensorFlow的版本只需要小数点前面的版本号一致即可,即CUDA 11.x可同时兼容TensorFlow 2.6.0(11.2)TensorFlow 2.4.0(11.0)

7. 结束语

  我想,应该没有其他问题了叭~

在这里插入图片描述

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐