为什么需要模型轻量化
大模型效果好,但又大又慢。一个 7B 模型 FP16 就要 14GB 显存,手机和边缘设备根本跑不动。如果要把大模型部署到端侧——手机、摄像头、嵌入式盒子——必须先把模型压小。轻量化就是在「效果不掉太多」和「模型足够小」之间找平衡。
常见的轻量化路线有三条:知识蒸馏让一个小模型学会大模型的本事;模型剪枝去掉模型里不重要的连接;量化把权重从浮点数压成整数。三条路各有侧重,实际项目里经常组合使用。
轻量化的目标不是「把模型压到最小」,而是「在效果可接受的前提下,把模型压到目标设备能跑」。
- 知识蒸馏用大模型当老师,训练一个小模型模仿它的输出。
- 模型剪枝把权重中接近零的连接剪掉,减少参数量和计算量。
- 量化把 FP16 权重压到 INT8 或 INT4,显存和计算都减半。
- 组合策略蒸馏加剪枝加量化,三步叠加才能端侧落地。
知识蒸馏:让小模型学大模型
知识蒸馏的思路很直观:大模型叫「教师模型」,小模型叫「学生模型」。先让大模型在大量数据上生成软标签(不是硬分类结果,而是带概率分布的输出),然后训练小模型去拟合这些软标签。这样小模型不仅学到了正确答案,还学到了大模型「认为哪些选项更接近正确答案」的隐含知识。
# 知识蒸馏的基本流程
# 1. 准备教师模型(大模型,已训练好)
teacher = load_pretrained("large-model")
# 2. 准备学生模型(小模型,从头训练)
student = SmallModel()
# 3. 用教师模型生成软标签
for batch in dataloader:
teacher_logits = teacher(batch)
soft_labels = softmax(teacher_logits / temperature)
# 4. 训练学生模型拟合软标签
student_logits = student(batch)
loss = kl_divergence(student_logits, soft_labels)
loss.backward()
温度系数是蒸馏的关键参数。温度越高,软标签的分布越平滑,学生模型能学到更多「暗知识」;温度越低,越接近硬标签。通常先用高温蒸馏,再用低温微调。
模型剪枝:去掉冗余连接
训练好的大模型里,很多权重其实接近零——这些连接对输出几乎没有贡献。剪枝就是把这些不重要的连接去掉,让模型变小变稀疏。剪枝分两种:非结构化剪枝(逐个权重剪)和结构化剪枝(整层或整通道剪)。
非结构化剪枝能压很高比例,但剪出来的稀疏矩阵在普通硬件上跑不快,需要专用推理库。结构化剪枝直接剪掉整个注意力头或者整个 FFN 层,剪完还是标准结构,直接就能跑。
| 方法 | 压缩比 | 推理加速 | 适用场景 |
|---|---|---|---|
| 知识蒸馏 | 模型缩小 5 到 10 倍 | 快 | 需要完整重训 |
| 结构化剪枝 | 参数量减 30% 到 50% | 中等 | 已有模型微调 |
| 量化 | 显存减半到四分之一 | 取决于硬件 | 部署阶段 |
量化落地:从 FP16 到 INT4
量化是最轻量的优化——不需要重新训练,只要把权重的数值表示从浮点数换成整数。FP16 是 16 位浮点数,INT8 是 8 位整数,INT4 是 4 位整数。位数越少,模型占的显存越小,计算也越快。
# 量化落地的常见步骤
# 1. 训练好的 FP16 模型
# 2. 静态量化:用校准数据统计权重分布,确定量化参数
# 3. 量化感知训练(QAT):少量数据微调,恢复精度
# 4. 导出 INT8 模型,用支持 INT8 的推理框架部署
# 经验法则:
# INT8:精度几乎不掉,显存减半
# INT4:精度可能掉 1% 到 3%,显存降到四分之一
# 端侧部署:优先 INT8,资源实在紧张再上 INT4
三条路线的组合使用
实际项目里,单一手段往往不够。常见的组合是:先用蒸馏把大模型变成小模型,再用剪枝去掉小模型里的冗余,最后用量化把小模型压到 INT4。三步叠加下来,模型可以缩小到原来的几十分之一,而效果只掉几个百分点。
- 先蒸馏后剪枝蒸馏后的小模型更紧凑,剪枝收益更大。
- 最后量化量化对结构变化敏感,放在最后一步。
- 每步都评测蒸馏后评一次,剪枝后评一次,量化后评一次,定位是哪步掉了精度。
边缘部署的工程考量
把模型压缩好只是第一步,端侧部署还有很多工程问题:手机 NPU 支持哪种量化格式、推理时内存峰值会不会 OOM、冷启动时间能不能接受、模型更新怎么做热修复。这些问题比压缩算法本身更影响落地。
建议从一开始就确定目标设备,按设备的能力倒推压缩比例。手机上能跑 INT8,摄像头可能只能跑 INT4 甚至更小。不要先压缩再找设备,要反过来。
从压缩到上线的完整流程
一个完整的轻量化项目流程是:确定目标设备和精度底线 → 蒸馏出小模型 → 结构化剪枝 → 量化微调 → 在目标设备上实测延迟和内存 → 迭代调整压缩比例。上线后还要持续监控效果,因为端侧分布和服务器分布可能不一样。
轻量化不是一次性压缩,而是「效果、大小、延迟」三角权衡的持续迭代。目标设备变了,压缩策略也要跟着变。