一,模型压缩技术概述
知识蒸馏算法整体的框架图如图下所示。
图片来源 https://intellabs.github.io/distiller/knowledge_distillation.html。
三,轻量级模型架构
四,模型剪枝
模型剪枝(model pruning)也叫模型稀疏化(model sparsity)。
深度学习模型中一般存在着大量冗余的参数,将权重矩阵中相对“不重要”的权值剔除(即置为 0
),可达到降低计算资源消耗和提高实时性的效果,而对应的技术则被称为模型剪枝。
来源论文 Han et al. Learning both Weights and Connections for Efficient Neural Networks, NIPS 2015。
上图是典型的三段式剪枝算法 pipeline
,主要是 3 个步骤:
- 正常训练模型;
- 模型剪枝;
- 重新训练模型
以上三个步骤反复迭代进行,直到模型精度达到目标,则停止训练。
模型剪枝算法根据粒度的不同,可以粗分为细粒度剪枝和粗粒度剪枝,如下所示:
- 细粒度剪枝(fine-grained):对连接或者神经元进行剪枝,它是粒度最小的剪枝。
- 向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。
- 核剪枝(kernel-level):去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。
- 滤波器剪枝(Filter-level):也叫通道剪枝(
Channel Pruning
),对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变,滤波器剪枝的工作是目前研究最多的。
按照剪枝是否规则,剪枝算法也可分为:
- 非结构化剪枝,其实就是前面的 1,对硬件支持不友好,需要设定特定硬件加速器,典型代表作是韩松
2016
年的论文。 - 结构化剪枝,如 2、3、4,对硬件支持友好,典型代表作如 Learning Efficient Convolutional Networks through Network Slimming 等。
4.1,结构化稀疏与非结构化剪枝比较
与非结构化剪枝相比,结构化剪枝通常通常会牺牲模型的准确率和压缩比。结构化稀疏对非零权值的位置进行了限制,在剪枝过程中会将一些数值较大的权值剪枝,从而影响模型准确率。 “非规则”的剪枝则契合了神经网络模型中不同大小权值的随机分布,这对深度学习模型的准确度至关重要。展开来讲就是:
- 非结构化稀疏具有更高的模型压缩率和准确性,在通用硬件上的加速效果不好。因为其计算特征上的“不规则”,导致需要特定硬件支持才能实现加速效果。
- 结构化稀疏虽然牺牲了模型压缩率或准确率,但在通用硬件上的加速效果好,所以其被广泛应用。因为结构化稀疏使得权值矩阵更规则更加结构化,更利于硬件加速。
综上所述,深度神经网络的权值稀疏应该在模型有效性和计算高效性之间做权衡。
目前,有一种趋势是在软硬件上都支持稀疏张量,因此未来非结构化剪枝可能会变得更流行。
五,模型量化
相比于剪枝操作,参数量化则是一种常用的后端压缩技术。所谓量化,其实可以等同于低精度(Low precision)运算概念,常规模型精度一般使用 FP32(32 位浮点数,单精度)存储模型权重参数,低精度则表示使用 INT8
、FP16
等权重数值格式。
模型量化(Model Quantization
,也叫网络量化)过程分为两部分:将模型的单精度参数(一般 FP32
-32
位浮点参数)转化为低精度参数(一般 INT8
-8
位定点参数),以及模型推理过程中的浮点运算转化为定点运算,这个需要推理框架支持。
模型量化技术可以降低模型的存储空间、内存占用和计算资源需求,从而提高模型的推理速度,也是为了更好的适配移动端/端侧 NPU
加速器。简单总结就是,模型变小了,速度变快了,支持的场景更多了。
最后,现在工业界主流的思路就是模型训练使用高精度-FP32 参数模型,模型推理使用低精度-INT8 参数模型: 将模型从 FP32 转换为 INT8(即量化算术过程),以及使用 INT8 进行推理。
5.1,模型量化的方案
在实践中将浮点模型转为量化模型的方法有以下三种方法:
-
data free
:不使用校准集,传统的方法直接将浮点参数转化成量化数,使用上非常简单,但是一般会带来很大的精度损失,但是高通最新的论文DFQ
不使用校准集也得到了很高的精度。 -
calibration
:基于校准集方案,通过输入少量真实数据进行统计分析。很多芯片厂商都提供这样的功能,如tensorRT
、高通、海思、地平线、寒武纪 -
finetune
:基于训练finetune
的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。
按照量化阶段的不同,量化方法分为以下两种:
- Post-training quantization
PTQ
(训练后量化、离线量化); - Quantization-aware training
QAT
(训练时量化,伪量化,在线量化)。
5.2,量化的分类
目前已知的加快推理速度概率较大的量化方法主要有:
- 二值化,其可以用简单的位运算来同时计算大量的数。对比从 nvdia gpu 到 x86 平台,1bit 计算分别有 5 到128倍的理论性能提升。且其只会引入一个额外的量化操作,该操作可以享受到 SIMD(单指令多数据流)的加速收益。
- 线性量化(最常见),又可细分为非对称,对称和
ristretto
几种。在nvdia gpu
,x86
、arm
和 部分AI
芯片平台上,均支持8bit
的计算,效率提升从1
倍到16
倍不等,其中tensor core
甚至支持4bit
计算,这也是非常有潜力的方向。线性量化引入的额外量化/反量化计算都是标准的向量操作,因此也可以使用SIMD
进行加速,带来的额外计算耗时不大。 - 对数量化,一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。目前
nvdia gpu
,x86
、arm
三大平台上没有实现对数量化的加速库,但是目前已知海思351X
系列芯片上使用了对数量化。
六,压缩方法总结
- 按照剪枝是否规则,剪枝算法可分为:非结构化剪枝和结构化剪枝。前者可以保持高模型压缩率和准确率,但难加速;后者更利于硬件加速,但牺牲了模型压缩率或准确率。
- 如果需要一次性端对端训练得到压缩与加速后模型,可以考虑基于轻量化网络设计的模型进行模型压缩与加速。
- 影响神经网络推理速度主要有
4
个因素:计算量FLOPs
、内存访问代价MAC
、计算并行度、硬件平台架构与特性(算力、GPU 内存带宽)。
参考资料
- 深度学习模型压缩与加速
- Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
- 《解析卷积神经网络》
- 《4-model_compression》(https://github.com/HarleysZhang/deep_learning_system/tree/main/4-model_compression)
本文作者:嵌入式视觉