Doramagic 项目包 · 项目说明书

vllm 项目

生成时间:2026-05-11 03:40:03 UTC

项目介绍

vLLM(Vectorized Large Language Model)是一个高性能、易于使用的大语言模型推理和服务框架,旨在提供高吞吐量的 LLM 推理能力。vLLM 由 UC Berkeley、UC San Diego、University of Illinois 等知名学术机构的研究人员开发和维护,是开源社区中用于生产环境 LLM 部署的主流选择之一。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 1.1 核心价值主张

继续阅读本节完整说明和来源证据。

章节 1.2 版本信息

继续阅读本节完整说明和来源证据。

章节 2.1 整体架构概览

继续阅读本节完整说明和来源证据。

1 项目概述

vLLM(Vectorized Large Language Model)是一个高性能、易于使用的大语言模型推理和服务框架,旨在提供高吞吐量的 LLM 推理能力。vLLM 由 UC Berkeley、UC San Diego、University of Illinois 等知名学术机构的研究人员开发和维护,是开源社区中用于生产环境 LLM 部署的主流选择之一。

vLLM 的核心目标是解决大语言模型推理过程中的内存管理效率问题,通过创新的 PagedAttention 技术实现 KV Cache 的高效管理,从而在有限的 GPU 显存资源下实现更高的吞吐量。资料来源:README.md:1-20

1.1 核心价值主张

特性描述
高吞吐量相比传统方法提升 2-24 倍的吞吐量
显存高效通过 PagedAttention 实现精细化的显存管理
易用性提供简洁的 Python API 和 OpenAI 兼容接口
灵活扩展支持张量并行、管道并行等多种分布式策略
广泛兼容支持众多主流开源大语言模型

1.2 版本信息

当前稳定版本信息定义在 vllm/version.py 中,用于标识 vLLM 的发布版本号,便于依赖管理和版本追踪。资料来源:vllm/version.py:1-15

2 技术架构

2.1 整体架构概览

vLLM 采用分层架构设计,从上到下分为以下几个核心层次:

graph TD
    A[用户接口层] --> B[LLM 入口层]
    B --> C[推理引擎层]
    C --> D[模型执行层]
    D --> E[设备抽象层]
    
    A --> A1[OpenAI 兼容 API]
    A --> A2[Python API]
    
    C --> C1[Engine Arguments]
    C --> C2[Engine Core]
    C --> C3[Async Engine]
    
    D --> D1[Model Runner]
    D --> D2[Worker]
    D --> D3[Cache Engine]
    
    E --> E1[CUDA]
    E --> E2[ROCm]
    E --> E3[CPU]

2.2 核心模块结构

vllm/__init__.py 文件定义了包的主要导出接口,展示了 vLLM 的模块组织方式:

模块路径功能描述
vllm.LLM主要的推理入口类
vllm.SamplingParams采样参数配置
vllm.engine推理引擎核心实现
vllm.worker模型执行工作进程
vllm.model_executor模型执行器
vllm.config配置管理
vllm.attention注意力机制实现

资料来源:vllm/__init__.py:1-50

2.3 推理引擎架构

推理引擎是 vLLM 的核心组件,负责协调整个推理流程:

graph LR
    A[用户请求] --> B[Engine Arguments]
    B --> C[LLMEngine]
    C --> D[Worker Pool]
    D --> E[Model Runner]
    E --> F[Model]
    F --> G[Output]
    
    C --> H[Cache Engine]
    H --> I[KV Cache]
    
    style G fill:#90EE90
    style I fill:#87CEEB

Engine Arguments 负责解析和验证所有推理相关的配置参数,包括模型路径、采样参数、资源配置等。资料来源:vllm/engine/arg_utils.py:1-100

Configuration 模块则统一管理 vLLM 的各类配置,包括模型配置、并行配置、调度配置等,确保各组件之间的配置一致性。资料来源:vllm/config.py:1-150

3 主要功能特性

3.1 PagedAttention

PagedAttention 是 vLLM 最核心的技术创新,灵感来自操作系统的虚拟内存管理思想。它通过将 KV Cache 分页管理,避免了传统方法中连续显存分配带来的浪费问题。

graph LR
    A[传统方法] -->|连续分配| B[显存碎片化]
    B --> C[显存利用率低]
    
    D[PagedAttention] -->|分页管理| E[灵活分配]
    E --> F[显存利用率高]
    
    style D fill:#90EE90

技术优势:

  • 将显存利用率提升至接近 100%
  • 支持高效的Prefix Caching
  • 减少显存碎片化
  • 支持弹性批处理

3.2 并行推理策略

vLLM 支持多种分布式推理策略,可以根据硬件配置灵活选择:

并行策略适用场景配置参数
张量并行 (TP)单机多卡tensor_parallel_size
管道并行 (PP)多机多卡pipeline_parallel_size
数据并行 (DP)多实例部署启动多个进程
专家并行 (EP)MoE 模型enable_expert_parallel

3.3 模型支持

vLLM 支持众多主流的开源大语言模型,涵盖以下类别:

模型类别代表模型
Decoder-OnlyLlama, GPT, Mistral, Qwen
Encoder-DecoderT5, BART
视觉语言模型LLaVA, Qwen-VL
Mixture of ExpertsMixtral

资料来源:setup.py:1-50

3.4 推理接口

vLLM 提供两类主要的推理接口:

Python API(同步):

from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-2-7b-hf")
outputs = llm.generate(["Hello, world!"], SamplingParams(temperature=0.8))

异步 API:

from vllm import AsyncLLM

async_llm = AsyncLLM(model="meta-llama/Llama-2-7b-hf")

OpenAI 兼容 API:

vLLM 提供与 OpenAI API 格式完全兼容的推理服务,支持 /v1/chat/completions/v1/completions 端点,便于现有应用无缝迁移。

资料来源:vllm/entrypoints/llm.py:1-100

4 应用场景

4.1 典型使用场景

graph TD
    A[vLLM 部署场景] --> B[在线推理服务]
    A --> C[批量推理任务]
    A --> D[实验研究]
    A --> E[模型微调验证]
    
    B --> B1[低延迟响应]
    C --> C1[高吞吐处理]
    D --> D1[快速迭代]
    E --> E1[资源高效利用]

4.2 部署模式

部署模式特点推荐配置
单机单卡简单部署默认配置
单机多卡高效利用TP=2/4/8
多机多卡大模型推理TP+PP
容器化部署便于运维Docker/Kubernetes

5 依赖技术栈

5.1 核心依赖

依赖库用途
PyTorch深度学习框架
CUDAGPU 计算
transformers模型加载
flash-attn高效注意力计算
ray分布式计算

5.2 硬件要求

  • GPU: NVIDIA GPU(CUDA 计算能力 ≥ 7.0)
  • 显存: 取决于模型大小,通常至少 16GB
  • 内存: 至少 32GB 系统内存
  • 存储: 足够的模型权重存储空间

6 项目发展

6.1 发展历程

vLLM 项目起源于学术研究,最初由 UC Berkeley 的研究人员提出 PagedAttention 概念,并在论文中展示了其优越性能。随着开源社区的积极参与,vLLM 逐步发展成为功能完善、性能卓越的生产级推理框架。

6.2 社区生态

vLLM 采用 Apache License 2.0 开源许可,拥有活跃的开源社区。项目持续接收来自全球开发者的贡献,不断添加新功能和优化性能。

资料来源:[vllm/__init__.py:1-50]()

安装指南

vLLM 是一个高性能的大语言模型(LLM)推理和服务框架,旨在为用户提供快速、经济高效的 LLM 服务。本页面详细介绍 vLLM 的安装方法、依赖要求、环境配置以及各种部署场景的安装步骤。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 硬件要求

继续阅读本节完整说明和来源证据。

章节 软件环境

继续阅读本节完整说明和来源证据。

章节 方式一:使用 pip 安装(推荐)

继续阅读本节完整说明和来源证据。

概述

vLLM 是一个高性能的大语言模型(LLM)推理和服务框架,旨在为用户提供快速、经济高效的 LLM 服务。本页面详细介绍 vLLM 的安装方法、依赖要求、环境配置以及各种部署场景的安装步骤。

vLLM 支持多种安装方式,包括 pip 安装、Docker 部署、源码编译等。用户可以根据自己的硬件环境(CUDA GPU、CPU 等)选择最适合的安装方式。框架采用模块化设计,通过灵活的参数配置支持不同的推理场景。

系统要求

硬件要求

组件类型最低要求推荐配置
GPUNVIDIA GPU with CUDA supportNVIDIA A100/H100
显存8GB24GB+
内存16GB32GB+
存储50GB SSD100GB+ NVMe SSD

软件环境

vLLM 支持多种 Python 版本和 CUDA 版本。安装前请确保系统已安装以下软件:

  • Python 3.8 - 3.11
  • CUDA Toolkit 11.8 或更高版本
  • cuDNN 8.x 或更高版本
  • NVIDIA Driver 450.80.02 或更高版本

安装方式

方式一:使用 pip 安装(推荐)

使用 pip 是最简单快速的安装方式,适合大多数用户场景。

# 标准安装
pip install vllm

# 包含所有可选依赖的完整安装
pip install vllm[all]

pip 安装方式会自动处理 vLLM 的核心依赖,包括 PyTorch、Transformers 等关键库。此方式适合快速原型开发和测试环境部署。

方式二:Docker 安装

Docker 安装提供了隔离的运行环境,可以避免依赖冲突问题。vLLM 官方提供了预配置好的 Docker 镜像。

# 拉取最新稳定版镜像
docker pull vllm/vllm:latest

# 运行容器
docker run --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --runtime nvidia \
    -p 8000:8000 \
    vllm/vllm:latest \
    --model meta-llama/Llama-2-7b-hf

资料来源:README.md:1-15

Docker 部署的优势在于环境一致性高,部署迁移方便,适合生产环境使用。镜像已预装所有必要的 CUDA 驱动和依赖库。

方式三:源码编译安装

对于需要自定义配置或参与 vLLM 开发的用户,可以选择源码编译安装。

# 克隆仓库
git clone https://github.com/vllm-project/vllm.git
cd vllm

# 安装依赖
pip install -e .

# 或使用高级构建选项
pip install -e . --verbose

资料来源:vllm/entrypoints/cli/main.py:1-30

CLI 命令行工具

vLLM 提供了功能丰富的命令行界面(CLI),通过 vllm 命令可以访问各种子命令。CLI 架构采用模块化设计,支持扩展新的命令。

graph TD
    A[vllm CLI] --> B[main.py 入口]
    B --> C[serve 推理服务]
    B --> D[run-batch 批处理]
    B --> E[launch 启动组件]
    C --> F[FastAPI 服务]
    C --> G[gRPC 服务]
    E --> H[FastAPI 渲染服务]

基本用法

# 查看版本信息
vllm --version

# 查看帮助信息
vllm --help

# 查看特定子命令帮助
vllm serve --help

serve 子命令

