问题描述
源码编译的pytorch 2.3.0,加pip安装的torchvision 0.18.0,在import torchvision时报错:
但使用pip安装的pytorch 2.3.0,就没有问题。
pip安装的pytorch为什么不会出错
从下面这张图片中可以看到,即使是使用pip安装的pytorch,torchvision::nms也不是一开始就有的。而是在import torchvision过程中动态添加进去的。
那么torchvision::nms是什么时候开始有的?
写一个python脚本,这个脚本中只有下面一行:
import torchvision
在vscode中开启调试。
经过调试,可以找到,是在下图中这一行把torchvison::nms加进来的。
load_library前:
load_library后:
(注:即使安装同样的软件环境:miniconda3 + torch2.3.0 + torchvision0.18.0,我在两台台式机上结果为True,在虚拟机和笔记本上结果为False,原因未知)。
源码编译的pytorch为什么会出错
现在换成源码编译的pytorch,开启调试。
可以看到load_library出现了异常。
在Debugger窗口检查变量:
错误原因是有未定义符号。
查看这个符号的名字:
看看libtorch_cpu.so中有没有这个符号:
可以看到libtorch_cpu.so中虽然有这个符号,但多了[abi:cxx11]修饰。
那么pip安装的torch中的符号是什么样的?
可以看到这里的符号是不带[abi:cxx11]后缀的。
所以出错原因找到了,是因为源码编译pytorch的时候开启了_GLIBCXX_USE_CXX11_ABI宏(这个宏默认是开启的)。
解决方法
编译时关闭_GLIBCXX_USE_CXX11_ABI宏
export GLIBCXX_USE_CXX11_ABI=0
python3 setup.py develop
注意环境变量前不带下划线”_“。
如果你的libtorch还依赖了其他源码编译的c++库,那这个库也要关掉_GLIBCXX_USE_CXX11_ABI宏。但若是C库或者所有的接口都是C接口,那就不受影响。