源代码链接: GitHub - xinntao/EDVR: Winning Solution in NTIRE19 Challenges on Video Restoration and Enhancement (CVPR19 Workshops) - Video Restoration with Enhanced Deformable Convolutional Networks. EDVR has been merged into BasicSR and this repo is a mirror of BasicSR.
我开始以为环境版本很重要,网上教程、github分析都在提供各种python、torch等匹配,但是经过我这四天血泪调试,现在发现版本是什么不重要。不同版本互相匹配很重要。
这篇文写之前我终于在RTX3090 + python3.6 + torch1.7.1 及 RTX2080 + python3.6 + torch1.4.1均编译成功。
1)pytorch 即使是相同的版本,下载时的cudatoolkit不同,也会导致最后算力不匹配。所以cudatoolkit需要和CUDA安装版匹配
2)如果要安装上述版本的cudatoolkit和pytorch,需要对python版本有要求,不然conda找不到下载源
3)不同pytorch版本支持的算力是不同的,需要匹配显卡硬件算力。
4)有服务器权限的话,可以CUDA版本不匹配。需要自己下载对应CUDA版本,然后软链接
5)算力不匹配的话,可以在~/.baschrc中限制显卡硬件算力(谨慎使用)。
以下是具体安装过程
3.1 了解服务器环境信息
我是在服务器上编译的,所以没有ROOT权限,所以CUDA版本、显卡算力这两个是不能变的。所以讲述会有种倒着推的感觉。
首先需要先知道这两个的信息
3.1.1 查询CUDA安装版本
1)使用命令
cat /usr/local/cuda/version.txt
2)直接进入CUDA安装地址
ls /usr/local
注意不是 nvidia-smi 出现的右上角那个CUDA版本
3.1.2 查询当前显卡算力
知道服务器安装的显卡型号后进入下网站查询。参考链接
CUDA GPU | NVIDIA Developer
有同学会问了,假如我连显卡型号都不知道呢?(比如我自己)
3.1.3 查询当前服务器安装显卡型号
1)如果已经安装了pytorch,可以使用命令行查询。参考链接
import torch
ng = torch.cuda.device_count() # 得到显卡数目
# 输出每块卡信息
[torch.cuda.get_device_properties(i) for i in range(ng)]
2)如果没有安装pytorch。参考链接
使用 lspci | grep -i nvidia 获得算力信息
然后将数字 1b06 复制到网站中
PCI devices
中查询。
此时已经知道CUDA安装版本和硬件算力。可以根据CUDA版本安装torch
比如CUDA==11.0, RTX3090 算力为 sm86
安装torch时命令为
conda install pytorch torchvision cudatoolkit==11.0
最重要的是先指定cudatoolkit和安装的相同
查看此时pytorch版本支持的算力
torch.cuda.get_arch_list() #当前版本pytorch支持的算力
如果算力能达到硬件算力,则匹配,否则不匹配。
比如我装pytorch==1.7.1 最大算力sm80,不能达到RTX3090需求,就不匹配。
不匹配有以下两种解决方法
1)限制显卡算力
进入~/.bashrc
添加 export TORCH_CUDA_ARCH_LIST="8.0"
这个8.0 就是限制的显卡算力
2)重装pytorch
可以在命令中添加pytorch环境
# 假如之前安装torch1.7.0仍达不到算力要求,就给torch添加条件
conda install pytorch>1.7 torchvision cudatoolkit==11.0
为啥我要现在才说给torch添加条件呢,因为一般条件太多conda找不到下载源。此时就要更换python版本,即下节。
那就要更换python版本。比如我python3.6.0只能装torch1.2.0 但是更换成python3.6.2时候可以安装torch1.4.0
这时有同学要问了,官方不是指定了cudatoolkit和torch版本的各对应关系吗?为什么不用官方的呢? 其实你们可以试试,但我会遇到以下问题。
1)官网指定通道,下速度慢。
2)如果不同官网通道,可能找不到cudatoolkit对应版本。比如torch1.8就没有cudatoolkit==11.0的。
3)我下载得到的 torchxxx+cu110 在编译DCNv2时会出现gcc g++什么鬼的问题。
此时cudatoolkit和 CUDA版本匹配, 同时安装的pytorch 能够支持硬件算力。环境已经基本没有问题。直接python setup.py develop 编译DCNv2就好。
这个就是算力不匹配的问题,按照上文说的1)限制显卡算力或者2)安装更高版本的torch
文章 说按照官网下载对应的torch,这种本没错,但在编译DCNv2时不限制CUDA匹配就会导致4.2的错误。
这个就是cuda安装的版本和cudatoolkit不匹配的错误。
有权限的大佬可以安装对应版本CUDA,然后建立软链接。比如下载的toolkit==11.2,目前安装的CUDA是11.0,可以自己安装个CUDA==11.2,然后通过ln链接到/usr/local 中。
没权限的我这种只能瑟瑟发抖的按照楼上去下载匹配版本。
为什么4.1时候链接的那篇文章说下载好pytorch 就行,因为他们不用编译这个 deformable_im2col 什么鬼的啊。
还有 error in deformable_col2im: invalid argument · Issue #13 · chengdazhi/Deformable-Convolution-V2-PyTorch · GitHub
这篇鬼里讲的更换代码,和我下载时候本来就一样好嘛,还怎么改
还有error in modulated_deformable_im2col_cuda: invalid device function · Issue #35 · CharlesShang/DCNv2 · GitHub
这篇鬼里讲的降低版本到torch1.1就好了。其实就不是torc版本问题好嘛,是你恰好下载的torch1.1和需要的cudatoolkit版本匹配了。所以很多人再问为啥我torch什么版本的还不行。因为还是和cudatoolkit和cuda不匹配。
比如说cuda是11.0, 那你下载torch1.7.1+cuda10.2就是不行,torch1.7.1+cuda11.0就行。torch1.8.1+cuda10.2就是不行,torch1.8.1+cuda11.0就行。和torch版本无关的
这就是3.3时候强装pytorch版本时候,和python不对应导致的。
差点忘了这个经常见得问题。这个就是没有编译DCNv2成功啊,亲,编译成功就好了。
这个鬼问题开始两天经常遇见,很简单改成['ninja',--version] 就好。后来就没遇见了。
这个鬼出现的很莫名其妙,也不说啥错。建议检查一下conda的python是不是真的conda安装时候的python。我的conda py=3.6.2 会莫名变成 3.8.4,需要 conda deactivate 后在进入就好啦。而且我用conda下载torch就没出现这种问题。
好啦,以上就是我摸鱼4天的成果啦。
xdm祝安装顺利,有补充或者更精准的讲解请指教。