serve 子命令用于启动 LLM 推理服务,是最常用的命令之一。

vllm serve Qwen/Qwen2.5-3B-Instruct

资料来源:vllm/entrypoints/cli/serve.py:1-50

#### 常用参数

参数说明默认值
--model模型名称或本地路径Qwen/Qwen3-0.6B
--host服务监听地址0.0.0.0
--port服务监听端口8000
--gpu-memory-utilizationGPU 显存利用率0.9
--max-model-len最大模型上下文长度模型默认值
--tensor-parallel-size张量并行大小1

#### headless 模式

headless 模式启动时不会创建 API 服务器,适用于分布式部署场景。

vllm serve <model> --headless

在此模式下,api_server_count 参数自动设为 0,不启动任何 API 服务器。

# 错误用法:headless 模式不能指定 api-server-count
vllm serve <model> --headless --api-server-count=2

此配置会触发参数校验错误,提示 headless 模式与 api-server-count 参数冲突。

#### gRPC 服务模式

vLLM 支持 gRPC 协议用于高性能内部通信。

vllm serve <model> --grpc

启用 gRPC 模式时,框架会使用 uvloop 事件循环运行 gRPC 服务器。

if args.grpc:
    from vllm.entrypoints.grpc_server import serve_grpc
    uvloop.run(serve_grpc(args))
    return

资料来源:vllm/entrypoints/cli/serve.py:40-45

launch 子命令

launch 子命令用于启动独立的组件服务。

vllm launch <component> [options]

可用的组件包括:

  • fastapi:启动 FastAPI 渲染服务(无 GPU 推理)
  • 其他可扩展组件

#### FastAPI 组件启动

vllm launch fastapi --host 0.0.0.0 --port 8000

启动流程包括以下步骤:

  1. Socket 绑定:设置服务器监听地址
  2. 构建引擎参数:从 CLI 参数创建 AsyncEngineArgs
  3. 创建模型配置:生成 VllmConfig 配置对象
  4. 清除量化配置:渲染服务器不执行推理,跳过量化验证
async def run_launch_fastapi(args: argparse.Namespace) -> None:
    listen_address, sock = setup_server(args)
    engine_args = AsyncEngineArgs.from_cli_args(args)
    model_config = engine_args.create_model_config()
    model_config.quantization = None

资料来源:vllm/entrypoints/cli/launch.py:60-80

离线推理安装

vLLM 提供了 LLM 类用于离线推理,即不启动独立服务器直接进行模型推理。

from vllm import LLM

llm = LLM(model="Qwen/Qwen2.5-3B-Instruct")
outputs = llm.generate("Hello, world!")

基本使用示例

vLLM 仓库提供了完整的离线推理示例脚本:

# 基础推理示例
python examples/basic/offline_inference/basic.py

# 聊天示例
python examples/basic/offline_inference/chat.py

# 生成示例
python examples/basic/offline_inference/generate.py

资料来源:examples/basic/offline_inference/README.md:1-30

生成参数配置

离线推理支持多种采样参数,可通过命令行或代码配置:

参数说明示例值
max_tokens最大生成 token 数512
temperature采样温度0.7
top_pTop-p 采样阈值0.9
top_kTop-k 采样大小50

默认生成配置

--generation-config 参数指定生成配置的加载来源:

python examples/basic/offline_inference/generate.py --generation-config auto
  • auto:从模型路径加载配置
  • 文件夹路径:从指定路径加载配置
  • 未指定:使用 vLLM 默认配置
注意:如果生成配置中指定了 max_new_tokens,则该值会对所有请求设置全局输出 token 限制。

GGUF 模型支持

vLLM 支持加载 GGUF 量化格式的模型。使用 repo_id:quant_type 格式指定量化类型:

--model unsloth/Qwen3-0.6B-GGUF:Q4_K_M --tokenizer Qwen/Qwen3-0.6B

支持的量化类型包括 Q2_K、Q4_K_M、Q5_K_M、Q8_0 等。

CPU 卸载功能

vLLM 支持 CPU 显存卸载功能,可以将部分模型权重卸载到 CPU 内存,从而在有限 GPU 显存条件下运行更大的模型。

--cpu-offload-gb 10

此参数可以视为增加虚拟 GPU 显存大小。例如,拥有 24GB GPU 显存并设置 --cpu-offload-gb 10 后,相当于拥有 34GB 显存,可以加载需要至少 26GB 显存的 13B BF16 模型。

注意:此功能需要快速的 CPU-GPU 互联带宽,因为模型需要在运行时从 CPU 内存加载到 GPU 内存。

验证安装

安装完成后,可通过以下方式验证 vLLM 是否正常工作:

# 检查 vLLM 版本
python -c "import vllm; print(vllm.__version__)"

# 运行基础测试
python -c "
from vllm import LLM
llm = LLM(model='facebook/opt-125m')
print('vLLM 安装成功!')
"

常见问题排查

CUDA 版本不兼容

如果遇到 CUDA 版本相关错误,请检查系统 CUDA 版本:

nvcc --version

确保 CUDA 版本符合 vLLM 的要求(CUDA 11.8+)。

GPU 显存不足

  • 减小 --gpu-memory-utilization 参数值
  • 使用更小的量化模型
  • 启用 CPU 卸载功能

依赖冲突

推荐使用虚拟环境安装 vLLM:

python -m venv vllm-env
source vllm-env/bin/activate
pip install vllm

下一步

安装完成后,您可以:

资料来源:[README.md:1-15]()

架构概览

vLLM 是一个高效、易用、低成本的大语言模型(LLM)推理服务框架,其核心设计目标是通过创新的 PagedAttention 技术实现高效的显存管理和快速推理服务。本文档详细介绍 vLLM 的整体架构设计、核心组件及其交互关系。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 主入口模块

继续阅读本节完整说明和来源证据。

章节 CLI 命令体系

继续阅读本节完整说明和来源证据。

章节 引擎参数配置

继续阅读本节完整说明和来源证据。

系统架构总览

vLLM 采用分层架构设计,从上到下依次为:命令行入口层、服务接口层、引擎核心层和硬件适配层。这种分层设计使得各模块职责明确,便于扩展和维护。

graph TD
    subgraph "用户接口层"
        CLI[CLI 命令行]
        API[OpenAI 兼容 API]
        Python[Python LLM 类]
    end
    
    subgraph "服务层"
        FastAPI[FastAPI 服务器]
        GRPC[gRPC 服务]
        Launch[Launch 组件]
    end
    
    subgraph "引擎核心层"
        LLMEngine[LLM Engine]
        Scheduler[调度器]
        ModelRunner[模型运行器]
    end
    
    subgraph "硬件适配层"
        GPU[GPU 平台]
        CPU[CPU 平台]
        Quantization[量化处理]
    end
    
    CLI --> FastAPI
    API --> FastAPI
    Python --> LLMEngine
    FastAPI --> LLMEngine
    GRPC --> LLMEngine
    Launch --> FastAPI
    LLMEngine --> Scheduler
    LLMEngine --> ModelRunner
    Scheduler --> GPU
    Scheduler --> CPU
    ModelRunner --> Quantization

命令行入口架构

vLLM 提供了功能丰富的命令行接口(CLI),支持多种子命令以满足不同的使用场景。CLI 架构基于灵活的命令注册机制,各子命令模块化设计,便于扩展。

主入口模块

主入口模块位于 vllm/entrypoints/cli/main.py,负责整体命令行解析和命令分发:

# vllm/entrypoints/cli/main.py (伪代码示例)
parser = FlexibleArgumentParser(description="vLLM CLI")
subparsers = parser.add_subparsers(required=False, dest="subparser")
cmds = {}
for cmd_module in CMD_MODULES:
    new_cmds = cmd_module.cmd_init()
    for cmd in new_cmds:
        cmd.subparser_init(subparsers).set_defaults(dispatch_function=cmd.cmd)
        cmds[cmd.name] = cmd

CLI 命令体系

命令名称模块路径功能说明
servevllm/entrypoints/cli/serve.py启动 HTTP API 服务器进行在线推理服务
launchvllm/entrypoints/cli/launch.py启动特定组件服务(如渲染服务器)
其他命令各子模块通过动态加载注册

CLI 命令初始化流程通过 cmd_init() 函数返回命令列表,实现动态注册机制。资料来源:vllm/entrypoints/cli/main.py:1-40

核心引擎架构

LLM Engine 是 vLLM 的核心组件,负责管理模型加载、请求调度、KV 缓存管理和推理执行。引擎支持同步和异步两种运行模式。

引擎参数配置

引擎参数通过 AsyncEngineArgs 类进行统一管理,该类封装了所有可配置的引擎参数:

# 引擎参数示例配置
engine_args = AsyncEngineArgs.from_cli_args(args)
model_config = engine_args.create_model_config()

关键配置参数包括:

参数类别参数名说明
模型配置model模型名称或路径
模型配置tokenizer分词器路径
模型配置trust_remote_code是否信任远程代码
推理配置tensor_size张量并行数
推理配置gpu_memory_utilizationGPU 显存利用率
推理配置max_model_len最大模型长度
量化配置quantization量化方法(如 AWQ、GPTQ)
服务配置api_server_countAPI 服务器实例数量

资料来源:vllm/engine/arg_utils.py

服务启动模式

vLLM 支持多种服务启动模式,以适应不同的部署场景:

graph LR
    A[CLI 启动] --> B{检查参数}
    B -->|grpc=True| C[gRPC 服务模式]
    B -->|headless=True| D[无头模式<br/>api_server_count=0]
    B -->|标准参数| E[FastAPI 服务模式]
    
    C --> F[uvloop 事件循环]
    D --> G[仅引擎运行]
    E --> H[FastAPI + Uvicorn]

#### 标准服务模式

标准模式通过 FastAPI 提供 OpenAI 兼容的 HTTP API 服务:

# vllm/entrypoints/cli/serve.py
from vllm.entrypoints.grpc_server import serve_grpc

if args.headless:
    if args.api_server_count is not None and args.api_server_count > 0:
        raise ValueError(
            f"--api-server-count={args.api_server_count} cannot be "
            "used with --headless"
        )
    args.api_server_count = 0

#### 无头模式(Headless)

无头模式下不启动任何 API 服务器,仅运行推理引擎,适用于程序化调用场景:

  • api_server_count 强制设为 0
  • 适合批处理作业
  • 减少资源开销

资料来源:vllm/entrypoints/cli/serve.py:1-50

#### Launch 组件模式

Launch 模式用于启动特定功能组件,如渲染服务器:

# vllm/entrypoints/cli/launch.py
async def run_launch_fastapi(args: argparse.Namespace) -> None:
    """运行在线服务层(无 GPU 推理)"""
    listen_address, sock = setup_server(args)
    engine_args = AsyncEngineArgs.from_cli_args(args)
    model_config = engine_args.create_model_config()

Launch 模式的特点:

  • 仅进行数据预处理,不执行模型推理
  • 清除量化配置以跳过量化数据类型验证
  • 不分配 KV 缓存

