一种把「并行草稿的高吞吐」和「负载感知的智能验证」缝合在一起的推测解码框架。已在 DeepSeek-V4 线上真实流量中部署,相对老基线 MTP-1,单用户生成速度提升 60%–85%。本文按论文章节逐节忠实还原全部事实、公式与数字,并为每个关键概念挑选最合适的讲法和配图。
用「背景铺垫」开场——先交代清楚 DSpark 出现之前的状况,读者才有落脚点。
大语言模型是自回归生成文本的:每生成一个新 token,都要基于前面所有 token 跑一次完整的前向传播,因此推理延迟与输出长度成正比。论文开篇点明,由此带来的低 GPU 利用率和高用户感知等待时间,构成了生产环境 LLM serving 的主要瓶颈,尤其在实时对话助手、多轮 agent 工作流这类对延迟敏感的场景。
推测解码(speculative decoding)是一条公认有原理依据的解法。但论文指出:当人们想用「并行草稿器 + 长草稿块」把这条路推到极致时,会撞上两个关键瓶颈——一个在生成质量,一个在系统效率。DSpark 的全部设计就是分别拆掉这两堵墙。
这是后面一切机制的地基。先用三段式立定义,再用「逐步推演」走一遍加速公式,最后用类比卡落地。
用一个轻量草稿模型 $M_d$ 加速一个大的目标模型 $M_t$。每个解码周期,草稿模型先提议 γ 个候选 token $x_1,...,x_γ$;目标模型用一次前向传播并行验证整块,通过拒绝采样接受「与自己分布一致的最长前缀」,并在末尾补一个 bonus token(本文与 anchor token 同义,指上一轮目标模型生成的最后一个 token)。
因为验证是并行的(一次前向查完整块),且接受规则在数学上精确保持目标分布不变——所以它是无损加速:输出分布与原模型逐 token 解码完全一致,只是更快。这是它区别于「直接换小模型」等有损方法的根本。
具体到验证规则:在每个位置 k,目标模型算出自己的分布 $p^t_k$,与草稿分布 $p^d_k$ 比较,以概率 $\min(1, p^t_k(x_k)/p^d_k(x_k))$ 接受该 token。
验证从左到右严格进行:在位置 k 第一次拒绝,会把后面所有 token $x_{k+1},...,x_γ$ 全部丢弃,无论它们本身质量如何。这个「前缀生存」特性贯穿全文——越靠前的 token 杠杆越大。
论文用一个公式把加速空间拆得很清楚。设 τ 为每周期接受的 token 数,$T_{draft}$、$T_{verify}$ 为草稿与验证耗时,则平均每 token 延迟:
L = (T_draft + T_verify) / τ
顺着这个式子推:要把 L 压小,只有三条路——
让草稿生成本身耗时更短。
每轮被接受的 token 更多,分母变大。
不在注定被拒的 token 上浪费验证算力。
记住这三条:DSpark 的两个机制,恰好分别对应「升 τ」(半自回归)和「降有效 $T_{verify}$」(置信度调度)。
实习生(草稿模型)先把一段话草拟出来,你(导师/目标模型)扫一眼,从头往后看,看到哪句不对就从那句开始作废,把之前认可的留下,自己补上正确的下一句。实习生干活快,你只需做一次并行审阅。「从某句开始作废、后面全丢」正好对应推测解码「第一次拒绝就丢弃整个后缀」的规则。
草稿模型架构决定 T_draft 和 τ 怎么权衡。这里用「对比解释」立两派,用「误区澄清」处理一个反直觉点,再「机制拆解」DFlash。
并行草稿器后缀接受率骤降的根本原因。每个位置预测时是对「所有可能的前文」做边缘化平均,而非基于实际采样出的那一个前文做条件预测,于是拼出前后矛盾的组合。
当上下文有多个合理续写(如「of course」和「no problem」)时,位置 1 选了「of」,位置 2 却独立地选了「problem」,拼成不存在的「of problem」。每个位置「单独正确」,合起来却错。
像两个不通气的翻译各译半句:一个按英式起头,一个按美式收尾,各自通顺,拼一起不伦不类。DSpark 要做的,就是让后半句那位「看到」前半句实际写了什么。
DSpark 的并行骨干基于 DFlash,论文把它的关键机制讲清了:
核心思路——保留并行骨干的高吞吐,只挂一个极轻的串行小头注入「块内依赖」,专治后缀衰减。对应三杠杆里的「升 τ」。
把草稿生成拆成两段:并行阶段(骨干一次前向产出所有 hidden state $h_k$ 和 base logits $U_k$)+ 串行阶段(轻量小头给每个位置补一个 prefix 相关的转移偏置 $B_k$,让它能条件于块内前面已采样的 token)。论文对原 DFlash 骨干只做一处微改:把 anchor 本身当作第一个预测位置(γ 个输入 = anchor + γ−1 个 mask,产出 γ 个 draft logits),从而减少草稿计算又维持质量。
纯并行快但碰撞、纯自回归连贯但慢。半自回归取两者之长:昂贵主体留在并行骨干(保速度),只用极轻串行环路注入局部转移信息(补依赖)。因串行采样天然顺序,小头必须足够轻,整体草稿延迟才仍由并行阶段主导。
回到「of course」:一旦位置 1 采样出「of」,串行头就在位置 2 抬高「course」、压低「problem」,碰撞被化解。它不重算整句,只在原始 logits 上「微调口径」。
论文给出串行头的分布——通过自回归因式分解诱导一个「因果块分布」,而非全局归一化能量模型(这点关键,见下文相关工作):每个位置概率是 base logit 加转移偏置后再 softmax,$x_0$ 是上一轮 anchor token:
p_k(v | x₀, x<k) = softmax( U_k(v) + B_k(x₀, x<k, v) )
最简单的实例:转移偏置只依赖前一个 token,退化成一阶转移 $B(x_{k-1},x_k)$。原则上是 V×V 大矩阵,用低秩分解 $B=W_1W_2$ 近似($W_1∈ℝ^{V×r}$ 当 embedding 查表,$W_2∈ℝ^{r×V}$ 当 logit 投影,默认秩 r=256)。
低秩分解让存储和每步计算都很小,即使词表很大,串行环路也跑得动。一阶马尔可夫看似简单,却足以化解绝大多数相邻 token 碰撞,且实测性价比最高,故选作默认。
位置 1 采样「of」后,Markov 头查表取出「of」对应那一行偏置,直接加到位置 2 的 logits 上把「course」顶上去。一次查表 + 一次投影,几乎零成本。
Markov 头只记得前一步;RNN 头维护循环状态 $s_k$ 累积块内整段前缀历史。每步把上一状态 $s_{k-1}$、前一 token embedding $W_1[x_{k-1}]$、骨干 hidden $h_k$ 拼成输入,做一次门控更新,再投影成转移偏置(状态 $s_0$ 初始化为零)。
它能看到更长历史,理论上更准。但论文实验发现:RNN 头相对 Markov 头只带来很边际的提升(主要在更长块上),却有更高实现复杂度和更差部署特性。性价比不划算。
好比从「只看上一个词」升级到「记得整句开头」。听起来更聪明,但对推测解码这种「块不长」的场景,多记那点历史换不回成本——于是论文最终选 Markov 头。
能生成长草稿块 ≠ 端到端就快。盲目验证整块在高并发下反而拖垮吞吐。对应三杠杆里的「降有效 T_verify」。
论文把这个瓶颈拆成两个交织因素,可串成一条因果链:
对每个草稿位置 k 输出一个 (0,1) 标量 $c_k$。关键在于它建模的是条件生存概率——「在前面所有 token 都已被接受的前提下,位置 k 通过目标验证的概率」。结构很轻:线性投影 + sigmoid,输入是骨干 hidden $h_k$ 与 Markov embedding $W_1[x_{k-1}]$。
有了每位置条件接受概率,累乘(链式法则)即得「整段前缀被接受」的联合概率,调度器才能据此算期望接受长度 τ。监督信号用「解析接受率」$c_k^* = 1 - ½‖p^d_k - p^t_k‖_1$(由草稿与目标分布的总变差距离决定)。
像给草稿里每个词标「存活率」:这个词大概率能过(0.95),那个悬(0.4)。调度器看这串数字,就知道该在哪儿下刀截断。
一种后处理校准。神经网络给的置信度通常过度自信,而调度器需要的是准确的绝对概率值(不只是排序)。STS 用留出验证集,从左到右逐位置做一维网格搜索,找最优温度标量,最小化累乘概率的期望校准误差(ECE),且固定已校准位置的分数。
因为调度器要靠累乘概率估吞吐,原始的过度自信分数会扭曲估算、导致次优调度。而温度缩放是保序变换:只把概率校准到匹配真实接受率,不打乱置信度头学到的相对排序。实测 ECE 从 3%–8% 降到约 1%。
像给一个总打高分的考官「校准尺度」:他打 90 实际只值 75,乘个系数把刻度掰正,但谁强谁弱的排名不变。掰正后调度器据此算账才不会算错。
论文把「验证长度选择」formulate 成全局吞吐最大化问题。对一批 R 个活跃请求,每个选验证长度 $ℓ_r$;由于推测解码只接受连续前缀,位置 j 的生存概率是累乘 $a_{r,j}=∏_{i≤j}c_{r,i}$。一次验证步发给目标模型的总 batch 是 $B=∑(1+ℓ_r)$,期望接受 token 数 $τ=∑(1+∑a_{r,j})$。目标是最大化系统级吞吐 $Θ=τ·SPS(B)$,其中 SPS(B) 是引擎在批大小 B 下的「每秒步数」能力曲线——这条曲线在引擎初始化时只 profile 一次,存成轻量成本表,运行时 O(1) 查表。
这个看似组合爆炸的优化,因为 $a_{r,j}$ 随 j 单调非增,可用贪心高效求解:
把所有请求的所有候选前缀扩展,按生存概率 $a_{r,j}$ 降序排成一个全局池。
从高到低逐个纳入验证,每纳一个就更新 batch B 和期望接受 τ,再用成本表 O(1) 查出当前吞吐 $Θ=τ·SPS(B)$。
一旦吞吐不再上升($Θ ≤ Θ_{best}$)立即 break,返回此前最优的各请求验证长度。
无损推测解码的硬约束:纳入决策不能依赖未来的候选 token。但 DSpark 的置信度头依赖「前一个已采样 token」的 Markov 特征,算下一个生存概率 $a_{r,k+1}$ 需要当前候选 $x_{r,k}$ 已实例化——一个回溯式全局搜索会把 $x_{r,k}$ 泄漏进决策,引入选择偏差,破坏无损(论文附录 A 给了反例)。
为强制严格因果,调度器用早停:吞吐一旦下降就 break,使截断决策只依赖到该步为止已处理的前缀,与未来 token 隔离,保证精确还原目标分布。前提是 Θ 关于纳入数单峰(隐含假设硬件能力曲线平滑下降——真实硬件的非平滑问题在第 05 节处理)。
像考试只能根据「已答的题」决定要不要答下一题,不能偷看后面答案再回头决定——一旦偷看,结果分布就会偏离「老老实实逐题做」的真值。
怎么训出这套草稿器,以及把理论算法搬到 DeepSeek-V4 生产引擎要踩平哪些坑。
训练时从每条目标序列随机采多个 anchor 位置,组成 γ-token 块作训练数据。目标模型全程冻结;草稿模型共享其 embedding 层和 LM head(也冻结),只更新骨干草稿器、串行块、置信度头。三项损失都按 $w_k=\exp(-(k-1)/γ)$ 位置加权(强调靠前位置,因它们对期望接受长度贡献更大):
总目标:L = α_ce·L_ce + α_tv·L_tv + α_conf·L_conf(默认权重 0.1 / 0.9 / 1.0)。
算法 1 理论无损,但直接上生产暴露两个冲突:
解法是把调度器改成异步运行:ZOS 要求下一步 batch size 在当前步完成前就已知,所以 DSpark 用两步之前的置信度头输出近似即将到来的验证容量(仅用于定截断长度 K,候选仍按当前最新累乘置信度严格排序)。这把纳入变成动态 top-K 选择,排序保序;而且这个「两步前」的时间错位恰好天然构成因果屏障——决策与当前 token 的实现隔离,于是论文得以去掉早停、放开无约束全局搜索来跨越锯齿悬崖,同时仍保证无损。
为隔离纯草稿质量,离线评测关掉置信度调度器,强制所有草稿器提固定长度块,只比每轮接受长度 τ(越高越好)。
评测在 4 个目标模型(Qwen3-4B/8B/14B、Gemma4-12B)、3 大领域(数学推理 / 代码生成 / 日常聊天)、共 9 个 benchmark 上进行;对手是 SOTA 并行草稿器 DFlash 和自回归草稿器 Eagle3(基于 Training-Time Test)。为公平,所有草稿器在同一框架、同一数据上重训;Eagle3 的 TTT horizon(7)对齐 DFlash/DSpark 的块大小(7),并用相同目标特征层。层数:Eagle3 用 1 层,DSpark 和 DFlash 用 5 层。训练数据用 Open-PerfectBlend(130 万样本:聊天 17.6%、数学 39.4%、代码 38.9%、指令 4.1%),每个草稿器训 10 epoch,非思考模式;采样温度 1.0。除非特别说明,DSpark 指 Markov 头变体。
具体地,Qwen3-4B/8B/14B 上,DSpark 宏平均接受长度比 Eagle3 分别高 30.9% / 26.7% / 30.0%,比 DFlash 分别高 16.3% / 18.4% / 18.3%;且优势跨模型族成立(Gemma4-12B 同样提升)。
| 草稿器 | GSM8K | MATH | AIME25 | MBPP | HumanEval | LCB | MT-Bench | Alpaca | Arena-Hard |
|---|---|---|---|---|---|---|---|---|---|
| Eagle3 | 5.14 | 4.62 | 3.92 | 3.69 | 4.16 | 3.77 | 2.39 | 2.26 | 2.55 |
| DFlash | 5.40 | 4.85 | 4.15 | 4.40 | 4.74 | 4.18 | 3.07 | 2.96 | 2.83 |
| DSpark | 6.11 | 5.70 | 4.89 | 5.13 | 5.38 | 4.86 | 3.64 | 3.54 | 3.29 |
表 1 还显示强烈的领域效应:结构化任务接受长度天然更高(Qwen3-4B 数学约 5.57、代码约 5.12),开放式聊天更低(约 3.49)。这种数据可预测性的内在差异,正说明静态验证长度会在「注定被拒的尾 token」上浪费算力——直接引出置信度调度。
论文用一个很有洞见的指标逐位置条件接受率(图 2)拆解:它只统计「前面 1..k−1 都被接受」的样本里,位置 k 也被接受的比例,从而剥离前缀错误的连累,看清每个位置的「真实预测力」。三条发现:
随阈值升高,置信度头把「终将被拒」的尾 token 剪掉,整体接受率稳步上升,且聊天受益最大(高熵分布):接受率从 45.7% → 95.7%;数学从 76.9% → 92.5%、代码从 67.6% → 92.0%(结构化任务剪得更温和、保留更多草稿 token)。校准方面:原始估计器判别力强(ROC-AUC 0.81~0.90)但过度自信(ECE 3%–8%),经 STS 校准后平均 ECE 降到约 1%。
离线证明算法增益,线上才检验生产价值。DSpark-5(最大草稿长度 γ=5,Markov 头)在 V4-Flash / V4-Pro 预览版生产引擎里,对打老基线 MTP-1。
草稿器配置:并行骨干含 3 个 MoE 层 + mHC + 滑窗注意力 128;置信度头随草稿模型端到端训练、再经 STS 校准。MTP-1 是 V4-preview 发布两周后被 DSpark 取代的前生产配置——历史上一直用单 token,是因为静态多 token 草稿器(如 MTP-3/5)在高并发下会因过度验证严格降低聚合吞吐。所以拿 DSpark 跟它比,直接证明 DSpark 能在动态服务环境里「安全地」释放长草稿块潜力。图中散点是来自真实用户流量的原始遥测,实线是拟合的性能前沿。
生产系统要同时优化两个竞争目标:单请求延迟(每用户生成速度 tok/s/user,决定体验,在 agent 工作负载里愈发关键)和聚合吞吐(决定同时服务多少用户)。SLA 指系统必须保证的最低每用户生成速度。
DSpark 把这条前沿整体向外推:中等 SLA 下提升吞吐,更重要的是在严格交互约束下守住非退化的服务容量——这些档位是老基线根本达不到的。论文还点出:在他们「batch 长期低于算力饱和阈值」(受 KV 缓存、可用流量、RL 长尾负载所限)的部署 regime 下,「最大化吞吐」与「最大化每用户速度」从竞争变成了高度正相关。
像一条本来「要快就只能少载客、要多载客就只能慢」的产线;DSpark 让它在同样载客量下更快,且在「要求极快」的高标准下还能保持像样产能,而非产能崩盘。
V4-Flash:在 80 tok/s/user 的中等 SLA 下,DSpark 聚合吞吐比 MTP-1 提升 51%;在更严格的 120 tok/s/user 下,MTP-1 逼近运行边界、只能撑很小并发批,此时 DSpark 名义达到 661% 吞吐优势——论文诚实说明,这个高 SLA 点主要应解读为「DSpark 把可行交互前沿延伸到基线够不着的区域」,而非对一个充分利用的基线的真实倍数提速。在更稳定的「同实际吞吐」比较下,每用户提速 60%–85%。V4-Pro 同模式:35 tok/s/user 下 +52%,50 tok/s/user 下名义 406%;同系统容量下每用户提速 57%–78%。
把全文压成一张可带走的速记,外加一张术语速查表。
| 推测解码 | 草稿模型提议、目标模型一次前向并行验证、拒绝采样接受最长前缀的无损加速框架。 |
| τ(接受长度) | 每个解码周期被目标模型接受的 token 数(含 bonus token);越高越快。 |
| 多模态碰撞 | 并行草稿器各位置独立预测,拼出前后矛盾组合,导致后缀接受率衰减。 |
| 半自回归 | 并行骨干 + 轻量串行头:主体并行算、局部依赖串行补。 |
| Markov 头 | 只依赖前一 token 的一阶转移偏置,低秩分解(r=256),DSpark 默认串行头。 |
| 置信度头 | 预测每位置「条件生存概率」$c_k$ 的轻量线性头 + sigmoid。 |
| STS | 序贯温度缩放,保序校准累乘概率,把 ECE 从 3–8% 降到约 1%。 |
| SPS(B) | 引擎在批大小 B 下的每秒步数能力曲线;初始化时 profile 一次,运行时 O(1) 查表。 |
| 非预知性 | 无损要求:纳入决策不得依赖未来候选 token;靠早停 / 两步前异步隔离实现。 |
| MTP-1 | DeepSeek-V4 的前生产基线,单 token 草稿;被 DSpark 取代。 |
| SLA | 服务等级协议,这里指系统必须保证的最低每用户生成速度(tok/s/user)。 |
DSpark 是推理侧的工程胜利:在不动模型、不损失输出分布的前提下,通过「并行打草稿 + 串行捋顺 + 按负载智能验证」,把 DeepSeek-V4 在生产高并发下的单用户速度提了一大截,并解锁了老基线根本撑不住的严格交互档位。对关注 RL / 推理经济学的人来说,这是攻击 rollout / 延迟瓶颈的一记直球。