引言
在使用 pytorch 进行深度学习开发时,cuda 版本兼容性问题是个老生常谈的话题。本文将通过一次真实的排查过程,剖析 pytorch 虚拟环境自带 cuda 运行时库与系统全局 cuda 环境冲突的场景,并一步步分析问题、定位原因,并最终给出解决方案。
问题复现:importerror: undefined symbol
始于一个看似简单的 import torch 语句
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ python python 3.12.9 (main, feb 12 2025, 14:50:50) [clang 19.1.6 ] on linux type "help", "copyright", "credits" or "license" for more information. >>> import torch >>> traceback (most recent call last): >>> file "<stdin>", line 1, in <module> >>> file "/home/wangh/codes/modelforger/.venv/lib/python3.12/site-packages/torch/__init__.py", line 367, in <module> >>> from torch._c import * # noqa: f403 >>> ^^^^^^^^^^^^^^^^^^^^^^ >>> importerror: /home/wangh/codes/modelforger/.venv/lib/python3.12/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvjitlinkcomplete_12_4, version libnvjitlink.so.12
错误信息很明确,在 libcusparse.so.12
中找不到符号 __nvjitlinkcomplete_12_4
,这通常意味着存在版本不匹配的问题。
初步排查:环境 & cuda 版本
首先,我们检查一下环境和 cuda 版本
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ echo $ld_library_path /usr/local/cuda/lib64: (modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ nvcc --version nvcc: nvidia (r) cuda compiler driver copyright (c) 2005-2023 nvidia corporation built on wed_nov_22_10:17:15_pst_2023 cuda compilation tools, release 12.3, v12.3.107 build cuda_12.3.r12.3/compiler.33567101_0 (modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ uv pip list | grep nvidia using python 3.12.9 environment at: /home/wangh/codes/modelforger/.venv nvidia-cublas-cu12 12.4.5.8 nvidia-cuda-cupti-cu12 12.4.127 nvidia-cuda-nvrtc-cu12 12.4.127 nvidia-cuda-runtime-cu12 12.4.127 nvidia-cudnn-cu12 9.1.0.70 nvidia-cufft-cu12 11.2.1.3 nvidia-curand-cu12 10.3.5.147 nvidia-cusolver-cu12 11.6.1.9 nvidia-cusparse-cu12 12.3.1.170 nvidia-nccl-cu12 2.21.5 nvidia-nvjitlink-cu12 12.4.127 nvidia-nvtx-cu12 12.4.127
发现了两个关键信息
nvcc --version
系统安装的 cuda 版本是 12.3。nvidia-*
虚拟环境安装的 nvjitlink 版本号为 12.4.127。
根据错误信息可知,pytorch 虚拟环境中的动态库 libcusparse.so.12
需要的正是 libnvjitlink.so.12
的 __nvjitlinkcomplete_12_4
版本,pip
安装的依赖包版本自身没有问题,因此推测可能错误链接到了系统中 cuda 12.3 的 libnvjitlink.so.12
。
分析:动态链接库加载路径
为了验证猜想,我们使用 patchelf
和 ldd
命令查看 libcusparse.so.12
的动态链接状态:
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ patchelf --print-rpath libcusparse.so.12 $origin:$origin/../../nvjitlink/lib (modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ ldd libcusparse.so.12 linux-vdso.so.1 (0x00007ffc507e2000) libnvjitlink.so.12 => /usr/local/cuda/lib64/libnvjitlink.so.12 (0x00007f867a399000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f867a353000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f867a349000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f867a343000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f867a1f4000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f867a1d7000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8679fe5000) /lib64/ld-linux-x86-64.so.2 (0x00007f868e62d000)
果不其然 libcusparse.so.12
依赖的 libnvjitlink.so.12
被加载到了系统 cuda 目录 (/usr/local/cuda/lib64
) 下,而不是预定义的 pytorch 虚拟环境的目录。
问题根源:ld_library_path 优先级
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ echo $ld_library_path /usr/local/cuda/lib64:
至此,问题根源已经明确:ld_library_path 环境变量导致系统 cuda 库路径优先于 pytorch 虚拟环境的 cuda 库路径被加载。这导致了版本不匹配,pytorch 无法找到所需的符号。
解决方案:unset ld_library_path
解决这个问题最直接的方法就是移除 ld_library_path 对系统 cuda 路径的设置:
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ unset ld_library_path
再次查看 libcusparse.so.12
的动态链接:
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ ldd libcusparse.so.12 linux-vdso.so.1 (0x00007fff959a7000) libnvjitlink.so.12 => /home/wangh/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib/./../../nvjitlink/lib/libnvjitlink.so.12 (0x00007f303000e000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f302ffc8000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f302ffbe000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f302ffb8000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f302fe69000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f302fe4c000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f302fc5a000) /lib64/ld-linux-x86-64.so.2 (0x00007f30443f9000)
现在,libnvjitlink.so.12
正确地加载到了 pytorch 虚拟环境的目录下。
验证:问题解决
(modelforger) wangh@ubuntu:~/codes/modelforger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ python python 3.12.9 (main, feb 12 2025, 14:50:50) [clang 19.1.6 ] on linux type "help", "copyright", "credits" or "license" for more information. >>> import torch
import torch 成功!问题解决。
最佳实践与总结
- 避免全局设置 ld_library_path: 在全局环境变量(如 .bashrc 或 .bash_profile)中设置 ld_library_path 会干扰虚拟环境的独立性。
- 理解动态链接机制: 了解 ld_library_path 的作用以及动态链接库的加载顺序,有助于快速定位和解决类似问题。
以上就是pytorch环境中cuda版本冲突问题排查与解决方案的详细内容,更多关于pytorch cuda版本冲突的资料请关注代码网其它相关文章!
发表评论