资料来源:vllm/entrypoints/cli/launch.py:1-60

离线推理架构

vLLM 提供离线推理能力,通过 LLM 类实现无需独立服务器的本地推理功能。

LLM 类接口

LLM 类是离线推理的主要接口,支持:

# 基本用法
from vllm import LLM

llm = LLM("meta-llama/Llama-2-7b-hf")
outputs = llm.generate("Hello, world!")

支持的功能类型

功能类型说明示例文件
对话生成Chat 格式推理chat.py
文本生成标准文本补全generate.py
分类任务文本分类classify.py
嵌入向量向量嵌入提取embed.py
评分计算文本相似度评分score.py

量化模型支持

vLLM 支持 GGUF 量化格式的模型加载:

--model unsloth/Qwen3-0.6B-GGUF:Q4_K_M --tokenizer Qwen/Qwen3-0.6B

格式说明:repo_id:quant_type,其中 quant_type 包括 Q2_K、Q4_K_M、Q5_K_S、Q6_K 等。

CPU 卸载功能

--cpu-offload-gb 参数允许将部分模型卸载到 CPU 内存:

--cpu-offload-gb 10  # 虚拟增加 10GB GPU 显存

这使得在显存较小的 GPU 上运行更大规模的模型成为可能。

资料来源:examples/basic/offline_inference/README.md

分离式 Prefill 架构

vLLM 支持分离式 Prefill 架构,将预填充阶段和解码阶段部署在不同的实例上,以优化大规模部署的资源利用率。

架构设计

graph TD
    subgraph "Encoder 实例"
        Encoder[编码器模型]
        ECC[EC Connector]
    end
    
    subgraph "Prefill 实例"
        Prefill[Prefill 模型]
        ECC2[EC Connector]
    end
    
    subgraph "Decode 实例"
        Decode[Decode 模型]
        KVStore[KV 状态存储]
    end
    
    Encoder -->|编码缓存| ECC
    ECC -->|EC Transfer| ECC2
    ECC2 --> Prefill
    Prefill -->|KV 状态| Decode
    Decode --> KVStore

EC Connector 配置

Encoder Cache (EC) Connector 用于在实例间传输编码器缓存:

# Encoder 实例配置
--ec-transfer-config '{
    "ec_connector": "ECExampleConnector",
    "ec_role": "ec_producer",
    "ec_connector_extra_config": {
        "shared_storage_path": "/path/to/storage"
    }
}'

# Prefill/Decode 实例配置
--ec-transfer-config '{
    "ec_connector": "ECExampleConnector",
    "ec_role": "ec_consumer",
    "ec_connector_extra_config": {
        "shared_storage_path": "/path/to/storage"
    }
}'

离线示例工作流

离线分离式推理示例包含两个脚本协同工作:

  1. prefill_example.py - 仅执行预填充,保存 KV 状态和提示词
  2. decode_example.py - 加载 KV 状态,执行解码生成
./run.sh  # 顺序执行 prefill 和 decode

资料来源:examples/disaggregated/example_connector/README.md

可观测性架构

vLLM 提供完整的可观测性支持,包括指标采集、分布式追踪和日志记录。

OpenTelemetry 集成

vLLM 原生支持 OpenTelemetry 标准,可与 Jaeger、Prometheus 等监控系统集成:

# 启动带追踪的 vLLM 服务
opentelemetry-instrument vllm serve facebook/opt-125m

追踪架构

graph LR
    A[vLLM 实例] -->|OTLP| B[Jaeger Collector]
    B --> C[Jaeger UI]
    D[Prometheus] --> E[Grafana]
    A -->|Metrics| D

集成组件

组件类型用途
opentelemetry-sdk追踪 SDK核心追踪功能
opentelemetry-apiAPI 接口标准化接口
opentelemetry-exporter-otlp导出器OTLP 协议导出
opentelemetry-semantic-conventions-ai语义约定AI 领域约定

Jaeger 部署示例

# 启动 Jaeger
docker run --rm --name jaeger \
    -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
    -p 6831:6831/udp -p 16686:16686 \
    -p 4317:4317 -p 4318:4318 \
    jaegertracing/all-in-one:1.57

# 配置端点
export JAEGER_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' jaeger)
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=grpc://$JAEGER_IP:4317
export OTEL_SERVICE_NAME="vllm-service"

资料来源:examples/observability/opentelemetry/README.md

平台检测机制

vLLM 在启动时自动检测运行平台,并相应调整资源配置:

# 平台检测逻辑(伪代码)
if platform_unspecified():
    logger.info("Unspecified platform detected, switching to CPU Platform instead.")
    switch_to_cpu_platform()

支持的平台:

平台说明适用场景
CUDANVIDIA GPU 平台生产环境高性能推理
ROCmAMD GPU 平台AMD 硬件部署
CPUCPU 计算平台开发测试、轻量推理
TPUGoogle TPU 平台TPU 硬件部署

结构化输出支持

vLLM 支持结构化输出功能,可生成符合约束条件的 JSON、Regex 等格式的输出。

支持的约束类型

约束类型说明使用场景
jsonJSON Schema 约束API 响应格式化
regex正则表达式约束特定格式匹配
structural_tag结构化标签约束XML/HTML 类输出

使用示例

# 启动结构化输出服务
vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
    --reasoning-parser deepseek_r1

# 运行结构化输出测试
python structured_outputs_offline.py --constraint structural_tag regex --stream

数据并行与负载均衡

vLLM 支持多种数据并行和负载均衡模式:

模式类型

模式启动参数说明
外部负载均衡--data-parallel-external-lb外部 LB 分配请求
混合负载均衡--data-parallel-hybrid-lb内部+外部混合
数据并行--data-parallel-rank指定实例排名
起始排名--data-parallel-start-rank混合模式起始rank

API Server 计数配置

# 默认值根据模式自动确定
if args.headless:
    args.api_server_count = 0  # 无头模式下禁用 API 服务器

总结

vLLM 的架构设计体现了以下核心设计原则:

  1. 模块化设计 - 各层职责清晰,便于独立开发和测试
  2. 灵活部署 - 支持在线服务、离线推理、分离式部署等多种模式
  3. 资源高效 - 通过 PagedAttention 实现显存的高效利用
  4. 标准兼容 - 提供 OpenAI 兼容 API,便于现有系统集成
  5. 可观测性 - 内置 OpenTelemetry 支持,便于监控和调试

这些设计使得 vLLM 能够满足从研究实验到生产部署的各种需求,成为大语言模型推理服务的重要选择。

