問題描述
源碼編譯的pytorch 2.3.0,加pip安裝的torchvision 0.18.0左痢,在import torchvision時報錯:
但使用pip安裝的pytorch 2.3.0仰楚,就沒有問題职员。
pip安裝的pytorch為什么不會出錯
從下面這張圖片中可以看到敦姻,即使是使用pip安裝的pytorch,torchvision::nms也不是一開始就有的崔梗。而是在import torchvision過程中動態(tài)添加進去的。
那么torchvision::nms是什么時候開始有的垒在?
寫一個python腳本蒜魄,這個腳本中只有下面一行:
import torchvision
在vscode中開啟調(diào)試。
經(jīng)過調(diào)試场躯,可以找到谈为,是在下圖中這一行把torchvison::nms加進來的。
load_library前:
load_library后:
(注:即使安裝同樣的軟件環(huán)境:miniconda3 + torch2.3.0 + torchvision0.18.0踢关,我在兩臺臺式機上結(jié)果為True伞鲫,在虛擬機和筆記本上結(jié)果為False,原因未知)签舞。
源碼編譯的pytorch為什么會出錯
現(xiàn)在換成源碼編譯的pytorch榔昔,開啟調(diào)試。
可以看到load_library出現(xiàn)了異常瘪菌。
在Debugger窗口檢查變量:
錯誤原因是有未定義符號撒会。
查看這個符號的名字:
看看libtorch_cpu.so中有沒有這個符號:
可以看到libtorch_cpu.so中雖然有這個符號,但多了[abi:cxx11]修飾师妙。
那么pip安裝的torch中的符號是什么樣的诵肛?
可以看到這里的符號是不帶[abi:cxx11]后綴的。
所以出錯原因找到了,是因為源碼編譯pytorch的時候開啟了_GLIBCXX_USE_CXX11_ABI宏(這個宏默認是開啟的)怔檩。
解決方法
編譯時關(guān)閉_GLIBCXX_USE_CXX11_ABI宏
export GLIBCXX_USE_CXX11_ABI=0
python3 setup.py develop
注意環(huán)境變量前不帶下劃線”_“褪秀。
如果你的libtorch還依賴了其他源碼編譯的c++庫,那這個庫也要關(guān)掉_GLIBCXX_USE_CXX11_ABI宏薛训。但若是C庫或者所有的接口都是C接口媒吗,那就不受影響。