一、算法总览
1. AWQ(Activation-aware Weight Quantization,激活感知权重量化)
- 定位:仅权重量化(Weight-only)的后训练量化(PTQ)算法,专为大语言模型(LLM)设计,核心是激活引导权重保护。
- 核心思想:权重重要性由激活分布而非权重本身决定,对与大激活值关联的 “显著权重通道” 做缩放保护,再统一量化,最小化关键信息损失。
- 量化方案:主流W4A16(权重 4bit,激活 FP16),硬件友好,适配边缘 / 端侧部署。
2. GPTQ(GPT Quantization,GPT 专用权重量化)
- 定位:基于二阶信息(Hessian 矩阵)的后训练量化算法,专门针对 GPT 类 Transformer 模型优化,核心是逐层最小化输出误差。
- 核心思想:将量化视为优化问题,通过Hessian 矩阵建模权重对输出的影响,分块量化 + 误差补偿,让量化误差尽可能不扩散。
- 量化方案:主流W4A16,是当前工业界最成熟的 4bit 量化方案之一。
二、AWQ 算法详解
1. 核心原理
(1)关键洞察
LLM 中仅0.1%~1%的权重对性能至关重要,这些权重对应输入激活值幅度大的通道;直接量化会导致严重精度损失,需优先保护。
(2)权重重要性计算
通过激活分布评估权重通道重要性,公式:Iij=∣Wij∣⋅E[∣Xj∣]
- Wij:权重矩阵元素
- Xj:第 j 个输入激活通道
- E[∣Xj∣]:激活通道 j 的平均绝对值(校准数据统计)
(3)通道缩放保护(核心创新)
- 对高重要性通道:乘以缩放因子 s放大,降低量化相对误差;推理时激活反向缩放,保证数学等价。
- 优化目标:最小化量化前后输出误差mins∥WX−(s⋅clip(W/s,−Qmax,Qmax))X∥22
- 对低重要性通道:直接做低比特(4bit)量化。
2. 实现步骤(伪代码)
def awq_quantize(weight, activation, w_bit=4, protect_ratio=0.01): # 1. 统计激活分布,计算权重重要性 act_scale = torch.mean(torch.abs(activation), dim=0) # 按通道平均激活 weight_importance = torch.abs(weight) * act_scale # 重要性分数 # 2. 筛选需保护的显著通道(前 protect_ratio 比例) threshold = torch.kthvalue( weight_importance.flatten(), int((1 - protect_ratio) * weight.numel()) )[0] protect_mask = weight_importance > threshold # 3. 按通道计算缩放因子(保护通道用高精度缩放) scale = torch.where( protect_mask, torch.max(torch.abs(weight), dim=1)[0] / (2 ** (w_bit + 2) - 1), # 高精度 torch.max(torch.abs(weight), dim=1)[0] / (2 ** w_bit - 1) # 标准4bit ) # 4. 缩放+量化+反量化(模拟推理) scaled_weight = weight / scale quant_weight = torch.round(torch.clamp(scaled_weight, -1, 1)) dequant_weight = quant_weight * scale return dequant_weight, scale3. 核心特点
- 无需反向传播:仅前向统计激活,量化速度快、泛化性强。
- 通道级保护:仅保护少量关键通道,不影响硬件并行效率。
- 边缘友好:量化后模型显存占用降 75%,推理加速 3 倍 +,适配 Jetson、手机等端侧设备。
三、GPTQ 算法详解
1. 核心原理
(1)优化目标
最小化量化前后模型输出的均方误差(而非权重误差),公式:minW^∥WX−W^X∥F2s.t. W^∈Zq
- W:原始权重(FP16)
- W^:量化后权重(INT4)
- X:校准数据激活
- ∥⋅∥F:Frobenius 范数
(2)二阶信息(Hessian 矩阵)
用Hessian 矩阵 H=XTX建模权重对输出的影响,量化时优先处理对输出影响大的权重,减少误差扩散。
(3)分块量化 + 误差补偿(核心)
- 权重矩阵按列块(如 128 列)迭代量化。
- 每块量化后,计算量化误差,并通过Hessian 逆矩阵将误差补偿到未量化权重,保证整体输出误差最小。
- 优化:Cholesky 分解加速 Hessian 逆计算;延迟批量更新提升 GPU 效率。
2. 实现步骤(伪代码)
def gptq_quantize(weight, activation, w_bit=4, block_size=128): # 1. 计算 Hessian 矩阵并做 Cholesky 分解 H = activation.T @ activation H_inv = torch.cholesky_inverse(torch.cholesky(H + 1e-6 * torch.eye(H.shape[0]))) # 2. 按列块迭代量化 quant_weight = weight.clone() for i in range(0, weight.shape[1], block_size): # 取当前块 block = quant_weight[:, i:i+block_size] # 标准 4bit 量化 scale = torch.max(torch.abs(block), dim=1)[0] / (2 ** w_bit - 1) quant_block = torch.round(torch.clamp(block / scale, -1, 1)) * scale # 计算量化误差 error = quant_block - block # 误差补偿:传播到未量化列 quant_weight[:, i+block_size:] -= error @ H_inv[i:i+block_size, i+block_size:] # 更新当前块为量化结果 quant_weight[:, i:i+block_size] = quant_block return quant_weight3. 核心特点
- 精度极高:4bit 量化下几乎无损,LLaMA-7B 量化后 PPL 仅上升 0.1~0.3。
- 逐层优化:误差局部补偿,不影响其他层,稳定性强。
- 生态成熟:支持 AutoGPTQ、ExLlama 等工具,适配主流 LLM(LLaMA、Qwen、Llama 2)。
四、AWQ vs GPTQ 核心对比
| 对比维度 | AWQ(激活感知) | GPTQ(二阶优化) |
|---|---|---|
| 核心理念 | 激活引导,保护关键权重通道 | 二阶误差建模,最小化输出损失 |
| 信息来源 | 激活分布(一阶统计) | Hessian 矩阵(二阶信息) |
| 量化粒度 | 通道级保护 + 分组量化 | 列块迭代 + 误差补偿 |
| 校准数据 | 少(100~512 样本) | 中等(需代表性数据) |
| 计算开销 | 低(仅前向) | 高(Hessian 计算 + 补偿) |
| 量化速度 | 快(7B 模型约 30min) | 慢(7B 模型约 1~2h) |
| 4bit 精度 | 极高(极低比特更优) | 极高(成熟稳定) |
| 推理速度 | 快(vLLM 原生支持) | 快(CUDA 内核优化) |
| 适用场景 | 边缘 / 端侧、多模态、动态输入 | 云端部署、追求极致精度 |
| 生态支持 | 快速成长(vLLM、SGLang) | 成熟(AutoGPTQ、ExLlama) |
五、实战要点与避坑指南
1. AWQ 实战要点
- 校准数据:用 100~500 条通用文本(如 Wiki、书籍),覆盖模型常见输入场景。
- 保护比例:默认0.1%~1%,过大影响压缩率,过小精度下降。
- 推理优化:用vLLM原生支持 AWQ,推理速度比 GPTQ 快 10%~20%。
- 硬件适配:优先 NVIDIA GPU、Apple Silicon、昇腾 NPU,端侧部署首选。
2. GPTQ 实战要点
- 校准数据:需高质量、代表性数据(如模型训练数据子集),否则精度下降明显。
- 块大小:默认128,平衡精度与速度;小模型可用 64,大模型可用 256。
- 工具选择:用AutoGPTQ一键量化,支持加载预量化模型;推理用ExLlama内核加速。
- 显存优化:量化时需足够显存(7B 模型需 16GB+),可分块量化减少内存占用。
3. 避坑指南
- AWQ 坑:
- 激活统计错误:校准数据过少 / 分布偏差,导致重要性计算不准。
- 缩放因子溢出:保护通道缩放过大,导致量化后数值溢出,需加 clip 约束。
- GPTQ 坑:
- Hessian 数值不稳定:加1e-6 正则项避免矩阵奇异。
- 误差补偿过度:未量化权重被过度修正,导致模型发散,需控制补偿幅度。
六、总结与选型建议
1. 算法总结
- AWQ:轻量、激活感知、端侧友好,低比特(3/4bit)精度更优,量化快、适配边缘设备。
- GPTQ:精准、二阶优化、生态成熟,云端部署首选,4bit 量化几乎无损,稳定性极强。
2. 选型建议
- 选AWQ:
- 部署在边缘 / 端侧(Jetson、手机、Mac)。
- 做3bit/4bit 极低比特量化。
- 追求量化速度,快速迭代模型。
- 选GPTQ:
- 云端 GPU 部署,追求极致精度。
- 用成熟工具链(AutoGPTQ、ExLlama)。
- 量化经典 LLM(LLaMA、Llama 2、Qwen)。