跳转至

二十:模型压缩:GPTQ、AWQ、剪枝与蒸馏

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484166&idx=1&sn=ce9430d5869ed9230d5e8a689a727abd&chksm=f01eb07fc7693969c531069cf5eac085f438ebeb692511dbf5cbc8a341d5598f2e21438b92ab#rd

1. 学习定位

第十九天学习了 ZeroQuant、LLM.int8() 和 SmoothQuant,重点是 INT8、activation outlier 和 W8A8。第二十天继续模型压缩,重点转向 4-bit weight-only PTQ 中最经典的两条路线:GPTQ 和 AWQ,同时补充模型剪枝与知识蒸馏。 本日知识链路:

量化基础
-> weight-only 4-bit PTQ
-> GPTQ: Hessian / OBQ / error compensation
-> AWQ: activation-aware salient weights protection
-> GPTQ vs AWQ deployment comparison
-> pruning: unstructured, structured, semi-structured
-> distillation: logits, hidden states, sequence/task distillation
-> compression method selection
GPTQ 和 AWQ 都常用于开源 LLM 低显存推理部署。面试中需要能说清:GPTQ 为什么使用二阶信息,AWQ 为什么关注 activation,二者与 SmoothQuant/LLM.int8() 有什么差异,以及剪枝和蒸馏与量化如何组合。

2. Weight-only 4-bit PTQ 仅权重 4 比特后训练量化

仅权重量化:只对模型权重做低比特压缩,激活值 (activations) 全程保留浮点精度,属于后训练量化(PTQ,无需重新训练)。 Weight-only quantization 只压缩权重:

weights: INT4 / INT3 / INT8
activations: FP16 / BF16
常见推理过程: - 加载打包后的 INT4 压缩权重

  • 权重解量化 / 融合式「解量化 + 矩阵乘」(fused dequant-GEMM)

  • 与浮点激活值做矩阵运算,完成推理

优点: - 显著降低权重显存。

  • 降低内存带宽压力。

  • 校准成本较低。

  • 对 activation outlier 不直接量化,精度更稳。

缺点: - 不一定获得完整 INT4 计算加速。

  • 需要高效 kernel。

  • 4-bit 误差更大,需要 GPTQ/AWQ 等方法保护重要权重。

3. GPTQ 的定位

GPTQ 是 Generative Pre-trained Transformer Quantization。它是面向 GPT 类大模型的高效训练后量化方法,目标是在少量校准数据上快速把大模型权重量化到 3/4 bit,并尽量保持精度。专门解决4bit极低比特量化下精度掉点严重的问题。 不去独立量化每个权重,而是量化一个权重 → 计算误差 → 把误差补偿给剩下的权重,让整体输出误差最小。 GPTQ 继承了 OBQ(Optimal Brain Quantization)的思想:

量化一个权重后
用二阶信息估计该量化误差对输出 loss 的影响
并补偿剩余未量化权重

4. GPTQ 的二阶近似

对一个线性层:

Y = XW
GPTQ 目标是让量化后的输出接近原输出:

min_{W_q} ||XW - XW_q||^2

img

这个目标与输入 activation 的协方差相关:

H ≈ X^T X

img

  • 一阶导数(梯度):描述损失随权重变化的快慢,代表「改变权重,损失会变多少」。
  • 二阶导数:描述梯度本身的变化快慢,也就是:微调这个权重,会对整体损失造成多大的连锁影响。

海森矩阵 H,就是损失函数 L 对所有权重的二阶偏导数矩阵,记录每一个权重变动,会如何影响全局损失。 H 可以看作该层权重误差对输出误差的二阶敏感度。GPTQ 用 Hessian 逆或近似来决定量化顺序和误差补偿。 每当量化一个权重产生误差→就调整剩余的未量化的权重→把整体的输出误差还是压回最小。 让误差不在输出端堆积,而是在权重之间互相抵消。

5. GPTQ 的误差补偿

当某个权重 w_i 被量化为 q_i,量化误差:

e_i = w_i - q_i
GPTQ 会用 Hessian 逆信息调整剩余权重,降低最终输出误差。抽象地说:

quantize selected weight
compute quantization error
update remaining weights to compensate error
repeat

img

这比逐权重独立 round 更准确,尤其适合低 bit 量化。

6. GPTQ 的工程流程

典型 GPTQ 流程:

