前言
由于ViTs的出现将原来的视觉任务的准确率几乎都刷了一遍,于是便有人着手去研究为什么ViTs的效果会这么好。他们得到的其中一个结论是,ViTs可以建立长程依赖,换句话说就是ViTs拥有更大的核(kernel),对应ViTs中便是的window_size。因此有研究尝试使用更大的卷积核来替换传统的 3 × 3 3\times 3 3×3卷积核,经过实验,发现这样做可以提升CNN的性能,并能够和ViTs相媲美。
CNN使用大核的好处是能提供更大的感受野,并且能够有效的提升有效感受野(有效感受野通常可K和L成正相关,即kernel越大,网络越深,有效感受野越大),感受野表示神经元感受信息的总量,而有效感受野表示有效信息的多少
。因此感受野不是越大越好,在设计网络时也应充分考虑有效感受野。
但是CNN使用大核的有一个坏处,就是计算效率比较低,并且使用torch直接将 3 × 3 3\times 3 3×3修改成 31 × 31 31\times 31 31×31的大核并不能提升性能,相反性能会下降,且算的巨慢。于是有研究提出了使用深度可分离卷积替换原来的卷积,并用cuda重写了深度可分离卷积的实现(确实厉害),后人编译代码后就可以直接将他们的实现作为一个函数调用了(感谢他们的付出)。
于是这就有了这篇博客,这次训练的是Sparse Large Kernel Network - SLaK
SLaK Github项目地址
论文:《 More ConvNets in the 2020s: Scaling up Kernels Beyond 51 x 51 using Sparsity》
关于这篇论文的讲解已有其他博客翻译,请自行查阅。不过我觉得在读这篇论文之前先去读一下《Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs》 SLaK是基于RepLKNet的进一步探索。这篇论文会带给你许多不一样的思考。
下面进入SLaK的环境搭建过程,这里仅列出关键的步骤,当SLaK的环境搭建完成后,RepLKNet同样可以使用这个环境
。
该教程假设你已经十分熟悉深度学习的环境配置
一、CUDA安装
Tips: 我是在Window11上配置的环境,理论上Linux上也是同样的,关键是CUDA和pytorch版本
根据RepLKNet仓库中README的说明,配置好cuda和pytorch
# 这是RepLKNet的作者怕你装不好,贴心给的参考环境
Ubuntu 18.04 + CUDA 11.3 + nvcc 11.3 + cudnn 8.2.0 + python 3.8.12 + pytorch 1.10 + gcc 7.3.0 + nccl 2.10.3 + NVIDIA driver 450.102.04 + V100 and A100 GPUs
Ubuntu 18.04 + CUDA 10.2 + nvcc 10.0 + cudnn 7.6.5 + python 3.6.9 + pytorch 1.9 + gcc 7.5.0 + nccl 2.7.8 + NVIDIA driver 460.32.03 + 2080Ti and V100 GPUs
你就别折腾了,按照我的环境来:CUDA11.3,cudnn=8.2.0,pytorch=1.10.0,python=3.8.12
,其他的就不用管了,下面我贴上相应链接:
CUDA下载:https://developer.nvidia.com/cuda-toolkit-archive
cudnn下载: https://developer.nvidia.com/rdp/cudnn-archive
pytorch下载: https://pytorch.org/get-started/previous-versions/
在上面的页面中分别找到对应的版本下载
剩下的就简单了,运行代码时,剩下缺什么包用pip装上即可
二、windows上要安装visual studio 2019或2017
如果你是Linux或者已经是vs2017、vs2019可以直接跳过这一步。
Linux上我并不清楚还需要安装什么,有尝试过的朋友请在评论区补充一下,谢谢
现在visual studio 2019的安装包很难找(或许只是我笨,找的并不轻松),直接使用下面的地址下载visual studio 2019即可:
VS2019: https://apps.microsoft.com/detail/xp8cdjnzkfm06w?atc=true&hl=zh-cn&gl=CN
安装好后,继续安装C++桌面开发
里的内容,你选择之后
默认没有 Windows 11 SDK,我也不清楚有没有用,确实不懂这个,不过我觉得可能有用,也就打勾了。
三、修改cutlass的代码并编译
RepLKNet给的19_large_depthwise_conv2d_torch_extension
代码有点问题,需要改一下,否则编译过不去,会报一个数据类型的错误
找到SLaK项目中的cutlass\examples\19_large_depthwise_conv2d_torch_extension
文件夹,然后找到下列文件:
backward_data_fp16.cu
backward_data_fp32.cu
backward_filter_fp16.cu
backward_filter_fp32.cu
forward_fp16.cu
forward_fp32.cu
这些.cu
文件里都有下面这行代码:
options.update({input.size(0), input.size(2), input.size(3), input.size(1)},
{weight.size(0), weight.size(2), weight.size(3), 1});
找到这些文件里上面代码的位置,然后替换成下面的代码:
options.update({static_cast<cutlass::Tensor4DCoord::Index>(input.size(0)),
static_cast<cutlass::Tensor4DCoord::Index>(input.size(2)),
static_cast<cutlass::Tensor4DCoord::Index>(input.size(3)),
static_cast<cutlass::Tensor4DCoord::Index>(input.size(1))},
{static_cast<cutlass::Tensor4DCoord::Index>(weight.size(0)),
static_cast<cutlass::Tensor4DCoord::Index>(weight.size(2)),
static_cast<cutlass::Tensor4DCoord::Index>(weight.size(3)),
static_cast<cutlass::Tensor4DCoord::Index>(1)});
然后你就可以愉快的根据SLaK里README的方法编译啦。
# 进入cutlass\examples\19_large_depthwise_conv2d_torch_extension目录
# 然后运行下面指令
python ./setup.py install --user
四、使用Pycharm调试SLaK
这节算是一个使用Pycharm调试并行训练代码的一个技巧,今天我才发现可以这么干,skill +1 😊
因为我只有一个GPU,并且想要debug SLaK,于是对SLaK中README的运行参数进行了一下修改:
# 这是SLaK给的命令行运行参数
python -m torch.distributed.launch --nproc_per_node=4 main.py \
--Decom True --sparse --width_factor 1.3 -u 2000 --sparsity 0.4 --sparse_init snip --prune_rate 0.5 --growth random \
--epochs 300 --model SLaK_tiny --drop_path 0.1 --batch_size 128 \
--lr 4e-3 --update_freq 8 --model_ema true --model_ema_eval true \
--data_path /path/to/imagenet-1k --num_workers 40 \
--kernel_size 51 49 47 13 5 --output_dir /path/to/save_results
我想要在Pycharm中debug,于是修改上面命令为下面所示:
# Interpreter options
-m
torch.distributed.launch
--nproc_per_node
1
# Parameters
--Decom
True
--sparse
--width_factor
1.3
-u
2000
--sparsity
0.4
--sparse_init
snip
--prune_rate
0.5
--growth
random
--epochs
300
--model
SLaK_tiny
--drop_path
0.1
--batch_size
4
--lr
4e-3
--update_freq
8
--model_ema
true
--model_ema_eval
true
--data_path
./datasets
--num_workers
0
--kernel_size
51 49 47 13 5
--output_dir
./logs
你需要在Pycharm中的Configurations中的Modify options中打开Interpreter options
然后将参数分别填入下面两个位置
然后你就可以愉快的Debug啦😘