RTX3080在Ubuntu 20.04复现yolact

1. 背景:

        刚入门CV和deep learning几个月,想复现一下yolact++,最初的计划是在实验室电脑搭建环境复现,后来发现RTX3080显卡只支持CUDA11,那么能下载的pytorch最低版本是1.7,于是搭建了一个pytorch1.7的环境,调了一堆的bug把DCNv2跑通了,但是测试的时候还是寄了,好像是GPU算力匹配的问题。后来在显卡为MX250的笔记本Windows环境下配置成功了,就是帧率感人,实时识别只有3~4fps,原论文的效果是30+fps。还是得想办法在实验室主机复现,于是就有了下文。


2. 之前卡住的地方

输入:

python eval.py --trained_model=weights/yolact_plus_base_54_800000.pth
 --score_threshold=0.15 --top_k=15 --image=my_image.png

报错

1、error in modulated_deformable_im2col_cuda: 
no kernel image is available for execution on the device

2、RuntimeError: cublas runtime error : 
the GPU program failed to execute at /pytorch/aten/src/THC/THCBlas.cu:309

        网上搜了一圈,两个error主要问题基本都是版本匹配的问题,要么说是pytorch版本太高,要么说是pytorch和cudatoolkit版本不匹配。我在这个环境里的配置是torch1.7.1+cu110。心想这个环境被装来装去已经变成臭水沟了,还是另起炉灶从头再来吧。


3. 准备

3.1 低版本pytorch成功实现的环境配置

        心想着既然Windows在低版本复现成功了,那就把pytorch相关包以外的功能包版本先照搬过来,先无脑截图了pip list和conda list。

         大致看了一下,跟pytorch无关的包主要有以下几个大概会被用到:Python==3.7, Matplotlib==3.5.3, Opencv-python==4.6.0, Numpy==1.21.6, Pillow==5.4.1, Pip==22.2.2, H5py==3.1.0, Pycocotools==2.0.4,记得在Windows搭环境过程中这些包基本都是下载默认版本的,除了pillow需要卸掉下载5.4.1版本,这个时候会提示pillow和matplotlib版本不匹配,在Windows里略过就是了,在Ubuntu里还是得下Matplotlib==3.1.0避免冲突。在Windows环境下还需要下载一下VS2017,提供C++的支持。

        跟pytorch相关的包就主要有这几个了:Cudatoolkit==10.0, Cudnn==7.6.5, Torch==1.2.0+cu92, Torchvision==0.4.0+cu92。

3.2 调研

        在搭建环境前还是先找篇成功实现的博文参考参考:[深度学习 - 目标检测 ] yolact 环境配置_南城同学的博客-CSDN博客_yolact环境配置

        这篇博文采用的也是较高版本的pytorch和cuda,但是只实现了yolact。

【DCNv2踩坑记录】Windows10 + RTX3060 + cuda11.0 + pytorch1.7.1成功编译_头发总是会长的的博客-CSDN博客_dcnv2代码

        DCNv2是实现yolact++的重要一环,这篇博文是我第一次尝试时参考的,用的是一样的配置,只是人家在Windows成功了,我在Ubuntu寄了,但还是很有参考价值。我的报错在评论区有人提到了,楼主建议更换CUDA版本,于是打算把CUDA11.0换成11.1再试一次。

https://www.researchgate.net/publication/360133572_Real-Time_Instance_Segmentation_of_Metal_Screw_Defects_Based_on_Deep_Learning_Approach

        这篇文章用的是RTX3080Ti的显卡,在Win10系统实现了yolact,也有一定借鉴意义,文章里的python版本是3.7,CUDA应该是11.1(原文可能写错了),pytorch1.9.0。


4. 正式开始搭建环境

conda创建虚拟环境

conda create -n yolact python=3.7
conda activate yolact

安装依赖

pip install cython opencv-python pillow==5.4.1 pycocotools matplotlib==3.1.0

安装pytorch

pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html

pip安装避免DCNv2编译报错

安装CUDA11.1

安装pytorch的同时顺便装一下CUDA11.1,之前只安装了CUDA11.0和11.3。

CUDA Toolkit 11.1.0

wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cuda_11.1.0_455.23.05_linux.run
sudo sh cuda_11.1.0_455.23.05_linux.run