1. 准备少量校准数据。(可能大概几十~几百条,看实际情况)
2. 对模型逐层前向,收集该层输入 activation X。
3. 计算近似 Hessian H = X^T X。
4. 对每个线性层分块量化权重。
5. 用 Hessian 逆近似做误差补偿。
6. 保存 packed 4-bit 权重和 scale/zero point。
7. 用 GPTQ kernel 推理。
GPTQ 通常是 layer-wise quantization,不需要端到端重训。

7. GPTQ 的关键超参数

常见配置: - bits:3-bit、4-bit、8-bit。(主流4bit)

  • group_size:例如 32、64、128。(越大则速度越快、显存更省,越小则精度越高)

  • desc_act / act-order:是否按 activation 重要性排序。

  • sym:对称或非对称量化。

  • damp_percent:Hessian damping,增强数值稳定。

  • calibration samples 和 sequence length。

group size 越小,scale 更精细,精度通常更好,但元数据和 kernel 开销更大。

8. GPTQ 的优缺点

优点: - 4-bit 下精度好。

  • 只需少量校准数据。

  • 不需要训练。

  • 开源生态成熟。

  • 适合 dense LLM weight-only 推理。

缺点: - Hessian 近似和分块计算复杂。

  • 量化过程相对 AWQ 更重。

  • 对校准数据、group size、act-order 敏感。

  • 部署效果依赖 kernel。

9. AWQ 的定位 激活感知权重量化

AWQ 是 Activation-aware Weight Quantization。它的核心观察是:

并不是所有权重同等重要
少量 salient weights 对模型输出非常关键
这些重要权重可通过 activation 分布识别
AWQ 不使用复杂的二阶 Hessian,而是利用 activation 统计找到重要通道/权重,通过 scaling 保护它们,让 weight-only 低 bit 量化更稳。

10. AWQ 的 Activation-aware 思想

对于线性层:

Y = XW
如果某些输入通道 activation 幅度大,那么对应权重列对输出影响更大,属于显著权重(salient weights)。AWQ 用校准数据统计 activation,识别重要通道,并通过缩放让这些通道对应权重量化误差更小。 核心直觉:

保护对真实 activation 更敏感的权重(优先保护高幅值激活对应的权重)
而不是只看权重数值大小
这也是 AWQ 名字中 activation-aware 的含义。 - 核心洞察:权重重要性不均,由激活值分布判定关键权重,而非单纯看权重数值;

  • 舍弃复杂的海森矩阵二阶计算,改用等价缩放保护重要权重,轻量化实现高精度量化。

11. AWQ 的 Scaling

AWQ 使用等价缩放保护 salient weights。简化理解:

Y = XW = (X / s)(sW)
通过选择 scale s,放大重要通道的权重,使其在量化时保留更多有效信息,同时激活做相反缩放保持数学等价。 和 SmoothQuant 相似,它也使用等价变换;但 SmoothQuant 主要目标是平滑 activation outlier 做 W8A8,AWQ 主要目标是保护重要权重做 weight-only 低 bit。

12. AWQ 的工程流程

典型 AWQ 流程:

1. 准备校准数据。
2. 前向收集各层 activation 统计。
3. 搜索每层/每组 scaling 参数。
4. 应用 scaling 保护 salient weights。
5. 对权重做 group-wise INT4 量化。
6. 保存量化权重和 scale。
7. 使用 AWQ kernel 推理。
AWQ 不需要反向传播,也不需要 Hessian 逆,因此量化流程通常比 GPTQ 更轻。

13. AWQ 的优缺点

优点: - 量化速度快。

  • 不依赖二阶 Hessian。

  • 对 instruction-tuned / multimodal 模型也常有较好泛化。

  • weight-only INT4 推理友好。

缺点: - 对 activation 校准数据仍敏感。

  • scaling 搜索和 kernel 支持影响部署。

  • 极低 bit 或非常困难任务仍可能退化。

  • 理论最优性不如二阶近似路线直观。

14. GPTQ 与 AWQ 对比

维度 GPTQ AWQ 核心思想 基于二阶 Hessian做全局误差补偿 激活感知 (Activation-aware),用缩放保护关键权重 是否使用 Hessian 需要近似计算 完全不需要 校准数据 需要少量校准样本 需要少量校准样本 量化计算成本 偏高 偏低 部署形态 仅权重量化 (Weight-only INT4) 仅权重量化 (Weight-only INT4) 主要敏感参数 group_size、damping、act-order 激活分布统计、缩放系数搜索 核心优势 极低比特下精度表现更强 量化速度快、实现简单、跨模型迁移稳定性好