资料来源:[vllm/engine/arg_utils.py](https://github.com/vllm-project/vllm/blob/main/vllm/engine/arg_utils.py)

V1 引擎架构

V1引擎是vLLM的全新一代推理引擎架构,采用完全异步的设计理念,实现了高性能的批量请求调度和KV缓存管理。与传统同步引擎不同,V1引擎通过异步流水线架构,能够更高效地处理并发推理请求,显著提升GPU利用率和吞吐量。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 架构组件图

继续阅读本节完整说明和来源证据。

章节 核心组件职责

继续阅读本节完整说明和来源证据。

章节 设计概述

继续阅读本节完整说明和来源证据。

概述

V1引擎是vLLM的全新一代推理引擎架构,采用完全异步的设计理念,实现了高性能的批量请求调度和KV缓存管理。与传统同步引擎不同,V1引擎通过异步流水线架构,能够更高效地处理并发推理请求,显著提升GPU利用率和吞吐量。

V1引擎的核心设计目标包括:

  • 异步优先:全链路异步处理,避免阻塞等待
  • 高效调度:智能批量调度,优化GPU计算资源
  • 内存优化:精细化的KV缓存管理,提高显存利用率
  • 可扩展性:模块化设计,支持多种推理策略

资料来源:vllm/v1/engine/core.py:1-100

整体架构

架构组件图

graph TD
    Client[客户端请求] --> AsyncLLM[AsyncLLM 异步接口]
    AsyncLLM --> Core[LLMCore 核心引擎]
    Core --> Scheduler[Scheduler 调度器]
    Scheduler --> Sampler[Sampler 采样器]
    Scheduler --> KVCacheMgr[KVCacheManager KV缓存管理]
    KVCacheMgr --> BlockMgr[BlockManager 块管理器]
    Sampler --> Worker[Worker 计算单元]
    Worker --> GPU[GPU 推理执行]
    
    style AsyncLLM fill:#e1f5fe
    style Core fill:#fff3e0
    style Scheduler fill:#e8f5e9
    style KVCacheMgr fill:#fce4ec

核心组件职责

组件文件路径主要职责
AsyncLLMvllm/v1/engine/async_llm.py异步请求接口,事件循环管理
LLMCorevllm/v1/engine/core.py引擎核心逻辑,请求生命周期管理
Schedulervllm/v1/core/sched/scheduler.py请求调度,批次优化
Samplervllm/v1/sample/sampler.py词元采样,生成控制
KVCacheManagervllm/v1/core/kv_cache_manager.pyKV缓存分配与回收
BlockManagervllm/v1/core/block_manager.py物理块管理,显存映射

资料来源:vllm/v1/engine/async_llm.py:1-50

AsyncLLM 异步接口层

设计概述

AsyncLLM是V1引擎对外暴露的异步编程接口,采用Python asyncio事件循环驱动。它将同步的用户请求转换为异步操作,实现非阻塞的推理调用。

graph LR
    A[add_request] --> B[请求队列]
    C[get_output] --> D[输出队列]
    B --> E[事件循环]
    E --> D
    E --> F[后台处理任务]

核心方法

class AsyncLLM:
    async def add_request(
        request_id: str,
        prompt: str,
        sampling_params: SamplingParams,
        lora_request: Optional[LoRARequest] = None
    ) -> None
    
    async def generate() -> AsyncGenerator[RequestOutput, None]
    
    async def abort_request(request_id: str) -> None

资料来源:vllm/v1/engine/async_llm.py:80-150

LLMCore 核心引擎

引擎初始化流程

LLMCore是V1引擎的核心类,负责初始化和管理整个推理引擎的生命周期。

flowchart TD
    A[初始化配置] --> B[创建Worker]
    B --> C[初始化KVCacheManager]
    C --> D[初始化Scheduler]
    D --> E[初始化Sampler]
    E --> F[启动事件循环]
    F --> G[引擎就绪]

核心类结构

class LLMCore:
    def __init__(
        self,
        model_config: ModelConfig,
        cache_config: CacheConfig,
        parallel_config: ParallelConfig,
        scheduler_config: SchedulerConfig,
        ...
    ):
        self.worker = self._init_worker()
        self.kv_cache_manager = KVCacheManager(...)
        self.scheduler = Scheduler(...)
        self.sampler = Sampler(...)

资料来源:vllm/v1/engine/core.py:100-200

Scheduler 调度器

调度策略

Scheduler负责管理待处理请求的调度,决定何时以及如何将请求打包成批次进行推理。V1引擎的调度器采用多级队列和多策略调度算法。

graph TD
    A[新请求] --> B[等待队列 WaitQueue]
    B --> C{调度决策}
    C -->|可以调度| D[运行队列 RunningQueue]
    C -->|等待资源| E[阻塞队列 BlockedQueue]
    D --> F[生成完成]
    F --> G[输出队列]
    E -->|资源释放| C

调度配置参数

参数类型默认值说明
max_num_seqsint256单批次最大序列数
max_num_batched_tokensint8192单批次最大词元数
gpu_memory_utilizationfloat0.9GPU显存利用率
num_scheduler_stepsint1调度器步数

资料来源:vllm/v1/core/sched/scheduler.py:50-150

调度循环

Scheduler的核心调度循环实现如下:

  1. 请求入队:新请求加入等待队列
  2. 资源检查:检查KV缓存和计算资源
  3. 批次构建:选择可调度的请求构建批次
  4. 执行分发:将批次分发给Worker执行
  5. 结果收集:收集推理结果并更新请求状态
def schedule(self) -> SchedulerOutput:
    # 1. 更新已完成的请求
    self._update_completed_requests()
    
    # 2. 分配新的 KV cache 块
    self._allocate_kv_cache()
    
    # 3. 选择要调度的请求批次
    scheduled = self._select_new_batch()
    
    # 4. 生成调度输出
    return SchedulerOutput(scheduled=scheduled, ...)

资料来源:vllm/v1/core/sched/scheduler.py:200-350

Sampler 采样器

采样流程

Sampler负责从模型输出的logits中进行词元采样,是生成式推理的关键环节。

graph LR
    A[Logits] --> B[Temperature处理]
    B --> C[Top-K过滤]
    C --> D[Top-P过滤]
    D --> E[采样]
    E --> F[新Token]

采样配置

参数类型说明
temperaturefloat温度参数,控制随机性
top_pfloatNucleus采样概率阈值
top_kintTop-K过滤的K值
max_tokensint最大生成长度
seedList[int]随机种子
class Sampler:
    def __init__(self, gpu_device: int, ...):
        self._setup_sampling_algorithms()
    
    def sample(
        self,
        logits: torch.Tensor,
        sampling_params: SamplingParams
    ) -> torch.Tensor:
        # 应用温度
        logits = self._apply_temperature(logits, sampling_params.temperature)
        
        # Top-K 采样
        if sampling_params.top_k != -1:
            logits = self._apply_top_k(logits, sampling_params.top_k)
        
        # Top-P 采样
        if sampling_params.top_p < 1.0:
            logits = self._apply_top_p(logits, sampling_params.top_p)
        
        # 最终采样
        return self._sample(logits, sampling_params.seed)

资料来源:vllm/v1/sample/sampler.py:50-200

KVCacheManager 缓存管理

设计原理

KVCacheManager是V1引擎的KV缓存管理器,负责高效管理和复用GPU显存中的Key-Value缓存。

graph TD
    A[请求到达] --> B{检查现有缓存}
    B -->|命中| C[复用已有缓存]
    B -->|未命中| D[分配新缓存块]
    C --> E[追加新Token]
    D --> E
    E --> F[更新块状态]
    F --> G[等待下次调度]
    
    style C fill:#c8e6c9
    style D fill:#ffcdd2

缓存块管理

块类型说明管理方式
空闲块未分配的缓存块空闲链表
已占用块当前被请求使用的块引用计数
已回收块请求完成后待回收的块回收队列
class KVCacheManager:
    def __init__(self, num_blocks: int, block_size: int, ...):
        self.num_blocks = num_blocks
        self.block_size = block_size
        self._free_blocks: Deque[int] = deque(range(num_blocks))
        self._block_mapping: Dict[str, List[int]] = {}
    
    def allocate(self, request_id: str, num_tokens: int) -> List[int]:
        """为请求分配缓存块"""
        num_blocks_needed = (num_tokens + self.block_size - 1) // self.block_size
        blocks = []
        for _ in range(num_blocks_needed):
            if not self._free_blocks:
                raise OutOfMemoryError("KV cache exhausted")
            blocks.append(self._free_blocks.popleft())
        self._block_mapping[request_id] = blocks
        return blocks
    
    def free(self, request_id: str) -> None:
        """释放请求的缓存块"""
        if request_id in self._block_mapping:
            self._free_blocks.extend(self._block_mapping.pop(request_id))

资料来源:vllm/v1/core/kv_cache_manager.py:80-200

缓存分配策略

V1引擎采用以下缓存分配策略优化显存利用:

  1. 预分配策略:根据请求预估长度预分配缓存
  2. 动态扩展:运行时根据实际需求动态扩展缓存
  3. 块复用:同一模型层的不同请求共享块结构
  4. 分层管理:支持不同层的KV缓存独立管理

资料来源:vllm/v1/core/kv_cache_manager.py:200-300

BlockManager 块管理器

物理块管理

BlockManager负责底层物理块的管理,将逻辑缓存块映射到实际的GPU显存地址。

class BlockManager:
    def __init__(
        self,
        num_gpu_blocks: int,
        num_cpu_blocks: int,
        block_size: int,
    ):
        self._gpu_block_table: Dict[int, torch.Tensor] = {}
        self._cpu_block_table: Dict[int, torch.Tensor] = {}
        self._block_allocator = BlockAllocator(...)

块状态转换

stateDiagram-v2
    [*] --> Free: 初始化
    Free --> Allocated: 分配
    Allocated --> Free: 释放
    Allocated --> Swapping: 换出到CPU
    Swapping --> Allocated: 换入到GPU

资料来源:vllm/v1/core/block_manager.py:50-150

Worker 计算单元

Worker架构

Worker是V1引擎的执行单元,负责在GPU上执行实际的推理计算。

graph TD
    A[输入词元] --> B[Embedding层]
    B --> C[Transformer层]
    C --> D[计算Attention]
    D --> E[读取KV缓存]
    E --> C
    C --> F[Logits输出]
    F --> G[返回给Sampler]

Worker基类

class WorkerBase:
    def __init__(self, vllm_config: VllmConfig, ...):
        self.vllm_config = vllm_config
        self.model_runner = ModelRunner(...)
    
    def execute_model(
        self,
        seq_group_metadata_list: List[SequenceGroupMetadata],
        kv_caches: List[torch.Tensor],
    ) -> Optional[List[torch.Tensor]]:
        # 准备输入
        input_tokens = self._prepare_input(seq_group_metadata_list)
        
        # 执行模型推理
        output = self.model_runner.execute(input_tokens, kv_caches)
        
        return output

资料来源:vllm/v1/worker/worker_base.py:50-150

请求处理流程

完整推理流程

sequenceDiagram
    participant Client as 客户端
    participant AsyncLLM as AsyncLLM
    participant Core as LLMCore
    participant Scheduler as Scheduler
    participant Worker as Worker
    participant Sampler as Sampler
    participant KVCache as KVCacheManager
    
    Client->>AsyncLLM: add_request()
    AsyncLLM->>Core: 提交请求
    Core->>Scheduler: 入队
    Scheduler->>KVCache: 分配缓存
    Scheduler->>Worker: 分发批次
    Worker->>Worker: GPU推理
    Worker-->>Sampler: Logits输出
    Sampler->>Sampler: 词元采样
    Sampler-->>KVCache: 更新缓存
    KVCache-->>Scheduler: 分配完成
    Scheduler-->>AsyncLLM: 调度结果
    AsyncLLM-->>Client: 输出流

多步推理循环

V1引擎支持多步推理(Multi-Step Decoding),在单次调度中执行多个推理步骤:

  1. 步骤1:执行Attention计算
  2. 步骤2:更新KV缓存
  3. 步骤3:执行采样
  4. 步骤4:判断是否继续
for step in range(num_scheduler_steps):
    # 执行模型前向
    hidden_states = model(input_ids, kv_caches)
    
    # 计算logits
    logits = hidden_states @ lm_head.weight
    
    # 采样新token
    next_tokens = sampler.sample(logits)
    
    # 检查终止条件
    if self._should_stop(next_tokens):
        break

资料来源:vllm/v1/engine/core.py:300-400

配置与优化

引擎配置选项

配置项类型默认值说明
modelstr必填模型路径或HuggingFace ID
tensor_parallel_sizeint1张量并行度
gpu_memory_utilizationfloat0.9GPU显存利用率
max_model_lenint8192最大模型长度
block_sizeint16KV缓存块大小
enable_prefix_cachingboolTrue启用前缀缓存
num_scheduler_stepsint1调度器步数

性能优化建议

  1. 调整GPU显存利用率:根据模型大小调整,避免OOM
  2. 优化块大小:较大块减少碎片,较小块提高利用率
  3. 启用前缀缓存:对重复前缀的请求效果显著
  4. 批量大小优化:根据延迟和吞吐量需求调整

资料来源:vllm/v1/engine/core.py:400-500

与V0引擎的对比

特性V0引擎V1引擎
架构模式同步批量处理异步流水线
缓存管理静态分配动态管理
调度策略固定批次自适应调度
扩展性一般模块化设计
多步推理不支持原生支持

V1引擎通过异步架构和精细化的资源管理,实现了更高的GPU利用率和更低的请求延迟。

总结

V1引擎架构代表了vLLM在推理优化领域的最新技术演进。通过异步设计、智能调度和高效缓存管理的协同优化,V1引擎能够充分利用现代GPU的并行计算能力,为大语言模型推理提供高性能、高吞吐量的解决方案。模块化的组件设计使得V1引擎具有良好的可扩展性和可维护性,便于后续功能扩展和性能优化。

资料来源:[vllm/v1/engine/core.py:1-100]()

引擎核心模块

vLLM 的引擎核心模块是整个推理服务系统的核心组件,负责管理模型加载、请求调度、推理执行和结果返回等关键流程。引擎模块支持同步和异步两种运行模式,提供了面向不同应用场景的编程接口。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 整体架构

继续阅读本节完整说明和来源证据。

章节 双引擎模式

继续阅读本节完整说明和来源证据。

章节 类定义

继续阅读本节完整说明和来源证据。

概述

vLLM 的引擎核心模块是整个推理服务系统的核心组件,负责管理模型加载、请求调度、推理执行和结果返回等关键流程。引擎模块支持同步和异步两种运行模式,提供了面向不同应用场景的编程接口。

vLLM 引擎采用了分层架构设计,底层封装了高性能的推理内核,上层提供了灵活的调度策略和请求管理机制。引擎通过抽象接口与上层服务层解耦,同时通过适配器与底层硬件平台紧密集成。

引擎模块位于 vllm/engine/ 目录下,主要包含以下核心组件:

组件文件路径职责
LLMEnginevllm/engine/llm_engine.py同步推理引擎主类
AsyncLLMEnginevllm/engine/async_llm_engine.py异步推理引擎主类
EngineProtocolvllm/engine/protocol.py引擎通信协议定义
V1 LLMEnginevllm/v1/engine/llm_engine.pyV1版本引擎实现

资料来源:vllm/engine/llm_engine.py

架构设计

整体架构

vLLM 引擎采用事件驱动的异步架构,核心模块之间通过协议接口进行通信。引擎接收来自 API 服务层的请求,经过调度器分配后交由推理内核执行,最终将结果返回给调用方。

graph TD
    subgraph "服务层"
        A[API Server] --> B[CLI/SDK]
    end
    
    subgraph "引擎层"
        C[AsyncLLMEngine] --> D[LLMEngine]
        D --> E[Scheduler]
        E --> F[Model Runner]
    end
    
    subgraph "内核层"
        G[CUDA Kernels] --> H[PagedAttention]
        F --> G
    end
    
    A --> C
    B --> C

资料来源:vllm/entrypoints/cli/main.py:46-58

双引擎模式

vLLM 支持 V0 和 V1 两套引擎实现,两者在架构和性能特性上有所不同:

特性V0 EngineV1 Engine
调度策略多种调度器可选统一调度框架
内存管理传统 KV CachePagedAttention
异步支持有限原生异步支持
性能优化成熟稳定新一代优化

V1 引擎位于 vllm/v1/engine/ 目录下,代表了 vLLM 的新一代架构设计。

资料来源:vllm/v1/engine/llm_engine.py

同步引擎 (LLMEngine)

类定义

LLMEngine 是 vLLM 的同步推理引擎主类,提供阻塞式的推理接口。该类负责初始化推理环境、管理模型权重、处理推理请求并返回结果。

class LLMEngine:
    def __init__(
        self,
        model_config: ModelConfig,
        cache_config: CacheConfig,
        parallel_config: ParallelConfig,
        scheduler_config: SchedulerConfig,
        device_config: DeviceConfig,
        executor_class: Type[ExecutorBase],
        log_stats: bool = True,
        usage_context: UsageContext = UsageContext.LLM_CLASS,
    ) -> None:

核心方法

方法参数返回值功能描述
add_requestrequest_id, prompt, paramsNone添加推理请求
step-List[Output]执行一步推理
abort_requestrequest_idNone取消指定请求
get_num_unfinished_requests-int获取未完成请求数

step() 方法是引擎的核心执行方法,每次调用会推进推理状态机,处理调度、内存分配、内核执行等操作。

资料来源:vllm/engine/llm_engine.py

请求处理流程

sequenceDiagram
    participant Client as 客户端
    participant Engine as LLMEngine
    participant Scheduler as 调度器
    participant Runner as ModelRunner
    participant Kernel as CUDA Kernels

    Client->>Engine: add_request()
    Engine->>Scheduler: 排队请求
    loop 推理循环
        Engine->>Scheduler: step()
        Scheduler->>Runner: 分发批次
        Runner->>Kernel: 执行推理
        Kernel-->>Runner: 输出结果
        Runner-->>Scheduler: 收集输出
    end
    Engine-->>Client: 返回结果

异步引擎 (AsyncLLMEngine)

设计理念

AsyncLLMEngine 是 vLLM 的异步推理引擎,专为高性能 Web 服务设计。它基于事件循环实现非阻塞推理,能够同时处理大量并发请求。

异步引擎封装了底层同步引擎,通过 asyncio 协程提供非阻塞接口。这使得 vLLM 能够与 FastAPI、aiohttp 等异步 Web 框架无缝集成。

资料来源:vllm/engine/async_llm_engine.py

核心接口

class AsyncLLMEngine:
    async def add_request(
        self,
        request_id: str,
        prompt: PromptType,
        params: Optional[RequestParams] = None,
        arrival_time: Optional[float] = None,
    ) -> AsyncStream:
        """添加异步推理请求"""

异步引擎通过 AsyncStream 对象返回结果,支持流式输出。调用方可以通过 async for 语法逐token获取生成结果。

请求取消机制

异步引擎支持请求级别的取消操作。当客户端需要中止某个长时间运行的推理时,可以通过 abort() 方法通知引擎。

async def abort(self, request_id: str) -> None:
    """取消指定请求"""

资料来源:vllm/engine/async_llm_engine.py

引擎协议 (EngineProtocol)

EngineProtocol 定义了引擎与外部组件通信的标准接口规范。该协议抽象了引擎的核心行为,确保不同实现之间的一致性。

graph LR
    subgraph "协议层"
        A[EngineProtocol] --> B[generate]
        A --> C[abort]
        A --> D[get_output]
    end

协议定义包括以下核心接口:

接口方法签名说明
generateasync generate(request)生成推理请求
abortabort(request_id)中止请求
get_outputawait output_event获取输出事件

资料来源:vllm/engine/protocol.py

配置管理

引擎参数

引擎初始化时需要传入多个配置对象,这些配置控制了推理行为的各个方面:

配置类参数数量主要功能
ModelConfig50+模型架构、词汇表、量化配置
CacheConfig10+KV Cache 内存管理策略
ParallelConfig5+多GPU并行配置
SchedulerConfig10+调度器行为参数
DeviceConfig5+硬件平台选择

命令行参数

引擎支持通过命令行参数进行配置,常用参数包括:

vllm serve Qwen/Qwen2.5-3B-Instruct \
    --tensor-parallel-size 2 \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.9

资料来源:vllm/entrypoints/cli/serve.py

服务启动流程

CLI 入口

vLLM 的服务通过命令行启动,主要入口流程如下:

flowchart LR
    A[vllm serve] --> B[main.py]
    B --> C[导入模块]
    C --> D[ServeSubcommand]
    D --> E[创建引擎]
    E --> F[启动服务]

CLI 入口位于 vllm/entrypoints/cli/main.py,负责解析命令行参数并分发到相应的子命令处理器。

资料来源:vllm/entrypoints/cli/main.py:48-68

引擎初始化

def cmd(args: argparse.Namespace) -> None:
    # CLI 参数优先级高于默认值
    if hasattr(args, "model_tag") and args.model_tag is not None:
        args.model = args.model_tag

    # gRPC 模式
    if getattr(args, "grpc", False):
        from vllm.entrypoints.grpc_server import serve_grpc
        uvloop.run(serve_grpc(args))
        return

    # Headless 模式(无API服务器)
    if args.headless:
        args.api_server_count = 0

引擎支持多种运行模式,包括标准 HTTP 服务、gRPC 服务和 headless 模式。Headless 模式不启动 API 服务器,适用于分布式推理场景。

资料来源:vllm/entrypoints/cli/serve.py

Launch 组件

vllm launch 命令提供了组件级别的启动能力,支持快速启动特定的推理组件:

vllm launch <component> [options]

Launch 子系统采用插件化架构,新的组件可以通过继承 LaunchSubcommandBase 类注册到系统中。

资料来源:vllm/entrypoints/cli/launch.py

调度器集成

调度策略

引擎内置多种调度策略,适用于不同的负载场景:

策略适用场景特点
FIFO批处理简单高效
Longest-Prefix前缀共享优化解码共享
混合策略通用平衡吞吐和延迟

调度器通过 SchedulerConfig 进行配置,控制批次大小、超时时间、资源分配等关键参数。

资源分配

调度器负责管理 GPU 显存使用,通过 gpu_memory_utilization 参数控制用于 KV Cache 的显存比例。剩余显存用于模型权重和中间计算。

# 显存分配示例
cache_config = CacheConfig(
    gpu_memory_utilization=0.9,
    block_size=16,
)

性能优化

PagedAttention

vLLM 引擎采用 PagedAttention 技术管理 KV Cache,相比传统连续分配方式,显存利用率提升显著:

  • 显存碎片减少 60%+
  • 吞吐量提升 2-4 倍
  • 支持更大的上下文长度

CUDA 图

引擎支持 CUDA Graph 加速,减少内核启动开销。在 profiling 模式下,可以通过 nsys 工具分析 CUDA 图的执行效率:

nsys profile -t cuda -o run1 -f true \
    --cuda-graph-trace=node \
    vllm serve openai/gpt-oss-120b

资料来源:tools/profiler/nsys_profile_tools/README.md

使用示例

离线推理

from vllm import LLM

llm = LLM(model="Qwen/Qwen2.5-3B-Instruct")
outputs = llm.generate("Hello, world!")

在线服务

# 启动服务
vllm serve Qwen/Qwen2.5-3B-Instruct \
    --tensor-parallel-size 2

# 发送请求
curl -X POST http://localhost:8000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{"model": "Qwen/Qwen2.5-3B-Instruct", "messages": [{"role": "user", "content": "Hello!"}]}'

异步客户端

from vllm.engine.async_llm_engine import AsyncLLMEngine

engine = AsyncLLMEngine.from_engine_args(engine_args)

async def generate():
    async for output in await engine.add_request("req-1", prompt, params):
        print(output)

asyncio.run(generate())

相关文档

资料来源:[vllm/engine/llm_engine.py](https://github.com/vllm-project/vllm/blob/main/vllm/engine/llm_engine.py)

PagedAttention 与 KV 缓存管理

PagedAttention 是 vLLM 核心推理引擎中的一项关键技术,旨在解决大语言模型(LLM)推理过程中 KV 缓存的内存管理问题。传统的 KV 缓存管理方式采用连续内存分配策略,导致内存碎片化严重、利用率低下。PagedAttention 借鉴了操作系统中虚拟内存和分页管理的思想,将 KV 缓存分割成固定大小的"页面"(blocks)进行管理,从而实现灵活的内存分...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 分页管理机制

继续阅读本节完整说明和来源证据。

章节 V1 与 V2 版本对比

继续阅读本节完整说明和来源证据。

章节 BlockPool 组件

继续阅读本节完整说明和来源证据。

概述

PagedAttention 是 vLLM 核心推理引擎中的一项关键技术,旨在解决大语言模型(LLM)推理过程中 KV 缓存的内存管理问题。传统的 KV 缓存管理方式采用连续内存分配策略,导致内存碎片化严重、利用率低下。PagedAttention 借鉴了操作系统中虚拟内存和分页管理的思想,将 KV 缓存分割成固定大小的"页面"(blocks)进行管理,从而实现灵活的内存分配与共享。

vLLM 的 KV 缓存管理架构分为 V1 和 V2 两个版本,其中 V2 版本在性能和内存效率方面进行了进一步优化。管理机制主要由 BlockPoolKVCacheManager 两个核心组件协同工作,实现对 GPU 和 CPU 内存中 KV 缓存块的高效调度。

PagedAttention 核心原理

分页管理机制

PagedAttention 将 KV 缓存划分为固定大小的块(blocks),每个块包含多个 token 的键值向量。与传统方法不同,这些块不需要在物理内存中连续存储,而是通过逻辑地址映射实现灵活访问。这种设计允许系统动态分配和释放缓存块,显著提高内存利用率。

graph TD
    A[请求序列] --> B[逻辑块分配]
    B --> C[块表映射]
    C --> D[物理块存储]
    D --> E[GPU KV Cache]
    
    F[块表] -->|映射| D
    G[新请求] -->|增量分配| B
    H[请求完成] -->|块回收| D

V1 与 V2 版本对比

特性PagedAttention V1PagedAttention V2
块大小固定16个token固定16个token
内存布局原始格式扁平化布局
计算效率标准计算融合内核优化
支持前缀共享有限支持增强支持

KV 缓存管理架构

BlockPool 组件

BlockPool 负责管理物理内存中的 KV 缓存块池。它维护可用块的分配状态,支持 GPU 和 CPU 内存的双层管理。当新的推理请求到达时,BlockPool 负责分配空闲块;当请求完成时,相应块被回收至空闲池。

核心功能包括:

  • 块预分配与动态分配策略
  • GPU/CPU 块状态追踪
  • 块引用计数管理
  • 内存碎片整理

KVCacheManager 组件

KVCacheManager 是更高层次的缓存管理器,负责逻辑块到物理块的映射管理。它维护请求的 KV 块分配记录,支持 block 级别的引用计数和共享机制。当多个请求共享相同的前缀时,KVCacheManager 可以实现块级别的共享,避免重复存储相同的 KV 数据。

graph LR
    A[推理请求] --> B[KVCacheManager]
    B --> C{前缀匹配?}
    C -->|是| D[共享已有块]
    C -->|否| E[分配新块]
    D --> F[BlockPool]
    E --> F
    F --> G[更新块表映射]
    G --> H[执行注意力计算]

CUDA 内核实现

PagedAttention V1 内核

V1 版本的内核实现位于 csrc/attention/paged_attention_v1.cu,采用标准的 CUDA 并行策略。内核函数 paged_attention_v1 处理块级别的注意力计算,每个线程块负责一个查询头(query head)的计算。内核通过共享内存缓存 KV 数据,减少全局内存访问延迟。

关键实现要点:

  • 支持不同的块大小配置
  • 实现了 KV 数据的分页读取
  • 使用 warp 级别的归约操作提升性能
  • 支持半精度(FP16/BF16)计算

PagedAttention V2 内核

V2 版本位于 csrc/attention/paged_attention_v2.cu,在 V1 基础上进行了深度优化。主要改进包括:

  1. 扁平化内存布局:将 KV 数据按页面连续存储,提升缓存局部性
  2. 融合内核设计:将多个操作融合到单一内核中,减少内核启动开销
  3. 向量化加载:使用更大的向量宽度访问内存,提高带宽利用率
  4. 动态块大小支持:根据配置自适应调整计算策略

内存管理策略

分配策略

vLLM 采用混合分配策略处理 KV 缓存:

  • 预分配策略:在模型加载时预分配一定比例的 GPU 内存用于 KV 缓存
  • 动态分配:运行时根据实际需求动态分配新块
  • 层级淘汰:GPU 内存不足时,将部分块交换至 CPU 内存

共享机制

PagedAttention 支持不同请求间的 KV 块共享。当多个请求共享相同的前缀(如系统提示词)时,对应的 KV 块可以被多个请求引用,无需重复存储。共享通过引用计数实现,只有当引用计数归零时,块才会被释放。

graph TD
    A[请求1: 共享前缀] --> B[引用计数=2]
    C[请求2: 共享前缀] --> B
    
    B --> D[物理块P]
    D --> E[Token 0-15 KV数据]
    
    F[请求3: 独立前缀] --> G[引用计数=1]
    G --> H[物理块Q]
    H --> I[Token 0-15 KV数据]

配置与调优

关键配置参数

参数说明默认值
block_size每个缓存块包含的 token 数量16
gpu_memory_utilization用于 KV 缓存的 GPU 内存比例0.9
num_cpu_blocksCPU 缓存块数量动态计算
num_gpu_blocksGPU 缓存块数量动态计算

性能调优建议

  1. 根据模型大小和可用显存调整 gpu_memory_utilization
  2. 对于长上下文场景,适当增加块数量
  3. 启用块共享以优化多请求场景的内存使用
  4. 监控实际的块使用率以优化配置

技术优势

PagedAttention 相比传统连续分配方案具有显著优势:

  • 内存效率提升:通过分页管理和共享机制,内存利用率提高 2-4 倍
  • 支持更长上下文:灵活的内存管理允许处理更长的输入序列
  • 高吞吐量:优化的 CUDA 内核实现提供更高的计算吞吐量
  • 弹性扩展:支持动态调整缓存容量以适应不同工作负载

源码引用

本文档参考了以下 vLLM 源码文件:

来源:https://github.com/vllm-project/vllm / 项目说明书

注意力后端

vLLM 的注意力后端(Attention Backends)是处理 Transformer 模型中自注意力机制的核心组件,负责高效计算 Query、Key、Value 之间的注意力分数。vLLM 采用模块化设计,支持多种注意力计算实现,通过后端抽象层提供统一的接口,使系统能够在不同硬件和性能需求下选择最优的实现方案。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 后端抽象层

继续阅读本节完整说明和来源证据。

章节 核心接口定义

继续阅读本节完整说明和来源证据。

章节 FlashAttention 后端

继续阅读本节完整说明和来源证据。

概述

vLLM 的注意力后端(Attention Backends)是处理 Transformer 模型中自注意力机制的核心组件,负责高效计算 Query、Key、Value 之间的注意力分数。vLLM 采用模块化设计,支持多种注意力计算实现,通过后端抽象层提供统一的接口,使系统能够在不同硬件和性能需求下选择最优的实现方案。

注意力后端的主要职责包括:

  • 计算多头自注意力(Multi-Head Attention)
  • 支持带因果掩码的解码模式
  • 处理键值缓存(KV Cache)的读写
  • 支持分页注意力(Paged Attention)以优化内存使用

资料来源:docs/design/attention_backends.md

架构设计

后端抽象层

vLLM 在 vllm/v1/attention/backends/ 目录下实现了后端抽象层,每个后端都继承自统一的基类接口。这种设计允许在运行时根据硬件能力和配置选择合适的实现。

graph TD
    A[Attention Layer] --> B[Attention Backend Selector]
    B --> C[FlashAttention Backend]
    B --> D[FlashInfer Backend]
    B --> E[其他后端...]
    C --> F[CUDA FlashAttention]
    D --> G[FlashInfer Kernel]

核心接口定义

每个注意力后端需要实现以下核心方法:

方法名功能描述
forward()执行注意力前向计算
init_backend()初始化后端资源
get_name()返回后端名称标识
get_supported_dtypes()获取支持的数据类型列表

资料来源:vllm/v1/attention/backends/flash_attn.py:1-100

后端实现

FlashAttention 后端

FlashAttention 是一种高效的注意力实现,通过分块计算和融合核(fused kernel)显著减少内存访问,提升计算吞吐量。

FlashAttention 后端的主要特性:

  • 支持 FP16、BF16 数据类型
  • 通过 CUDA 核心实现分块矩阵乘法
  • 自动处理序列长度大于 GPU 限制的情况(通过 Flash Attention 2/3 的支持)
  • 与 vLLM 的 Paged Attention 机制无缝集成
# FlashAttention 后端核心逻辑示意
class FlashAttentionBackend:
    def __init__(self, num_heads: int, head_dim: int, scale: float):
        self.num_heads = num_heads
        self.head_dim = head_dim
        self.scale = scale
    
    def forward(self, query, key, value, cu_seqlen_q, cu_seqlen_k):
        # 使用 CUDA Flash Attention 内核计算
        return flash_attn_varlen_func(
            query, key, value,
            cu_seqlen_q, cu_seqlen_k,
            self.scale
        )

资料来源:vllm/v1/attention/backends/flash_attn.py:1-150

FlashInfer 后端

FlashInfer 是另一种高性能注意力库,特别针对推理场景优化,提供更低的延迟和更好的吞吐。

FlashInfer 后端的特点:

  • 针对推理工作负载优化
  • 支持增量解码(Incremental Decoding)
  • 与 PagedAttention 深度集成
  • 支持连续批处理(Continuous Batching)
# FlashInfer 后端核心逻辑示意
class FlashInferBackend:
    def forward(self, query, key, value, paged_kv_cache, ...):
        # 使用 FlashInfer 核函数
        return flashinfer.attention(
            query, paged_kv_cache,
            ...
        )

资料来源:vllm/v1/attention/backends/flashinfer.py:1-100

后端选择机制

动态选择器

vLLM 提供了智能的后端选择器(Attention Selector),根据系统环境和配置自动选择最优的注意力后端。选择逻辑位于 vllm/v1/attention/selector.py 文件中。

graph TD
    A[启动时检测] --> B{检查用户配置}
    B -->|明确指定| C[使用指定后端]
    B -->|未指定| D[检测 GPU 能力]
    D --> E{FlashInfer 可用?}
    E -->|是| F[优先选择 FlashInfer]
    E -->|否| G{FlashAttention 可用?}
    G -->|是| H[选择 FlashAttention]
    G -->|否| I[降级到基础实现]

选择优先级

优先级后端条件
1FlashInferGPU 支持且已安装
2FlashAttentionCUDA 版本兼容
3基础实现无其他选项时的兜底方案

资料来源:vllm/v1/attention/selector.py:1-80

分页注意力机制

Paged Attention 概述

PagedAttention 是 vLLM 的核心创新之一,通过将 KV 缓存分页存储在 GPU 内存中,显著提高内存利用率,支持更大的并发批处理。

核心数据结构

graph LR
    A[逻辑 KV Cache] -->|映射| B[物理块]
    A[Query] --> C[注意力计算]
    B --> C

PagedAttention 使用块表(Block Table)来管理逻辑块到物理块的映射关系。每个请求的 KV 缓存被分割成固定大小的块(通常为 16 或 32 个 token),存储在非连续的物理内存位置。

块表结构

字段类型说明
physical_blocksList[int]物理块编号列表
num_blocksint块数量
block_sizeint每个块的 token 数量

资料来源:vllm/v1/attention/ops/paged_attn.py:1-120

配置与使用

命令行配置

用户可以通过命令行参数指定注意力后端:

vllm serve <model_name> --attention-backend flashinfer

支持的参数值:

  • auto - 自动选择最优后端(默认)
  • flash_attn - 强制使用 FlashAttention
  • flashinfer - 强制使用 FlashInfer

编程接口配置

在 Python 代码中配置注意力后端:

from vllm import LLM, SamplingParams

llm = LLM(
    model="Qwen/Qwen2.5-3B-Instruct",
    attention_backend="flashinfer"  # 指定后端
)

环境变量

环境变量作用
VLLM_ATTENTION_BACKEND覆盖默认后端选择

性能特性对比

特性FlashAttentionFlashInfer
首次 token 延迟中等
解码吞吐更高
内存效率极高
连续批处理支持深度优化
适用场景通用推理生产级推理

扩展新的注意力后端

如需为 vLLM 添加新的注意力后端,需要:

  1. vllm/v1/attention/backends/ 下创建新的 Python 模块
  2. 实现 AttentionBackend 基类定义的所有接口
  3. selector.py 中注册新的后端和选择逻辑
  4. 在配置选项中添加新后端的支持
# 新后端模板
class NewAttentionBackend(AttentionBackend):
    def __init__(self, num_heads: int, head_dim: int, scale: float):
        self.num_heads = num_heads
        self.head_dim = head_dim
        self.scale = scale
    
    @staticmethod
    def get_name() -> str:
        return "new_backend"
    
    @staticmethod
    def get_supported_dtypes() -> List[torch.dtype]:
        return [torch.float16, torch.bfloat16]
    
    def forward(self, ...):
        # 实现注意力计算
        pass

注意事项

  • 确保 GPU 驱动和 CUDA 版本与所选后端兼容
  • FlashInfer 后端需要单独安装:pip install flashinfer
  • 在多 GPU 场景下,后端选择需要考虑 NCCL 通信开销
  • 某些特殊模型架构可能需要特定后端才能正常工作

资料来源:[docs/design/attention_backends.md]()

量化支持

vLLM 的量化支持模块位于 vllm/modelexecutor/layers/quantization/ 目录下,提供多种权重量化方案以降低模型内存占用和提升推理效率。该模块实现了统一的量化接口规范,支持 FP8、GPTQ、AWQ、GGUF 和 Compressed Tensors 等主流量化格式。

阅读重点 量化支持

vLLM 的量化支持模块位于 vllm/modelexecutor/layers/quantization/ 目录下,提供多种权重量化方案以降低模型内存占用和提升推理效率。该模块实现了统一的量化接口规范,支持 FP8、GPTQ、AWQ、GGUF 和 Compressed Tensors 等主流量化格式。

概述

vLLM 的量化支持模块位于 vllm/model_executor/layers/quantization/ 目录下,提供多种权重量化方案以降低模型内存占用和提升推理效率。该模块实现了统一的量化接口规范,支持 FP8、GPTQ、AWQ、GGUF 和 Compressed Tensors 等主流量化格式。

量化层的核心设计采用策略模式(Strategy Pattern),通过抽象基类定义标准接口,不同量化算法作为独立实现类存在。这种架构允许用户通过 --quantization 参数灵活选择量化方案,同时保持核心推理逻辑的一致性。

来源:https://github.com/vllm-project/vllm / 项目说明书

推测解码

注意: 当前检索到的上下文内容中未包含推测解码相关的源码文件。以下文档是基于 vLLM 项目中推测解码功能的通用技术知识构建,具体的 API 参数、配置选项和行为细节需要参考实际源码文件进行验证。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 核心价值

继续阅读本节完整说明和来源证据。

章节 验证机制

继续阅读本节完整说明和来源证据。

章节 核心组件

继续阅读本节完整说明和来源证据。

概述

推测解码(Speculative Decoding)是 vLLM 中用于加速大语言模型推理的一种技术。该技术通过使用一个轻量级的"草稿模型"(Draft Model)提前生成多个候选 token,然后由原始的目标模型(Target Model)并行验证这些候选 token,从而减少自回归生成的顺序等待时间。

核心价值

  • 降低延迟: 通过并行验证减少生成 token 的平均等待时间
  • 保持输出质量: 验证机制确保最终输出与标准自回归解码完全一致
  • 灵活的加速策略: 支持多种草稿模型和提议策略

工作原理

推测解码的核心思想是将自回归解码过程中的顺序计算转换为"生成-验证"两阶段模式:

  1. 提议阶段(Proposal): 草稿模型快速生成多个候选 token
  2. 验证阶段(Verification): 目标模型批量验证这些候选 token 的正确性
graph TD
    A[输入 Prompt] --> B[草稿模型提议]
    B --> C[生成候选 Token 序列]
    C --> D[目标模型并行验证]
    D --> E{验证结果}
    E -->|全部正确| F[接受候选序列]
    E -->|部分错误| G[回退到首个错误位置]
    F --> H[继续下一轮]
    G --> I[修正后继续生成]
    H --> B
    I --> B

验证机制

目标模型对草稿模型生成的每个 token 进行验证。只有通过验证的 token 才会被接受为最终输出。如果某个 token 验证失败,系统会回退到该位置,使用目标模型生成的结果替换草稿模型的错误预测。

架构设计

核心组件

组件职责源码位置
推测解码配置管理推测解码相关参数vllm/config/speculative.py
草稿模型接口定义草稿模型的标准接口vllm/v1/spec_decode/draft_model.py
提议器实现具体实现不同类型的提议策略vllm/v1/spec_decode/
指标收集跟踪推测解码性能指标vllm/v1/spec_decode/metrics.py

提议策略类型

vLLM 支持多种推测解码提议策略:

  1. Ngram 提议器(Ngram Proposer)
  • 基于 n-gram 统计的简单提议策略
  • 无需额外训练模型
  • 适用于快速原型验证
  1. EAGLE 提议器
  • 使用自回归方式生成候选 token
  • 可配合小型语言模型使用
  • 支持更复杂的语义预测
  1. 自定义提议器
  • 通过插件机制扩展
  • 支持用户自定义草稿模型

配置参数

推测解码的主要配置参数定义在 vllm/config/speculative.py 中:

参数类型说明默认值
speculative_modelstr草稿模型的名称或路径-
num_speculative_tokensint每轮提议的 token 数量1
speculative_draft_tensor_parallel_sizeint草稿模型的张量并行大小1
speculative_disable_by_num_cached_sequencesint缓存序列数超过此值时禁用推测-

使用方法

命令行启动

使用 vllm serve 命令启动带推测解码的服务:

vllm serve <model_name> \
    --speculative-model <draft_model_name> \
    --num-speculative-tokens 5

Python API

from vllm import LLM

llm = LLM(
    model="meta-llama/Llama-2-70b-chat-hf",
    speculative_model="meta-llama/Llama-2-7b-chat-hf",
    num_speculative_tokens=5,
    tensor_parallel_size=2
)

性能指标

推测解码的效率通过以下指标衡量:

指标说明
接受率草稿模型生成的 token 被目标模型接受的比例
加速比推测解码相对于标准自回归解码的速度提升
Token 吞吐量每秒处理的 token 数量

这些指标由 vllm/v1/spec_decode/metrics.py 模块收集和计算。

限制与注意事项

  1. GPU 内存: 草稿模型会占用额外的 GPU 显存
  2. 接受率依赖: 加速效果高度依赖于草稿模型与目标模型输出的一致性
  3. 不支持的场景: 某些特殊的采样参数(如某些类型的 logits warper)可能与推测解码不兼容
  4. 分布式部署: 草稿模型和目标模型的并行策略需要协调配置

相关文档

来源:https://github.com/vllm-project/vllm / 项目说明书

分布式并行策略

vLLM 是一个高性能的大语言模型推理服务框架,支持多种分布式并行策略以满足不同规模和场景的部署需求。这些并行策略包括数据并行(Data Parallelism)、张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)以及它们的组合形式。通过灵活配置这些并行策略,vLLM 能够有效利用多 GPU 和多节点集群的计算资源,实现...

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 张量并行(Tensor Parallelism, TP)

继续阅读本节完整说明和来源证据。

章节 流水线并行(Pipeline Parallelism, PP)

继续阅读本节完整说明和来源证据。

章节 数据并行(Data Parallelism, DP)

继续阅读本节完整说明和来源证据。

概述

vLLM 是一个高性能的大语言模型推理服务框架,支持多种分布式并行策略以满足不同规模和场景的部署需求。这些并行策略包括数据并行(Data Parallelism)、张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)以及它们的组合形式。通过灵活配置这些并行策略,vLLM 能够有效利用多 GPU 和多节点集群的计算资源,实现大规模模型的高效推理。

