本页目录 STEPQuant

STEPQuant

STEPQuant 将 Delta-rule 线性注意力的循环状态量化拆成时间与空间两个问题:按误差寿命分配混合精度,再按关键行影响和双轴幅值拟合尺度;在两款混合模型上,名义 6-bit 状态接近 FP32 准确率,并将循环状态压缩超过 5 倍。

论文基本信息

  • 题目:STEPQuant: When and Where Errors Matter in Delta-Rule Recurrent State Quantization
  • 作者:Bingchen Yao、Haobo Xu、Haokun Lin、Yichen Wu、Ziyu Guo、Renrui Zhang、Zhichao Lu、Zhenan Sun、Ying Wei
  • 机构:浙江大学、香港城市大学、清华大学、哈佛大学、中国科学院自动化研究所 NLPR & MAIS、香港中文大学
  • arXiv:2609.38169v1,2026 年 9 月 29 日提交;类别 cs.CL、cs.AI、cs.LG
  • Daily Papers:Hugging Face 页面 2026 年 10 月 8 日榜首
  • 代码与系统:STEPQuant 开源实现,集成到 SGLang 0.5.12
  • 链接:Hugging Face 详情页;arXiv 摘要页;arXiv HTML 全文;arXiv PDF 全文;代码仓库

一句话结论

循环状态是“固定大小”而不是“没有成本”:并发请求越多,每个请求都要长期保留一份状态。STEPQuant 发现低比特量化失败的关键不只是瞬时舍入误差,而是误差会被反复写回并沿时间传播,同时不同 key row 对输出的影响和不同 row/column 的幅值都高度不均。它据此把精度分给误差大、寿命长的单元,并对状态矩阵做关键行感知的双轴尺度拟合;在 Qwen3.8-27B 与 Kimi-Linear-48B-A3B-Instruct 上,名义 6-bit 配置几乎保持 FP32-state 准确率,同时把循环状态压缩约 5 倍。

背景与动机

线性注意力只是换了一种内存账单

标准 softmax attention 在自回归解码中保留随上下文增长的 KV cache。Gated DeltaNet(GDN)和 Kimi Delta Attention(KDA)一类线性注意力则把历史压缩进固定大小的状态矩阵:单个 head 的状态可写为 S_t ∈ R^(d_k × d_v),每一步用当前 key、value 和 retention gate 更新,再通过 query 读出。

这种状态不随序列长度增长,但必须为每个活跃请求持续存在。批量和并发升高时,状态池仍会线性扩张。论文给出的 Qwen 部署示例中,在官方 SGLang 配置可支持 70 个并发请求时,FP32 状态池已经比 BF16 模型权重更占显存。权重量化后,循环状态所占比例还会进一步上升。

为什么普通 INT8 仍然不够稳

权重通常量化一次后保持不变,循环状态却在每一个 decode step 都经历“反量化、更新、重新量化”。设量化后累积误差为 E_t,本步新引入的舍入误差为 ε_t,论文推导出:

E_t = A_t E_(t-1) + ε_t
output_error_t = E_(t-1)^T A_t^T q_t

其中 A_t 同时包含 retention gate 和 Delta update。旧误差不会自动消失:如果 gate 接近 1,且后续 key 很少命中误差所在方向,误差会存活许多步;新误差又会持续叠加。因此,对所有位置使用同一 bit width、同一尺度,即便是 INT8,也可能破坏长推理。

作者把问题概括为两个问题:

  1. When:误差能活多久。 长寿命状态会把量化误差带过更多解码步。
  2. Where:误差发生在哪里。 不同 key row 对最终 readout 的贡献不同,状态幅值又同时沿 key row 和 value column 呈现离群结构。

