最近在做动作的时空检测,想跑一下2020ECCV的moc-detector,这篇论文提供了源码(github链接)。
原以为有源码,那么跑起来会比较顺利,没成想在配置环境上,遇到了好多坑,前后花了两天时间,总共尝试了5论,最后才成功跑起来。
其中的主要难点来源于可变形卷积(DCNv2)的安装。
在描述痛苦的五轮环境配置尝试之前,我先把经验教训介绍一下:
- 如果一个项目所用的python、pytorch、cuda等包和软件版本很旧的话,去github找找,看一下有没有人用较新的包实现该论文的代码,有的话,建议采用新的;
- 跑别人的模型代码,一定要地遵循他们提供的installation说明,比如python、pytorch、cuda等包和软件的版本要一致,建议新建一个docker容器。如果觉得新建一个docker容器有点麻烦,那至少需要在已有docker容器中,新建一个conda环境,把包和软件等版本和论文的installation要求保持一致;
- 遇到bug,要及时把bug贴到网上,查找答案,这样会比自己在那里瞎想更快找到解决办法,特别是自己的经验比较少的时候。
下面介绍我经历的五轮环境配置尝试。
第一轮尝试:太过随意,当场被打脸
这一轮环境配置中,我比较随意,选了一个常用的docker容器中的常用的conda环境,把源码下载下来,开始跑。发现在关于DCNv2的import会报错,错误长这样:
File "XXXX/src/lib/models/networks/DCNv2/dcn_v2.py", line 13, in <module> import _ext as _backend ModuleNotFoundError: No module named '_ext'
然后我在网上搜索了一顿,找了各种答案,包括删除build.py,重新执行python setup.py等等,但就是不行,然后开始了第二轮尝试。
第二轮尝试:新建环境,依然不行
经过第一轮被打脸,这一次学乖了,按照官方提供的代码项目中的installation指导(链接),新建conda环境,在环境中安装各种包,版本都按要求来。其中因为要求的python的版本是3.5.2,非常老,python官网已经不再支持了,所以conda和pip都安装不了,离线安装的方法也试了,也没成功,最后在Stack Overflow上找到一个办法,详见链接。
最后一步的bash make.sh也成功了,这一次没有报 No module named '_ext' 错误了,但报了另一个错误,这个错误的具体内容我忘了,但是网上搜索的结果显示,是cuda版本对不上,我的cuda版本是10.2,代码要求cuda9.0。
所以,这一轮尝试,我没注意到了cuda也要保持版本一致,被教做人了。
第三轮尝试:同一个doker容器中,安装多个版本的cuda
网上比较了很多安装多个版本的cuda并进行切换的教程,最后选择了下面两个学习和执行:
Ubuntu18.04安装NVIDIA显卡驱动、cuda10.1以及cudnn-10.1-7.6.4_薛定猫的谔w的博客-CSDN博客_anzhuangcudnn
Linux多CUDA版本共存并切换使用_薛定猫的谔w的博客-CSDN博客_linux 多cuda
然后安装好了cuda9.0,满心欢喜的去跑程序,发现还是报错,和第二轮一样的错。
第四轮尝试:拉镜像,建容器,建环境
一个朋友建议我拉取一个包含了cuda9.0的容器镜像,用这个镜像新建一个docker容器。然后,我去docker hub输入关键词cuda9.0,选了个镜像,拉取下来,开始新建容器,安装conda等等。这里有两点经验:
- 建议拉取各种软件齐全的镜像,虽然会比较大,下载时间长一点,但是免去了自己安装conda等软件的繁琐过程,并且安装这些软件实际上还是需要一个下载过程;
- 记得即使把conda、nvcc等添加到环境变量中去。添加环境变量的文件一般是 /etc/bash.bashrc,当然也有例外。好像用export命令也可以。
在根据镜像建容器时,因为粗心,在命令行最后没写 /bin/bash,导致ssh远程连接出了问题,当时根据网上的各种搜索结果,我重新拉取了多个镜像,创建了多个容器,最后才意识到,是自己在创建docker容器时输入命令不完整。从这里要学到一个教训,做事一定要非常仔细。
最后,终于建好了conda环境,根据论文代码的installation要求安装好了各种包,bash make.sh也成功了。然后运行代码python train.py,这时不再报import相关的错误了。我终于看到曙光了!
然后打开vscode,开始跑程序,为了熟悉程序,我开启了debug模式,这时遇到问题了,python版本太老了,是3.5.2版本,vscode的debug不能适配,我尝试把debug等回滚到以前的版本,依然不支持。
这时,我想到的一个办法是,用pycharm来做编辑器,抛开vscode,因为我有个pycharm2020 professional版本的。果然,用pycharm2020可以debug。
到这里,我终于可以真正的进入读代码和改代码阶段了,内牛满面!
第五轮尝试:有没有更新的moc-detector实现版本
上述遇到的很多问题,是与论文官方提供的代码所要求的包和软件版本很旧有关,在第四轮尝试中,当vscode不支持python3.5.2的debug时,我想到能不能去找找有没有更新的moc-detector实现版本(这个想法来的真是太迟了,为什么早没想到呢?!)。在github上一搜,果然有,有python3.6-pytorch1.4-cuda10.1的实现代码(链接),然后我就按照新的实现版本的安装要求,新建环境,安装包等等,最后python setup.py build develop出了点问题,关于nvcc的,但是因为有上述几轮的经验,很快解决了这个问题。
最后的最后,终于可以在vscode 里debug moc-detector代码了!!!
拉拉杂杂写了这么多,但是上述各种坑只是我这次遇到的所有坑中一小部分,很多小坑略过了,整个周末啊,都花在上面了,今天上午9点到实验室,肝到下午5点出去吃了个饭,中间除了上卫生间,没有离开过实验室。唉。
但所幸,学到了一点东西,总结一点经验教训。