vLLM 的分布式并行策略建立在 PyTorch 分布式通信原语之上,并针对 LLM 推理的工作负载特征进行了深度优化。其核心设计理念是在保证推理正确性的前提下,最大化 GPU 利用率和吞吐量,同时最小化通信开销。

核心并行模式

张量并行(Tensor Parallelism, TP)

张量并行是一种将模型的单个层的权重矩阵沿行或列方向切分到多个 GPU 上的技术。在 LLM 中,这通常应用于注意力机制和前馈网络层。每个 GPU 持有完整输入的一部分和部分权重,通过集合通信操作(如 AllReduce)聚合结果。

张量并行的主要优势在于能够将单个层的计算分布到多个设备上,从而支持超出单个 GPU 显存限制的模型。vLLM 采用了 Megatron-LM 风格的张量并行实现,支持 2、4、8 等多种并行度配置。

流水线并行(Pipeline Parallelism, PP)

流水线并行将模型的不同层组分配到不同的 GPU 上。每个 GPU 负责模型的一个连续子集,形成计算流水线。这种策略特别适合多节点场景,能够有效减少节点间的通信开销。

vLLM 支持微批处理(micro-batching)来提高流水线并行下的 GPU 利用率,减少流水线气泡(pipeline bubble)。流水线并行通常与张量并行结合使用,形成 3D 并行(TP + PP + DP)。

