跳到主要内容

模型压缩【选修】

本节定位

模型压缩不是为了追求“更小”这一个目标,
而是为了在真实部署里解决更具体的问题:

  • 内存不够
  • 推理太慢
  • 设备跑不动

所以这节课的关键不是记术语,而是建立一个很实用的判断:

压缩永远是在拿某些精度或灵活性,换部署收益。

学习目标

  • 理解量化、剪枝、蒸馏三类压缩方法的核心思路
  • 理解为什么压缩不是白赚
  • 通过可运行示例建立量化误差直觉
  • 学会从部署约束出发选择压缩路线

一、模型压缩到底在换什么?

1.1 常见收益

  • 更小内存
  • 更低延迟
  • 更高吞吐
  • 更适合边缘设备

1.2 常见代价

  • 精度下降
  • 工程复杂度增加
  • 调试更难

1.3 一个类比

模型压缩像出差打包。
你当然希望箱子越轻越好,
但不能把关键东西全扔了。


二、三条最常见的压缩路线

2.1 量化

把高精度数值压到低精度表示。

2.2 剪枝

去掉不太重要的权重、通道或结构。

2.3 蒸馏

让更小模型去模仿更大模型的行为。


三、先看一个最小量化误差示例

weights = [0.12, -1.87, 3.44, -0.03]


def fake_quantize(values, scale):
return [round(v * scale) / scale for v in values]


def mae(a, b):
return sum(abs(x - y) for x, y in zip(a, b)) / len(a)


q8_like = fake_quantize(weights, scale=16)
q4_like = fake_quantize(weights, scale=4)

print("original:", weights)
print("q8_like :", q8_like)
print("q4_like :", q4_like)
print("q8 mae :", round(mae(weights, q8_like), 4))
print("q4 mae :", round(mae(weights, q4_like), 4))

3.1 这个例子最关键的启发是什么?

压得越狠,通常误差越大。
所以量化的核心不是:

  • 能不能压

而是:

  • 压完后业务还能不能接受

3.2 为什么这和真实部署高度相关?

因为部署里最常见的问题之一就是:

  • 模型能不能塞进设备

量化往往是第一步会想到的办法。


四、什么时候更该想量化、剪枝还是蒸馏?

4.1 量化

更适合:

  • 先快速降内存和加速

4.2 剪枝

更适合:

  • 明确知道有大量冗余结构

4.3 蒸馏

更适合:

  • 你愿意重新训练一个更小模型

五、最容易踩的坑

5.1 误区一:压缩一定更快

不一定。
还要看:

  • 硬件支持
  • 推理引擎支持

5.2 误区二:只看模型大小,不看任务指标

部署收益只有在任务还能用时才有意义。

5.3 误区三:先压再说

更稳的顺序通常是:

  • 先明确部署痛点
  • 再选压缩策略

小结

这节最重要的是建立一个部署判断:

模型压缩不是“越小越好”,而是在精度、工程复杂度和部署收益之间做权衡。

只要这个判断建立起来,你后面看量化和蒸馏就不会只剩方法名。


练习

  1. 把示例里的 scale 改大和改小,观察误差变化。
  2. 用自己的话解释:为什么压缩从来不是白赚?
  3. 想一想:如果目标设备内存特别小,你会先考虑哪条路线?
  4. 如果模型大小已经够小,但延迟仍然高,你还会优先做压缩吗?为什么?