【端侧AI模型部署】模型量化技术
·
通过前面解析一遍手写数字识别的简单前馈网络模型训练与推理过程,应该对AI模型有了基本的理解。在此基础上,我们开始学习端侧模型部署中的模型量化技术。
1. 什么是模型量化
模型量化就是把模型的浮点数参数(训练时通常为FP32)和计算转为空间更小的数值类型,从而大幅减小模型体积、提升推理速度,同时尽量保持精度。
2. 六种数据类型速览
下表直观对比了这六种数据类型的核心特性。
| 精度类型 | 位宽 | 通俗理解 | 数值范围(近似) | 核心应用场景 |
|---|---|---|---|---|
| FP32 | 32位 | 全精度基准 | -3.4×10³⁸ ~ +3.4×10³⁸ | 模型训练时使用,高精度计算基准 |
| BF16 | 16位 | 保范围,舍精度 | -3.4×10³⁸ ~ +3.4×10³⁸ | 大模型训练,防止数值溢出,技术较新 |
| FP16 | 16位 | 保精度,舍范围 | -65504 ~ +65504 | 混合精度训练,部分芯片推理 |
| INT16 | 16位 | 高精度整数 | -32,768 ~ +32,767 | 对量化误差敏感的场景,作为中间精度 |
| INT8 | 8位 | 均衡之选 | -128 ~ +127 | 端侧量化主力,效率与精度平衡 |
| INT4 | 4位 | 极限压缩 | -8 ~ +7 | 资源极度受限的场景,前沿探索 |
3. 关键差异:范围、精度与数据类型
理解这些格式的核心在于把握两个权衡:数值范围(能表示的最大/最小数值)、精度(表示数值的准确度),以及数据类型(浮点数或整数)的选择。
- 浮点数(FP):由符号位、指数位和尾数位组成。指数位决定范围,尾数位决定精度。例如,BF16通过保留与FP32相同的8位指数位来获得极宽的范围,利于训练稳定;而FP16的指数位虽只有5位,但其10位尾数位提供了比BF16更高的精度。
- 整数(INT):是纯粹的整数值,表示范围直接由位宽决定。其运算在硬件上通常更高效。从INT16到INT4,位宽逐级减半,其表示范围和存储空间也相应减半。
4. 量化方法:PTQ 与 QAT
将高精度模型(如FP32)转换为低精度模型,主要有两种技术路径:
-
训练后量化(PTQ)
- 做法:模型训练完成后,使用一个校准数据集来统计各层数值范围,确定量化参数(如缩放因子Scale和零点Zero Point),然后直接转换模型。
- 优点:快速、简单,无需重新训练模型。
- 缺点:是一种“事后补救”,在较低精度(如INT4)下精度损失可能较大。
- 适用场景:INT8量化的首选方案,适用于快速部署。
-
量化感知训练(QAT)(训练时量化)
- 做法:在模型训练过程中插入“伪量化”操作,模拟量化带来的误差,让模型提前适应低精度计算。
- 优点:量化后的精度更高,是实现高质量低比特量化(如INT4)的关键技术。
- 缺点:需要重新训练或微调模型,时间成本和计算成本高。
- 适用场景:对精度要求严苛,或必须进行低比特量化的场景。
5. 端侧实践:如何选择?
在实际的端侧AI应用(推理部署)中,可以遵循以下思路来选择:
- 首选INT8量化:对于绝大多数端侧应用,应优先尝试INT8-PTQ。这是在模型大小、推理速度和精度之间取得了最佳平衡的、经过工业界广泛验证的方案。
- 精度不满足时:若INT8-PTQ的精度损失无法接受,可尝试INT8-QAT。或者,考虑采用混合精度量化策略,即对量化误差敏感的网络层(如注意力机制的输出层、LayerNorm层)保留较高的精度(如FP16或BF16),而将其他层量化为INT8或INT4。此时,INT16也可作为一种选项,它在精度和压缩率之间介于FP16和INT8之间,在对量化误差敏感且需要一定压缩率的场景下可能是一个合适的折中方案。
- 资源极度紧张时:如果INT8仍无法满足体积或速度要求,可考虑INT4,但通常必须使用QAT或GPTQ/AWQ等高级PTQ算法并仔细评估精度。
- 关注硬件支持:最终选择取决于目标硬件的支持程度。例如,一些新的端侧芯片开始支持BF16推理,而INT4需要较新的硬件(如NVIDIA Ampere+架构)才能获得良好加速效果。
理解它们的特点,并结合具体业务场景、硬件条件和精度要求,才能为您的应用找到最佳的效率与精度平衡点。
更多推荐
所有评论(0)