PyTorch環(huán)境中CUDA版本沖突問題排查與解決方案
引言
在使用 PyTorch 進行深度學習開發(fā)時,CUDA 版本兼容性問題是個老生常談的話題。本文將通過一次真實的排查過程,剖析 PyTorch 虛擬環(huán)境自帶 CUDA 運行時庫與系統(tǒng)全局 CUDA 環(huán)境沖突的場景,并一步步分析問題、定位原因,并最終給出解決方案。
問題復現(xiàn):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
,這通常意味著存在版本不匹配的問題。
初步排查:環(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)了兩個關鍵信息
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)鏈接庫加載路徑
為了驗證猜想,我們使用 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
) 下,而不是預定義的 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)境變量導致系統(tǒng) CUDA 庫路徑優(yōu)先于 PyTorch 虛擬環(huán)境的 CUDA 庫路徑被加載。這導致了版本不匹配,PyTorch 無法找到所需的符號。
解決方案:unset LD_LIBRARY_PATH
解決這個問題最直接的方法就是移除 LD_LIBRARY_PATH 對系統(tǒng) CUDA 路徑的設置:
(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)境的目錄下。
驗證:問題解決
(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: 在全局環(huán)境變量(如 .bashrc 或 .bash_profile)中設置 LD_LIBRARY_PATH 會干擾虛擬環(huán)境的獨立性。
- 理解動態(tài)鏈接機制: 了解 LD_LIBRARY_PATH 的作用以及動態(tài)鏈接庫的加載順序,有助于快速定位和解決類似問題。
以上就是PyTorch環(huán)境中CUDA版本沖突問題排查與解決方案的詳細內(nèi)容,更多關于PyTorch CUDA版本沖突的資料請關注腳本之家其它相關文章!
相關文章
django 前端頁面如何實現(xiàn)顯示前N條數(shù)據(jù)
這篇文章主要介紹了django 前端頁面如何實現(xiàn)顯示前N條數(shù)據(jù)。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03django model通過字典更新數(shù)據(jù)實例
這篇文章主要介紹了django model通過字典更新數(shù)據(jù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04