二十:模型压缩: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
2. Weight-only 4-bit PTQ 仅权重 4 比特后训练量化¶
仅权重量化:只对模型权重做低比特压缩,激活值 (activations) 全程保留浮点精度,属于后训练量化(PTQ,无需重新训练)。 Weight-only quantization 只压缩权重:
常见推理过程: - 加载打包后的 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)的思想:
4. GPTQ 的二阶近似¶
对一个线性层:
GPTQ 目标是让量化后的输出接近原输出:这个目标与输入 activation 的协方差相关:
- 一阶导数(梯度):描述损失随权重变化的快慢,代表「改变权重,损失会变多少」。
- 二阶导数:描述梯度本身的变化快慢,也就是:微调这个权重,会对整体损失造成多大的连锁影响。
海森矩阵 H,就是损失函数 L 对所有权重的二阶偏导数矩阵,记录每一个权重变动,会如何影响全局损失。
H 可以看作该层权重误差对输出误差的二阶敏感度。GPTQ 用 Hessian 逆或近似来决定量化顺序和误差补偿。
每当量化一个权重产生误差→就调整剩余的未量化的权重→把整体的输出误差还是压回最小。 让误差不在输出端堆积,而是在权重之间互相抵消。
5. GPTQ 的误差补偿¶
当某个权重 w_i 被量化为 q_i,量化误差:
quantize selected weight
compute quantization error
update remaining weights to compensate error
repeat
这比逐权重独立 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 推理。
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。它的核心观察是:
AWQ 不使用复杂的二阶 Hessian,而是利用 activation 统计找到重要通道/权重,通过 scaling 保护它们,让 weight-only 低 bit 量化更稳。10. AWQ 的 Activation-aware 思想¶
对于线性层:
如果某些输入通道 activation 幅度大,那么对应权重列对输出影响更大,属于显著权重(salient weights)。AWQ 用校准数据统计 activation,识别重要通道,并通过缩放让这些通道对应权重量化误差更小。 核心直觉: 这也是 AWQ 名字中 activation-aware 的含义。 - 核心洞察:权重重要性不均,由激活值分布判定关键权重,而非单纯看权重数值;- 舍弃复杂的海森矩阵二阶计算,改用等价缩放保护重要权重,轻量化实现高精度量化。
11. AWQ 的 Scaling¶
AWQ 使用等价缩放保护 salient weights。简化理解:
通过选择 scales,放大重要通道的权重,使其在量化时保留更多有效信息,同时激活做相反缩放保持数学等价。
和 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 推理。
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():
SmoothQuant: GPTQ/AWQ: 因此 8-bit W8A8 与 4-bit weight-only 的部署目标不同。16. 模型剪枝¶
剪枝是删除模型中不重要的结构或参数。 非结构化剪枝Unstructured pruning:
结构化剪枝Structured pruning: 半结构化剪枝Semi-structured pruning: 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 行为。
蒸馏目标:
蒸馏常和剪枝、量化结合,用于恢复压缩模型能力。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="