寒假期间,研读了王立民老师的论文,决定去复现其文章中的代码:https://github.com/MCG-NJU/MOC-Detector。由于自己的显卡太过于垃圾,因此我将代码git到了学校的集群环境。但是在复现过程中仍出现很多问题。下面我将自己遇到的问题以及解决方法分享给大家,供参考。如有不足,希望大家补充。
实验环境
该代码在github上说明的环境是:
Ubuntu 16.04.1, Python 3.5.2, PyTorch 0.4.1, torchvision 0.2.1,NVIDIA TITAN XP with cuda 9.0。
刚开始在运行的时候,按照Readme创建了MOC的conda环境,环境的设置与github保持一致。但在执行make.sh的时候出现了几个错误:
(1)TypeError: dist must be a Distribution instance
出现这个错误,网上很多方案都是将setuptools降低到0.9.8,但是这个方法对我无效。在查看多个方案之后,最后的方法是将gcc降低到5.5.0。可能会有小伙伴有疑问,为什么会把gcc降低到5.5.0,实际上这个错误是与py35有关,
python3.7/distutils/cmd.py", line 57, in __init__
raise TypeError("dist must be a Distribution instance")
这是报错的原话。
如果大家选择更新pytorch那么这个问题任然会有,而且还会产生另外一个错误:ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
这个问题,有的博主也做了说明,这个是版本问题,高版本的语法规则改变了,因此做相应替换就可以了。但是,如果你觉得改代码麻烦,那就选择pytorch=0.4.1。
所以,上面的问题,用的方法就是将gcc降低到5.5.0,然后运行make.sh就可以了。至于你愿不愿意改代码,看个人喜好。如果你把orch.utils.ffi的相关代码改动了,在train的时候还会有no moudule _ext的问题出现。
(2)ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
这个问题参考一下博客:
https://blog.csdn.net/ShuqiaoS/article/details/88420326
说的十分详细。
**
在train的时候可能会遇到
**
(1)ImportError: /cm/shared/apps/gcc5/5.5.0/lib64/libstdc++.so.6: version `GLIBCXX_3.4.22’ not found
这个问题的产生就是因为我们在 bash make.sh的时候将gcc降到了5.5.0,低版本对应的GLIBCXX没有到3.4.22,然后你如果用gcc6.5.0,那么报错则是ImportError: /cm/shared/apps/gcc5/5.5.0/lib64/libstdc++.so.6: version `GLIBCXX_3.4.26’ not found。所以最好的办法是将gcc升高点,我采用的是gcc9.2.0,这样train的这个报错就解决了
(2)依旧是train的时候,ImportError: cannot import name '_wrap_function’
这个问题就比较尴尬了。就是我问题二写的那里,如果只是替换部分代码可能对make.sh没影响,但是在train的时候会报错。这个问题该怎么解决呢,最好的办法是重写DCNv2的代码(我将这个代码重写了,当然是参照网上)。如果不愿意重写,那么你的pytorch就用0.4.1,显卡可能要低一点,20系列之下的应该都可以用。如果拟采用30系列的显卡去训练,那我还是推荐你去重写DCNv2的代码。
(3)ImportError: No module named '_ext’
这个问题是因为我重写的DCNv2代码,参考https://github.com/CharlesShang/DCNv2/issues/96。新修改的代码在build后生成了.so文件,但是没改名,所以才报错。解决办法就是在 ${MOC_PATH}/src/network/DCNv2下面创建一个ext文件夹,然后在ext文件夹下再创建一个dcn_v2文件夹,然后将生成的.so文件cp到这个文件夹下。这样这个问题就解决了
(4)RuntimeError: cuda runtime error (11) : invalid argument at /opt/conda/conda-bld/pytorch_15354919743
这个是因为cuda版本问题,对于30系列的显卡或者20系列的显卡,这个问题最好的解决方案就是重写DCNv2,将pytorch升级到1.4+。这里参考了https://blog.csdn.net/neudeep/article/details/113058729。我私聊该博主了,但是并没有回复我,所以我自己修改了DCNv2的代码,使得它可以兼容pytorch1.x的版本。
(5)undefined symbol: _ZN2at19UndefinedTensorImpl10_singletonE
这是由于torch的cuda版本和机器的cuda版本不同导致。利用conda install pytorch=1.5就可解决啦,如果不放心那就参考pytorch的官方安装指令。
我遇到的大概就这几个问题,核心就是修改DCNv2的代码(一劳永逸)。