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-linear | Norm 到 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 ×3Flex SmoothQuant 处于中游,上游先有QuaRot 正交旋转(旋转矩阵见 rot.safetensors,可选增强见 optional/quarot.safetensors):
- QuaRot:
W′ = QᵀW,X′ = XQ(Q 为正交阵,QᵀQ = I,计算严格等价),把集中在少数通道的离群值旋转分散到更多通道; - Flex SmoothQuant:在 norm-linear / ov 子图上做X′ = X/s、W′ = W·s的互逆缩放,把残余的激活幅度等价迁移到权重侧;
- 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),仅供参考