报错解决undefined-symbol-_ZN15TracebackLoggerC1EPKc,-version-libcudnn_ops_infer.so.8
报错解决:undefined symbol: _ZN15TracebackLoggerC1EPKc, version libcudnn_ops_infer.so.8
搭建 resemble-enhance 这个项目的过程中,在 Ubuntu20.04的机器上跑,报错如下:
undefined symbol: _ZN15TracebackLoggerC1EPKc, version libcudnn_ops_infer.so.8
这个错误是在 NVIDIA GPU 上使用 PyTorch 2.1.2 和 cuDNN 12.1 时使用 torch.nn.Conv2d 时出现符号查找错误,这意味着 PyTorch 正在尝试在库 libcudnn_ops_infer.so.8 中查找名为 _ZN15TracebackLoggerC1EPKc 的符号,但该符号不存在, 发生这种情况的原因有多种,包括:
1、cuDNN 版本之间不匹配:虽然安装了 cuDNN 12.1,但用于构建 PyTorch (cu121) 的 cuDNN 版本与系统上可用的 cuDNN 版本之间可能不匹配
2、库路径不正确,环境中 cuDNN 库的路径可能不正确
3、cuDNN 安装损坏或不完整,cuDNN 安装可能已损坏或不完整
要解决问题,有三个东西要理解清楚:nivdia-smi、nvcc以及cuDNN
nvidia-smi | nvcc | cuDNN |
---|---|---|
1、nvidia-smi是NVIDIA System Management Interface的缩写,是一个命令行工具 2、用于监视和管理NVIDIA GPU设备 3、nvidia-smi提供有关GPU的详细信息,例如GPU的使用情况、显存使用情况、温度、驱动程序版本等 4、用于检查CUDA版本、显示GPU拓扑结构和进程信息等 | 1、nvcc是NVIDIA CUDA Compiler的缩写,是一个用于编译和构建CUDA代码的命令行工具 2、是NVIDIA CUDA工具包的一部分,用于将CUDA源代码编译为可在NVIDIA GPU上执行的机器码 3、nvcc根据CUDA源代码中的CUDA扩展和C++语法,生成针对NVIDIA GPU架构优化的可执行文件 4、还提供了一些编译选项,允许开发人员控制编译过程、优化级别和目标GPU架构等 | 1、cuDNN是NVIDIA Deep Neural Network库的缩写,是一个用于深度学习的GPU加速库 2、提供了高性能的深度神经网络加速,包括卷积神经网络(CNN)、循环神经网络(RNN)等 3、cuDNN通过优化算法和实现,加速了深度学习任务的计算过程 4、提供了一系列的函数和接口,可用于在CUDA平台上开发和部署深度学习模型 |
简而言之,nvidia-smi是用于监视和管理NVIDIA GPU设备的命令行工具,nvcc是用于编译和构建CUDA代码的命令行编译器,而cuDNN是一个用于深度学习的GPU加速库
基于以上概念,我先运行
nvidia-smi
,结果如下,CUDA版本为12.2
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.12 Driver Version: 535.104.12 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A10 Off | 00000000:00:07.0 Off | 0 |
| 0% 45C P0 59W / 150W | 7776MiB / 23028MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 933471 C python 2432MiB |
| 0 N/A N/A 956741 C python 5326MiB |
+---------------------------------------------------------------------------------------+
接着运行
nvcc -V
,结果如下,CUDA版本为11.4
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Wed_Jul_14_19:41:19_PDT_2021
Cuda compilation tools, release 11.4, V11.4.100
Build cuda_11.4.r11.4/compiler.30188945_0
我冒出了疑问:为什么两个命令显示的CUDA版本不一致???
经过查阅得知,CUDA的API有两种: 驱动(driver)API 和 运行(runtime)API
1、驱动(driver)API:
驱动API是较低级别的接口,提供了对GPU硬件和驱动程序的底层访问。驱动API需要开发人员显式地管理GPU的内存分配、数据传输和并行执行等操作,它提供了更多的灵活性和控制权,适用于需要直接操作GPU硬件的特定场景,以及对CUDA运行时环境更高级别的自定义需求,通过驱动API,开发人员可以创建和管理CUDA上下文(context)、配置GPU设备、分配和释放GPU内存等。
2、运行(runtime)API:
运行API是较高级别的接口,封装了驱动API的底层细节,提供了更简化的编程模型,隐藏了底层GPU硬件和驱动程序的复杂性,简化了CUDA应用程序的开发。运行API提供了一组高级函数,例如并行执行(kernel启动)、内存管理和数据传输等,以便开发人员更方便地编写CUDA应用程序,它提供了对上下文管理、内存分配和数据传输等常见操作的封装和自动化处理。因此运行API是更常用和推荐的API,适用于大多数CUDA应用程序。
至此还有一个问题,这些和cuDNN有啥关系?cuDNN是一个用于深度学习的GPU加速库,CUDA和cuDNN之间存在版本兼容性的关系,一般情况下,每个cuDNN版本都支持一系列的CUDA版本,这是因为cuDNN库是针对特定的CUDA版本进行编译和优化的。
基于以上分析得知:程序报错的原因是pytorch使用的cuDNN版本与机器安装的CUDA版本不兼容导致的错误,所以更新 运行(runtime)API 即可解决问题
解决办法:
Step1 :下载cuda toolkit(https://developer.nvidia.com/cuda-toolkit-archive)
Step2 :运行安装脚本
Step3 :将Driver这里按ENTER勾掉!如下图
Step4 :配置环境变量,在
~/.bashrc
中添加如下内容以后记得
source ~/.bashrc
export PATH=$PATH:/usr/local/cuda-12.1/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-12.1/lib64
至此,问题解决
参考:https://blog.csdn.net/qq_41368074/article/details/107785536