vLLM Model Runner V2 发布说明 / 新功能

vLLM 已宣布 Model Runner V2(MRV2),这是一项从头重新实现的模型运行器,旨在提升执行效率并降低技术债务。MRV2 引入了模块化、GPU 原生、异步优先的核心,在不需要更改现有面向用户的 API 的情况下提升性能。

GPU 原生输入准备与持久批处理

MRV2 通过将持久请求状态与每步输入张量解耦,并使用 Triton 内核将输入准备直接移至 GPU,从而提升吞吐量。

在 vLLM V1 中,请求顺序与块表布局紧密耦合,这在添加或删除请求时需要进行复杂的重新排序。MRV2 用一个稳定的状态表取代了这种方式,每个活跃请求在其整个生命周期内占据固定的一行。运行器随后使用 gather 操作为每一步生成正确顺序的输入块表。该设计消除了诸如 CachedRequestState 等冗余备份状态的需求,并简化了状态管理。

通过将张量的构建——包括 input_idspositionsquery_start_locseq_lens——迁移到 GPU,MRV2 实现了:

  • 降低 CPU 开销:最小化 Python 和 CPU 端的张量操作。
  • 简化代码:去除 CPU 端操作施加的约束。
  • 提升兼容性:允许 GPU 本地的准备直接消费设备端结果而无需同步,促进更好的异步和推测解码。

异步优先架构

MRV2 基于在所有支持的模型和特性中 CPU 与 GPU 之间零同步的假设构建。该异步优先设计通过让调度器和工作线程在 GPU 执行第 N 步时准备第 N+1 步,最大化 GPU 利用率。

该架构专门解决了之前在将异步调度与推测解码结合时的困难。由于输入准备现在在设备上进行,准备内核可以直接消费 GPU 产生的拒绝采样结果。输出通过独立的 CUDA 流异步传输到 CPU,完全将主计算流与主机端处理解耦。

Triton 原生采样改进

采样已使用优化的 Triton 内核重新实现,以提升内存效率和数值控制:

  • Gumbel-Max 采样:现在避免显式的 softmax 物化,并使用无状态的内核 RNG。
  • Top-k logprobs:通过先识别 top-k logits,然后仅对选中的候选项计算 logprobs,提高了效率。
  • Prompt logprobs:通过更细粒度的分块(包括单个提示内部),降低了内存使用。
  • 推测解码:通过在内核中使用 idx_mapping 间接,实现兼容性提升,避免了为匹配每个 logits 向量而扩展请求状态的需求。

通过 ModelState 实现模块化

为了在不污染共享执行路径的前提下支持多样的模型架构,MRV2 引入了 ModelState 抽象。该接口定义了多模态嵌入、注意力元数据和 CUDA 图捕获等模型特定逻辑,使主运行器能够专注于通用执行路径。

这种模块化显著降低了代码复杂度。原本超过 6,700 行的 gpu_model_runner.py 文件已被拆分为多个更小的文件,最大文件现在不足 1,300 行。

性能基准

MRV2 在可测量的性能提升方面表现突出,尤其是在主机端开销成为瓶颈的场景中:

  • 吞吐量:在单个 GB200 GPU 上使用 Qwen3-0.6B 的测试中,MRV2 达到每秒 25K 输出 token,而 MRV1 为 16K,提升了 56.2% 吞吐量
  • 延迟:在 4xGB200 GPU 上使用 GLM-4.7-FP8MTP=1 的情况下,MRV2 通过消除推测解码期间的 CPU‑GPU 同步点,实现了 6.3% 的平均每 token 时间 (TPOT) 降低

当前状态与限制

截至 v0.18.0,MRV2 仍属实验性功能,尚未实现全部特性。以下功能目前 不受支持

  • 线性注意力模型(例如 Qwen3.5、Nemotron 3 Super)
  • 除 Eagle、Eagle3 和 MTP 之外的推测解码方法
  • Logits 处理器、LoRA、EPLB 和 DBO

用户可以通过设置环境变量 export VLLM_USE_V2_MODEL_RUNNER=1 来启用 MRV2。

Sources