目录
- 课程总结
- 前言
- 1. 基础快速入门
- 2. 基于VGG的模型剪枝
- 3. 英伟达2-4剪枝方案
- 4. YOLOv8剪枝
- 5. ACNet、DBB、RepVGG重参
- 个人总结
课程总结
前言
手写AI推出的全新模型剪枝与重参课程。记录下个人学习笔记,仅供自己参考。
本次课程主要是课程总结,对之前学习的知识的一个复习。
课程大纲可看下面的思维导图
1. 基础快速入门
在这部分主要是对剪枝有个基本认识
非结构化剪枝
- 每个卷积核的所有权重都被看做一个整体,不按照某种固定结构裁剪,而是根据某些规则
- 细粒度剪枝
- 按比例裁剪卷积层的权重(求取threshold)
- 向量剪枝
- 将某些列和行上的参数设置为0
- 卷积核剪枝
- 计算每个 filter(即一份起司面包) 的 L2 范数,根据 L2 范数排序进行裁剪
结构化剪枝
- 考虑每个卷积核权重的内部结构核关系,不破化卷积层结构,对不同维度上的元素进行聚合
- 可分为 kernel-level、filter-level、channel-level
修剪标准
- 基于权重大小
- 根据卷积核的权重大小来决定哪些权重需要剪枝
- 基于梯度幅度
- 根据卷积核权重的梯度幅度来决定哪些权重需要剪枝
- 基于梯度核权重大小的混合标准
- 综合考虑权重大小和梯度幅度
修剪方法
- 训练后剪枝(常用)
- 训练 => 剪枝 => 微调
- paper
- 训练时剪枝
- 也称剪枝回溯,模型训练和剪枝交替进行
- paper
稀疏训练
-
训练过程给权重参数加上稀疏性约束(L1和L2正则化),让部分权重参数的值变为0,减少参数量
-
paper
2. 基于VGG的模型剪枝
这部分主要是实战,对 VGG 网络进行剪枝
- 对 BN 层的 γ \gamma γ 进行稀疏训练,得到 mask 对 Conv、BN、Linear 层进行剪枝
- paper
- 实现流程
- initial network
- Train with channel sparsity regularization
- Prunne channels with small scaling factors
- Fine-tune the pruned network
- Compact network
3. 英伟达2-4剪枝方案
在这部分主要了解 NVIDIA 的 2:4 pattern 的稀疏方案并进行手写复现
-
方案
-
- 训练网络
-
- 2:4 稀疏剪枝,稀疏矩阵被压缩,存储非零的数据值和对应非零元素的索引信息
-
- 重复原始的训练流程
- 超参数与 1 一致
- 权重初始化与 2 一致
- 保持 2 中的 0 pattern
-
4. YOLOv8剪枝
这部分主要是实战,对 YOLOv8 进行剪枝
- 流程
- Pretrain(非必要)
- Constrained Training
- Prune
- Finetune
- 约束训练的目的
- 使得模型更易于剪枝。在约束训练中,模型会学习到一些通道或者权重稀疏比较不重要的信息,而这些信息在剪枝过程中得到应用
- 只考虑 TopConv、BottomConv、Seq、Detect-FPN 的剪枝
5. ACNet、DBB、RepVGG重参
在这部分主要是对重参有个基本认识,以及对常见分支结构重参的实现
重参
- 网络的参数重新组织,网络训练时是并行多分支结构,网络推理时重参为单分支结构
ACNet
- 训练时 1x3+3x1+3x3 卷积,推理时 3x3 卷积
- Conv2d + BN 重参
- Conv2d的 kernel 都乘以 γ σ B 2 + ϵ \frac{\gamma}{\sqrt{\sigma_B^2 + \epsilon}} σB2+ϵγ ,Conv2d 的 bias 都加上 − μ B σ B 2 + ϵ -\frac{\mu_B}{\sqrt{\sigma_B^2 + \epsilon}} −σB2+ϵμB
- Conv1x3 + Conv3x1 + Conv3x3 重参
DBB
- 设计了一个类似 Inception 的模块
- 推理阶段存在 6 种变换
- I:a conv for conv-BN
- II:a conv for branch addition
- III:a conv for sequential convolutions
- IV:a conv for depth concatenation
- V:a conv for average pooling
- VI:a conv for multi-scale convolutions
RepVGG
- 对原始 VGG 网络进行重参
concatenation- V:a conv for average pooling
- VI:a conv for multi-scale convolutions
RepVGG
- 对原始 VGG 网络进行重参
- conv3x3+bn、conv1x1+bn、bn => conv3x3
个人总结
本次剪枝与重参课程让我对模型剪枝和模型重参数有了一个基本认识,简单来说,模型剪枝就是剪去网络中那些不重要的权重参数,而模型重参数就是将网络中的并行多分支结构在推理阶段合并为单分支结构,二者的目的都是为了减少模型的参数量,提高网络的推理速度。在学习完本次课程后,用上实践的就是YOLOv8的剪枝(毕竟是老师提供的现成方案😂),并将剪枝后的模型部署到嵌入式设备上,可以进一步提高其推理速度,对于计算能力有限的嵌入式还是十分有效的。对于剪枝和重参的一些代码实现并没有去深究,也就是照着抄了一遍,同时对原理掌握还是不够清晰,后续花时间补吧(大概率也不会去补了🤣)。
总的来说,本次课程的学习收获还是比较大的,起码对模型剪枝和模型重参的概念还是有的,同时也用上了YOLOv8的剪枝,感谢苏老师和Rocky老师!!!🤞