CUDA创建软链接

sudo gedit ~/.bashrc 

添加如下内容。

export PATH=/usr/local/cuda-11.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

打开终端:

sudo rm -rf /usr/local/cuda    #删除之前创建的软链接
sudo ln -s /usr/local/cuda-11.1 /usr/local/cuda    #创建链接到cuda11.1的软链接

到这里环境基本配置好了,可以开始试试效果了。


5. 试验yolact效果

git clone https://github.com/dbolya/yolact.git
cd yolact

yolact github 地址:

https://github.com/dbolya/yolact#installation

在github里下载模型,我先试了试yolact_resnet50_54_800000.pth模型,在yolact文件夹下新建的weights文件夹里放入模型,然后在yolact文件夹下放一张测试图片。

python eval.py --trained_model=weights/yolact_resnet50_54_800000.pth --score_threshold=0.15 --top_k=15 --image=my_image.png:output.png

可以在yolact文件夹下找到输出结果:

 OK,至此yolact已经成功复现,下面还有一场硬仗要打:复现yolact++。

6. DCNv2编译

相较于yolact,yolact++需要额外编译DCNv2包。

首先按照github的教程编译一下:

cd external/DCNv2
python setup.py build develop

不出所料地报错:

/home/lin/CV_AI_learning/yolact/external/DCNv2/src/cuda/dcn_v2_cuda.cu(107): error: identifier "THCState_getCurrentStream" is undefined

/home/lin/CV_AI_learning/yolact/external/DCNv2/src/cuda/dcn_v2_cuda.cu(279): error: identifier "THCState_getCurrentStream" is undefined

/home/lin/CV_AI_learning/yolact/external/DCNv2/src/cuda/dcn_v2_cuda.cu(324): error: identifier "THCudaBlas_Sgemv" is undefined

3 errors detected in the compilation of "/home/lin/CV_AI_learning/yolact/external/DCNv2/src/cuda/dcn_v2_cuda.cu".
error: command '/usr/local/cuda-11.0/bin/nvcc' failed with exit code 1

因为pytorch1.8版本太高了,DCNv2在低版本的pytorch用的函数在高版本有所改动。

下载高版本pytorch适配的DCNv2包:

GitHub - MatthewHowe/DCNv2: Deformable Convolutional Networks v2 with Pytorch

下载该工程,将DCN目录下的dcn_v2.py文件移动到上层,和make.sh文件放在同一级目录,然后执行:./make.sh,可以编译成功。

在之前CUDA11.0的环境中运行如下代码可编译成功:

python DCN/testcpu.py

但是运行如下代码:

python DCN/testcuda.py

报错:

error in modulated_deformable_im2col_cuda: no kernel image is available for execution on the device
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`

网上查了一下,原因基本都是CUDA版本匹配的问题。

无奈之下又得重开环境,但是试了一下发现报了新的错

(yolact) lin@lin-System-Product-Name:~/CV_AI_learning/yolact/external/DCNv2/DCN$ python testcpu.py 
Traceback (most recent call last):
  File "testcpu.py", line 11, in <module>
    from dcn_v2 import dcn_v2_conv, DCNv2, DCN
  File "/home/lin/CV_AI_learning/yolact/external/DCNv2/dcn_v2.py", line 13, in <module>
    import _ext as _backend
ImportError: /home/lin/CV_AI_learning/yolact/external/DCNv2/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe28TypeMeta21_typeMetaDataInstanceIdEEPKNS_6detail12TypeMetaDataEv

网上给了一些模棱两可的解释:可能是pytorch和cuda版本不匹配,虽然我完全按照pytorch官网的版本对应关系安装的,后续又试了多个环境,无功而返,蚌埠住了,打退堂鼓了。


做个小总结,这篇博文大致介绍了如何复现yolact,但是高版本pytorch复现yolact++未能成功,主要是DCNv2出错,网上有许多教程是在Win10实现了高版本pytorch对DCNv2的配置,如果有兴趣的朋友们对操作系统没有要求的话可以在Windows试试,ubuntu在RTX30系列显卡可能比较难编译DCNv2,仅一家之言,背后本质的原因还是需要大佬解惑。

猜你喜欢

转载自blog.csdn.net/astruggler/article/details/128062152