☰
GLM-5.3-w4a4c8-mxfp4 的 Flex SmoothQuant 原理:norm-linear 与 ov 互逆缩放如何破解低比特量化难题
2026/11/3 10:29:54 网站建设 项目流程

GLM-5.3-w4a4c8-mxfp4 的 Flex SmoothQuant 原理:norm-linear 与 ov 互逆缩放如何破解低比特量化难题

GLM-5.3-w4a4c8-mxfp4是基于 GLM-5.3(BF16)用 msModelSlim 量化的 W4A4 低比特模型,MoE 专家走 MXFP4、注意力与主干 MLP 走 MXFP8。而它能在 4-bit 下保持精度的关键之一,就是Flex SmoothQuant中norm-linear 与 ov 子图上的互逆缩放技巧——本文用尽量少的公式,把这个原理讲清楚。

一、先搞懂问题:W4A4 量化最怕什么?

把线性层Y = X·W量化到低比特时,真正的风险来自激活离群值:个别通道的激活幅度比其他通道高几十甚至上百倍。低比特格式(如 MXFP4)的动态范围有限,一个"巨无霸"通道就会把整组的量化刻度撑大,让其余通道挤进极窄的格子里,精度随之崩塌。

GLM-5.3 的结构特点让这个问题更突出:

  • hidden_size 6144,MoE 256 专家 top-8(前 3 层为 dense),见 config.json;
  • 每层线性层的输入大多来自RMSNorm的输出,而 RMSNorm 本身会保留、甚至放大离群通道;
  • 专家层被压到W4A4,是对激活最"苛刻"的一档。

所以量化的核心矛盾是:激活在线、幅度不受控,而权重离线、可以反复打磨。

二、互逆缩放:一次"不改变输出"的等价变换

SmoothQuant 的核心只有一句话:激活除以 s,权重乘以 s,数学上严格等价:

Y = X · W = (X / s) · (W · s)

这个s是按通道统计得到的缩放因子:

  • 激活侧被除小 → 离群值被"压平",分布变平滑,在线量化更从容;
  • 权重侧被乘大 → 代价转移到离线侧,权重落盘前可以重新做高精度量化,几乎无损。

这就是"把激活的难,等价地搬给权重"。在 GLM-5.3-w4a4c8-mxfp4 中,这一步对应配置项flex_smooth_quant,位于 GLM-5.3_best_practice.yaml:

- type: flex_smooth_quant alpha: null beta: null enable_subgraph_type: - norm-linear - ov include: - '*'

alpha: null / beta: null表示缩放强度由工具结合校准数据(GLM-5.3_best_practice.yaml 中的qwen3_cot_w4a4.json)自动搜索确定——这正是 "Flex" 的由来:不写死平滑系数,而是按数据找最优平衡点。

三、两种子图:norm-linear 与 ov 分别管什么

Flex SmoothQuant 不是对全部算子"一刀切",而是只在两类被验证有效的子图上施加互逆缩放:

3.1 norm-linear:掐断离群值的"传送带"

RMSNorm → Linear

这是 Transformer 中离群值最集中的路径:Norm 输出直接喂给线性层。互逆缩放就"卡"在这两者之间——激活(Norm 输出)除以s,线性层权重乘以s,输出不变,但送入低比特线性层的激活幅度被显著拉平。对 256 个 MoE 专家的入口激活而言,这一步几乎就是 W4A4 的"保命"操作。

3.2 ov(outlier variation):按通道差异动态施力

ov子图关注通道间的幅度差异模式:工具统计各通道激活的离群程度,对差异大的通道给出更强的缩放、对已平滑的通道少动甚至不动,避免"为了压离群值,把整体都压小了"这种矫枉过正。可以把它理解为更精细的按通道自适应平滑。

两者分工互补:

子图类型作用位置解决的问题
norm-linearNorm 到 Linear 的衔接处阻断离群值向低比特线性层的传导
ov通道幅度差异显著的子图按通道自适应分配缩放强度,兼顾平滑度与信噪比

⚠️ 注意范围控制:配置中include: ['*']只是候选全集,最终平滑范围还受保护对象约束——gate、kv_b_proj、indexer 的wk/weights_proj以及首尾敏感层都被排除在低比特量化之外(见 README.md 的保护对象清单)。平滑参数与量化器、位宽强耦合,自定义层范围后建议重新执行参数搜索。

四、在完整量化流水线中的位置

在 GLM-5.3_best_practice.yaml 中,量化流水线按固定顺序执行:

quarot → flex_smooth_quant(norm-linear / ov) → fa3_quant(indexer / knope) → linear_quant ×3

Flex SmoothQuant 处于中游,上游先有QuaRot 正交旋转(旋转矩阵见 rot.safetensors,可选增强见 optional/quarot.safetensors):

  1. QuaRot:W′ = QᵀW,X′ = XQ(Q 为正交阵,QᵀQ = I,计算严格等价),把集中在少数通道的离群值旋转分散到更多通道;
  2. Flex SmoothQuant:在 norm-linear / ov 子图上做X′ = X/s、W′ = W·s的互逆缩放,把残余的激活幅度等价迁移到权重侧;
  3. linear_quant:*mlp.experts.*压到MXFP4(per_block,group_size=32),*self_attn*与其余*mlp*走MXFP8。

旋转是"打散",平滑是"搬家",两者叠加后,激活和权重都落在各自量化工具的动态范围之内——这是 W4A4 能成立的组合拳。

五、结果如何落地?

  • 互逆缩放后的权重与weight_scale按 58,943 组全配对写入 104 个分片(单分片 4 GB),如 quant_model_weights-00001-of-00104.safetensors;
  • 逐 tensor 的量化类型(W4A4_MXFP4/W8A8_MXFP8/FLOAT等)记录在 quant_model_description.json 中,供 vLLM-Ascend 等部署侧按图索骥加载;
  • 分片与张量映射关系由 quant_model_weights.safetensors.index.json 维护。

💡 换句话说:你拿到的量化产物里,每个权重张量都已经"预消化"了平滑变换,推理时无需任何额外开销——这是 SmoothQuant 类"离线等价变换"最大的工程价值。

六、一句话总结

Flex SmoothQuant 的本质是一次零误差的精度再分配:

  • 用norm-linear / ov两类子图精准定位离群值的"高发地";
  • 用X/s 与 W·s 互逆缩放把在线激活的量化难度,等价搬到离线可反复打磨的权重上;
  • 与QuaRot 旋转、保护对象协同,让 GLM-5.3 在W4A4 MXFP4的极限压缩下依然可用。

理解了这套互逆缩放技巧,你也能看懂绝大多数"激活平滑 + 低比特量化"方案的底层逻辑。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询