Skip to content

DSpark ​

DSpark 是建立在 DFlash 块并行骨干上的半自回归投机解码框架。它用轻量顺序头补回块内 token 依赖,再根据候选前缀的存活概率和实时硬件成本动态分配验证预算。

这两个组件解决不同问题:顺序头提高 Draft 质量,置信度调度减少 Target Model 对低价值后缀的验证开销。最终输出仍由标准投机验证校正,DSpark 不替代 Target Model。

1. 两个瓶颈 ​

1.1 并行预测的后缀衰减 ​

DFlash 一次 Forward 产生所有位置的基础 logits,但位置 k 不知道位置 k−1 实际采样了哪个 token。当上下文同时允许多个合理短语时,不同位置可能分别选择不同语义路径,形成多模态碰撞。

投机解码只接受连续前缀。设位置 k 在前 k−1 个候选均已接受时的条件接受率为 ck,则第 j 个候选能进入最终接受前缀的概率为:

aj=∏i=1jci

一轮含 bonus token 的期望产出为:

τ=1+∑j=1γaj

后部位置的 ck 只要持续下降,累积存活概率 aj 就会快速衰减。继续扩大块长度的边际收益随之降低。

1.2 固定验证长度浪费 Batch 容量 ​

验证更多候选在低并发、Memory-bound 阶段可能接近免费;高并发下,每个低接受率候选都会占用 Target Model 的 Batch token 容量。代码、数学等结构化任务通常比开放对话更容易预测,同一个静态长度无法同时适配任务难度与系统负载。

DSpark 因此把问题拆成两层:先改善 ck,再只验证具有正向系统收益的前缀。

2. 半自回归 Draft ​

2.1 并行骨干 ​

DSpark 复用 DFlash 的 Target Context Feature 与 KV 注入。并行骨干对整个查询块做一次 Forward,得到隐藏状态 h1,…,hγ 和基础 logits U1,…,Uγ。

DSpark 对查询布局做了一项重要调整:论文实现用 anchor + γ-1 masks 产生 γ 个候选,anchor 所在位置也预测第一个候选;原始 DFlash 则把 anchor 作为已知 bonus token,仅从后续 mask 位置取预测。不同 checkpoint 格式可能采用不同布局,推理引擎必须读取模型配置,不能只按方法名硬编码偏移。

2.2 顺序修正 ​

顺序阶段不重跑 Transformer,只在基础 logits 上添加依赖已采样前缀的转移偏置:

pk(v∣x0,x<k)=exp⁡(Uk(v)+Bk(x0,x<k,v))∑u∈Vexp⁡(Uk(u)+Bk(x0,x<k,u))

于是块分布保持自回归分解:

P(X∣x0)=∏k=1γpk(xk∣x0,x<k)

每个 pk 都是显式 Softmax,推理时能够保存准确的 Draft 概率并继续使用标准拒绝采样。这一点区别于需要全局归一化或隐变量边缘化的结构化输出层。

2.3 Markov Head ​

默认实现只依赖前一个 token,并把完整的 V×V 转移矩阵做低秩分解:

B=W1W2,W1∈RV×r,W2∈Rr×VB(xk−1,⋅)=W1[xk−1]W2

论文和公开 Qwen3 配置默认 r=256。每步只执行一次 Embedding Lookup 和低秩到词表的投影,Transformer 主干仍保持完全并行。

2.4 RNN Head ​

RNN 变体维护块内状态 sk,把更长前缀、前一 token Embedding 与当前骨干隐藏状态合并后做一次门控更新。它在长候选块上略优于一阶 Markov Head,但实现复杂度更高;论文默认使用 Markov Head,当前 vLLM 的通用 Qwen3 DSpark 路径也实现的是 Markov 顺序采样。

论文在 Batch Size 128、上下文长度 512~4096 的测试中报告:相对 DFlash,把候选长度从 4 扩展到 16 时,顺序头只增加整轮 0.2%~1.3% 延迟。这个比例依赖“Target 验证占主导”的测试条件,不代表顺序循环在所有模型、Batch 和硬件上都可忽略。

3. 置信度建模 ​

3.1 条件接受概率 ​

DSpark 的置信度头同时读取骨干隐藏状态与前一 token 的 Markov Embedding:

