029 模型压缩技术综述:量化、剪枝、蒸馏与低秩分解
昨晚调试一块STM32H743上的TinyML推理,板子跑一个MobileNetV2量化模型,死活卡在内存溢出。盯着map文件看了半小时,发现模型权重占了将近1.2MB,而芯片SRAM总共才512KB。这种时候你才会真正理解——模型压缩不是锦上添花,是能不能跑起来的生死线。
嵌入式机器学习最残酷的现实:你花三个月训出来的SOTA模型,在MCU上连加载都做不到。今天这篇笔记,我把这几年在模型压缩上踩过的坑、试过的方案、以及真正能落地的经验,一次性写清楚。
量化:最直接的“降维打击”
量化这件事,本质就是拿精度换速度、换内存。但很多人一上来就做INT8量化,结果模型直接崩了——不是精度掉得离谱,就是推理结果全是NaN。
我踩过最深的坑:直接调用TFLite的默认量化器,把训练好的FP32模型转成INT8,部署到Cortex-M4上。推理结果完全不对,查了两天才发现——激活值的分布根本没校准,量化参数是瞎算的。
正确的做法分三步:
校准数据集必须来自真实场景。别拿ImageNet的随机100张图去校准一个工业缺陷检测模型,分布完全不一样。我习惯从训练集里抽500-1000个样本,覆盖所有类别和边缘case。
逐层检查量化误差。量化后跑一遍校准集,对比每一层的输出和FP32版本的余弦相似度。低于0.99的层,要么换量化策略,要么保留FP32。代码里这样写:
<