使程序正确识别cuda和cudnn

在模型加载的时候报错:找不到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里的加载方式;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值