问题描述
使用MMDetection复现论文,出现如下Bug:
ImportError:/home/quaiping/anaconda3/lib/python3.7/site-packages/mmcv/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe28TypeMeta21_typeMetaDataInstanceIdEEPKNS_6detail12TypeMetaDataEv
原因分析:
mmcv官网点明了如何去判断并解决这类问题:
我这里稍微解释一下:
当报错中出现:“undefined symbol”或者“cannot open xxx.so”时,你可以从以下三个方面去考虑:
1.如果“undefined symbol”后面出现的是CUDA/C++ symbols, 具体来说,就是有Libcudart.so/GLIBXX类似内容,就检查CUDA/GCC运行时和编译mmcv时,是不是同一个版本。
补充:可能会有人问,如何去检查?
如果你是直接源码安装mmcv,或者通过pip install mmcv命令安装,那么mmcv在安装过程中有一个编译的过程,你只要保证这个过程的环境与最后运行代码的环境一致,就不会出问题。
如果你是通过下载编译好的whl文件去安装mmcv,就是通过类似命令:pip install mmcv-full==1.3.0 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.8.0/index.html,那么你就去检查,你运行代码的环境中的cuda是不是与命令中的cu版本一致,查看自己环境的cuda版本命令:nvcc -V
很明显,我使用命令后,显示版本号为10.1,与cu101一致,如果你的结果不一致,就按照你自己环境中的cuda版本(红框中中对应的版本)去下载对应版本的mmcv.
2.如果“undefined symbol”后面出现的是Pytorch symbols,具体来说就是有caffe, aten, TH等内容,你就要检查你的环境中的pytorch版本与编译mmcv时使用的pytorch是否一致。
补充:
检查自己环境的pytorch:命令行依次键入:python
import torch
print(torch.--version--)
检查编译mmcv时的环境:看你通过pip install mmcv-full==1.3.0 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.8.0/index.html安装mmcv时,torch是不是与你自己环境相对应。
3.进入目录./mmdet/utils ,运行python collect_env.py,查看PyTorch, torchvision, and MMCV 是否在同一个环境下运行。
解决方案:
很显然,我的bug属于第2种情况: _ZN6caffe28TypeMeta21_typeMetaDataInstanceIdEEPKNS_6detail12TypeMetaDataEv,我的undefined symbol后面出现了caffe字符,这时候需要我去检查我的pytorch版本。
我个人环境的pytorch版本为1.8.0,安装的mmcv是通过1.6.0的pytorch编译的,卸载1.6.0版本ptytorch编译的mmcv,安装对应1.8.0版本的mmcv就行了。