Sparse Large Kernel Network - SLaK训练,没错这就是全网你唯一能找到的教程!


前言

由于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的进一步探索。这篇论文会带给你许多不一样的思考。

RepLKNet Github项目地址

下面进入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啦😘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值