TensorFlow-GPU运行报错libcublas.so.8.0无法打开,如何解决?
咱们先把问题根源理清楚:这个错误说明你用virtualenv创建的Python环境没法定位到CUDA 8.0的libcublas.so.8.0库文件——哪怕你在.bashrc里配置了CUDA环境,要么是virtualenv的隔离特性导致环境变量没生效,要么是配置本身有问题,甚至可能是CUDA安装不完整。
下面是一步步的排查和解决方法:
1. 先确认CUDA 8.0的库是否真的存在
首先找到CUDA 8.0的安装路径,默认一般是/usr/local/cuda-8.0,也可能是你自定义的路径。咱们先检查lib64目录里有没有目标文件:
ls /usr/local/cuda-8.0/lib64/libcublas.so.8.0
如果输出提示文件不存在,那说明你CUDA 8.0安装不完整,或者装错了版本,得重新下载对应版本的CUDA Toolkit 8.0重新安装。
2. 检查.bashrc里的CUDA环境变量配置是否正确
打开你的.bashrc文件看看配置:
nano ~/.bashrc
确认里面有类似下面的配置(路径要和你的CUDA 8.0实际安装路径一致):
export PATH=/usr/local/cuda-8.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
如果配置不对,修改后保存,然后重新加载环境变量:
source ~/.bashrc
之后验证一下变量是否生效:
echo $LD_LIBRARY_PATH
正常情况下应该能看到/usr/local/cuda-8.0/lib64出现在输出里。
3. 让virtualenv继承CUDA的环境变量
virtualenv默认会隔离系统环境变量,所以你在.bashrc里配的LD_LIBRARY_PATH可能没被虚拟环境继承。这里有两个解决办法:
方法A:创建虚拟环境时允许继承系统包(不推荐,易污染环境)
如果还没创建环境,或者愿意重新创建,可以加参数:
virtualenv --system-site-packages your_env_name
但这种方法会让虚拟环境继承系统所有的包,容易引发依赖冲突,更推荐下面的方法B。
方法B:给虚拟环境单独配置环境变量
进入你的虚拟环境的bin目录(比如your_env_name/bin),创建一个postactivate文件:
nano your_env_name/bin/postactivate
在里面添加CUDA的环境变量配置:
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
保存后,下次激活虚拟环境时,这个变量会自动加载。现在激活环境试试:
source your_env_name/bin/activate
再验证一下变量:
echo $LD_LIBRARY_PATH
确认包含CUDA 8.0的lib64路径就行。
4. 直接配置系统级的库缓存
如果上面的方法都没效果,可以把CUDA的库路径添加到系统的库缓存配置里,这样所有环境都能找到它:
编辑/etc/ld.so.conf.d/cuda.conf(如果文件不存在就新建):
sudo nano /etc/ld.so.conf.d/cuda.conf
添加一行:
/usr/local/cuda-8.0/lib64
然后更新系统库缓存:
sudo ldconfig
5. 确认tensorflow-gpu版本和CUDA版本匹配
最后别忘了,tensorflow-gpu和CUDA版本是严格对应的——比如tensorflow 1.4.x对应CUDA 8.0,1.5及以上版本对应CUDA 9.0。如果你的tensorflow版本太高,也会找不到CUDA 8.0的库。
在激活的虚拟环境里检查tensorflow版本:
import tensorflow as tf print(tf.__version__)
如果版本不匹配,卸载当前版本,安装对应CUDA 8.0的版本,比如:
pip uninstall tensorflow-gpu pip install tensorflow-gpu==1.4.0
内容的提问来源于stack exchange,提问作者blackmamba

