概览(一句话总结)
Dual Grained Quantization(DGQ)把「组内 INT4 细粒度权重」在推理前无损抬升到「INT8 通道尺度」,再搭配 A8 动态/静态激活量化,实现 W4 × A8 模式既享受 Fine-grained 精度,又保留 INT8 GEMM 的硬件效率,并用“双阶段网格搜索 + 百分位裁剪”确保量化参数快速可得、精度几乎无损。


背景与挑战

  • 粗粒度(通道/张量)量化 易映射到连续 INT8 GEMM,但精度差;细粒度(组 / token / vector)量化 精度高,却因“每组独立 scale”打断累加轴而无法用单一 INT8 核心高效执行。(arxiv.org)

  • 现有 W4A16 或 W3A16 方法在显存占用上优于 FP16,却需 FP16 累加;W4A8 方案若直接 group-wise,仍要分段 GEMM + FP16 合并,速度受限。

核心设计思想

1. 双粒度权重量化(Dual-Grained)

  1. 离线

    • 对每个 group g 求 INT4 量化W_{u4} 与对应组尺度S'_{fp16}(细粒度)。

    • S'{fp16} 分解 为 整型组尺度S^{(2)}{s8}(INT8 保存)和 通道尺度s^{(1)}_{fp16}(FP16)。

    • 存储:W_u4 (4 bit) + S^{(2)}_{s8} (8 bit) + s^{(1)}_{fp16} (16 bit)。

  2. 推理
    $W_{s8}=S^{(2)}{s8}\cdot(W{u4}+ZP)$ 再与 A8 激活做 一次性 INT8 GEMM;结果乘以s^{(1)}{fp16},s^{X}{fp16} 即回到 FP16 精度。

这样保留了组尺度的低误差,又让乘法仍可用通用 INT8 kernel。

2. 双阶段网格搜索(Two-Phase Grid Search)

直接同时搜索两级 scale{s^{(1)},S^{(2)}} 维度爆炸。DGQ:

  1. Phase-1:只对每组搜索最优S'_{fp16}、ZP,复杂度O(n_g\sigma_g)

  2. Phase-2:在组 scale 固定后,再按通道搜索s^{(1)} 并离散S^{(2)}=\big\lfloor S'/s^{(1)}\big\rfloor,复杂度降低到O(\sigma_c)
    总复杂度O(n_g\sigma_g+\sigma_c),比一次性搜索的O(o,n_g,\sigma_g,\sigma_c) 快近两个数量级。

3. 百分位裁剪平滑(Percentile Clipping Smooth)

针对 LLaMA 中 GLU 放大激活离群值的问题,DGQ在每层按通道对激活做 p-th percentile 裁剪 + scale 回填,无需梯度或 Hessian 即显著抑制 outlier 对量化误差的影响。

4. 高效 CUTLASS INT8 Kernel

作者基于 NVIDIA CUTLASS 实现融合“INT4→INT8 dequant + GEMM”算子,在 长序列 情况下比 A16W4 实际推理 提速 ≈ 3.2×,同时显存仅为 A8W8 的一半。


实验结果速览

量化方案

LLaMA-1 30B (WikiText-2 PPL↓)

OPT 30B (PPL↓)

速度 (Seq 2 k)

显存

FP16

4.10

10.86

baseline

baseline

SmoothQuant A8W8

4.48

10.90

=

0.5×

AWQ A16W4

4.63

11.41

0.7×

0.5×

DGQ A8W4

4.28

10.93

≈1.0× FP16 / 1.3× AWQ

0.5× FP16 / 0.8× A16W4

此外,DGQ 在六项 CSQA 零样本任务上与 FP16 误差 ≤ 0.5 pp;在长序列 4 k-token 情形,整体延迟与 A8W8 持平而显存继续下降。


与现有方法对比

方法

精度

推理效率

关键技巧

GPTQ / AWQ(W4A16)

组/通道 W4 精度好

FP16 累加慢

二阶近似 + Reorder / Activation-Aware scale

ZeroQuant-v2 (W4A8)

引入 LoRC 拟合误差

需额外 FP16 低秩补偿

低秩补偿 + 平滑

DGQ

同级最佳

INT8 GEMM,端到端最快

双粒度权重 + 两阶段搜索 + 百分位裁剪


适用场景与局限

  • 适用:需要通用 GPU 推理、对显存/带宽敏感的在线生成、移动端 INT8 GEMM。GitHub 已提供一键脚本与 CUTLASS kernel。(github.com)

  • 局限

    • 仍需保存两套 scale,参数量略高于纯组 INT4。

    • A8 激活对部分极端稀疏/高动态范围任务可能不足,需配合 SmoothQuant 或动态量化。

    • 当前 kernel 针对 NVIDIA GPU;ARM/ASIC 需重新调度指令。


未来可能改进方向

  1. 自动分组大小 & 自适应双粒度拆分(可融合 Hessian 估计)。

  2. 将 DGQ 与 KV-Cache 量化(如 ZipCache)结合,统一显存压缩策略。

  3. 面向 H100 FP8 Pipe 的“FP8-INT4”混合版本,进一步降低能耗。

  4. 在编译器层做 Scale-Fusion & Kernel-Fusion,减少访存。(huggingface.co, papers.ssrn.com)


参考:arXiv 论文与 PDF 全文、OpenReview 提交、GitHub 实现、HuggingFace DailyPapers 摘要、SSRN & X-MOL 聚合页面等。感谢原作者与社区提供的公开材料。