TensorRT模型部署剪枝
TensorRT模型部署剪枝
本文属于学习笔记,在重点章节或代码位置加入个人理解,欢迎批评指正!
参考:
CUDA与TensorRT部署部署实战第四章
一. Pruning
学习目标
- 理解什么是模型剪枝
- 模型剪枝的分类,以及各类剪枝的利弊都有哪些
1. 剪枝
“剪枝”是直接“删除”掉模型中没有意义的,或者意义较小的权重,来让推理计算量减少的过程。
为什么想要剪枝,原因?
主要是因为学习的过程中会产生过参数化导致会产生一些意义并不是很大的权重
,或者经过ReLU值为0的权重
(下游权重在后续计算中失去作用)。对于这些权重所参与的计算是占用计算资源且没有作用的,需要想办法找到这些权重并让硬件去skip掉这些权重所参与的计算。
2. 模型剪枝的流程
1)获取一个已经训练好的初始模型
2) 对这个模型进行剪枝, 剪枝方法有:
- 我们可以通过训练的方式让DNN去学习哪些权重是可以归零的(e.g. 使用L1 regularization和BN中的
scaling factor
让权重归零) - 我们也可以通过
自定义一些规则
,手动的有规律的去让某些权重归零(e.g. 对一个1x4的vector进行2:4的weight prunning)
3)对剪枝后的模型进行fine-tuning - 有很大的可能性,在剪枝后初期的网络的精度掉点比较严重,需要fine-tuning这个过程来恢复精度
- Fine-tuning后的模型有可能会比之前的精度还要上涨
4)获取到一个压缩的模型
3. 剪枝分类
按照减枝的方法按照一定规律与否可以分为结构化减枝
,以及非结构化减枝
。
注意:
filter pruning = kernel pruning
图中白色的块并非真的去掉,只是将权重置为0。如果真去掉,kernel维度变化肯定不对。
同时,模型减枝也可以按照减枝的粒度与强度分为粗粒度减枝
,以及细粒度减枝
。
4. Coarse Gain Pruning的优势劣势
- 优势:
不依赖于硬件,可以在任何硬件上跑并且得到性能的提升 - 劣势:
由于减枝的粒度比较大(卷积核级别的),所以有潜在的掉精度的风险
不同DNN的层的影响程度是不一样的
减枝之后有可能反而不适合硬件加速(比如Tensor Core的使用条件是channel是8或者16的倍数)
5. Fine Grain Pruning(细粒度剪枝)优劣势
- 结构化(Vector-wise 和 block-wise)
- 非结构化:硬件支持不一定友好
- 优势:
相比于Coarse Grain Pruning,精度的影响并不是很大 - 劣势:
需要特殊的硬件的支持(Tensor Core可以支持sparse)
需要用额外的memory来存储哪些index
是可以保留计算的
memory的访问不是很效率(跳着访问)
支持sparse计算的硬件内部会做一些针对sparse的tensor的重编,这个会比较耗时
二. Channel level Pruning
学习目标
理解channel-level pruning的算法,以及如何使用L1-Norm来让权重稀疏
1. channel-level pruning
整篇文章的核心点是围绕着通过使用BN中的scaling factor
,与使用L1-regularization
的训练可以让权重趋向零这一特点。找到conv中不是很重要的channel,实现channel-level的pruning。
做法:
通过在loss损失函数中添加L1/L2范数(L1/L2-norm)
2. fine-tuning
fine-tuning更新之后,还需要把为0的地方置为0, 得到稀疏sparse weight
3. channel-level pruning中的超参和技巧
超参就两个:lambda和channel的剪枝力度