量化中的异常通道为什么难处理?
简化版
异常通道含少量远大于普通值的权重或激活。若整张量共享 Scale,极值会拉宽范围,让多数值挤在少数格点;若直接裁剪,异常值可能承载关键能力。低比特下范围与分辨率冲突更严重。
常用方法是 per-channel/group 量化、SmoothQuant 把激活难度迁移到权重、AWQ 保护重要通道、Outlier 单独高精度计算或混合精度。选择必须结合校准覆盖、目标 Kernel 与长尾质量。
详细版
scale ≈ (max - min) / (2^bits - 1)
Max 被极值拉大时,量化步长增大;普通值舍入误差上升。裁剪能缩小步长,却产生饱和误差。
| 方案 | 收益 | 代价 |
|---|---|---|
| Per-channel | 隔离通道范围 | Scale 更多 |
| Group-wise | 质量/开销折中 | Group 选择 |
| SmoothQuant | 平滑激活 | 权重范围变大 |
| Outlier 高精度 | 保关键值 | 分支与 Cast |
| QAT | 学习适应误差 | 训练成本 |
异常并不一定是噪声,要用消融判断其任务贡献,避免为平均重构误差删除稀有能力。
完整版教学
1. 什么是异常通道
某些隐藏通道在大量 Token 上出现远高于其他通道的幅值,或少数权重极端。它们常具有通道结构,而非随机散点。
分布结构决定 per-tensor 量化难以同时照顾普通值与极值。
2. 范围与分辨率冲突
固定 bit 只有有限整数格点。范围扩大,步长变粗;范围缩小,极值被 clip。
rounding_error ↑ as scale ↑
clipping_error ↑ as range ↓
校准要在两类误差间选择。
3. 为什么低比特更严重
INT8 有 256 级,INT4 只有 16 级;同一范围下 INT4 步长明显更粗。
因此在 4bit 下,少数 Outlier 对普通值有效精度的挤压更明显。
4. 异常值是否应该裁掉
若 Outlier 来自偶发噪声,适度裁剪有益;若它稳定出现在特定通道并承载稀有 Token 或注意力,裁剪会损伤能力。
用通道消融、任务切片和不同裁剪阈值验证,而不是仅看直方图。
5. Per-channel 为什么有效
每个输出通道使用独立 Scale,使大范围通道不影响其他通道。权重量化通常易实现 per-channel。
Activation per-channel 的 Kernel 和运行时统计更复杂,硬件支持需确认。
6. Group-wise 如何折中
把相邻若干元素共享 Scale,Group 越小适应性越好,但元数据与解码开销越高。
| Group size | 质量倾向 | 性能/存储倾向 |
|---|---|---|
| 32 | 较好 | Scale 较多 |
| 64/128 | 折中 | 常见实现友好 |
| 整 Tensor | 较差 | 最简单 |
具体最优值依模型与 Kernel。
7. SmoothQuant 的直觉
利用线性层缩放等价性,把激活通道的动态范围迁移到权重,使 Activation 更易 INT8 量化。
Y = XW = (X / s) × (sW)
平滑系数过强会让权重更难量化,需要联合选择。
8. AWQ 的直觉
AWQ 根据激活识别对输出重要的权重/通道,通过缩放保护它们,目标不是最小化所有权重的平均误差。
重要性依赖校准分布,长尾缺失会让保护对象判断错误。
它通过少量缩放搜索降低显著权重的量化误差,并保持 Weight-only 部署形式;但不同实现的目标和搜索范围不同,应以具体算法配置说明。
9. Outlier 高精度分支
将少量异常通道保留 FP16,其余 INT4/INT8,可保持质量。但两路 GEMM、Gather/Scatter 与合并增加复杂度。
异常比例过高或位置不规则时,分支开销会抵消低比特收益。
10. 校准集如何覆盖
覆盖语言、领域、长度、格式与安全长尾,统计各层各通道的最大值、分位数与出现频率。
单个极端样本不应直接决定全部 Scale;使用 Percentile、MSE/KL 搜索并在独立集验证。
同时记录 Outlier 在样本间的出现频率:稳定通道与一次性尖峰应区别处理。校准快照、Tokenizer 和预处理版本都要固化,保证可复现。
11. 层与模块敏感度
并非所有 Outlier 都同等重要。Embedding、少数 MLP/Attention 通道可能敏感,其他层可更激进。
逐层替换量化配置,测任务损失与真实延迟,构建混合精度方案。
12. 硬件实现为何关键
Per-group Scale、稀疏 Outlier 分支和动态量化都需要相应 Kernel。若频繁 Cast 或回退 Dense,质量收益可能换来性能退化。
Profile 反量化、访存和主 GEMM,不能只看权重压缩率。
13. 如何验收
报告重构误差、困惑度只是基础;还要测长尾语言、代码、长上下文、安全、Schema 和工具成功率。
性能在目标卡型、真实 Batch/长度上测 TTFT、TPOT、吞吐、显存和功耗,并保留高精度回滚。
异常通道难处理,是因为它们既破坏共享 Scale 的数值分辨率,又可能恰好承载不可随意删除的能力。
14. 常见误区与追问
- 误区:Outlier 都是噪声。 稳定异常通道可能具有功能性。
- 误区:直接扩大范围最安全。 普通值分辨率会下降。
- 误区:裁剪极值一定提升质量。 可能删除稀有能力。
- 误区:Group 越小越好。 Scale 与 Kernel 开销会上升。
- 误区:SmoothQuant 只改善激活且无代价。 难度被迁移到权重。
- 追问:如何判断功能性 Outlier? 看稳定性、通道消融和任务切片。
- 追问:低比特怎么保它们? 细粒度 Scale、平滑、AWQ 或高精度分支。
15. 加强记忆
- 先记矛盾:范围大则步长粗,范围小则会裁剪。
- 再记结构:Outlier 常集中在特定通道。
- 再做粒度:per-channel 或 group-wise。
- 再做迁移:SmoothQuant 平滑激活。
- 再做保护:AWQ/高精度异常分支。
- 再看数据:校准必须覆盖长尾。
- 最后看硬件:真实 Kernel 与任务质量共同验收。