核心贡献

  1. 给出 Delta-rule 循环状态量化误差的条件传播公式,并在 Qwen 的 2,304 个 recurrent head 上观察到 gate half-life 与累计 INT6 误差的 Spearman 相关系数约为 0.80。
  2. 提出 Lifetime-aware Bit Allocation:同时考虑不同 bit width 下的重构误差和状态寿命,在固定平均 bit budget 下进行离线混合精度分配,并用少量 FP16 pivot 保护极难量化的单元。
  3. 提出 Key-Row-Aware Dual-Axis Fitting:用 row-impact 衡量某一 key row 的误差对 readout 的影响,再联合拟合 key-row scale 与 value-column scale。
  4. 将压缩状态的读取、Delta update 与当前 readout 融合进 GPU kernel,并把 scale fitting 和 packed writeback 放到独立 CUDA stream,与后续层计算重叠。
  5. 在长推理、短回答、BF16 权重和 W4A16 权重设置上验证方法,并报告准确率、生成长度、状态占用、总服务显存、状态更新时间和完整模型吞吐。

方法:时间分配与空间拟合如何协同

1. Lifetime-aware Bit Allocation

作者把精度分配单元定义为:Qwen/GDN 中的整个 head,KDA 中的单个 key row。对单元 u,离线校准得到两组量:

  • d_u(b):该单元在 b bit 下的重构失真;
  • l_u:retention gate 的平均对数,越接近 0 表示记忆衰减越慢。

以未来 H 步为窗口,误差寿命权重近似为:

L_u = Σ_(j=0)^(H-1) exp(2j l_u)

随后在平均 bit budget 约束下最小化 Σ_u L_u d_u(b_u)。直观地说,误差本来就大、又不容易被遗忘的单元获得更多 bit;误差小或快速衰减的单元可以更激进地压缩。

两个模型采用不同的离散求解方式。Qwen 共有 2,304 个 head,以整个 head 为单元,用 multiple-choice dynamic programming;KDA 有 81,920 个 key row,以 Lagrangian allocation 求解并修复离散预算。名义 4-bit 配置允许 {2, 4, 6, 8},名义 6-bit 配置允许 {4, 6, 8}。此外,Qwen 保留 32 个 FP16 pivot head,KDA 保留 512 个 FP16 pivot row。

这里“名义 6 bit”不等于最终恰好 6 bit/value。把 FP16 pivots 和 scale metadata 计入后,Qwen 为 6.361 bit/value,KDA 为 6.300 bit/value;论文所有压缩比都用实际紧凑表示计算,而不是简单拿 32/6 估算。

2. Row-impact:相同误差不等于相同伤害

当前 readout 误差可展开为各 key row 误差的加权和。作者定义:

g_t = A_t^T q_t
ω_i = E_cal[g_(t,i)^2]

ω_i 是第 i 个 key row 的影响分数。论文把 row 按该分数分成八组,每次只把其中一组量化到 INT4:高影响组通常造成更大的 perplexity 上升,说明只优化元素级 MSE 不足以反映模型输出风险。

3. Key-Row-Aware Dual-Axis Fitting

状态矩阵的离群值不是只沿单一维度出现。论文统计中,key-row 与 value-column 两个方向的最大/中位 RMS 对比分别达到 10.3 倍和 19.4 倍;98.6% 的采样状态在两个方向上的对比都超过 3 倍。单纯 per-row 或 per-column scale 难以同时覆盖这两种几何结构。

STEPQuant 把量化重构写成:

X_hat[i,j] = r_i × c_j × z[i,j]
  • r_i 是 row factor:随本行平均绝对幅值增大,同时对高 ω_i 行提供更细的分辨率;
  • c_j 是 column factor:在固定 row factor 后,以 row-impact 加权 MSE 拟合 value column;
  • z[i,j] 是按离线 precision map 存储的低比特整数。

时间模块回答“哪个单元值得更多 bit”,空间模块回答“给定 bit 如何放置量化格点”。消融实验表明,两者不是替代关系:只做其中一个都明显弱于组合,并且少量 FP16 pivot 对极低比特尤其关键。

4. 每个 decode step 的执行路径

实际推理中的逻辑顺序是:

  1. 从整数 code、row/column scale 和 FP16 pivot 重构需要的状态 tile;
  2. 在浮点 tile 上完成 retention、Delta update 和当前 readout;
  3. 当前输出立即交给后续网络层,不等待重新量化;
  4. 在线拟合新状态的 row/column factor;
  5. 打包 integer code 与 scale,pivot 继续用 FP16;
  6. 在下一次 recurrent step 读取前完成异步 writeback。

