为什么需要模型轻量化

大模型效果好,但又大又慢。一个 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。三步叠加下来,模型可以缩小到原来的几十分之一,而效果只掉几个百分点。

组合策略的经验
  • 先蒸馏后剪枝蒸馏后的小模型更紧凑,剪枝收益更大。
  • 最后量化量化对结构变化敏感,放在最后一步。
  • 每步都评测蒸馏后评一次,剪枝后评一次,量化后评一次,定位是哪步掉了精度。