Group Size决定多少个权重共享一个scale和zero point,每128个权重共享一对量化参数时成本约为每权重3.375比特。文章给出了精确的bits per weight计算方式。
Group size 是人们最先修改但最后才理解的参数。它不是一个带有神秘代价的质量调节器——代价完全可以计算,用的是每个权重的比特数,一旦你能算出来,32、64 和 128 之间的选择就不再是凭经验传说。
4-bit 权重是从 0 到 15 的整数。要把它转回实数,需要两个额外的值:scale(缩放),表示一个整数步进值多少;以及 zero point(零点),表示哪个整数代表零。这两个值由一组权重共享,这组权重就是一个 group。
当 group_size=128 时,沿行输入维度连续排列的 128 个权重共享一个 scale 和一个 zero point。在 GPTQConfig 和 AwqConfig 中,group_size=-1 表示整个行是一个 group——每个输出通道一个 scale,是这两个工具提供的最粗粒度选项。分组的走向是有意义的:它沿着归约维度进行,因此一组内的所有权重乘以同一输出的不同输入通道。这恰恰是激活量级变化剧烈的维度,这就是 group 大小会产生影响的原因。
假设常见的打包方式:每组一个 16-bit 的 scale 和 4-bit 的 zero point,权重为 4-bit。每个权重的开销是每组元数据除以 group 大小。
overhead(g) = (16 + 4) / g bits per weight
g = 128 → 20/128 = 0.156 → 4.156 bits per weight
g = 64 → 20/64 = 0.313 → 4.313 bits per weight
g = 32 → 20/32 = 0.625 → 4.625 bits per weight
g = -1 → ~0 → 4.000 bits per weight
把它换算成 7B 模型的 gigabytes,只计算可量化的 linear 权重:
7.0e9 * 4.156 / 8 = 3.64 GB (g=128)
7.0e9 * 4.313 / 8 = 3.77 GB (g=64)
7.0e9 * 4.625 / 8 = 4.05 GB (g=32)
所以从 128 到 32 的整个跨度在 7B 模型上大约是 0.41 GB——约 11%。在 70B 模型上,同样 0.469 bits per weight 约是 4.1 GB,这就是能不能塞进一张 48 GB 显卡的区别。算术运算随参数量线性增长,所以决策的代价在模型变大且空间紧张时变得更高。
16-bit 的 scale 和 4-bit 的 zero point 是常见惯例,不是定律。对称量化(sym=True)不存储 zero point,分子降至 16。有些打包方式使用 32-bit 的 scale。如果你要匹配真实文件大小,先检查你使用的格式实际存储了什么,而不是假设这些常量。
一组的 scale 由该组内权重的范围设定,网格步长是范围除以 15。一组权重跨度为 [-0.02, 0.02] 的组得到的步长约为 0.0027;同样的组与相邻的含有一个量级为 0.5 的单个权重的组合并,步长约为 0.067,粗了 25 倍。合并后组内的每个权重的舍入现在都差了 25 倍,就为了一个离群值。
更小的 group 把这种损害隔离开来。离群值落在自己的 32 或 64 个邻居组成的组中,而不是 128 个,其他组保持它们紧凑的范围。这就是整个精度机制的原理,它解释了两个人们注意到的关于 group 大小的现象:
好处在低比特位宽时更大。在 4 bit 时你有 16 个级别可以失去;在 3 bit 时你有 8 个,在 2 bit 时你有 4 个。当级别更少时,粗粒度的 scale 相对更具破坏性,这就是为什么 3-bit 和 2-bit 量化几乎总是使用比 4-bit 更小的 group。
好处取决于模型的离群值有多重。权重分布干净的模型在大 group 下损失很小。有明显离群值结构的模型损失很大。这就是为什么相同的 group 大小在不同模型系列中表现不同,以及为什么从某个模型抄来的规则不是另一个模型的证据。
Hugging Face Transformers 中的 GPTQConfig 和 AwqConfig 都默认为 group_size=128,两者都描述 128 为推荐值。原因并非纯粹关乎误差。
每权重 0.156 bits 很便宜。4-bit 权重上不到 4% 的开销已经小到没人会争论,同时比每行一个 scale 细 128 倍。
内核是为此写的。混合精度 matmul 内核按 tile 加载权重,与 tile 边界对齐的 group 边界意味着 scale 可以每个 tile 加载一次并在寄存器中应用。不能整除 tile 大小的 group 大小会迫使要么重新加载要么走更慢的路径。128 能整除这些内核使用的形状,因此 4-bit group-128 是跨运行时内核覆盖最好的配置。
这是检查点 baked 时用的。大多数在 Hugging Face 上发布的 GPTQ 和 AWQ 文件使用 128,所以这是被其他人验证过最多推理路径的配置。
三种情况真正有理由离开 128,一种常见情况则不是。
降到 4 bit 以下。如果你用 3 bit 或更少 baking,更小的 group 在做实际工作,每权重多花的 0.16 到 0.47 bits 是你通过降低比特位宽所节省的一小部分。或者,非均匀地花费预算:混合精度量化按层而非按 group 分配。
模型有已知的离群值结构。当模型的权重有集中极端值时,更小的 group 限制损害而非扩散。
你内存充裕且受质量约束。如果模型已经有余量,group 32 花你零点几 GB 换一个严格更细的近似。先检查你的内核是否支持它达到同样速度。
站不住脚的情况是"输出看起来不对所以我把 group 大小减半"。Group 大小略微改变每个权重的舍入;它不能修复损坏的 chat template、错误的 stop token 或设错了的采样参数。在花一次 bake 之前先排除这些。
Quantization Granularity: Per-Tensor, Per-Channel and Per-Group Scales
GPTQ Explained: How Post-Training Calibration Works
AWQ Explained: Protecting the Weights That Matter Most