SGLang 实现不会在服务路径中常驻一份完整 FP32 shadow state。离线分配固定 packed layout,在线 kernel 融合读取、更新和输出,减少对完整状态矩阵的额外显存扫描。

实验设计

模型、校准与硬件

项目设置
模型Qwen3.8-27B;Kimi-Linear-48B-A3B-Instruct
循环结构Qwen 使用 GDN;Kimi 使用 KDA
权重格式BF16;4-bit AWQ(W4A16)
全精度状态基线SGLang 默认 FP32 SSM state
量化基线symmetric rowwise-absmax INT4 / INT6 / INT8;Q-Mamba DSQ 消融
校准数据32 个 WikiText-2 训练片段,每段 2,048 token
服务框架SGLang 0.5.12
硬件4 张 NVIDIA A800,TP4

任务

长生成覆盖七项:LiveCodeBench v6、EvalPlus、AIME 2026、MATH-500、HMMT February 2026、GPQA Diamond、IFBench。最大生成长度为 65,536 token,不同任务每题采样 4 至 64 次。

短生成覆盖六项:MMLU、ARC-C、OpenBookQA、HellaSwag、WinoGrande、LAMBADA,使用 greedy decoding,并对实际生成答案评分而不是候选 likelihood。这样可以真正触发论文所研究的逐步循环状态写回。

主要实验结果

1. 名义 6-bit 基本追平 FP32,普通 INT8 仍明显掉点

模型与设置FP32 stateUniform INT8STEPQuant@6bitSTEPQuant@4bit
Qwen,七项长生成平均80.6071.8680.5980.51
Kimi,七项长生成平均61.5256.0261.4758.52
Qwen,六项短生成平均87.7886.2587.5487.63
Kimi,六项短生成平均68.3667.8068.8268.11

对长生成而言,uniform INT6 在 Qwen/Kimi 上只有 45.04/45.70,uniform INT4 更降到 12.73/21.63。STEPQuant@6bit 分别达到 80.59/61.47,与 FP32 的差距只有 0.01/0.05 个百分点。4-bit 配置也在两个模型上超过 uniform INT8,但 Kimi 长生成仍比自身 FP32 低 3.00 个百分点,因此“4 bit 无损”并不成立。

2. 与 4-bit 权重量化兼容

采用 AWQ W4A16 权重后,Qwen 的 FP32-state 七项平均为 79.32,STEPQuant@6bit 为 79.27;Kimi 分别为 58.95 与 58.62。状态压缩没有抵消权重量化节省,反而处理了权重变小后更突出的状态显存占比。

3. 时间与空间组件缺一不可

在 Qwen 的 AIME、GPQA、LiveCodeBench 三项消融中,FP32 平均为 84.61:

名义 4-bit 方案三项平均
Uniform INT43.97
Q-Mamba dual-axis baseline7.64
仅空间拟合73.95
仅时间分配,无 FP16 pivot6.17
仅时间分配,含 pivot12.87
完整 STEPQuant84.72

空间拟合单独已经很强,但无法达到 FP32;时间分配单独仍会被矩阵双轴离群结构拖垮。把两者组合后才恢复完整精度。只保护 1.39% 的 Qwen head 作为 FP16 pivot,就让 4-bit 时间分支平均提升 6.70 个百分点,也说明误差风险高度集中。

4. 低质量量化会诱发“无效过度思考”

uniform quantization 不只降低准确率,还显著拉长输出。Kimi 在 INT4 下,AIME 和 HMMT 平均分别生成 63.40K 与 64.22K token,接近 65,536 上限,同时两项准确率近乎为 0。模型不是通过更多 token 获得更强推理,而是在被破坏的循环记忆中失去终止和解题能力。STEPQuant 的输出长度则接近 FP32,这为“准确率保持”提供了行为层面的旁证。

5. 显存、状态更新和端到端吞吐同时改善

在 batch size 512、W4 权重设置下:

指标QwenKimi/KDA
总服务显存419.73 → 131.18 GiB(-68.7%)149.70 → 69.36 GiB(-53.7%)
循环状态内存-80.1%,5.03× 压缩-80.3%,5.08× 压缩
状态更新时间-65.6%,2.91× 更快-43.9%,1.78× 更快
完整模型 decode 吞吐6,040 → 7,280 token/s(+20.53%)21,241 → 23,748 token/s(+11.80%)

吞吐测量使用固定 128-token prompt、每请求生成 1,024 token、greedy decoding,并排除 prefill、启动、warmup 和最终输出交付。它能说明 decode steady state 的收益,但不等价于端到端用户延迟。

如何理解这篇论文

“固定状态”解决上下文增长,不解决并发增长

线性注意力经常被概括为 constant-memory attention,但这个 constant 是“每个请求相对序列长度固定”。总内存仍近似随请求数、循环层数、head 数和状态维度增长。SGLang 为 radix cache、overlap tracking 和 sentinel 预留的 slot 还会放大状态池。论文的重要工程贡献,是把架构级 O(1) 状态继续压缩成真正适合高并发的表示。

循环量化的风险更像控制系统,而不是静态张量压缩

对权重做一次局部 MSE 优化,误差不会在下一步重新进入权重;循环状态却构成反馈回路。STEPQuant 的时间权重,本质上是用 gate decay 估计扰动的有效时域;row-impact 则估计扰动到输出的增益。这个视角解释了为何 ordinary per-row absmax 即使到 8 bit 仍不稳,也解释了为什么离线 precision map 与在线 scale fitting 可以合理分工。

4-bit 结果亮眼,但 6-bit 更像当前部署甜点位

Qwen 的 4-bit 准确率几乎无损,Kimi 的长生成却存在可见下降;附录还指出 Qwen 4-bit 会生成更长文本。相较之下,6-bit 在两种架构、BF16/W4 权重、长短任务上都更一致。若生产目标是高并发而非极限压缩,6-bit 更像论文证据真正支持的默认选择。

局限与审慎解读

  • 寿命模型是近似。 L_u 主要依据 gate decay,并没有完整建模随时间变化、依赖 key 方向的 A_t;真实误差传播可能被 key alignment 放大或衰减。
  • 模型覆盖有限。 只测试 Qwen 的 GDN 和 Kimi 的 KDA 两种混合架构,不能直接推广到 RetNet、Mamba、纯线性注意力或其他 state-space model。
  • 校准域很窄。 precision map、pivot 和 impact score 只由 32 个 WikiText-2 片段得到。跨语言、代码、极端长上下文和分布漂移下是否稳定,需要进一步验证。
  • 硬件与软件固定。 系统实验限定在四张 A800、TP4、SGLang 0.5.12 和作者 kernel;Hopper/Blackwell、不同 tensor parallelism、动态 batching 和混合请求长度可能改变收益。
  • 吞吐不是完整延迟。 计时排除了 prefill、server startup、warmup 与最终交付;在线服务还会受调度、网络、prefix cache 命中和 tail latency 影响。
  • 并发显存依赖预留策略。 论文的 Qwen 容量曲线采用每个支持请求预留五个状态 slot 的配置。减少预留、改变 radix cache 策略后,绝对节省会变化。
  • 名义 bit budget 不含全部开销。 scale 与 FP16 pivot 另计;虽然论文给出实际 6.361/6.300 bit/value 和压缩比,但比较“6 bit”方案时必须保留这个限定。
  • 4-bit 并非全面无损。 KDA 在长生成上仍有准确率下降,Qwen 也出现更长输出。极低 bit 的风险不能被四项平均数掩盖。
  • 与 DAMP 不是严格同场复现。 DAMP 代码不可用,论文只在三个共享 KDA 基准上按各自 FP32 基线归一化比较;生成设置不同,不能据此给出严格优劣排序。
  • 缺少长期稳定性测试。 最长允许生成 65,536 token,但未展示数十万 token、跨轮会话或状态长期复用下的误差与异常率。

应用影响

高并发混合模型服务

当模型采用 GDN/KDA 等循环层,服务容量不能只按权重和 attention KV cache 估算,还要把每请求的 state pool、预留倍数和卷积状态计入。STEPQuant 最直接的价值是把状态池从容量瓶颈降为次要项,让同一 GPU 集群承载更多并发请求;在 W4 权重下尤其重要,因为权重越小,FP32 state 的相对成本越高。