ck=σ(w⊤[hk;W1[xk−1]])

训练标签不是某次随机验证的 0/1 结果,而是 Draft 分布 pkd 与 Target 分布 pkt 的理论接受概率:

ck∗=1−12‖pkd−pkt‖1

它等于两分布概率质量的重叠程度,直接对应标准拒绝采样在该位置的期望接受率。

3.2 STS 校准 ​

调度器需要的是累积存活概率 aj=∏i≤jci 的绝对数值,而不只是候选排序。论文使用 Sequential Temperature Scaling(STS):在验证集上从左到右为每个位置搜索温度,固定已经校准的前部位置,使累积概率的 Expected Calibration Error(ECE)最小。

论文在 Alpaca 上报告,原始置信度头的 ECE 约为 3%~8%,STS 后各位置约为 0.4%~2.0%。这属于论文训练与部署流程;使用第三方 checkpoint 时,应确认其校准数据和运行时是否包含对应变换。当前 vLLM 通用实现直接消费 checkpoint 输出的 sigmoid 概率,没有暴露独立的 STS 运行时配置。

4. 硬件感知前缀调度 ​

4.1 优化目标 ​

对 R 个请求,设请求 r 的验证长度为 ℓr,则 Target 本轮处理的 token 数为:

B=∑r=1R(1+ℓr)

期望产出为:

τ=∑r=1R(1+∑j=1ℓrar,j),ar,j=∏i=1jcr,i

若预先 profiling 得到 Batch Size 为 B 时的每秒 Step 数 SPS(B),调度目标就是:

maxℓ1,…,ℓRΘ=τ⋅SPS(B)

由于同一请求中的 ar,j 单调不增,把所有 (request, position) 按 ar,j 降序排列,会自然保留连续前缀。调度器沿这条全局排序路径逐个加入候选,选择期望吞吐最高的总验证预算。

4.2 无损调度的非预见性 ​

验证长度不能回看未来候选再决定是否验证更早的 token。DSpark 的 ck+1 依赖已经采样的 xk;若调度器先观察整个块,再根据后缀置信度决定是否纳入 xk,就会偏向“能导向高置信度后缀”的 xk,从而改变 Target 分布。

论文算法在吞吐首次下降时立即停止搜索,使位置 k 的纳入决策只依赖当时已经可见的信息。这个 Early Stop 在吞吐目标沿候选预算单峰时得到全局最优;真实硬件成本曲线是离散且不平滑的,生产实现还需额外处理。

4.3 生产异步调度 ​

DeepSeek 的生产系统需要提前准备下一步 Batch 与 CUDA Graph,无法同步等待当前步的完整调度结果。论文中的生产适配使用两步前的置信度估计总预算 K,当前步仍按最新存活概率选择 Top-K 候选。历史预算与当前 token 取值之间形成因果隔离,因此可以跨越不平滑的硬件成本台阶,同时保持非预见性。

当前 vLLM 主线采用相似的双层思路:CPU 侧使用滞后的置信度与启动时 profiling 的 Draft/Verify 成本选择总预算,GPU 侧再按当前累积置信度把预算分给各请求。它优化的是“期望接受 token / 实测耗时”,与论文的 τ⋅SPS(B) 等价地表达吞吐目标。

5. 训练目标 ​

Target Model、共享 Embedding 与 LM Head 保持冻结;只训练并行骨干、顺序头和置信度头。三个损失都使用前部权重 wk=exp⁡(−(k−1)/λ):

LCE=−∑kwklog⁡pkd(xk∗)LTV=∑kwk‖pkd−pkt‖1Lconf=−∑kwk[ck∗log⁡ck+(1−ck∗)log⁡(1−ck)]L=αCELCE+αTVLTV+αconfLconf

论文默认权重为 0.1、0.9、1.0。公开的 Qwen3-4B 配置使用 5 个 Draft Layer、block size 7、5 个 Target Feature Layer、Markov rank 256,并随机采样 512 个 anchor。

6. 开源实现边界 ​

6.1 DeepSpec ​

DeepSeek 开源的 DeepSpec 覆盖数据生成、Target Cache、DFlash/DSpark/EAGLE-3 训练和离线评测。它可以用固定候选长度评估接受长度,也可以用静态置信度阈值提前截断;论文中的生产级硬件感知调度器并不在这条离线 evaluator 路径中。

