解决TensorFlow-GPU 2.x使用GPU报错:Could not load dynamic library ‘libcudnn.so.7‘
前言
本篇博客主要解决在安装tensorflow-gpu
之后,使用gpu
训练模型时报错的问题。
1. 问题描述
软件 | 版本号 |
---|---|
OS | Ubuntu 18.04 |
CUDA | 10.1 |
cuDNN | 7.6.5 |
TensorFlow-GPU | 2.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
中不包含,比如cudatoolkit
,cudnn
等,这时只需要在conda install
指令后加上-c anaconda
即可。也确实,有时候使用pip install
一些库时,会导致相关的依赖没有完全安装完,不知道使用 ,已测试,pip install cudnn
能否成功,暂未测试pypi
没有cudnn
库。
tensorflow-gpu
与cuDNN
和CUDA
的版本对应关系,请参阅官网文档。
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.0
和cudnn7
相关的库没有找到,去/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 API
和 runtime API
,按照NVIDIA
官方的说法,driver API
和 runtime 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. 结束语
我想,应该没有其他问题了叭~
更多推荐
所有评论(0)