当前位置: 代码网 > it编程>前端脚本>Python > PyTorch环境中CUDA版本冲突问题排查与解决方案

PyTorch环境中CUDA版本冲突问题排查与解决方案

2025年02月27日 Python 我要评论
引言在使用 pytorch 进行深度学习开发时,cuda 版本兼容性问题是个老生常谈的话题。本文将通过一次真实的排查过程,剖析 pytorch 虚拟环境自带 cuda 运行时库与系统全局 cuda 环

引言

在使用 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

发现了两个关键信息

  1. nvcc --version 系统安装的 cuda 版本是 12.3。
  2. 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版本冲突的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com