一:背景
如果要将深度学习的AI模型部署到受限设备(FPGA)上,往往需要更小的存储需求和最低的计算复杂度。当然,还得保持一定的性能(下降在能够接受的范围)。受限设备资源的环境,一般是指的手机,嵌入式系统,而对于我目前的场景,主要是针对FPGA,但因为本文并不涉及具体硬件的实现,所以,完全不涉及FPGA领域知识。不管部署到哪种受限设备,要达到这种要求,最常见的方法就是 量化和剪枝了。
对于FPGA,不好意思,我还得多说几句,因为有些情况它还是和其它硬件不太一样。它更擅长于定点数的运算(而不是浮点运算),原因是什么?因为FPGA由大量的基本逻辑单元组成。而这些逻辑单元(LUT 和触发器)非常适合于布尔逻辑和整数(定点数)运算。因为定点数的运算不涉及复杂的位移和归一化操作,逻辑实现直接,资源利用率高。而对于FPGA中配置的DSP,它通常也会优化用于执点定点数运算。如果一定要执行浮点运算,那么浮点数的归一化,舍入,溢出检测等复杂操作,会显著增加FPGA的资源消耗和功耗。低功耗是FPGA中非常关键的一环。另外,对于FPGA的应用场景,经常是需要高效的实时计算。如果运算过于复杂,必须无法满足实时性的要求。而且需要更多的资源。
二:概念
那什么是量化,什么是剪枝呢?
2.1:模量化(Quantization)
定义:模型量化是通过减少模型中参数的表示精度来实现模型压缩的过程。通常,神经网络模型中的参数是使用浮点数表示的,而量化则将这些参数表示为更少比特的定点数或整数,从而减小了内存占用和计算成本。
目标:减小模型的存储空间和加速推理过程。通过使用较少位数的表示来存储权重和激活值,模型的存储需求减少,且在硬件上执行推理时,可以更快地进行计算。
2.2:剪枝(Pruning)
定义:剪枝是一种技术,通过减少神经网络中的连接或参数来减小模型的大小。在剪枝过程中,通过将权重较小或对模型贡献较小的连接移除或设为零,从而减少模型的复杂度。
目标:减小模型的尺寸和计算负载。剪枝不仅可以减少模型的存储需求,还可以在推理时减少乘法操作,因为移除了部分连接或参数,从而提高推理速度。
2.3:对比
虽然两者都致力于减小模型的大小和计算复杂度,但方法和实现方式略有不同。模型量化侧重于减小参数表示的精度,而剪枝则专注于减少模型的连接或参数数量。通常,这两种技术可以结合使用,以更大程度地减小神经网络模型的尺寸和提高推理效率。
三:量化
3.1:量化的作用
我们再具体说一下量化的效果。
1:更少的存储开销和带宽需求。即使用更少的bit存储数据,有效减少应用对存储资源的依赖;
2:更快的计算速度。即对大多数处理器而言,整型运算(定点运算)的速度一般(但不总是)要比浮点运算更快一些;
举例:int8 量化可减少 75% 的模型大小(相比于F32),int8 量化模型大小一般为 32 位浮点模型大小的 1/4 加快推理速度,访问一次 32 位浮点型可以访问四次 int8 整型,整型运算比浮点型运算更快;
3.2:量化的方法
3.2.1:动态量化(Dynamic Quantization)
这是应用量化形式的最简单方法,其中权重提前量化,但激活在推理过程中动态量化。
动态量化 (Dynamic Quantization) 是一种在推理过程中将浮点数模型转换为低精度整数模型的量化技术。其主要目的是减少模型的内存占用和加速推理过程,同时尽量保持模型的精度。
- 在动态量化中,模型的权重通常在推理之前就被量化,而激活函数的量化则是在推理过程中动态完成的。
- 权重通常从浮点数 (如
float32
) 量化为低精度整数 (如int8
)。 - 激活值根据输入数据在推理过程中动态计算缩放因子,再将其量化为整数形式。
- 通过动态量化,计算时使用低精度整数进行运算,然后在必要时将结果重新缩放回浮点格式。
动态量化的做法:
1.