3. 模型轻量化技术:剪枝、量化(INT8/INT4)、知识蒸馏在ISP中的应用
端侧AI ISP的痛点,说白了就是算力和带宽都有限。你想想看,一个手机SoC或者安防芯片上,NPU的算力就那么几TOPS,还要跟其他任务抢资源。模型太大,跑不动;精度太低,效果又不行。
我这些年调过不少ISP模型,从最初的MobileNetV2到现在的轻量Transformer,踩过的坑不少。今天咱们就聊聊三个最实用的轻量化技术:剪枝、量化和知识蒸馏。这三板斧用好了,模型体积能缩到原来的十分之一,推理速度翻几倍,画质还不掉太多。
3.1 剪枝:砍掉冗余的计算
剪枝的原理很简单——神经网络里很多参数其实没啥用。我拆过几个训练好的ISP模型,发现有些卷积核的权重接近零,对最终输出几乎没影响。把这些冗余结构去掉,模型就瘦了。
3.1.1 结构化剪枝 vs 非结构化剪枝
| 类型 | 做法 | 硬件友好度 | 压缩率 |
|---|---|---|---|
| 非结构化剪枝 | 将权重矩阵中接近0的单个元素置0 | 低(稀疏矩阵加速依赖特殊硬件) | 高(可到90%以上) |
| 结构化剪枝 | 按通道、卷积核或层为单位整体移除 | 高(直接减少计算量,通用硬件支持) | 中等(通常30%~50%) |
我个人习惯在ISP模型里优先用结构化剪枝。为什么?因为端侧NPU对稀疏矩阵的支持很差,非结构化剪枝后的模型跑起来反而更慢。我曾经在一个去噪模型上试过非结构化剪枝,剪掉80%的参数后,NPU推理时间反而增加了15%——因为稀疏矩阵的存储和计算开销更大了。
3.1.2 ISP中的剪枝策略
具体怎么做?我一般分三步:
- 训练一个大模型(比如参数量2M以上的ISP网络),确保精度足够高。
- 逐层评估敏感度:对每一层单独剪枝,观察PSNR/SSIM下降幅度。敏感度低的层多剪,高的少剪。
- 微调恢复:剪完后用少量数据微调几个epoch,精度通常能恢复90%以上。
举个例子,我之前处理一个3D-LUT增强模型,原始模型有1.8M参数。通过结构化剪枝,把颜色变换模块的通道数从64砍到32,模型缩到0.9M,推理速度提升1.8倍,PSNR只掉了0.3dB。这个trade-off在端侧完全能接受。
3.2 量化:用更少的比特表示参数
量化是端侧部署的必修课。FP32模型直接跑在NPU上?那带宽和功耗都扛不住。INT8量化后,模型体积缩到1/4,推理速度通常能翻2~4倍。
3.2.1 INT8量化:主流选择
INT8量化就是把32位浮点数映射到8位整数。映射公式很简单:
q = round(r / scale) + zero_point
其中r是原始浮点值,scale是缩放因子,zero_point是零点偏移。
在ISP模型里,我遇到过最头疼的问题是激活值分布不均匀。比如RAW域的数据范围是0~4095,经过几个卷积层后,某些通道的激活值集中在很小的区间内。这时候用全局量化,精度损失会很大。
3.2.2 INT4量化:极限压缩
INT4量化是最近两年才在端侧流行起来的。模型体积再缩一半,但精度损失也更大。我一般只在以下场景用INT4:
- 权重部分:权重的分布通常比较集中,INT4量化后精度损失可控。
- 非关键层:比如最后的颜色校正层,对精度要求不高。
- 激活值:用INT4量化激活值风险较大,建议先做校准集统计,确认分布范围。
我做过一个对比实验,在一个去马赛克模型上:
| 量化方案 | 模型大小 | 推理时间(ms) | PSNR(dB) |
|---|---|---|---|
| FP32 | 12.8 MB | 45 | 38.2 |
| INT8 | 3.2 MB | 18 | 37.9 |
| INT4(权重)+ INT8(激活) | 1.8 MB | 12 | 37.5 |
| INT4(全量化) | 1.6 MB | 10 | 36.8 |
你看,INT4权重+INT8激活的方案,在体积和速度上都有明显优势,精度损失也还能接受。全INT4量化虽然更快,但PSNR掉了1.4dB,有些场景就不太行了。
3.3 知识蒸馏:大模型教小模型
知识蒸馏的思路很巧妙——用一个精度高但计算量大的教师模型,去指导一个小学生模型学习。学生模型的结构可以很轻量,但通过模仿教师模型的输出分布,能学到教师模型的知识。
3.3.1 ISP中的蒸馏策略
在ISP任务里,蒸馏的目标不只是分类概率,更重要的是特征图和中间结果。我常用的蒸馏损失函数有三部分:
L_total = α * L_hard + β * L_soft + γ * L_feature
- L_hard:学生模型与ground truth之间的损失(比如L1 loss)。
- L_soft:学生模型与教师模型输出之间的KL散度。温度系数T控制软标签的平滑程度,T越大,软标签越平滑,学生学到的知识越丰富。
- L_feature:中间特征图的MSE损失。我一般选最后几个卷积层的特征图做蒸馏。
3.3.2 一个实战案例
我之前做过一个夜景增强模型。教师模型是UNet-like结构,参数量3.5M,跑在手机上要80ms。学生模型用MobileNetV2做backbone,参数量只有0.8M。
直接训练学生模型,PSNR只有32.1dB。用知识蒸馏后,PSNR提升到了33.8dB,推理时间降到22ms。你想想看,效果提升了1.7dB,速度还快了近4倍。这就是蒸馏的价值。
3.4 三者的协同使用
剪枝、量化、蒸馏不是互斥的,我通常把它们组合起来用:
- 先蒸馏:用大模型训练一个小学生模型,得到一个精度不错的轻量模型。
- 再剪枝:对学生模型做结构化剪枝,进一步压缩。
- 最后量化:剪枝后的模型做INT8或INT4量化,部署到端侧。
这套流程走下来,模型体积通常能压缩到原来的5%~10%,推理速度提升5~10倍,精度损失控制在1~2dB以内。
3.5 本章知识结构
下面这张图总结了三种轻量化技术的关系和适用场景:
嗯,这张图把三种技术的关系理清楚了。实际项目中,我建议你先从量化入手——收益最高,改动最小。如果量化后精度不够,再考虑蒸馏和剪枝。别一上来就全上,容易把自己搞晕。