• 给mocdetector(centernet)配置环境的艰难过程


    最近在做动作的时空检测,想跑一下2020ECCV的moc-detector,这篇论文提供了源码(github链接)。

    原以为有源码,那么跑起来会比较顺利,没成想在配置环境上,遇到了好多坑,前后花了两天时间,总共尝试了5论,最后才成功跑起来。

    其中的主要难点来源于可变形卷积(DCNv2)的安装。

    在描述痛苦的五轮环境配置尝试之前,我先把经验教训介绍一下:

    1. 如果一个项目所用的python、pytorch、cuda等包和软件版本很旧的话,去github找找,看一下有没有人用较新的包实现该论文的代码,有的话,建议采用新的;
    2. 跑别人的模型代码,一定要地遵循他们提供的installation说明,比如python、pytorch、cuda等包和软件的版本要一致,建议新建一个docker容器。如果觉得新建一个docker容器有点麻烦,那至少需要在已有docker容器中,新建一个conda环境,把包和软件等版本和论文的installation要求保持一致;
    3. 遇到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等等。这里有两点经验:

    1. 建议拉取各种软件齐全的镜像,虽然会比较大,下载时间长一点,但是免去了自己安装conda等软件的繁琐过程,并且安装这些软件实际上还是需要一个下载过程;
    2. 记得即使把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点出去吃了个饭,中间除了上卫生间,没有离开过实验室。唉。

    但所幸,学到了一点东西,总结一点经验教训。

  • 相关阅读:
    Chapter 23: Termination Handlers(2)Understanding Termination Handlers by Example(6)
    【原】常用HTML
    [导入]化州特产~
    [导入]又大一岁,自己祝自己生日快乐~
    [导入]新视觉LOGO~
    [导入]看清楚中国移动的新旧资费
    [导入]AJAX .NET版本之间的区别
    泛型简介
    关于MongoDB的group分组
    【javascript继承】之——原型链继承和类式继承
  • 原文地址:https://www.cnblogs.com/picassooo/p/16488616.html
Copyright © 2020-2023  润新知