推理加速的三本账:解码、数值、潜空间各自在赌什么

同周推到台前的三篇论文分别动了解码调度、状态量化与潜空间压缩:一个把 wall-clock 再提 5%–41%,一个把服务内存砍掉 68.7%,一个把视频生成延迟从 863.2 秒压到 77.7 秒。三个数字的计量单位互不相同,代价也各记在各层的账上。

工程实践 已修订 推理优化 推测解码 量化 SGLang 视频生成 工程实践

加速比写在纸上,代价记在别处

本周推到台前的三篇 arXiv 论文,各自动了推理栈的一层。DLoop(arXiv:2610.07659,NAVER AI Lab、NAVER AI Search Platform 与高丽大学,10 月 6 日提交)动解码调度,STEPQuant(arXiv:2609.38169,港城大、哈佛、浙大、自动化所、港中大与清华,9 月 29 日提交)动数值精度,GRACE(arXiv:2610.10524,KAIST 与 Kakao,10 月 7 日提交)动潜空间表示。

三篇没有一个是在让模型变小。它们做的是同一件事的不同版本:让每一步少干一点活。问题出在抄数字这一步——wall-clock 提速 5%–41%、服务内存降 68.7%、端到端延迟快 11.1 倍,这三个数的计量单位互不相同,代价也各记在各层的账上。只把收益列进周报,上线时踩的坑一个都不会少。

第一本账:解码层,赌 draft 模型可靠

推测解码的标准流程是 draft 提一串 token、target 验一次、接受多少算多少。DLoop 的作者注意到一件事:draft 模型越来越强之后,target 模型经常把一个 drafting stage 产出的 token 全盘接受,可 verification 一步也没省。draft 越准,验证越像纯粹的过路费。

已有的 adaptive draft length 方法能在解码时决定攒多少个 draft token 再验证,但它们只对自回归 draft 模型有效。并行 draft 模型要继续往下写,需要那些尚未被验证的 token 对应的 target hidden states,这一步卡住了。

DLoop 把 drafting 本身做成循环:draft 模型还自信就继续写,攒够了再把累积的全部 draft token 一次验完。多花的是 draft 模型的前向,省下的是 target 模型的验证前向。配套一个 loop-aware training——训练时把 draft 模型为未验证 token 生成的 hidden states 喂回它自己,否则它在多出来的那些 stage 上并不可靠。

数字是跨 EAGLE-3、DFlash、Domino、DSpark 与 multi-token prediction 等五种 draft 方案,wall-clock 加速比提升 5%—41%,且保持 lossless decoding。

工程提示:这一层的赌注是「draft 模型的置信度在额外 stage 上仍然可信」,能不能兑现取决于你做没做 loop-aware training。DLoop 的仓库 README 明写代码尚在内部评审,等不到开源也能先把账建起来——在自己的 serving 里记两个数:每个 decoding step 的 target forward 次数,以及被接受的 draft token 占比。后者长期贴着 100%,你就知道自己在交过路费。

第二本账:数值层,赌误差分布可预测

线性注意力把随长度增长的 KV cache 换成固定大小的 recurrent state,省了显存,却换来另一种增长:每个并发请求都要一份常驻 state,服务系统还要为缓存和调度多留 slot。STEPQuant 的图 1(a) 给出了交叉点——官方 SGLang 部署下,Qwen 的 FP32 state pool 在 70 个并发请求时就超过了它 BF16 权重的显存占用。

直接把 state 均匀量化会崩,因为 Delta rule 每次更新都作用在一个近似 state 上,误差一步传一步。论文把误差拆成两个维度:时间上,门控保留得越久的 state unit 累积误差越大(在 2304 个 Qwen head 上验证过);空间上,同样幅度的误差落在不同的 key row 上,对输出的影响并不一样,而 state 的量级沿行和列都在变。

于是精度不再均匀分配。lifetime-aware bit allocation 给误差大且活得久的 unit 更多 bit,少数高风险 unit 直接留在 FP16;key-row-aware dual-axis fitting 给 key 行和 value 列分别配 scale,行 scale 一并兼顾当前量级与实测的输出误差影响。

BF16 权重、七项长生成任务(LCB v6 / EvalPlus / AIME 26 / MATH-500 / HMMT / GPQA-D / IFBench)的平均准确率:Qwen3.8-27B 从 FP32 的 80.60,到均匀 INT8 的 71.86、均匀 INT6 的 45.04、均匀 INT4 的 12.73,STEPQuant@6bit 是 80.59、@4bit 是 80.51。Kimi-Linear-48B-A3B-Instruct 同一张表:FP32 61.52,INT8 56.02,INT6 45.70,INT4 21.63,STEPQuant@6bit 61.47、@4bit 58.52。四张 A800、SGLang、batch 512、W4(4-bit AWQ)权重下,Qwen 总内存从 419.73 GiB 降到 131.18 GiB(−68.7%),state 内存降 80.1%(5.03×),state 更新耗时降 65.6%(2.91× 快)。