数据并行(Data Parallelism, DP)

数据并行是最简单的并行策略,每个 GPU 持有模型权重的完整副本,独立处理不同的输入批次。vLLM 的数据并行实现支持多种负载均衡模式,包括外部负载均衡(External LB)和混合负载均衡(Hybrid LB)。

在数据并行模式下,vLLM 通过分片 KV 缓存管理来支持多副本推理,提高系统吞吐量。数据并行可以与张量并行和流水线并行叠加使用,形成混合并行配置。

分布式并行配置

并行配置参数

参数类型说明默认值
tensor-parallel-sizeint张量并行度1
pipeline-parallel-sizeint流水线并行度1
data-parallel-sizeint数据并行度1
data-parallel-external-lbbool启用外部负载均衡False
data-parallel-hybrid-lbbool启用混合负载均衡False
data-parallel-start-rankint混合负载均衡起始节点0

启动命令示例

vllm serve Qwen/Qwen2.5-3B-Instruct \
    --tensor-parallel-size 4 \
    --pipeline-parallel-size 2 \
    --data-parallel-size 2

上述命令配置了 4x2x2 = 16 GPU 的混合并行拓扑,适用于大规模模型部署场景。

架构设计

分布式并行状态管理

vLLM 通过 parallel_state.py 模块管理分布式并行状态。该模块负责初始化和协调各并行维度的通信组,建立 GPU 之间的拓扑关系,并提供进程组查询接口。

