序言

最近在做镜像瘦身,之前的同事把docker打的太大了,20个G。。。所以需要重新打一个纯净版image,然后把之前的模型重新部署到新image中,但是有一个模型用到了DCNv2(这玩意编译太烦了,建议少用),不得已,需要在docker中进行编译后才能使用,在服务器外面编译的时候非常顺利,一步到位。但是在docker中好像一切并不是特别顺利,坑一个接着一个,来来去去搞了好几天,所以特别记录下来。

编译DCNv2

按照正常流程,将DCNv2下载下来后,cd进入DCNv2目录,运行:

python setup.py build develop

正常编译的话,就可以直接得到编译的结果的。但是…
记一次docker编译DCNv2吐血的踩坑记录_linux
好吧,问题不大,按照网上的解决方案,将/home/user/miniconda/lib/python3.8/site-packages/torch/utils/cpp_extension.py里的[‘ninja’,’-v’]改成[‘ninja’,’–version’]即可。
记一次docker编译DCNv2吐血的踩坑记录_python_02
但是…会提示找不到这些文件:dcn_v2_im2col_cuda.o、dcn_v2_cuda.o、dcn_v2_psroi_pooling_cuda.o,如果你修改后–version后把build删除重新编译,连cpu的.o也没有编译出来,如下两图
记一次docker编译DCNv2吐血的踩坑记录_ico_03记一次docker编译DCNv2吐血的踩坑记录_linux_04
这个问题给我整破防了,网上看到很多类似的提问,但是没有一个靠谱的回答,这也是我找到原因后,立马想写一篇文章记录一下的原因。到底是哪里出了问题呢?回退到第一次编译,就是没修改–version前,第一次运行python setup.py build develop的时候,输出了很多信息,沿着信息往上找,当时只看到了[‘ninja’,’-v’]这个报错,就没再往上翻,没想到,上面还有error!!玛德法克惹!!
记一次docker编译DCNv2吐血的踩坑记录_解决方案_05记一次docker编译DCNv2吐血的踩坑记录_ico_06
记一次docker编译DCNv2吐血的踩坑记录_python_07
这里编译没通过啊…/bin/sh: 1: /usr/local/cuda/bin/nvcc: not found

不可能找不到nvcc啊,docker里面不自带嘛?

然后去找了一下,挖槽,还真没有!下错镜像了。。。白搞了
记一次docker编译DCNv2吐血的踩坑记录_解决方案_08
正常情况下是这样的
记一次docker编译DCNv2吐血的踩坑记录_解决方案_09

我最开始拉的镜像是anibali/pytorch1.5.0-cuda10.2-ubuntu18.04,这个版本应该是属于runtime,nvcc作为cuda的编译器,在这个镜像中是不提供的。

所以从一开始就错了,白搞了。不过总算知道问题的所在了。

重新pull镜像,应该pull devel版本的,所以我重新pull了这个:

docker pull pytorch/pytorch:1.5-cuda10.1-cudnn7-devel

可以看到pull下来后比之前的大了很多,所以这里建议如果不是必须要用DCNv2模型的,还是少用。免得部署时一堆问题。
记一次docker编译DCNv2吐血的踩坑记录_解决方案_10

run进去看看,有没有nvcc,看到了曙光有木有!!
记一次docker编译DCNv2吐血的踩坑记录_python_11
然后继续cd到DCNv2编译,运行python setup.py build develop:
记一次docker编译DCNv2吐血的踩坑记录_解决方案_12
我枯了,太顺利了吧!!不到一分钟的编译时间,我整了两天!!!终于成功了。