3. 模型量化技术(下):权重量化与激活量化、KL散度校准、GPTQ/AWQ量化方法
好,咱们接着聊量化。上一节我们把量化的基础概念和对称/非对称量化讲透了。这一节,我打算把几个真正在生产环境中高频使用的技术掰开揉碎。
说白了,量化这件事,核心就两个问题:量化什么,以及怎么校准。前者对应权重量化和激活量化,后者对应KL散度这类校准方法。而GPTQ和AWQ,则是目前最主流的两种实操方案。
权重量化 vs 激活量化
先说说量化对象。很多人一开始以为量化就是压缩模型权重,其实不全面。
权重量化,顾名思义,就是把模型里的权重参数从FP16变成INT8甚至INT4。这个操作是静态的——模型加载完,权重就定死了。好处是显存占用直接砍半甚至砍到四分之一。我在项目中遇到过一个大模型,原始FP16版本要14GB显存,做完INT4权重量化后,直接降到4GB不到,单卡就能跑起来。
激活量化则不同。它量化的是推理过程中每一层的中间结果。这个值每时每刻都在变,所以量化难度更大。但为什么还要做?因为推理的计算瓶颈往往不在权重读取,而在矩阵乘法。如果激活值也是INT8,那就可以用INT8的矩阵乘法单元,速度能翻倍。
嗯,这里要注意:激活量化对精度的影响通常比权重量化更大。我个人的习惯是,先做权重量化,如果精度损失在可接受范围内,再考虑激活量化。
KL散度校准:找到最佳量化边界
量化不是简单地把数值等比例缩放。你想想看,如果原始数据大部分集中在[-1, 1]之间,但有几个离群点跑到10,直接按最大值量化,那大部分精度都浪费了。
这时候就需要KL散度校准。它的思路很简单:找一个阈值T,把[T, -T]之外的值全部截断,然后在这个范围内做量化。目标是让量化后的分布和原始分布的KL散度最小。
为什么会用KL散度?因为它衡量的是两个分布之间的信息损失。我们想要的是:量化后的分布尽可能保留原始分布的信息。
具体做法是这样的:
- 收集一批校准数据,跑一遍推理,记录每一层的激活值分布
- 对不同的阈值T,计算量化后的分布和原始分布的KL散度
- 选择KL散度最小的那个T
我曾经在一个视觉模型上试过,不用KL散度校准,直接按最大值量化,精度掉了3个点。用了KL散度校准后,精度只掉了0.5个点。差距很明显。
GPTQ:基于二阶信息的后训练量化
GPTQ是目前最流行的权重量化方法之一。它的核心思想是:量化一个权重时,考虑它对后续层的影响,然后通过补偿来减少误差。
说白了,它不是独立地量化每个权重,而是逐个量化,每量化一个,就调整剩下的权重来弥补损失。这个过程叫最优脑损伤(Optimal Brain Damage)的变体。
代码实现上,核心步骤是这样的:
# GPTQ核心逻辑(伪代码)
for each layer:
# 收集该层的输入和输出
inputs, outputs = get_calibration_data(layer)
# 计算Hessian矩阵(二阶信息)
H = inputs.T @ inputs
# 逐个量化权重
for col in range(W.shape[1]):
# 找到当前列中最重要的权重
error = compute_quantization_error(W[:, col], H)
# 量化该权重
W_quant[:, col] = quantize(W[:, col])
# 补偿:调整其他权重来减少误差
W[:, col+1:] -= compensation(W[:, col], H)
我在实际部署中用过GPTQ,效果确实不错。一个70B的模型,用GPTQ量化到INT4,精度损失不到1%,但显存从140GB降到了40GB左右。不过要注意,GPTQ的校准过程比较慢,大模型可能需要几个小时。
AWQ:感知重要性的权重量化
AWQ是另一种主流方法,和GPTQ思路不同。它发现:权重中只有一小部分(约1%)是特别重要的,这些权重对精度影响很大。如果对这些重要权重特殊处理,整体精度就能保住。
AWQ的做法是:
- 通过激活值的分布来判断哪些权重更重要
- 对重要权重保留更高的精度(比如INT8)
- 对不重要权重用更低的精度(比如INT4)
这个方法的好处是速度快。GPTQ需要逐个权重调整,AWQ只需要一次前向传播就能确定重要性。我在一个8B的模型上对比过,AWQ的校准时间只有GPTQ的十分之一,精度却差不多。
| 方法 | 校准时间 | 精度损失 | 适用场景 |
|---|---|---|---|
| GPTQ | 慢(小时级) | 低(~0.5%) | 对精度要求极高 |
| AWQ | 快(分钟级) | 中(~1%) | 快速部署、迭代 |
| KL散度校准 | 快(分钟级) | 中(~1-2%) | 激活量化场景 |
知识体系总览
下面这张图把这一节的核心逻辑串起来了。你可以看到,量化技术从量化对象出发,经过校准方法,最终落地到具体的量化方案。
从这张图可以看得很清楚:量化对象决定了你要处理什么,KL散度校准帮你找到最优的量化边界,而GPTQ和AWQ则是两种不同的落地实现。我个人建议,如果时间充裕,优先试GPTQ;如果追求快速迭代,AWQ更合适。
最后说一句,量化不是银弹。有些模型对量化特别敏感,尤其是那些已经用蒸馏或剪枝优化过的模型。遇到这种情况,我一般会先做一小部分量化测试,看看精度损失趋势,再决定是否全量量化。
好了,这一节的内容就到这里。量化技术其实还有很多细节,比如分组量化、动态量化等,但掌握了权重量化、激活量化、KL散度校准、GPTQ和AWQ这几个核心概念,你已经能应对大部分实际场景了。