训练成本不可忽略。DeepSpec README 估计,默认 Qwen3-4B 数据准备配置的 Target Cache 约为 38 TB;实际规模取决于样本数、缓存字段、精度和层数。

6.2 vLLM ​

截至 2026-08-19,vLLM 已包含 DSpark Markov 顺序采样与可选 Adaptive Verification:

vLLM:在并行基础 logits 上逐位置添加 Markov Bias
python
prev = self.input_buffers.input_ids[self._anchor_idx[:num_reqs]]

for i in range(n_spec):
    markov_embed = self.model.markov_embed(prev)
    bias = self.model.markov_bias(markov_embed)
    logits_i = base_logits[:, i] + bias
    draft_sampled_i = self._sample_logits(
        logits_i, idx_map[:, i], sample_pos[:, i], i
    )
    self.draft_tokens[:num_reqs, i] = draft_sampled_i
    prev = draft_sampled_i

源码:vLLM dspark/speculator.py

启用自适应验证需要带 Confidence Head 的 DSpark checkpoint,并设置 enable_adaptive_verification=true。当前实现还要求支持设备端可变 Query Length 的 Attention Backend 和 Full CUDA Graph;不支持 LoRA、Pipeline Parallelism 或输出 logprobs。固定长度验证不受这些额外约束。

7. 实验结果如何解读 ​

7.1 离线 Draft 质量 ​

论文 Table 1 在 temperature 1、固定 block size 7、关闭 Confidence Scheduler 的条件下,对所有方法使用相同训练框架和数据。Qwen3 系列 9 个任务的宏平均结果为:

TargetEAGLE-3DFlashDSparkDSpark vs DFlash
Qwen3-4B3.614.064.73+16.3%
Qwen3-8B3.804.074.81+18.4%
Qwen3-14B3.684.044.78+18.3%

这些数值是每轮平均产出 τ,包含 Target 生成的 bonus token,不是端到端加速比。该实验刻意关闭调度器,因此只验证半自回归结构对 Draft 质量的贡献。

论文还报告,在 Qwen3-4B、5 层 Draft 的消融中,候选长度从 4 增加到 16 后,DSpark 相对 DFlash 的接受长度增益从数学 16%、代码 15%、对话 18%,扩大到 30%、26%、22%。这与“顺序依赖主要改善长块后缀”一致。

7.2 生产 Serving ​

DeepSeek 在 V4-Flash/Pro preview 的生产引擎与真实流量上,将最大 Draft 长度为 5 的 DSpark 与原 MTP-1 配置比较:

场景论文报告结果
V4-Flash,匹配系统吞吐单用户生成速度提高 60%~85%
V4-Pro,匹配系统吞吐单用户生成速度提高 57%~78%
V4-Flash,80 tok/s/user SLA聚合吞吐提高 51%
V4-Pro,35 tok/s/user SLA聚合吞吐提高 52%

更严格 SLA 下出现的 661% 和 406% 名义吞吐差异来自 MTP-1 已进入极低并发区。论文也明确建议把它理解为“DSpark 扩展了可行的交互速度边界”,而不是常规负载下可复现的倍数加速。

8. DFlash 与 DSpark 对比 ​

维度DFlashDSpark
并行骨干块并行 + KV 注入复用 DFlash
块内依赖候选位置独立Markov Head 或 RNN Head
Draft Forward1 次块 Forward1 次块 Forward + 轻量顺序采样
验证长度通常固定可按置信度和硬件成本动态分配
主要收益降低 Draft 串行开销缓解后缀衰减与无效验证
新增风险长块后缀质量下降置信度校准、因果调度和后端适配更复杂

DSpark 不是用自回归替换并行 Draft,而是在最便宜的位置补入有限顺序依赖。其核心价值也不只是接受长度更高,而是把 Draft 质量、请求差异和 Serving 负载放进同一个验证预算决策中。

9. 参考资料 ​

  1. DSpark: Confidence-Scheduled Speculative Decoding with Semi-Autoregressive Generation
  2. DeepSpec 官方仓库
  3. DeepSpec Qwen3-4B DSpark 配置
  4. vLLM DSpark Speculator
  5. vLLM Adaptive Verification 文档
  6. vLLM Adaptive Verification 实现