深度学习模型剪枝、量化和TensorRT推理
创作时间:
作者:
@小白创作中心
深度学习模型剪枝、量化和TensorRT推理
引用
CSDN
1.
https://blog.csdn.net/linghu8812/article/details/109585506
深度学习模型的优化是提升模型效率和性能的关键步骤。本文将详细介绍模型剪枝和量化两种优化方法,并介绍如何使用TensorRT进行高效的模型推理。
模型剪枝算法
模型剪枝是一种通过删除神经网络中冗余或不重要的部分来减小模型大小和计算复杂度的技术。以下是几种常见的模型剪枝算法:
预定义网络结构剪枝
剪枝方法 | 参考文献 | github | 剪枝原理 |
|---|---|---|---|
L1-norm based Filter Pruning | Pruning Filters for Efficient ConvNets | l1-norm-pruning | 在每一个卷积层,根据卷积核的权重值的L1 norm大小,修剪掉相应百分比的通道数。 |
ThiNet | ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression | 剪枝时,不根据当前层进行剪枝,而是修剪去对下一卷积层激活值影响最小的权重值。 | |
Regression based Feature Reconstruction | Channel Pruning for Accelerating Very Deep Neural Networks | 根据LASSO回归算法选出有代表性的卷积层通道,减枝去掉冗余通道,使用最小二乘法重建剩余通道。 |
自动网络结构剪枝
剪枝方法 | 参考文献 | github | 剪枝原理 |
|---|---|---|---|
Network Slimming | (1) Learning Efficient ConvNets through Network Slimming(2) SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications | (1) network-slimming(2) https://github.com/PengyiZhang/SlimYOLOv3 | 在剪枝时,对BN层的gamma参数进行惩罚进行稀疏训练,剪枝时选择稀疏训练后BN层gamma值较大的参数进行保留 |
Sparse Structure Selection | Data-Driven Sparse Structure Selection for Deep Neural Networks | 除了对通道进行稀疏训练,还可以对残差模块进行稀疏训练。 |
稀疏训练代码示例:
def updateBN():
for m in model.modules():
if isinstance(m, nn.BatchNorm2d):
m.weight.grad.data.add_(args.s*torch.sign(m.weight.data))
需要注意的是,在剪枝时对残差模块通道的剪枝策略需要考虑,方案有不剪枝(减去的参数较少)或者根据残差模块的某一层进行剪枝,也有对所有残差通道的mask进行或运算。剪枝后的效果如下图所示,在剪枝时必须保证shortcut连接的两个卷积层通道数相等。另外,使用network slimming算法时,每个卷积层都必须剩下至少1个通道。
TensorRT int8量化算法
TensorRT是一个高性能的深度学习推理引擎,支持int8量化以进一步提升模型的推理速度和降低内存需求。
量化概述
- 目标:将fp32的卷积神经网络转换为int8而不会造成明显的精度损失;
- 原因:int8方法具有更高的吞吐量和更低的内存需求;
- 挑战:int8的精度和动态范围明显低于fp32;
类型 | 动态范围 | 最小精度 |
|---|---|---|
fp32 | -3.4 x 1038~ +3.4 x 1038 | 1.4 x 10-45 |
fp16 | -65504 ~ +65504 | 5.96 x 10-8 |
int8 | -128 ~ +127 | 1 |
- 解决方案:在将训练的模型权重量化为int8时以及在int8计算激活时,最大限度地减少信息损失;
- 结果:在TensorRT中实现了int8方法,并且不需要任何额外的fine tune或重训练。
- 问题:为什么要量化而不使用int8直接训练?模型训练是需要反向传播和梯度下降的,训练时的超参一般都是浮点型,如学习率等,int8类型无法进行训练。
线性量化
公式:
Tensor Values = fp32 scale factor * int8 array
根据量化公式仅需求fp32 scale factor即可进行int8量化,那么如何求fp32 scale factor?
从上图中可以看出,有两种int8量化方法,一种是非饱和映射(左),另一种是饱和映射(右)。经过验证,非饱和映射会造成严重的准确率损失,原因是由于卷积层计算的正负分布很不均匀,如果按照对称非饱和映射(原意是为了尽可能多地保留原信息)的话,那么+max那边有一块区域就浪费了,也就是说scale到int8后,int8的动态范围就更小了,举个极限的例子就是量化后正的样本没有,负的全部扎堆在一个很小的值附近,这样会造成严重的精度损失。饱和映射方法是先找一个阈值T,将低于最低阈值的值全部都饱和映射到-127上,如右上图的左边的三个红色的点。
如何选择量化阈值?
- 标定步骤:
- 在标定数据集上进行fp32推理。
- 对每一个卷积层:
- 收集激活的直方图;
- 生成具有不同饱和阈值的量化分布;
- 选择使KL发散最小化的阈值。
- 一般来说,整个标定过程需要几分钟的时间
- 标定数据集选择:
- 有代表性
- 多样化
- 理想情况下是验证数据集的子集
- 1000+样例
深度学习模型转TensorRT
- 深度学习模型PyTorch训练并转ONNX与TensorRT部署
- darknet YOLOv4模型转ONNX转TensorRT部署
- yolov5 PyTorch模型转TensorRT
- CenterFace模型转TensorRT
- RetinaFace MXNet模型转ONNX转TensorRT
热门推荐
阿德勒的个体心理学理论
猫咪独处时可以准备的几个活动,让它们的“单身派对”也精彩!
用价值链视角分析项目需求:6个经典案例拆解
法学在职博士招收的院校有哪些?3所法学博士名校介绍!
从心理学角度解读"喜"的情感表达与意义
如何分析美国股市的红绿信号
电缆的导电性能主要和哪几个因素有关?
公证继承流程需要多长时间
C语言如何对一个数四舍五入:使用标准库函数、手动实现
白圭经商之道:古代智慧与现代商业的启示
中航证券首席经济学家董忠云:四月决断
欧洲留学免费?满足哪些条件?如何申请?
尾静脉注射不再“盲打”!新型设备可点亮小鼠血管,实验成功率飙升
武铁推出11款高铁定期票及计次票产品覆盖5条干线,最高折扣6.2折
朱自清说《诗经》:诗的源头与《诗经》的诞生
这些纪录片,会让你的认知变得开阔,让你的生命变得丰盛
9年来首次止跌回升,韩国新生儿为什么变多了?
西溪湿地文化盛宴绽放沪上,多维呈现生态人文新图景
鸣潮卡卡罗共鸣链提升多少好?
薄皮甜瓜高效栽培技术探讨
MES运维工程师需要学习哪些技能
MES运维工程师职责全解析:从系统维护到数据管理
13本适合培养阅读兴趣的必读好书,让你成为更有趣的人!
三级医院评审,如何做到心中有“数”
ZCuZn25Al6Fe3Mn3铜合金技术资料
ZCuZn25Al6Fe3Mn3铜合金技术资料
解放军报|精细化训练管理:人人有本“明白账”
【科普】滑滑腻腻,擦了又来……刷牙杯怎么用着用着就“包浆”了?
重装Windows的详细教程(让你的电脑重获新生,重装Windows的简易指南)
入职体检报告都包括哪些项目 体检中需要注意的事项有哪些