模型压缩【选修】
本节定位
模型压缩不是为了追求“更小”这一个目标,
而是为了在真实部署里解决更具体的问题:
- 内存不够
- 推理 太慢
- 设备跑不动
所以这节课的关键不是记术语,而是建立一个很实用的判断:
压缩永远是在拿某些精度或灵活性,换部署收益。
学习目标
- 理解量化、剪枝、蒸馏三类压缩方法的核心思路
- 理解为什么压缩不是白赚
- 通过可运行示例建立量化误差直觉
- 学会从部署约束出发选择压缩路线
一、模型压缩到底在换什么?
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 误区三:先压再说
更稳的顺序通常是:
- 先明确部署痛点
- 再选压缩策略
小结
这节最重要的是建立一个部署判断:
模型压缩不是“越小越好”,而是在精度、工程复杂度和部署收益之间做权衡。
只要这个判断建立起来,你后面看量化和蒸馏就不会只剩方法名。
练习
- 把示例里的
scale改大和改小,观察误差变化。 - 用自己的话解释:为什么压缩从来不是白赚?
- 想一想:如果目标设备内存特别小,你会先考虑哪条路线?
- 如果模型大小已经够小,但延迟仍然高,你还会优先做压缩吗?为什么?