长推理与代码生成

循环误差会通过长生成放大。部署验收不应只看短任务 perplexity,还应同时观察长任务准确率、输出长度、截断率和异常循环。论文中 INT4 Kimi“接近 token 上限但几乎答不对”的现象说明,量化回归测试必须包含 termination behavior,而不只是首 token 或短序列指标。

推理框架与模型共同设计

STEPQuant 的收益不是量化公式单独产生的。固定 packed layout、tilewise 重构、update/readout 融合、异步 scale fitting 和直接写回压缩页共同避免了量化开销。若只把论文算法作为 Python 层 fake quant 插进推理框架,可能得到准确率收益,却得不到显存带宽和吞吐收益。

生产落地可以采用以下顺序:先以 6-bit 和少量 FP16 pivot 建立保守基线;按目标域重新校准 lifetime、distortion 和 row-impact;对真实请求分布测量 batch-scaled state pool、端到端 p50/p99 延迟和异常长度;最后再决定是否对部分层或单元下探到 4/2 bit。

相关工作

第一条路线是 线性注意力与状态空间模型。RetNet、Gated Linear Attention、Gated DeltaNet、Kimi Delta Attention 以及 Mamba/Mamba-2 都用固定状态替代持续增长的 KV cache。STEPQuant 不改变其 recurrence,而是处理“每请求固定状态在大并发下仍很昂贵”的后续问题。

第二条路线是 权重、激活与 KV cache 的 PTQ。GPTQ、AWQ、SmoothQuant、QuaRot 等主要优化权重或激活;KIVI 等方法压缩 softmax attention 的 KV cache。它们的共同假设多是张量被读取但不在每步把量化结果反馈为下一状态,因此不能直接解决 recurrent-state 的累计误差。

第三条路线是 state-space/recurrent state 量化。Quamba 与 MambaQuant 处理 Mamba 的权重和激活,Quamba2 将 cached recurrent state 压到 8 bit;Q-Mamba 使用 dual-axis scaling 和 selectivity reconstruction。论文消融显示,直接移植 Q-Mamba 的 dual-axis component 仍显著弱于加入 row-impact 的空间拟合。

第四条路线是并行工作的 DAMP。DAMP 用 reconstruction error 与 decay persistence 选择 FP16 key channel,其余采用 INT8 加 Hadamard transform;在论文引用的设置中平均约 9.9 bit/value。STEPQuant 进一步用混合精度、生命周期预算和 readout-aware 双轴拟合探索 6.3 和 4.3 bit/value。由于两项工作设置不同,这一对比更适合说明设计空间,而不是宣称可直接替换。

总结

STEPQuant 的核心洞察是:循环状态量化不能只问“每个元素误差多大”,还要问“误差会留多久”和“它位于输出敏感矩阵的哪里”。Lifetime-aware Bit Allocation 用 gate retention 把未来风险折算进 bit 分配,Key-Row-Aware Dual-Axis Fitting 再根据 readout 影响和双轴幅值结构调整量化尺度;两者组合,才在极低精度下避免误差反馈链失控。

从实验看,名义 6-bit 是最可靠的结果:两款模型的长短任务几乎追平 FP32 state,实际循环状态压缩约 5 倍,batch 512 时总服务显存下降 53.7% 至 68.7%,完整 decode 吞吐提升 11.80% 至 20.53%。4-bit 展示了进一步压缩的可能,但架构差异、输出变长和 KDA 长任务掉点提醒我们,它还不是无条件默认值。

这篇论文也重新界定了线性注意力的工程优势。固定状态消除了随上下文增长的 KV cache,却没有自动消除并发状态池。只有把状态表示、误差动力学和 serving kernel 一起设计,constant-memory 才能真正转化为高并发容量。

参考资料

  1. Hugging Face Daily Papers:STEPQuant
  2. arXiv:STEPQuant
  3. arXiv HTML 全文
  4. arXiv PDF 全文
  5. STEPQuant 代码仓库
  6. SGLang 论文
  7. Kimi Linear 论文