关于Could not dlopen library和Cannot dlopen some GPU libraries等问题的解决建议

在使用服务器的tensorflow1.14时,发现GPU内存占用很低,才100多M,而且GPU利用率为0%

这根本没用GPU跑啊

回过头看编译输出的报告

出现了类似于

1
Could not dlopen library 'libcufft.so.10.0'; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory

以及

1
Cannot dlopen some GPU libraries. Skipping registering GPU devices...

一类的报错

看了一下服务器里的CUDA安装的是9.0

实际上tf1.14和CUDA9.0是不匹配的,具体的匹配关系请参考

Tensorflow与cuda版本对应关系

关于这个问题如何解决,网上的解决方案众说纷纭,我也是菜鸡代码搬运工,只能一个个尝试

有的说是未配置 LD_LIBRARY_PATH的原因

直接在终端中输入

1
vim ~/.bashrc

按a进入编辑,在结尾添加

1
2
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda-9.0/bin:$PATH

按Esc退出编辑 ,输入:wq保存

终端中输入

1
source ~/.bashrc

使其生效

我的实际操作中发现,自己并不是这个问题。

有的说如果的报的文件和你安装的CUDA版本是相同的,那可以通过

1
ldconfig /usr/local/cuda-9.0/lib64

来解决。参考ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory

不过,我也不是这个问题

有的说是是创建一个libcudart.so的软链接就可解决

参考四 ubuntu下训练GPU未工作问题及解决办法

终端中输入,

1
sudo ln -s /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudart.so.10.2 /usr/lib/x86_64-linux-gnu/libcudart.so.10.1

为10.0创建了软连接,我也尝试了,可能是版本不同的问题,进入root后具体操作中使用的是

1
2
3
4
5
6
ln -s /usr/local/cuda-9.0/lib64/libcudart.so.9.0 /usr/lib/x86_64-linux-gnu/libcudart.so.10.0
ln -s /usr/local/cuda-9.0/lib64/libcublas.so.9.0 /usr/lib/x86_64-linux-gnu/libcublas.so.10.0
ln -s /usr/local/cuda-9.0/lib64/libcufft.so.9.0 /usr/lib/x86_64-linux-gnu/libcufft.so.10.0
ln -s /usr/local/cuda-9.0/lib64/libcurand.so.9.0 /usr/lib/x86_64-linux-gnu/libcurand.so.10.0
ln -s /usr/local/cuda-9.0/lib64/libcusolver.so.9.0 /usr/lib/x86_64-linux-gnu/libcusolver.so.10.0
ln -s /usr/local/cuda-9.0/lib64/libcusparse.so.9.0 /usr/lib/x86_64-linux-gnu/libcusparse.so.10.0

这确实解决了一部分的问题

输出变成了

1
2
3
4
5
6
Successfully opened dynamic library libcudart.so.10.0
Successfully opened dynamic library libcublas.so.10.0
Successfully opened dynamic library libcufft.so.10.0
Successfully opened dynamic library libcurand.so.10.0
Could not dlopen library 'libcusolver.so.10.0'; dlerror: /usr/lib/x86_64-linux-gnu/libcusolver.so.10.0: undefined symbol: GOMP_critical_end
Successfully opened dynamic library libcusparse.so.10.0

可以看到除了libcusolver.so.10.0报出了

1
Could not dlopen library 'libcusolver.so.10.0'; dlerror: /usr/lib/x86_64-linux-gnu/libcusolver.so.10.0: undefined symbol: GOMP_critical_end

其他的文件都找到了。

具体的原因大概是别人都是10.1降到10.0,我是在用9.0来欺骗10.0,哈哈哈

所以,又回到了版本匹配 的问题,我先去重新装个CUDA10.0

由于使用的是实验室的服务器,修改CUDA会影响其他人使用pytorch。。。在我准备装CUDA10.0的时候被后排的师兄看见了,已经被打了,被打的很惨,已经不能走了,不过刚好不影响坐在电脑前写代码的那种。。。

最后我选择了重装tensorflow,装回了tensorflow1.10,问题解决。

关于CUDA的版本

可通过

1
nvcc -V

来查看