DualScale:w4a4量化方案说明¶
简介¶
- 背景:传统的分组量化通常采用单尺度(single-scale)策略:每组K维元素共享一个缩放因子。例如,MXFP4格式中每32个元素使用一个FP8格式的共享指数。然而,激活值中存在结构化的异常通道(outlier channels)——某些通道的值平均比其他通道高出数个数量级。单尺度量化难以同时精准表示这些差异巨大的数值范围,导致精度损失。
- 核心思想:通过两级粒度递进的缩放因子,在保持硬件高效性的同时提升4比特量化的精度。
算法原理¶
计算逻辑与核心公式如下:
1.权重激活值 (Activation) 的动态量化与反量化 (Fake Quantization)¶
a) 外层缩放 (Dual Scale)¶
将输入 X 按照 x_dual_block_size 划分,计算每个大块的最大绝对值,得到外层尺度 $S_{dual_x}$:
$$X_{dualscaled} = \frac{X}{S_{dual_x}}, \quad S_{dual_x} = \frac{\max(|X_{block}|)}{{MXFP4_MAX_NORMAL}}$$
b) 内层量化与反量化 (Inner Quant-Dequant)¶
将 $X_{dualscaled}$ 进一步按 x_inner_block_size 划分,计算内层尺度并转换为目标低比特格式:
$$X_{q_dq_inner} = \text{mxfp4_quantize_dequantize}(X_{dualscaled}, S_{inner_x})$$
c) 外层反量化 (Dual Scale Dequantization)¶
$$X_{q_dq} = X_{q_dq_inner} \times S_{dual_x}$$
2. 权重 (Weight) 的静态反量化 (Dequantization)¶
权重在初始化时已完成了量化存储,前向传播时仅进行两级反量化恢复至高精度:
a) 内层反量化 (Inner Dequantization)¶
根据内层参数 inner_w_q_param 恢复基础缩放:
$$W_{dualscaled_q_dq} = \text{dequantize}(W_{quantized}, S_{inner_w})$$
b) 外层反量化 (Dual Scale Dequantization)¶
乘以模型初始化时固化的外层权重尺度 weight_dual_scale ($S_{dual_w}$):
$$W_{q_dq} = W_{dualscaled_q_dq} \times S_{dual_w}$$
3. 矩阵乘法矩阵 (Linear Inverted)¶
$$\text{Output} = X_{q_dq} \cdot W_{q_dq}^T + \text{bias}$$
使用前准备¶
安装 msModelSlim 工具,详情请参见《msModelSlim工具安装指南》。
适用要求¶
- 低比特量化:适合极低比特量化场景中的4比特量化。
- 高精度需求:在低比特条件下仍能保持较高的模型精度。
- 计算资源:需要额外的优化过程,计算成本高于简单量化方法。
-
使用限制:
- 需要足够的校准数据或训练迭代次数来优化参数,由于涉及到迭代优化,量化时长相对其他方法相对较久。
- 当前该方案主要面向Qwen3稠密系列模型(如Qwen3-8B/14B/32B)的低比特量化场景,不保证可泛化到其他系列模型。
功能介绍¶
昇腾AI处理器支持情况¶
| 产品系列 | 支持 |
|---|---|
| Atlas 350 加速卡 | ✓ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | ✗ |
| Atlas A2 训练系列产品/Atlas 800I A2 推理产品 | ✗ |
| Atlas 推理系列产品 | ✗ |
[!NOTE]
算法实现包含训练过程,对NPU显存有一定的要求,仅支持NPU显存>=64G的设备。
YAML配置示例¶
作为Processor使用,YAML配置示例如下:
process:
- type: "linear_quant"
qconfig:
act:
scope: "dual_scale"
dtype: "mxfp4"
symmetric: True
method: "dualscale"
ext: {
dual_block_size: 512
}
weight:
scope: "dual_scale"
dtype: "mxfp4"
symmetric: True
method: "dualscale"
ext: {
dual_block_size: 512
}
YAML配置字段详解¶
qconfig.weight (权重量化配置)¶
| 参数名 | 作用 | 可选值 | 说明 | 默认值 |
|---|---|---|---|---|
| scope | 量化范围 | "dual_scale" |
dual_scale: 双尺度 | "per_block" |
| dtype | 量化数据类型 | "mxfp4" |
mxFP4 格式量化 | "mxfp4" |
| symmetric | 是否对称量化 | true, false |
true: 对称量化,零点为0 false: 非对称量化,零点可调整 |
true |
| method | 量化方法 | "dualscale" |
dualscale: 二级量化算法 | "dualscale" |
| dual_block_size | block大小 | "int" |
dual_block_size: block大小 | 512 |