15. GPTQ/AWQ 与 SmoothQuant/LLM.int8()

LLM.int8():

8-bit mixed precision
处理 activation outlier
适合 8-bit 推理
SmoothQuant:

W8A8
把 activation 量化难点迁移到 weight
适合 INT8 GEMM 部署
GPTQ/AWQ:

weight-only 4-bit PTQ
重点压缩权重显存和带宽
activation 通常仍是 fp16/bf16
因此 8-bit W8A8 与 4-bit weight-only 的部署目标不同。

16. 模型剪枝

剪枝是删除模型中不重要的结构或参数。 非结构化剪枝Unstructured pruning:

删除单个权重
稀疏模式不规则
理论压缩高,硬件加速难
结构化剪枝Structured pruning:

删除通道、attention head、MLP neuron、layer
结构规则,硬件友好
半结构化剪枝Semi-structured pruning:

例如 2:4 sparsity
每 4 个权重保留 2 个
更容易利用硬件加速
LLM 剪枝要小心,因为删除结构可能破坏能力,通常需要恢复训练或蒸馏。

17. 剪枝指标

常见重要性指标:

  • 权重幅值 (magnitude):最简易标准,绝对值越小,判定为越不重要

  • 激活值幅值:对应单元输出激活越小,贡献越低

  • 梯度 / 泰勒近似:参数梯度越小,对损失影响越小

  • 海森矩阵敏感度:参考二阶信息,衡量参数变动对整体输出的影响程度

  • 注意力头贡献:评估单个 Attention 头对模型推理的作用大小

  • 通道输出范数:用范数衡量通道整体输出强度,范数低则优先剪枝

绝大多数场景下,单纯剪枝无法保住精度,剪枝 + 微调 / 蒸馏是落地标配流程。

18. 知识蒸馏

知识蒸馏让 student 学习 teacher。 常见蒸馏信号: - Logits distillation:匹配 teacher 概率分布。

  • Hidden states distillation:匹配中间层表示。

  • Attention distillation:匹配 attention map。

  • Sequence-level distillation:用 teacher 生成数据训练 student。

  • Preference distillation:蒸馏偏好或 reward 行为。

蒸馏目标:

L = alpha * CE(student, label)
  + (1-alpha) * KL(student_logits || teacher_logits)
蒸馏常和剪枝、量化结合,用于恢复压缩模型能力。

19. 压缩方法组合

常见组合:

quantization + distillation:
  量化后用 teacher 恢复精度

pruning + distillation:
  剪枝后让 student 学 teacher

quantization + pruning:
  同时降低 bit 和参数量

SFT/RLHF + quantization:
  先对齐,再量化部署
组合压缩要注意误差叠加。通常先做结构性压缩,再恢复训练,最后做部署量化。

20. 选型框架

压缩方法选型:

只想省显存快速部署:
  GPTQ/AWQ/NF4 weight-only

想要 INT8 GEMM 加速:
  SmoothQuant / W8A8

想要减少模型参数量:
  structured pruning

想要小模型继承大模型能力:
  distillation

想要低显存微调:
  QLoRA / NF4
最终要用真实任务指标、真实硬件和真实推理栈验证。

21. 核心总结

第二十天需要掌握的最小闭环:

GPTQ:
  weight-only PTQ
  uses Hessian / second-order info
  quantization error compensation

AWQ:
  activation-aware weight quantization
  protects salient weights
  no Hessian, uses activation statistics and scaling

Pruning:
  remove weights/channels/heads/layers
  structured pruning is hardware-friendlier

Distillation:
  student learns teacher logits/hidden/sequence behavior
  often used to recover compressed model quality

Deployment:
  compression method must match hardware kernel and task metric

22. 参考资料

  • GPTQ 原论文:https://arxiv.org/abs/2210.17323

  • AWQ 原论文:https://arxiv.org/abs/2306.00978

  • 量化、剪枝和蒸馏,有代码:https://blog.csdn.net/m0_59257547/article/details/140613606

  • AutoGPTQ:https://github.com/AutoGPTQ/AutoGPTQ

  • llm-awq:https://github.com/mit-han-lab/llm-awq

  • Hugging Face 量化文档:https://huggingface.co/docs/transformers/quantization

            预览时标签不可点
    

    <div class="