跳到内容

vLLM V1

公告

我们已开始弃用 V0 版本。请参阅 RFC #18571 获取更多详情。

V1 现已在所有受支持的用例中默认启用,我们将逐步为计划支持的每个用例启用它。请在 GitHubvLLM Slack 中分享您的任何反馈。

要禁用 V1,请将环境变量设置为:VLLM_USE_V1=0,并通过 GitHub issue 告诉我们原因!

为何选择 vLLM V1?

vLLM V0 成功支持了广泛的模型和硬件,但随着新功能独立开发,系统变得日益复杂。这种复杂性使得集成新功能变得更加困难,并引入了技术债,揭示了对更精简和统一设计的需求。

在 V0 成功的基础上,vLLM V1 保留了 V0 中稳定且经过验证的组件(例如模型、GPU 内核和实用程序)。同时,它显著地重新架构了核心系统,包括调度器、KV 缓存管理器、工作器、采样器和 API 服务器,以提供一个更具内聚性、可维护的框架,更好地适应持续的增长和创新。

具体而言,V1 旨在

  • 提供一个**简单、模块化且易于修改的代码库**。
  • 确保**高性能**,同时 CPU 开销接近于零。
  • 将**关键优化**整合到统一架构中。
  • 通过默认启用功能/优化,实现**零配置**。

我们看到升级到 V1 核心引擎带来了显著的性能提升,尤其是在长上下文场景中。请参阅性能基准(待添加)。

欲了解更多详情,请查阅 vLLM V1 博客文章 《vLLM V1:vLLM 核心架构的重大升级》(发布于 2025 年 1 月 27 日)。

本用户指南概述了 vLLM V1 引入的一些已知**重要变更和限制**。团队一直在积极努力将 V1 作为默认引擎,因此本指南将随着 vLLM V1 支持更多功能而不断更新。

当前状态

对于每个项目,我们对 V1 支持的进展状态分为以下几类:

  • 🚀 **已优化**:接近完全优化,目前没有进一步的工作计划。
  • 🟢 **功能完备**:完全可操作,并持续进行优化。
  • 🚧 **WIP (开发中)**:正在积极开发中。
  • 🟡 **已计划**:计划未来实施(部分可能有已开放的 PR/RFC)。
  • 🟠 **已延迟**:在 V1 中暂时移除,但计划稍后重新引入。
  • 🔴 **已弃用**:未计划在 V1 中支持,除非有强烈需求。

注意

vLLM V1 的统一调度器通过使用一个简单的字典(例如 `{request_id: num_tokens}`)来动态分配每个请求的固定令牌预算,从而以相同的方式处理提示和输出令牌,实现了分块预填充、前缀缓存和推测解码等功能,而无需严格区分预填充和解码阶段。

V1 调度器支持多种调度策略,包括先到先服务(FCFS)和基于优先级的调度(请求根据分配的优先级处理,FCFS 作为平局决胜者),可通过 `--scheduling-policy` 参数进行配置。

硬件

硬件 状态
NVIDIA 🚀
AMD 🟢
TPU 🟢
CPU 🟢 (x86) 🟡 (MacOS)

注意

更多硬件平台可能通过插件支持,例如:

请查看其相应的仓库了解更多详情。

模型

模型类型 状态
仅解码器模型 🚀 已优化
编码器-解码器模型 🟠 已延迟
嵌入模型 🟢 功能完备
Mamba 模型 🟢 (Mamba-2), 🟡 (Mamba-1)
多模态模型 🟢 功能完备

vLLM V1 目前排除了具有 SupportsV0Only 协议的模型架构。

提示

这对应于我们支持的模型列表中的 V1 列。

请参阅下文,了解尚未支持或在 V1 中有更多功能计划的模型状态。

嵌入模型

最初的基本支持现已可用。

随后,我们将考虑使用基于 全局 logits 处理器 隐藏状态处理器,以实现在 V1 中使用相同引擎实例同时进行生成和嵌入。

Mamba 模型

使用选择性状态空间机制而非标准 Transformer 注意力机制的模型已部分支持。使用 Mamba-2 层(例如 Mamba2ForCausalLM)的模型已受支持,但使用较旧 Mamba-1 层(例如 MambaForCausalLMJambaForCausalLM)的模型尚未支持。请注意,这些模型目前在 V1 中需要禁用前缀缓存。

结合了 Mamba-2 层和标准注意力层的模型也受支持(例如 BambaForCausalLMZamba2ForCausalLMNemotronHForCausalLMFalconH1ForCausalLMGraniteMoeHybridForCausalLM)。请注意,这些模型目前在 V1 中需要禁用前缀缓存并使用 FlashInfer 注意力后端。

编码器-解码器模型

需要独立编码器和解码器之间交叉注意力的模型(例如 BartForConditionalGenerationMllamaForConditionalGeneration)尚未支持。

功能

功能 状态
前缀缓存 🚀 已优化
分块预填充 🚀 已优化
LoRA 🚀 已优化
Logprobs 计算 🟢 功能完备
FP8 KV 缓存 🟢 在 Hopper 设备上功能完备 ( Pull Request #15191)
推测解码 🚀 已优化
带前缀缓存的提示 Logprobs 🟡 已计划 ( RFC #13414)
结构化输出备选后端 🟢 功能完备
请求级结构化输出后端 🔴 已弃用
best_of 🔴 已弃用 ( RFC #13361)
按请求 Logits 处理器 🔴 已弃用 ( RFC #13360)
GPU <> CPU KV 缓存交换 🔴 已弃用

注意

vLLM V1 的统一调度器通过使用一个简单的字典(例如 `{request_id: num_tokens}`)来动态分配每个请求的固定令牌预算,从而以相同的方式处理提示和输出令牌,实现了分块预填充、前缀缓存和推测解码等功能,而无需严格区分预填充和解码阶段。

Logprobs 的语义变更

vLLM V1 支持 logprobs 和提示 logprobs。然而,与 V0 相比,存在一些重要的语义差异:

Logprobs 计算

V1 中的 Logprobs 现在从模型原始输出计算后立即返回(即在应用任何 logits 后处理,如温度缩放或惩罚调整之前)。因此,返回的 logprobs 不反映采样过程中使用的最终调整概率。

支持带采样后调整的 logprobs 正在开发中,并将在未来更新中添加。

带前缀缓存的提示 Logprobs

目前,提示 logprobs 仅在通过 --no-enable-prefix-caching 关闭前缀缓存时才受支持。在未来的版本中,提示 logprobs 将与前缀缓存兼容,但即使命中前缀缓存,也会触发重新计算以恢复完整的提示 logprobs。详情请参阅 RFC #13414

已弃用的功能

作为 vLLM V1 核心架构重大重构的一部分,一些遗留功能已被弃用。

采样功能

  • **best_of**:此功能因使用率有限已被弃用。详情请参阅 RFC #13361
  • **按请求 Logits 处理器**:在 V0 中,用户可以传递自定义处理函数以按请求调整 logits。在 vLLM V1 中,此功能已弃用。相反,设计正朝着支持**全局 logits 处理器**的方向发展,这是团队正在积极为未来版本开发的功能。详情请参阅 RFC #13360

KV 缓存功能

  • **GPU <> CPU KV 缓存交换**:随着新的简化核心架构,vLLM V1 不再需要 KV 缓存交换来处理请求抢占。

结构化输出功能

  • **请求级结构化输出后端**:已弃用,现在支持带回退机制的替代后端(outlines, guidance)。