KDA(Kimi 侧)在同一实验里是另一组数:总内存 149.70 → 69.36 GiB(−53.7%),state 内存 100.04 → 19.70 GiB(−80.3%,5.08×),state 更新耗时 8.48 → 4.76 ms(−43.9%,1.78×)。同一套方法在两个架构上的收益并不对称——Qwen 拿到 68.7%,KDA 只拿到 53.7%,因为后者 state 占总显存的比例本就不同。

消融表里最该看的一格在 4-bit 档:只做时间维度分配(Temporal only)平均准确率掉到 12.87,只做空间拟合(Spatial only)还有 73.95,两者合起来 84.72。低比特下承重的是空间拟合,不是比特分配。另一条消融解释了为什么剩下那一点点 bit 要花在刀刃上:只用 FP16 保护 1.39% 的 Qwen head,4-bit 三任务平均就涨 6.70 分,6-bit 的 AIME 涨 14.16 分。

命令来自官方 README(实测栈为 SGLang 0.5.12、PyTorch 2.11.0、Triton 3.7.1):

bash scripts/reuse_sglang_env.sh /path/to/sglang-env
.venv-eval/bin/python -m stepquant.reproduction \
  --models qwen --formats stepquant6 --devices 0,1,2,3

CUDA_VISIBLE_DEVICES=0,1,2,3 .venv-serving/bin/python -m stepquant.sglang \
  --model-path /path/to/Qwen3.8-27B --tp-size 4 \
  --state-format stepquant6 --plan artifacts/reproduction/plans/qwen-stepquant6.pt \
  --attention-backend triton --reasoning-parser qwen3 \
  --context-length 131072 --chunked-prefill-size 2048 \
  --mem-fraction-static 0.85 --served-model-name stepquant

校准只用 32 段 WikiText-2 训练文本、每段 2048 token,一次离线做完。bit 分配与 FP16 pivot 在离线阶段定死,解码时 packed 布局跨请求固定,没有 per-token 分配开销;tilewise 重建、Delta 更新与当前 readout 融合进一个 kernel,scale 更新和数据回写丢到另一条 CUDA stream 上与模型计算重叠。

踩坑在论文自陈的 Limitations 里:BF16 权重配 4-bit state 时,KDA 在长生成任务上掉点,而 Qwen 虽然平均准确率贴着 FP32,输出却变长了。准确率这张表看不出成本上升。上线前把「平均生成 token 数」和准确率并排放进同一个看板,别只看后者。

第三本账:潜空间层,赌压缩后的 latent 还被原模型认得

视频扩散模型的算力主要花在 DiT 处理的 token 数上,注意力随序列长度平方增长。提高 VAE 压缩比是最直接的减速带,但压缩比一高重建质量就掉,靠加 latent 通道补回来又会拖慢 DiT 收敛。更麻烦的是换掉 latent 空间等于让预训练 DiT 面对一个它没见过的分布——要么从头重训,要么花大价钱适配。论文引用了 Open-Sora 2.0 的例子:在 Video DC-AE 上适配预训练 DiT,160 张 GPU 仍未完全收敛。

GRACE 用两阶段绕开这个死结。第一阶段保留冻结的预训练编码器在低分辨率输入上产出的 base latent,另学一个 residual latent 承接压缩丢掉的空间细节与帧间运动,并用冻结 DiT 的中间特征把压缩后的 latent 与原 latent 对齐——对齐目标是生成,不是重建,所以不用只靠 L1/L2 和感知损失。第二阶段轻量微调 DiT,配 asymmetric denoising:base latent 比 residual latent 先去噪,让已去噪的 base 给 residual 一个稳定锚点,两者在同一次采样内完成,不增加采样开销。

数字来自 Wan2.1-I2V-14B,480×832×81、50 步、单张 A100(SXM4-80GB,bfloat16,无推理时编译;延迟覆盖条件编码、去噪循环与视频解码,不含模型加载、文本编码与写 MP4):推理延迟从 863.2 秒降到 77.7 秒(11.1×),T2V 从 851.5 秒降到 75.8 秒,latent token 从 32.8k 降到 4.3k(约 7.6×,论文表述为「近 8×」);VBench-I2V 总分 87.92 → 87.90(差 0.02),T2V 总分 83.93 → 85.81(反而高 1.88)。736×1280×81 下加速到 15.5×。

代价写在附录表 G.1:Stage 1 自编码器 8.5 H200 GPU 天(全量 6.9 加 decoder-only 1.6),Stage 2 适配 DiT 30 H200 GPU 天,合计 38.5。

