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散度?因为它衡量的是两个分布之间的信息损失。我们想要的是:量化后的分布尽可能保留原始分布的信息。

具体做法是这样的:

  1. 收集一批校准数据,跑一遍推理,记录每一层的激活值分布
  2. 对不同的阈值T,计算量化后的分布和原始分布的KL散度
  3. 选择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的校准过程比较慢,大模型可能需要几个小时。

避坑指南: 我曾经遇到过GPTQ量化后模型输出出现重复片段的问题。后来发现是校准数据太少,只有100条。增加到500条后问题就解决了。校准数据量建议至少500条。

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散度

从这张图可以看得很清楚:量化对象决定了你要处理什么,KL散度校准帮你找到最优的量化边界,而GPTQ和AWQ则是两种不同的落地实现。我个人建议,如果时间充裕,优先试GPTQ;如果追求快速迭代,AWQ更合适。

最后说一句,量化不是银弹。有些模型对量化特别敏感,尤其是那些已经用蒸馏或剪枝优化过的模型。遇到这种情况,我一般会先做一小部分量化测试,看看精度损失趋势,再决定是否全量量化。

实战建议: 先做权重量化(INT8),评估精度。如果OK,再尝试激活量化。如果还想进一步压缩,上GPTQ或AWQ的INT4。每一步都要用验证集评估,别跳步。

好了,这一节的内容就到这里。量化技术其实还有很多细节,比如分组量化、动态量化等,但掌握了权重量化、激活量化、KL散度校准、GPTQ和AWQ这几个核心概念,你已经能应对大部分实际场景了。

可可精品资料库