graph TD
    A[全局初始化] --> B[创建通信组]
    B --> C[张量并行组 TP]
    B --> D[流水线并行组 PP]
    B --> E[数据并行组 DP]
    C --> F[AllReduce 通信]
    D --> G[流水线调度]
    E --> H[数据分片]
    F --> I[聚合结果]
    G --> I
    H --> I

设备通信层

cuda_communicator.py 实现了针对 NVIDIA GPU 优化的集合通信操作。该模块封装了 PyTorch 分布式通信原语,提供了高效的 AllReduce、Broadcast、AllGather 等操作实现。通信层针对 LLM 推理的通信模式进行了优化,最小化了流水线气泡和通信延迟。

弹性并行(Elastic EP)

vLLM 支持弹性并行(Elastic EP),允许在运行时动态调整数据并行组的规模。这一特性通过 vllm/distributed/elastic_ep 模块实现,提供了容错能力和弹性扩展能力。当集群中的部分节点发生故障或新增时,系统能够自动重新配置数据并行组,无需中断服务。

分片 KV 缓存管理

分片 KV 缓存是 vLLM 实现高效数据并行的关键技术之一。在传统的数据并行中,所有副本需要共享或复制 KV 缓存,导致显存浪费或同步开销。vLLM 通过将 KV 缓存按注意力头维度分片,让每个数据并行副本持有 KV 缓存的不同部分。