踩坑有两条。压缩后每帧 token 变少,小物体受损最重——远处的脸、招牌上的字、细结构会丢或者糊,736×1280 下这个效应更弱,因为同样的压缩比留下了更多 token。换一条预训练管线就要重跑一次 Stage 1,base latent 来自那条管线冻结的编码器、对齐损失也由它的 DiT 监督,一次 8.5 GPU 天,排期里要单列一行。

三本账并到一张表上

层收益指标收益代价指标代价
解码调度wall-clock 加速比+5%–41%draft 可靠性需 loop-aware training,否则额外 stage 不可靠
数值精度服务内存−68.7%输出长度4-bit 下 Qwen 分数持平但生成变长,KDA 掉点
潜空间表示端到端延迟11.1×训练预算与细节38.5 H200 GPU 天,小物体与文字丢失

排查顺序按成本量级排。先数 target 前向次数与 draft 接受率,小时级,改 serving 埋点就能拿到;再看 state pool 占总显存的比例与并发交叉点,天级,要做量化和校准;最后才动潜空间,周级,得重训自编码器。前者近乎零成本,后者一动手就是几十 GPU 天。

多数团队卡住的地方是第二本账。线性注意力的 state 尺寸不随上下文涨,却在并发下变成新的显存大户,而这一点在单请求 benchmark 上完全看不出来——70 并发那个交叉点,只有把 batch 拉起来才现形。

参考来源

引用核验记录

声明出处结果
DLoop:跨 EAGLE-3 / DFlash / Domino / DSpark / MTP,wall-clock 提速 5%–41%,losslessarXiv:2610.07659 abs 摘要(v1,2026-10-06)✅ 逐字一致
DLoop:5%–41% 覆盖四 draft 模型 × Qwen3-4B/Qwen3-8B + MTP × Qwen3.5-9B/Gemma-4-12B,八 benchmark、H100、bf16、T=0;最大增益 DSpark;接受长度 +12%–102%论文 §4.2 + 结论段(PDF 全文,2026-10-08 读)✅ 终审补记
STEPQuant:419.73 → 131.18 GiB 出于 W4 权重配置(非 BF16)论文 §5.6 原文✅ 终审补记
DLoop 代码未发布naver-ai/DLoop README(2026-10-08 读)✅ 原文「under internal review」
STEPQuant:Qwen 80.60 / 71.86 / 45.04 / 80.59 / 80.51论文表 1 + 仓库 README 结果表(2026-10-08 读)✅ 两处一致
STEPQuant:Kimi 61.52 / 56.02 / 45.70 / 61.47 / 58.52论文表 1(长生成,同表)✅ 与 README 一致
STEPQuant:419.73 → 131.18 GiB(−68.7%)、state −80.1%(5.03×)、更新 −65.6%(2.91×)论文 §5.6 与图 3(c)(d)✅
STEPQuant:四张 A800、TP4、batch 512论文 §5.1 Setup✅
STEPQuant:消融 12.87 / 73.95 / 84.72;pivot 1.39% head → +6.70 / +14.16论文 §5.6 Component analysis✅
STEPQuant:KDA 149.70 → 69.36 GiB、8.48 → 4.76 ms论文附录 F.4(图 F4)✅
STEPQuant Limitations:BF16 + 4-bit 下 KDA 长生成掉点、Qwen 输出变长论文附录 H Limitations 原文✅
GRACE:863.2 → 77.7(I2V)、851.5 → 75.8(T2V)、11.1× / 15.5×论文表 3 与附录表 G.1✅
GRACE:token 32.8k → 4.3k论文表 3 / 表 4✅ 实测 7.6×,论文表述「近 8×」
GRACE:8.5(6.9 全量 + 1.6 decoder-only)+ 30 = 38.5 H200 GPU 天论文附录表 G.1✅ 逐项一致
GRACE:单张 A100、50 步、bfloat16、无推理时编译论文附录 C.2 Evaluation Protocol✅

口径提示(终审补充):DLoop 的 5%–41% 是跨全部实验设置的极差,不是某一种 draft 方法在某一负载下的取值。据论文 §4.2 原文,覆盖的组合是四个 draft 模型(EAGLE-3 / DFlash / Domino / DSpark)配 Qwen3-4B 与 Qwen3-8B,外加 MTP 模块配 Qwen3.5-9B 与 Gemma-4-12B,八个 benchmark、H100 80GB、bf16、greedy(T=0);同一批实验里平均接受长度提升 12%–102%,四个 draft 模型中增益最大的是 DSpark(它的 full acceptance ratio 最高)。同理,STEPQuant 那组内存数字出于 W4 权重配置,GRACE 的 11.1× 与 15.5× 分别对应 480p 与 736p。三篇的吞吐/延迟数字均出自各自论文自报的硬件与负载,跨论文横向比较不成立。