从P100将CenterNet移植到P4上运行,遇到一些问题,解决起来很棘手,记录下来。
P100环境:
CUDA 10.0
gcc版本 7.3.0
pytorch 1.0.1
P4原始环境:
CUDA 9.0
gcc版本 4.8.5
pytorch 1.1.0
移植步骤:
- 代码拷贝
- 数据移植
- 配环境
遇到的问题及解决方法:
1.运行代码时DCNv2报错:
Installation issue: undefined symbol: __cudaPopCallConfiguration · Issue #19 · rusty1s/pytorch_scatter
原因:编译DCNv2时的cuda版本和编译pytorch的时候不一样
解决方法:不能直接用移植的代码,重新下载CenterNet中DCNv2库。
2.运行代码的时候DCNv2报错如下:
PyTorch no longer supports this GPU because it is too old.
原因:pytorch的版本和CUDA版本不对应
解决方法:需要在安装pytorch的时候确认版本和cuda版本对应,必要的话使用pytorch官网给出的命令。如果cuda环境有变化,需要重新安装pytorch。可以用 'torch.cuda.is_available()' 确定cuda版本的pytorch是否安装正确。
还有一种方法是升级驱动。
3.运行时报错Segmentation fault
原因:使用faulthandler调试加打印输出,发现问题出在DCNv2的库中,但是库编译时没有报错。
解决方法:一开始用的解决方法是,从原作者DCNv2库中下载,因为pytorch1.1.0的变化,改变其中一行代码,重新编译。编译未报错,但运行仍有问题。
后来发现是gcc有问题,gcc在4.9.0以上才能正确编译pytorch,而以下的版本编译不会报错,但是使用有问题,因此升级gcc到4.9.4版本。
4.运行代码时报错如下:
undefined symbol: _ZN3c105ErrorC1 ENS_14SourceLocationERKSs
原因:pytoch中 _GLIBCXX_USE_CXX11_ABI为1,但是c++编译是 _GLIBCXX_USE_CXX11_ABI为0,因此对不上
实际原因是pytorch编译时候用到的gcc与代码中c++库用到的gcc版本不同
解决方法:
卸载conda,重新安装conda,此时conda环境用到的gcc与c++编译库时版本一样。
问题解决。