PyTorch環(huán)境中CUDA版本沖突問題排查與解決方案
引言
在使用 PyTorch 進(jìn)行深度學(xué)習(xí)開發(fā)時(shí),CUDA 版本兼容性問題是個(gè)老生常談的話題。本文將通過一次真實(shí)的排查過程,剖析 PyTorch 虛擬環(huán)境自帶 CUDA 運(yùn)行時(shí)庫與系統(tǒng)全局 CUDA 環(huán)境沖突的場景,并一步步分析問題、定位原因,并最終給出解決方案。
問題復(fù)現(xiàn):ImportError: undefined symbol
始于一個(gè)看似簡單的 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,這通常意味著存在版本不匹配的問題。
初步排查:環(huán)境 & CUDA 版本
首先,我們檢查一下環(huán)境和 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
發(fā)現(xiàn)了兩個(gè)關(guān)鍵信息
nvcc --version系統(tǒng)安裝的 CUDA 版本是 12.3。nvidia-*虛擬環(huán)境安裝的 nvjitlink 版本號為 12.4.127。
根據(jù)錯誤信息可知,PyTorch 虛擬環(huán)境中的動態(tài)庫 libcusparse.so.12 需要的正是 libnvJitLink.so.12 的 __nvJitLinkComplete_12_4 版本,pip 安裝的依賴包版本自身沒有問題,因此推測可能錯誤鏈接到了系統(tǒng)中 CUDA 12.3 的 libnvJitLink.so.12。
分析:動態(tài)鏈接庫加載路徑
為了驗(yàn)證猜想,我們使用 patchelf 和 ldd 命令查看 libcusparse.so.12 的動態(tài)鏈接狀態(tài):
(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 被加載到了系統(tǒng) CUDA 目錄 (/usr/local/cuda/lib64) 下,而不是預(yù)定義的 PyTorch 虛擬環(huán)境的目錄。
問題根源:LD_LIBRARY_PATH 優(yōu)先級
(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ echo $LD_LIBRARY_PATH /usr/local/cuda/lib64:
至此,問題根源已經(jīng)明確:LD_LIBRARY_PATH 環(huán)境變量導(dǎo)致系統(tǒng) CUDA 庫路徑優(yōu)先于 PyTorch 虛擬環(huán)境的 CUDA 庫路徑被加載。這導(dǎo)致了版本不匹配,PyTorch 無法找到所需的符號。
解決方案:unset LD_LIBRARY_PATH
解決這個(gè)問題最直接的方法就是移除 LD_LIBRARY_PATH 對系統(tǒng) CUDA 路徑的設(shè)置:
(modelforger) wangh@ubuntu:~/codes/ModelForger/.venv/lib/python3.12/site-packages/nvidia/cusparse/lib$ unset LD_LIBRARY_PATH
再次查看 libcusparse.so.12 的動態(tài)鏈接:
(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)
現(xiàn)在,libnvJitLink.so.12 正確地加載到了 PyTorch 虛擬環(huán)境的目錄下。
驗(yàn)證:問題解決
(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 成功!問題解決。
最佳實(shí)踐與總結(jié)
- 避免全局設(shè)置 LD_LIBRARY_PATH: 在全局環(huán)境變量(如 .bashrc 或 .bash_profile)中設(shè)置 LD_LIBRARY_PATH 會干擾虛擬環(huán)境的獨(dú)立性。
- 理解動態(tài)鏈接機(jī)制: 了解 LD_LIBRARY_PATH 的作用以及動態(tài)鏈接庫的加載順序,有助于快速定位和解決類似問題。
以上就是PyTorch環(huán)境中CUDA版本沖突問題排查與解決方案的詳細(xì)內(nèi)容,更多關(guān)于PyTorch CUDA版本沖突的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python multiprocessing多進(jìn)程原理與應(yīng)用示例
這篇文章主要介紹了Python multiprocessing多進(jìn)程原理與應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了基于multiprocessing包的多進(jìn)程概念、原理及相關(guān)使用操作技巧,需要的朋友可以參考下2019-02-02
Python深度學(xué)習(xí)albumentations數(shù)據(jù)增強(qiáng)庫
下面開始albumenations的正式介紹,在這里我強(qiáng)烈建議英語基礎(chǔ)還好的讀者去官方網(wǎng)站跟著教程一步步學(xué)習(xí),而這里的內(nèi)容主要是我自己的一個(gè)總結(jié)以及方便英語能力較弱的讀者學(xué)習(xí)2021-09-09
Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫
這篇文章主要介紹了Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2016-10-10
Python中的print()?函數(shù)和格式化操作方法
?print()?函數(shù)和字符串格式化是每個(gè)Python開發(fā)者必須掌握的基礎(chǔ)技能,從簡單的%?操作符到強(qiáng)大的f-string,Python一直在進(jìn)化,讓我們的編碼工作變得更加愉快和高效,本文介紹Python中的print()函數(shù)和格式化操作方法,感興趣的朋友一起看看吧2025-10-10
Python Django 數(shù)據(jù)庫的相關(guān)操作詳解
下面小編就為大家?guī)硪黄猟jango數(shù)據(jù)庫的相關(guān)操作,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-11-11
Python實(shí)現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解
這篇文章主要為大家介紹了Python實(shí)現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

