在模型加载的时候报错:找不到libcudnn.so.8:libcuda.so:open failed,类似的错误,我在bashrc里配置了
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH$
export LD_LIBRARY_PATH=/home/lia/miniconda3/envs/py38/lib:$LD_LIBRARY_PATH$
export LD_LIBRARY_PATH=/home/lia/miniconda3/envs/py38/lib/python3.8/site-packages/torch/lib:$LD_LIBRARY_PATH$
第一条对应目录下还有验证命令:nvidia-smi
因为要避免基础环境中的cuda和conda环境中的冲突,我根据一些提示删除了/usr/lib/wsl/lib下的四个文件:libcuda.so. libcuda.so.1 libcuda.so.1.1 libcuda.so. debugger,然后导致torch.cuda.is_available不可用了,然后我又尝试恢复,最后一个我没有找到备份所以没有恢复;因为恢复在移动的时候提示权限问题,所以我修改了上述文件的权限,不知道是不是这个原因解决了程序找不到libcuda.so的报错,因为我已经把我知道的cuda相关文件的路径都添加了,而且所谓的冲突也就是常见的/usr/local/cuda下的文件也都删了(我其实不确定是不是冲突,但是因为conda里装了,所以把这块的文件删了,包括链接);我觉得上述的三个动态库和nVidia-smi文件放在一个目录下,应该是一种基本的识别符号,动态库不是可执行文件,我conda环境也就是/home/lia/miniconda3/envs/py38/lib/python3.8/site-packages/torch/lib下找到的是libtorch_cuda.so而非常见或者程序要求的libcuda.so,这也是我想在conda环境下找这个动态库而一直找不到的原因,有时候精确查找就是有这样的问题,你无法查找一个你认知之外的文件,所以这种时候需要到包含它的文件夹里实际看一眼,我之前那个数据的存放错误也是这样发现的,就是你调试了,很精确,很多时候错误提示都是根据大家的常规认知来写的,自己误操作导致的一些零碎的小问题,只有自己实际去查看才知道,包括程序一直提示什么nvidia不可用,要让我安装驱动,但是实际不是这个问题,因为报错提示也是人根据经验推断的,而具体的,你前后的操作你自己要记忆和理解他们的意义。
我在运行测试代码时又遇到上述报错;之前我根据抽象的提示,各种检查我的bashrc里的路径配置和文件访问权限等问题,几乎淹没在了linux的各种文件切换里,但是还是没有很好地解决;直到我想到要用写一个检错的函数在test.py里测试,然后很快就定位到了问题,函数如下:
import ctypes
def check_library(library_path):
try:
# 尝试加载库文件
ctypes.CDLL(library_path)
print(f"成功加载库文件:{library_path}")
except OSError as e:
# 捕获 OSError 异常
if e.errno == 2:
# 文件不存在的错误
print(f"库文件 {library_path} 不存在,请确保路径正确")
elif e.errno == 13:
# 权限错误
print(f"无法访问库文件 {library_path},请检查文件权限")
else:
# 其他错误
print(f"加载库文件 {library_path} 出现错误:{e}")
# 检查 cudnn 库文件
check_library("/path/to/libcudnn_cnn_infer.so.8")
# 检查 cuda 库文件
check_library("/path/to/libcuda.so")
其中/path/to/我替换了~/.bashrc里export的LD_LIBRARY_PATH的路径:
/home/usr/miniconda3/envs/py38/lib/python3.8/site-packages/torch/lib/
发现cudnn可以查到,但是cuda查不到,于是查看了该路径发现库的名称是:libtorch_cuda.so(因为conda环境装的是绑定torch的cuda,所以动态库的命名是:libtorch_cuda.so),故尝试换成这个名称看能否加载,可以,也就是说代码要求libcuda.so,但是加载libtorch_cuda.so也可以,但是直接找libcuda.so它找不到;
当于原来的加载方式换成了指定的try里的加载方式;