vLLM 使用 DSpark 进行自适应验证

vLLM 通过使用 DSpark 的置信度调度验证(confidence-scheduled verification)实现了自适应验证,以优化投机解码(speculative decoding)。通过使用学习到的置信度头(confidence head)来评估草拟标记(drafted tokens)的生存概率,vLLM 可以根据系统负载和标记置信度动态决定每步验证多少个标记,从而消除了手动调整 num_speculative_tokens 的需求。

为高并发优化投机解码

投机解码通常是以增加计算量来换取更少的解码步数。虽然这在 GPU 受内存限制的低 Batch Size 下是高效的,但在高并发(例如 Batch Size 为 256)时会变得成问题,因为草拟标记会与真实标记争夺计算资源。当接受率下降时——例如在 DeepSeek-V4-Pro-0813 上,一个 7 标记块中的最后一个标记生存概率低于 10% 时——被拒绝的标记会浪费关键的计算资源并降低整体吞吐量。

自适应验证通过将静态投机长度替换为动态预算来解决这个问题。vLLM 不再验证固定数量的标记,而是在整个 Batch 中为最有可能的草拟序列分配验证槽位(verification slots),从而确保计算资源仅用于那些具有高接受概率的标记。

DSpark 置信度调度机制

自适应验证利用 DSpark 置信度头为每个草拟标记分配生存概率。系统通过以下逻辑,在最大化单位步时间内的预期产出标记数的情况下,确定最佳草拟预算 ($B$):

  • Global Top-B Selection: 该调度器在所有请求中识别出 $B$ 个最佳草拟槽位。由于生存概率随着草拟位置的增加而降低,系统只需接受每个请求草拟部分的连续前缀。
  • Budget Calculation: 预算 $B$ 源自一个成本模型,该模型在预期奖励标记数(每个采样请求一个奖励标记,外加 $B$ 个最佳槽位的生存数)与已分析的单步成本(非草拟标记 $T$ 与草拟标记 $B$ 之和)之间取得平衡。
  • Execution Pipeline: 预算规模计算在 CPU 上执行,使用的是来自上一步的双缓冲置信度数组。实际的槽位分配是在 GPU 上通过 PyTorch 和 torch.compile(降级为 Triton)执行的,从而避免了主机与设备之间的数据回传。

技术实现与 CUDA Graphs

为了支持可变大小的验证,vLLM 集成了 varlen decode CUDA graphs。该实现依赖于以下组件:

  • Attention Kernel Support: 系统使用来自 DeepGEMM 的稀疏 MLA 内核和 varlen indexer 内核来处理可变长度。
  • Graph Capture: 解码图(Decode graphs)是以 num_speculative_tokens + 1 作为最大查询长度进行捕获的。单个图可以服务于每个请求中 1 到 num_speculative_tokens + 1 个标记的任何混合组合。
  • Cost Modeling: 在启动时,引擎会分析模拟步骤以创建用于验证和草拟成本的查找表。为了处理分析噪声和内核分块大小(tile size)的变化,成本曲线被强制设为单调。
  • CUDA Graph Padding: 成本模型考虑了 CUDA graph padding 的“阶梯”效应,即一批 121 个标记可能会产生 128 个标记图的成本。这鼓励预算算法将计算保持在 CUDA graph 区域内,以实现最大效率。

性能结果

在 DeepSeek-V4-Pro-0813(TP=8,运行在 8×B300 SM100 上)上的测试表明,自适应验证在从 1 到 256 的并发度扫描中,始终保持在吞吐量与交互性的 Pareto 前沿(Pareto frontier)。

该系统在低并发时有效地模拟长固定块,在高并发时有效地模拟短固定块,无需预先了解工作负载形状即可获得两者的优点。

当前局限性

自适应验证目前存在以下约束:

  • Hardware/Backend Requirements: 完整的 varlen decode graphs 需要 AttentionCGSupport.ALWAYS,目前在 SM100 上的 DSV4 sparse-MLA、sparse-SWA 和 indexer 后端中已报告支持。
  • Unsupported Features: 该功能与 --enforce-eager 模式、LoRA 或流水线并行(pipeline parallelism)不兼容。
  • Logprobs: 不支持输出 logprobs,因为验证过程在正向传播后会压缩 logits。

配置与复现

自适应验证通过 speculative-config JSON 中的 enable_adaptive_verification: true 标志来启用。为了获得最佳性能,max_cudagraph_capture_size 应设置为 (num_speculative_tokens + 1) * max_num_seq,以确保验证批次保持在已捕获的图中。

Sources

相关