这种方法的优势在于:

  • 减少每个副本的 KV 缓存显存占用
  • 支持更大的批量处理
  • 通过 PagedAttention 技术实现细粒度的显存管理
  • 支持 Prefix Caching 以加速重复前缀的推理

通信优化

CUDA 通信优化

vLLM 的设备通信层利用 CUDA 的高效内存复制和集合操作,减少 GPU 间通信延迟。通信操作与计算重叠执行,通过异步执行和流水线技术隐藏通信开销。

流水线气泡优化

在流水线并行中,vLLM 采用微批处理策略来减少流水线气泡。通过将每个批次划分为多个微批次,系统能够更充分地利用流水线各阶段的 GPU 资源,提高整体吞吐量。

监控与调优

性能指标

vLLM 提供了丰富的分布式并行性能指标,包括:

指标说明
GPU 利用率各 GPU 的计算利用率
通信带宽GPU 间通信的实际带宽
流水线气泡率流水线空闲时间占比
吞吐量每秒处理的请求数

分布式追踪

vLLM 支持 OpenTelemetry 分布式追踪,能够追踪请求在多个 GPU 和节点间的处理路径。这对于诊断分布式并行下的性能瓶颈和通信问题非常重要。

配置示例:

opentelemetry-instrument vllm serve facebook/opt-125m

最佳实践

并行度选择

  • 单节点多卡:推荐使用张量并行(TP=2/4/8),根据显存和模型大小调整
  • 多节点部署:推荐 TP × PP × DP 混合并行,充分利用节点内高带宽和节点间网络
  • 大批量推理:增加数据并行度,提高系统吞吐量

配置建议

  • 确保 NVLink 连接用于张量并行通信
  • 流水线并行的节点间网络带宽应足够高
  • 数据并行适用于无状态或状态可分片的模型

参考资料

来源:https://github.com/vllm-project/vllm / 项目说明书

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

medium 来源证据:[Bug]: Qwen3.5-397B-NVFP4 Disagg accuracy gsm8k collapses with async scheduling

可能增加新用户试用和生产接入成本。

medium 来源证据:[Bug]: vLLM v1 with prefix caching: first request differs from subsequent identical requests at temperature=0

可能增加新用户试用和生产接入成本。

medium 来源证据:[Usage]: How to proactively clear CPU-resident memory left behind by unloaded LoRA adapters after calling `/v1/unload_l…

可能增加新用户试用和生产接入成本。

medium 来源证据:v0.18.1

可能增加新用户试用和生产接入成本。

Pitfall Log / 踩坑日志

项目:vllm-project/vllm

摘要:发现 21 个潜在踩坑项,其中 0 个为 high/blocking;最高优先级:安装坑 - 来源证据:[Bug]: Qwen3.5-397B-NVFP4 Disagg accuracy gsm8k collapses with async scheduling。

1. 安装坑 · 来源证据:[Bug]: Qwen3.5-397B-NVFP4 Disagg accuracy gsm8k collapses with async scheduling

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[Bug]: Qwen3.5-397B-NVFP4 Disagg accuracy gsm8k collapses with async scheduling
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_1a71634c530044a68b9160080d55de0a | https://github.com/vllm-project/vllm/issues/42182 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

2. 安装坑 · 来源证据:[Bug]: vLLM v1 with prefix caching: first request differs from subsequent identical requests at temperature=0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[Bug]: vLLM v1 with prefix caching: first request differs from subsequent identical requests at temperature=0
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_58327949a4524ed082bd189b53f713a1 | https://github.com/vllm-project/vllm/issues/40896 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 安装坑 · 来源证据:[Usage]: How to proactively clear CPU-resident memory left behind by unloaded LoRA adapters after calling `/v1/unload_l…

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:[Usage]: How to proactively clear CPU-resident memory left behind by unloaded LoRA adapters after calling /v1/unload_lora_adapter?
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_fb1461834fe34049bd05182574d3e5e5 | https://github.com/vllm-project/vllm/issues/42207 | 来源讨论提到 docker 相关条件,需在安装/试用前复核。

4. 安装坑 · 来源证据:v0.18.1

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:v0.18.1
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_317a03f9de4e459f9be42064c7318b2c | https://github.com/vllm-project/vllm/releases/tag/v0.18.1 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

5. 能力坑 · 来源证据:[Feature]: Qwen3.5-Moe LoRA Support (experts)

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个能力理解相关的待验证问题:[Feature]: Qwen3.5-Moe LoRA Support (experts)
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_2d068d43c6654f3cab6b48bf98dad116 | https://github.com/vllm-project/vllm/issues/40005 | 来源类型 github_issue 暴露的待验证使用条件。

6. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 建议检查:将假设转成下游验证清单。
  • 防护动作:假设必须转成验证项;没有验证结果前不能写成事实。
  • 证据:capability.assumptions | github_repo:599547518 | https://github.com/vllm-project/vllm | README/documentation is current enough for a first validation pass.

7. 运行坑 · 来源证据:v0.20.2

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:v0.20.2
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_ecf37722dff6494c82b384225e34bcb0 | https://github.com/vllm-project/vllm/releases/tag/v0.20.2 | 来源类型 github_release 暴露的待验证使用条件。

8. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 建议检查:补 GitHub 最近 commit、release、issue/PR 响应信号。
  • 防护动作:维护活跃度未知时,推荐强度不能标为高信任。
  • 证据:evidence.maintainer_signals | github_repo:599547518 | https://github.com/vllm-project/vllm | last_activity_observed missing

9. 安全/权限坑 · 下游验证发现风险项

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:下游已经要求复核,不能在页面中弱化。
  • 建议检查:进入安全/权限治理复核队列。
  • 防护动作:下游风险存在时必须保持 review/recommendation 降级。
  • 证据:downstream_validation.risk_items | github_repo:599547518 | https://github.com/vllm-project/vllm | no_demo; severity=medium

10. 安全/权限坑 · 存在安全注意事项

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:No sandbox install has been executed yet; downstream must verify before user use.
  • 对用户的影响:用户安装前需要知道权限边界和敏感操作。
  • 建议检查:转成明确权限清单和安全审查提示。
  • 防护动作:安全注意事项必须面向用户前置展示。
  • 证据:risks.safety_notes | github_repo:599547518 | https://github.com/vllm-project/vllm | No sandbox install has been executed yet; downstream must verify before user use.

11. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 建议检查:把风险写入边界卡,并确认是否需要人工复核。
  • 防护动作:评分风险必须进入边界卡,不能只作为内部分数。
  • 证据:risks.scoring_risks | github_repo:599547518 | https://github.com/vllm-project/vllm | no_demo; severity=medium

12. 安全/权限坑 · 来源证据:[Bug]: ngram speculative decoding changes greedy output on Qwen3-0.6B / A100

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:[Bug]: ngram speculative decoding changes greedy output on Qwen3-0.6B / A100
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源问题仍为 open,Pack Agent 需要复核是否仍影响当前版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_9ce279a037934e8085332120bfdaca86 | https://github.com/vllm-project/vllm/issues/41758 | 来源讨论提到 docker 相关条件,需在安装/试用前复核。

13. 安全/权限坑 · 来源证据:v0.16.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.16.0
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_57ff11ff995a4809a33a38ff7504a5ef | https://github.com/vllm-project/vllm/releases/tag/v0.16.0 | 来源类型 github_release 暴露的待验证使用条件。

14. 安全/权限坑 · 来源证据:v0.17.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.17.0
  • 对用户的影响:可能阻塞安装或首次运行。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_4592ced4fde24aa9aa808caa40e25b84 | https://github.com/vllm-project/vllm/releases/tag/v0.17.0 | 来源类型 github_release 暴露的待验证使用条件。

15. 安全/权限坑 · 来源证据:v0.18.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.18.0
  • 对用户的影响:可能阻塞安装或首次运行。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_7ca09904f8164e94a3a1bc489d32d1ff | https://github.com/vllm-project/vllm/releases/tag/v0.18.0 | 来源类型 github_release 暴露的待验证使用条件。

16. 安全/权限坑 · 来源证据:v0.19.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.19.0
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_cdb0d7a7f491474da7b93583ec643c00 | https://github.com/vllm-project/vllm/releases/tag/v0.19.0 | 来源讨论提到 docker 相关条件,需在安装/试用前复核。

17. 安全/权限坑 · 来源证据:v0.19.1

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.19.1
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_8c2ec43cf6f147d49f80f22bcd199e8f | https://github.com/vllm-project/vllm/releases/tag/v0.19.1 | 来源类型 github_release 暴露的待验证使用条件。

18. 安全/权限坑 · 来源证据:v0.20.0

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.20.0
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_c867dafed19f4b97978d637aea4c7308 | https://github.com/vllm-project/vllm/releases/tag/v0.20.0 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

19. 安全/权限坑 · 来源证据:v0.20.1

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安全/权限相关的待验证问题:v0.20.1
  • 对用户的影响:可能影响授权、密钥配置或安全边界。
  • 建议检查:来源显示可能已有修复、规避或版本变化,说明书中必须标注适用版本。
  • 防护动作:不得脱离来源链接放大为确定性结论;需要标注适用版本和复核状态。
  • 证据:community_evidence:github | cevd_dc6a717c695b47838899da8c9791f907 | https://github.com/vllm-project/vllm/releases/tag/v0.20.1 | 来源类型 github_release 暴露的待验证使用条件。

20. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 建议检查:抽样最近 issue/PR,判断是否长期无人处理。
  • 防护动作:issue/PR 响应未知时,必须提示维护风险。
  • 证据:evidence.maintainer_signals | github_repo:599547518 | https://github.com/vllm-project/vllm | issue_or_pr_quality=unknown

21. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 建议检查:确认最近 release/tag 和 README 安装命令是否一致。
  • 防护动作:发布节奏未知或过期时,安装说明必须标注可能漂移。
  • 证据:evidence.maintainer_signals | github_repo:599547518 | https://github.com/vllm-project/vllm | release_recency=unknown

来源:Doramagic 发现、验证与编译记录