vLLM 系统级架构分析

项目: vLLM — High-throughput and memory-efficient inference engine for LLMs
代码规模: 1935 Python文件(~687K行) + 233 C++/CUDA文件(~87K行) ≈ 77万行
代码目录: github.com/vllm
分析日期: 2026-05-17


一、项目整体架构

1.1 整体设计思路

vLLM 的核心设计目标是高吞吐、低延迟、显存高效的大语言模型推理服务引擎。其整体架构围绕三大核心技术挑战展开:

  1. KV Cache 显存管理:PagedAttention(分页注意力)将 KV Cache 按块(block)管理,block_size默认16个token,解决传统连续分配导致的显存碎片化问题。支持前缀缓存(prefix caching),相同前缀的请求可复用已有KV blocks。
  2. 请求调度优化:Continuous Batching(连续批处理)在迭代级别动态调度请求,取代静态批处理。Scheduler不再区分prefill/decode阶段,而是统一在token级别调度——每个迭代中既有新请求的prefill token,也有正在运行的decode token。
  3. 分布式推理:原生支持5维并行布局(ExternalDP×DP×PP×PCP×TP)、专家并行负载均衡(EPLB)、弹性专家并行(Elastic EP)及分离式推理(Disaggregated Serving via KV Transfer)。

核心架构模式分层管道架构(Layered Pipeline Architecture)+ 插件式注册机制(Plugin Registry Pattern)

1.2 整体架构6层模型

┌─────────────────────────────────────────────────────────┐
│  第1层:用户/客户端层                                      │
│  HTTP/OpenAI API / CLI / Python SDK / gRPC / WebSocket   │
└──────────────────────┬──────────────────────────────────┘
                       │ HTTP请求 / API调用
┌──────────────────────▼──────────────────────────────────┐
│  第2层:服务入口层 (Entrypoints)                          │
│  ┌──────────────────────────────────────────────────┐   │
│  │ InputProcessor(分词+多模态) → Detokenizer → OutputProcessor │
│  │ ToolParserManager(工具调用) / ReasoningParser(CoT)│   │
│  └──────────────────────────────────────────────────┘   │
└──────────────────────┬──────────────────────────────────┘
                       │ EngineCoreRequest (msgspec序列化)
┌──────────────────────▼──────────────────────────────────┐
│  第3层:V1引擎层 (Engine)                                │
│  ┌──────────────────────────────────────────────────┐   │
│  │ Frontend进程:  AsyncLLM → EngineCoreClient(IPC)  │   │
│  │ Core子进程:    EngineCore → Scheduler → Executor │   │
│  │                KVCacheManager → BlockPool         │   │
│  └──────────────────────────────────────────────────┘   │
└──────────────────────┬──────────────────────────────────┘
                       │ SchedulerOutput (调度决策)
┌──────────────────────▼──────────────────────────────────┐
│  第4层:执行器+Worker层                                  │
│  ┌──────────────────────────────────────────────────┐   │
│  │ Executor(UniProc/Multiproc/Ray/ExternalLauncher) │   │
│  │ Worker(GPU/CPU/XPU) → ModelRunner(GPU/CPU)       │   │
│  │ GPUModelRunner._prepare_inputs() → forward()     │   │
│  └──────────────────────────────────────────────────┘   │
└──────────────────────┬──────────────────────────────────┘
                       │ model.forward()
┌──────────────────────▼──────────────────────────────────┐
│  第5层:模型执行层 (Model Executor)                       │
│  ┌──────────────────────────────────────────────────┐   │
│  │ Models: 296种(LLaMA/Mixtral/DeepSeek/Qwen/...)   │   │
│  │ Layers: Attention/FusedMoE/Quantization/RoPE/Lin │   │
│  │ Weight Loader: AutoWeightsLoader/WeightsMapper   │   │
│  └──────────────────────────────────────────────────┘   │
└──────────────────────┬──────────────────────────────────┘
                       │ CUDA ops / torch.ops.vllm.*
┌──────────────────────▼──────────────────────────────────┐
│  第6层:内核+分布式层                                     │
│  ┌──────────────────┐  ┌───────────────────────────┐   │
│  │ C++/CUDA Kernels │  │ Distributed               │   │
│  │ PagedAttention   │  │ parallel_state(5维并行)    │   │
│  │ QuantKernels     │  │ kv_transfer(11种Connector)│   │
│  │ MoE/Sampler/...  │  │ device_communicators(NCCL)│   │
│  └──────────────────┘  └───────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

         ←──── 横切关注点 ────→
┌─────────────────────────────────────────────────────────┐
│  VllmConfig(22子配置) | Platforms(6平台) | Compilation   │
│  Tokenizers | ToolParsers(40种) | LoRA | MultiModal     │
│  IR(ir.ops注册) | Tracing | Profiler | Plugins          │
└─────────────────────────────────────────────────────────┘

1.3 架构模式详解

模式 应用位置 说明
分层管道架构 全局6层(入口→引擎→执行器→模型→内核→分布式) 请求自顶向下流经各层,每层有明确职责边界和数据格式
插件式注册 Models(296种)/Quantization(25+)/Attention Backend(8+)/KV Connector(11种) 通过Registry/工厂函数动态注册,运行时按配置选择实现
进程分离架构 EngineCore(子进程) ↔ Frontend(主进程) 调度核心与API服务进程隔离,通过ZMQ+共享内存IPC通信
策略模式 Scheduler(FCFS/Priority)/Executor(UniProc/Ray/MP)/Attention Backend 接口统一,多种实现可替换
观察者模式 KV Events(ZeroMQ PUB/SUB)/Engine Events 发布-订阅解耦模块间通知
模板方法 Model.forward()/Worker生命周期/ModelRunner._prepare_inputs() 基类定义骨架,子类覆写关键步骤
工厂模式 ModelRegistry/QuantizationConfig/KVConnectorFactory 统一创建接口,隐藏实现细节
代理模式 EngineCoreClient(代理EngineCore) 本地接口,远程执行

1.4 整体运行流程(端到端序列图)

OutputProcessor CUDA Kernels Model(LLaMA/...) GPUModelRunner GPUWorker Executor KVCacheManager Scheduler EngineCore EngineCoreClient InputProcessor AsyncLLM OpenAI API Client OutputProcessor CUDA Kernels Model(LLaMA/...) GPUModelRunner GPUWorker Executor KVCacheManager Scheduler EngineCore EngineCoreClient InputProcessor AsyncLLM OpenAI API Client EngineCore主循环(step) 构建input_ids/positions block_tables/LoRAMapping attn_metadata RMSNorm→Attention(RoPE+PagedAttn) →Residual→RMSNorm→MLP/MoE →Residual loop [每个推理迭代] POST /v1/chat/completions generate(request_params) process(prompt+mm_data+sampling_params) Tokenizer.encode() → token_ids MultiModalProcessor.encode() → mm_embeddings send_request(EngineCoreRequest) schedule() get_computed_blocks(前缀匹配) allocate_slots(分配新KV blocks) SchedulerOutput execute_model(SchedulerOutput) execute_model() _prepare_inputs() forward(hidden_states) N × DecoderLayer PagedAttention/MoE/Sampler logits/sampled_tokens AsyncModelRunnerOutput output EngineCoreOutput update_from_output() free(已完成请求) EngineCoreOutput raw output process() Detokenizer.decode_incremental() 检查stop_strings/max_tokens RequestOutput SSE stream / final response data: {"delta": {"content": "..."}}

二、子模块/功能模块划分

2.1 模块全景图

L6-内核层

L5-基础设施层

L4-分布式层

L3-模型执行层

L2-V1引擎层

L1-服务入口层

openai
OpenAI兼容API
154文件/34K行

cli
命令行工具
ctr等效

anthropic
Anthropic兼容

mcp
MCP工具协议

serve
服务管理
LoRA/Cache/Disagg/RLHF

pooling
嵌入/分类/评分

engine
AsyncLLM+EngineCore
14文件/15K行

core
Scheduler+KVCacheManager
15文件/8K行

worker
GPU/CPU/XPU Worker
77文件/25K行

executor
进程管理
8文件/8K行

attention
注意力后端
71文件/30K行

sample
采样策略
15文件/4K行

spec_decode
推测解码
14文件/5K行

structured_output
结构化输出
8文件/2K行

models
296种LLM模型
296文件/189K行

layers
算子层
281文件/97K行

model_loader
权重加载

parallel_state
5维并行状态
~5K行

kv_transfer
KV传输11种Connector
56文件/23K行

device_communicators
NCCL/CustomAR
19文件/7K行

eplb
专家并行LB
9文件/3K行

elastic_ep
弹性专家并行
4文件/1K行

config
22子配置
29文件/12K行

compilation
编译优化
42文件/13K行

platforms
6平台抽象
8文件/4K行

tokenizers
14种分词器
14文件/4K行

lora
LoRA管理
42文件/13K行

multimodal
多模态处理
23文件/9K行

tool_parsers
40种解析器
44文件/18K行

transformers_utils
HF兼容
99文件/22K行

reasoning
推理模式
24文件/4K行

renderers
内容渲染
14文件/4K行

csrc
233文件/87K行
PagedAttn/Quant/MoE


2.2 模块1:V1引擎层 (vllm/v1)

核心作用:vLLM的推理引擎核心,管理从请求接收到输出生成的完整生命周期。采用Frontend-Core进程分离架构:Frontend进程运行API服务和detokenizer,Core子进程运行Scheduler和模型执行循环,通过ZMQ+共享内存IPC通信。

架构模式:进程分离 + 调度-执行解耦

Worker进程

EngineCore子进程

Frontend进程(主进程)

IPC

AsyncLLM
━━━━━━━━━━
generate()/abort()
sleep()/wake_up()

InputProcessor
━━━━━━━━━━
分词+多模态+LoRA

OutputProcessor
━━━━━━━━━━
detokenize+stop检查

Detokenizer
━━━━━━━━━━
FastIncremental
SlowIncremental

EngineCoreClient
━━━━━━━━━━
ZMQ+TensorIPC

EngineCore
━━━━━━━━━━
step()主循环
schedule→execute→update

Scheduler
━━━━━━━━━━
schedule()
update_from_output()

KVCacheManager
━━━━━━━━━━
allocate/free
前缀缓存匹配

BlockPool
━━━━━━━━━━
物理块池化管理

KVCacheCoordinator
━━━━━━━━━━
多类型KV协调

Executor
━━━━━━━━━━
UniProc/Multiproc/Ray

GPUWorker
━━━━━━━━━━
init_device()
execute_model()

GPUModelRunner
━━━━━━━━━━
_prepare_inputs()
forward()

关键类/方法清单

文件 核心方法 作用
AsyncLLM v1/engine/async_llm.py generate() 异步推理入口,返回AsyncGenerator[RequestOutput]
abort() 中止请求
sleep()/wake_up() 引擎睡眠/唤醒(节省显存)
EngineCore v1/engine/core.py step() 核心循环:schedule→execute→update
run() 子进程主循环入口
EngineCoreClient v1/engine/core_client.py send_request() 发送请求到Core
get_output() 获取推理输出
Scheduler v1/core/sched/scheduler.py schedule() 统一token级调度(无prefill/decode区分)
update_from_output() 根据模型输出更新请求状态
_preempt_request() 抢占低优先级请求释放KV blocks
_select_waiting_queue_for_scheduling() 选择下一个调度队列
KVCacheManager v1/core/kv_cache_manager.py get_computed_blocks() 前缀缓存匹配
allocate_slots() 为请求分配KV blocks
free() 释放请求的KV blocks
evict_blocks() 驱逐blocks(LRU策略)
BlockPool v1/core/block_pool.py get_block_ids() 物理块分配/回收
Worker v1/worker/gpu_worker.py init_device() GPU初始化+分布式环境设置
execute_model() 执行模型推理
load_model() 加载模型权重
GPUModelRunner v1/worker/gpu_model_runner.py _prepare_inputs() 构建推理输入(input_ids/positions/block_tables)
forward() 模型前向传播
_build_attention_metadata() 构建注意力元数据

调度策略详解

Scheduler.schedule

waiting队列有请求?

_select_waiting_queue_for_scheduling
FCFS或Priority策略

计算token预算
max_num_scheduled_tokens

遍历waiting请求

KV blocks足够?

_preempt_request
抢占running中低优先级请求

释放被抢占请求的KV blocks

分配KV blocks
allocate_slots

检查前缀缓存
get_computed_blocks

加入running队列

处理running请求
追加decode tokens

总tokens超预算?

构建SchedulerOutput

包含:
- new_request_data
- cached_request_data
- grammar_output
- kv_connector_meta

数据流入EngineCoreRequest(token_ids, sampling_params, lora_request, multi_modal_data, arrival_time)
数据流出EngineCoreOutput(request_id, sampled_token_ids, finish_reason, logprobs, kv_connector_output)


2.3 模块2:模型执行层-模型注册 (vllm/model_executor/models)

核心作用:承载296+种大语言模型的推理实现,提供统一的模型注册/加载/执行框架。将HuggingFace的架构名映射到vLLM的优化实现。

架构模式:注册表模式 + 工厂模式 + 适配器模式

接口协议 (Protocol)

模型实现

模型注册表 (ModelRegistry)

arch→(module, class)

_TEXT_GENERATION_MODELS
_MULTIMODAL_MODELS
_EMBEDDING_MODELS
_POOLING_MODELS

映射示例:
LlamaForCausalLM → (llama, LlamaForCausalLM)
MixtralForCausalLM → (mixtral, MixtralForCausalLM)
DeepSeekV3ForCausalLM → (deepseek_v3, DeepSeekV3ForCausalLM)

LlamaForCausalLM
━━━━━━━━━
Embedding→N×DecoderLayer
→RMSNorm→Linear→Logits

MixtralForCausalLM
━━━━━━━━━
同LLaMA+MLP→MoE
(Router+8Experts)

DeepSeekV3ForCausalLM
━━━━━━━━━
MLA注意力+细粒度MoE
+共享专家+AuxLoss-free

Qwen2ForCausalLM
━━━━━━━━━
GQA+SwiGLU+RoPE

...290+种模型
Dense/MoE/Hybrid/多模态

SupportsLoRA
━━━━━━━━━
LoRA适配器支持

SupportsPP
━━━━━━━━━
流水线并行支持

SupportsEagle
━━━━━━━━━
推测解码Eagle支持

supports_multimodal
━━━━━━━━━
多模态输入支持

is_attention_free
━━━━━━━━━
无注意力模型(SSM)

关键类/方法

作用
ModelRegistry 架构名→(module, class)映射,支持延迟导入(lazy import)避免启动时加载全部模型
LlamaForCausalLM LLaMA系列实现,forward()含Embedding→N×DecoderLayer→Logits
MixtralForCausalLM MoE模型,MLP替换为Router+Experts
DeepSeekV3ForCausalLM MLA注意力+细粒度MoE+共享专家
_ModelInfo 模型元信息,含arch/支持特性(LoRA/PP/Eagle/MM)
AutoWeightsLoader 自动权重加载,处理HF→vLLM权重名映射
WeightsMapper 权重重命名/拆分/合并的声明式映射

模型分类

  • Dense模型:LLaMA, Qwen2, GPT-2, Gemma, Phi, Mistral…
  • MoE模型:Mixtral, DeepSeek-V2/V3, QwenMoE, Arctic, Jamba…
  • Hybrid模型:Jamba(Mamba+Attention), Zamba…
  • 多模态模型:LLaVA, Qwen2VL, InternVL, Phi3V, DeepSeekVL…

2.4 模块3:模型执行层-算子层 (vllm/model_executor/layers)

核心作用:提供模型层所需的全部算子实现,是模型层与内核层的桥梁。包含量化、MoE、注意力、位置编码等核心算子。

基础层

Linear体系
━━━━━━━━━━
QKVParallelLinear
MergedColumnParallelLinear
RowParallelLinear
ReplicatedLinear

归一化
━━━━━━━━━━
RMSNorm/LayerNorm
+融合kernel

Embedding
━━━━━━━━━━
VocabParallelEmbedding
ParallelLMHead

激活函数
━━━━━━━━━━
SiluAndMul/GeluAndMul
NewGELU/...

RotaryEmbedding (rotary_embedding/)

RotaryEmbedding
━━━━━━━━━━
_compute_cos_sin_cache()
forward_cuda/native/hip

20+变体
━━━━━━━━━━
LinearScalingRoPE
NTKScalingRoPE
YaRNRotaryEmbedding
Llama3RotaryEmbedding
MRotaryEmbedding(mrope)

Attention (attention/)

标准Attention
━━━━━━━━━━
委托V1 Backend

MLA Attention
━━━━━━━━━━
DeepSeek压缩KV
Prefill/Decode双路径

Cross Attention
━━━━━━━━━━
Encoder-Decoder

FusedMoE (fused_moe/)

FusedMoE层
━━━━━━━━━━
Router→TopK→Permute
→Experts→Unpermute

7种Router
━━━━━━━━━━
TopK/Sigmoid/Softmax
DeepSeek/Qwen/Llama

15种Expert Backend
━━━━━━━━━━
Marlin/Triton/Fused
FlashInfer/Cutlass/...

量化框架 (quantization/)

QuantizationConfig
━━━━━━━━━━
基类:get_quant_method()
get_scaled_act_names()

AWQ: W4A16

GPTQ: W4A16/W8A8

FP8: per_tensor/per_channel

Marlin: W4A16/W8A16

GGUF: Q4_0/Q8_0/...

BitsAndBytes: NF4/FP4

...20+种方法

register_quantization_config()
━━━━━━━━━━
注册+延迟导入
25+量化方法

量化框架注册机制

已注册

自定义

用户指定
--quantization awq

QuantizationConfig.init()

register_quantization_config
注册表中查找

延迟导入
from .awq import AWQConfig

_CUSTOMIZED_METHOD
_TO_QUANT_CONFIG

实例化AWQConfig

get_quant_method()
返回AWQMarlinMethod

应用于Linear层
替换默认实现


2.5 模块4:分布式层 (vllm/distributed)

核心作用:多GPU/多节点分布式推理的通信与协调。支持5维并行布局和11种KV传输连接器。

弹性EP (elastic_ep/)

4种状态机
━━━━━━━━━━
ScaleUp/ScaleDown
Standby Groups
原子组切换

专家并行LB (eplb/)

DeepSeek装箱算法
━━━━━━━━━━
逻辑/物理/冗余专家
异步权重重排

KV传输 (kv_transfer/)

KVConnectorBase_V1
━━━━━━━━━━
双端接口设计:
Scheduler端+Worker端

NIXLConnector
NVIDIA加速库

P2PConnector
点对点传输

MooncakeConnector
月面传输

LMCacheConnector
LMCache

HF3FSConnector
3FS文件系统

FlexKVConnector
灵活KV

OffloadingConnector
KV卸载到CPU

...4+种Connector

设备通信 (device_communicators/)

6层通信后端

NCCL Backend
标准GPU通信

CustomAllreduce
用户态RDMA
低延迟

QuickReduce
快速规约

FlashInfer Comm
Batched通信

All2All MoE
专家分发/汇总

SHM Broadcast
共享内存广播

并行状态管理 (parallel_state.py)

GroupCoordinator
━━━━━━━━━━
5维并行布局:
ExternalDP×DP×PP×PCP×TP

TP Group
张量并行
all-reduce/all-gather

PP Group
流水线并行
send/recv

DP Group
数据并行
all-reduce

EP Group
专家并行
all2all

ExternalDP
外部数据并行
跨实例聚合

KV Connector双端接口设计

Worker端

Scheduler端

metadata

worker_meta

get_num_new_matched_tokens()
计算远程已有token数

update_state_after_alloc()
临时buffer分配后更新

update_connector_output()
处理Worker端返回

request_finished()
请求完成,决定KV释放时机

take_events()
获取KV事件

start_load_kv()
开始加载KV(可异步)

wait_for_layer_load()
等待某层加载完成

save_kv_layer()
保存某层KV(可异步)

wait_for_save()
等待保存完成

get_finished()
获取完成的异步操作


2.6 模块5:服务入口层 (vllm/entrypoints)

核心作用:提供多种服务入口,将外部请求转化为引擎可处理的内部格式。核心是OpenAI兼容API。

客户端

OpenAI API Server
━━━━━━━━━━
FastAPI+Uvicorn+uvloop
build_async_engine_client()

/v1/chat/completions
━━━━━━━━━━
OpenAIServingChat
流式/非流式双模式

/v1/completions
━━━━━━━━━━
OpenAIServingCompletion

/v1/responses
━━━━━━━━━━
OpenAIServingResponses

/v1/models
━━━━━━━━━━
OpenAIServingModels

/v1/realtime
━━━━━━━━━━
WebSocket实时推理

/v1/audio/transcriptions
━━━━━━━━━━
Speech-to-Text

serve/子模块
━━━━━━━━━━
10个服务管理组件

LoRA服务
动态加载/卸载

缓存服务
前缀缓存管理

分离式推理
P/D分离

RLHF服务
奖励模型

睡眠/唤醒
显存回收

弹性并行
动态扩缩容

Profile服务
性能分析

Pooling服务
━━━━━━━━━━
嵌入/分类/评分/重排
工厂模式

Anthropic兼容层
━━━━━━━━━━
错误转换+格式适配

MCP ToolServer
━━━━━━━━━━
工具服务协议

Chat Completion请求处理完整流程

HTTP POST /v1/chat/completions

OpenAIServingChat.create_chat_completion

解析请求: messages/model/params

有tools?

ToolParserManager选择解析器
根据model_type

直接处理

adjust_request(k, v)
转换工具调用参数

TokenizerRegistry.get_tokenizer()
获取分词器

有多模态输入?

MultiModalProcessor.process()
编码图像/音频/视频

Tokenizer.encode()
text→token_ids

AsyncLLM.generate()
提交请求

InputProcessor.process()
构建EngineCoreRequest

EngineCoreClient.send_request()
IPC发送到Core


2.7 模块6:配置与编译层 (vllm/config + vllm/compilation + vllm/ir)

核心作用:全局配置枢纽(22个子配置类聚合在VllmConfig中)与编译优化管线。

IR层 (ir/)

IrOp注册系统
━━━━━━━━━━
6大后端:
vllm_c/aiter/oink/
helion/triton/xpu_ops

IrOpPriorityConfig
━━━━━━━━━━
控制优先级
tolerance体系(7种dtype)

编译管线 (compilation/)

3种CompilerInterface

EagerAdaptor
O0: 无编译

InductorAdaptor
O1-O2: torch.compile

StandaloneCompiler
O3: 离线预编译

PostGradPassManager
14步Pass管线

FuseQKV

FuseRMSNorm

Recompute

...11个其他Pass

CUDAGraph
Full/Piecewise/Partition

VllmConfig全局配置枢纽

VllmConfig
━━━━━━━━━━
compute_hash()配置指纹
22个子配置字段

ModelConfig
━━━━━━━━━━
model/arch/max_model_len
dtype/quantization

CacheConfig
━━━━━━━━━━
block_size/CacheDType
12+类型(fp8/fp8_inc/turboquant/...)

SchedulerConfig
━━━━━━━━━━
max_num_scheduled_tokens
max_num_seqs/policy

ParallelConfig
━━━━━━━━━━
tp_size/pp_size/dp_size
eplb_config

KernelConfig
━━━━━━━━━━
IrOpPriorityConfig
IR算子优先级

AttentionConfig
━━━━━━━━━━
后端选择
flash_attn/flashinfer/...

CompilationConfig
━━━━━━━━━━
O0-O3级别
PassConfig/CUDAGraphMode

KVTransferConfig
━━━━━━━━━━
connector_type
分离式推理配置

LoRAConfig
━━━━━━━━━━
max_loras/max_rank
lora_dtype

...14个其他子配置

优化级别差异

级别 编译器 CUDAGraph 融合Pass 适用场景
O0 Eager 调试/开发
O1 Eager Full 选择性 生产默认
O2 torch.compile Partition 全部14步 高性能
O3 Standalone Full+预编译 全部+离线优化 最高性能

2.8 模块7:LoRA适配器 (vllm/lora)

核心作用:多LoRA动态加载与请求级路由,允许多个LoRA同时服务于不同请求。

运行时应用

权重管理

请求级路由

生命周期

加载: add_lora()
从磁盘→显存缓存

活跃: serve中
被请求引用

卸载: remove_lora()
释放显存

固定: pin_lora()
防止被驱逐

请求携带
LoRARequest
(lora_id+lora_path)

LoRAManager
━━━━━━━━━━
管理模型级LoRA
加载/卸载/缓存

LoRAModel
━━━━━━━━━━
safetensors加载
显存缓存

LoRALayerSet
━━━━━━━━━━
每层LoRA权重
A矩阵+B矩阵

LoRAMapping
━━━━━━━━━━
请求index→LoRA_id映射
传给GPUModelRunner

ModelRunner.forward()
━━━━━━━━━━
Linear层根据mapping
应用对应LoRA权重


2.9 模块8:多模态处理 (vllm/multimodal)

核心作用:图像/音频/视频等多模态输入的编码、嵌入与token化。

多模态输入
image/audio/video
URL/base64/PIL

MultiModalRegistry
━━━━━━━━━━
模型→处理器映射
ProcessingInfoFactory

MultiModalProcessor
━━━━━━━━━━
_call_hf_processor()
_apply_hf_processor_overrides()

Encoder
━━━━━━━━━━
CLIP/SigLIP/Whisper
Enc-Dec模型

Projection
━━━━━━━━━━
语言模型嵌入空间
mm_projector

Token Merge
━━━━━━━━━━
与文本token拼接
位置编码对齐

Model.forward()

关键类MultiModalRegistry, MultiModalProcessor, ProcessingInfoFactory, MultiModalBudget


2.10 模块9:工具解析器 (vllm/tool_parsers)

核心作用:将模型生成的工具调用文本解析为结构化JSON,支持40种格式。

ToolParserManager
━━━━━━━━━━
3种注册模式:
即时/延迟/装饰器

请求指定
tool_parser

HermesParser
━━━━━━━━━━
JSON标签格式
<tool_call>{"name":...}</tool_call>

DeepSeekV3Parser
━━━━━━━━━━
JSON标签
DeepSeek优化

MistralParser
━━━━━━━━━━
专有协议
[TOOL_CALLS]

Qwen3XmlParser
━━━━━━━━━━
XML标签

OpenAI_parser
━━━━━━━━━━
函数调用格式

...35种其他解析器

流式解析
━━━━━━━━━━
增量状态机
partial_tag_overlap

非流式解析
━━━━━━━━━━
extract_tool_calls()
完整JSON解析


2.11 模块10:分词器 (vllm/tokenizers)

核心作用:分词与反分词(detokenization),支持14种tokenizer后端。

关键组件

  • TokenizerLike:协议定义,统一tokenizer接口
  • TokenizerRegistry:注册表,按model_type选择实现
  • HFTokenizer:HuggingFace tokenizer的线程安全封装
  • MistralTokenizer/DeepSeekTokenizer/QwenVLTokenizer:专用tokenizer
  • DetokenizerUtils:增量解码,支持stop string检查

2.12 模块11:C++/CUDA内核 (csrc/)

核心作用:高性能GPU内核实现,Python层的计算后端。

MoE内核

量化内核

核心内核

注册入口

其他

RMSNorm/LayerNorm
+量化融合

RoPE融合内核
NeoX/GPT-J双布局

CustomAllReduce
用户态RDMA

Mamba SSM
选择性扫描

torch_bindings.cpp
4个TORCH_LIBRARY命名空间
ops/cache_ops/cuda_utils/custom_ar
71+操作注册

PagedAttention
━━━━━━━━━━
V1: 64 token/block
V2: 分割K
MLA: DeepSeek压缩KV
BlockSparse: 稀疏注意力

cache_kernels
━━━━━━━━━━
reshape_and_cache
copy_blocks
swap_blocks

sampler.cu
━━━━━━━━━━
greedy/top-p/top-k
repetition_penalty
Persistent TopK

Marlin
━━━━━━━━━━
W4A16/W8A16
异步流水线

FP8
━━━━━━━━━━
per_tensor/per_channel
scale+量化

AWQ
━━━━━━━━━━
W4A16+group_scale

GPTQ
━━━━━━━━━━
W4A16/W8A8+act_order

permute/unpermute
━━━━━━━━━━
token→expert分发
expert→token汇总

MX-FP8 MoE
━━━━━━━━━━
Grouped GEMM
量化专家计算


2.13 模块12:平台抽象 (vllm/platforms)

核心作用:跨硬件平台适配,6种平台实现。

Platform基类(1018行)
━━━━━━━━━━
get_device_name()
get_device_total_memory()
is_async_supporteds()
get_attn_backend_cls()

CUDADevice
━━━━━━━━━━
GPU架构查询
内核注册
注意力后端选择

ROCmDevice
━━━━━━━━━━
AMD GPU
AITer算子集成

TPUDevice
━━━━━━━━━━
Google TPU
JIT编译

XPUDevice
━━━━━━━━━━
Intel GPU
SYCL后端

CPUDevice
━━━━━━━━━━
oneDNN/ACL
SGLang内核

ZenCPUDevice
━━━━━━━━━━
AMD Zen
AMX指令集


三、模块间调用关系与数据流

3.1 核心调用关系图

横切关注点

分布式层

内核层

模型层

执行层

引擎层

服务入口

HTTP请求

EngineCoreRequest
(msgspec序列化)

ZMQ+TensorIPC
(跨进程)

内部调用

allocate/free
KVCacheBlocks

SchedulerOutput
(调度决策)

execute_model
(SchedulerOutput透传)

forward
(SchedulerOutput)

_prepare_inputs
(input_ids/positions
/block_tables/attn_metadata)

model.forward
(hidden_states)

QKV+attn

expert_compute

pos_encode

sampler

torch.ops.vllm
.paged_attention

torch.ops.vllm
.moe_*

torch.ops.vllm
.sample

tp all-reduce

ep all2all

kv_transfer
(跨节点)

nccl/xccl

配置注入

配置注入

配置注入

配置注入

分词

权重路由

MM嵌入

设备信息

编译优化

EngineCoreOutput
(token_ids+finish)

raw output

detokenize

RequestOutput
(text+logprobs
+finish_reason)

openai/api_server
━━━━━━━━━

AsyncLLM
━━━━━━━━━

EngineCoreClient
━━━━━━━━━

EngineCore
━━━━━━━━━

Scheduler
━━━━━━━━━

KVCacheManager
━━━━━━━━━

Executor
━━━━━━━━━

GPUWorker
━━━━━━━━━

GPUModelRunner
━━━━━━━━━

InputBatch

Model
(LLaMA/Mixtral/...)

Attention
━━━━━━━━━

FusedMoE
━━━━━━━━━

RotaryEmbedding
━━━━━━━━━

Sampler
━━━━━━━━━

PagedAttention
(CUDA)

MoE Kernels
(CUDA)

Sampler
(CUDA)

parallel_state
━━━━━━━━━

kv_transfer
━━━━━━━━━

device_communicators
━━━━━━━━━

VllmConfig
━━━━━━━━━

TokenizerRegistry
━━━━━━━━━

LoRAManager
━━━━━━━━━

MultiModalRegistry
━━━━━━━━━

Platform
━━━━━━━━━

CompilationConfig
━━━━━━━━━

OutputProcessor
━━━━━━━━━

3.2 主流程详解:从HTTP请求到推理输出

阶段1:请求接收与预处理
HTTP POST /v1/chat/completions
  → FastAPI路由 → OpenAIServingChat.create_chat_completion()
    → 提取 messages / model / sampling_params / tools
    → ToolParserManager选择解析器(根据model_type + tool_parser参数)
    → ToolParser.adjust_request()(转换工具参数格式)
    → TokenizerRegistry.get_tokenizer()(按model_type选择tokenizer实现)
    → MultiModalProcessor.process()(编码图像/音频/视频 → mm_embeddings)
    → Tokenizer.encode()(text → token_ids)
    → InputProcessor.process() → EngineCoreRequest(msgspec序列化)
阶段2:调度决策
EngineCore.step() — 核心循环每迭代执行一次:
  → Scheduler.schedule()
    → _select_waiting_queue_for_scheduling() — 选择下一个调度队列
    → 遍历waiting请求,计算token预算(max_num_scheduled_tokens)
    → KVCacheManager.get_computed_blocks() — 前缀缓存匹配
    → KVCacheManager.allocate_slots() — 分配新KV blocks
    → 不足时 _preempt_request() — 抢占running中低优先级请求
    → 构建SchedulerOutput:
      - new_request_data: 新请求的token_ids+block_ids
      - cached_request_data: running请求的追加token+block_ids
      - grammar_output: 结构化输出的bitmask
      - kv_connector_meta: KV传输的元数据
阶段3:模型执行
Executor.execute_model(SchedulerOutput):
  → GPUWorker.execute_model()
    → GPUModelRunner._prepare_inputs():
      → 构建 input_ids, positions, block_tables
      → _build_attention_metadata()(PagedAttention所需元数据)
      → 应用LoRAMapping(请求→LoRA映射表)
      → KVConnector.bind_connector_metadata()(分离式推理)
    → GPUModelRunner.forward():
      → Model.forward(input_ids, positions, kv_caches, attn_metadata):
        → Embedding: VocabParallelEmbedding(input_ids) → hidden_states
        → N × DecoderLayer:
          → RMSNorm(hidden_states)
          → RotaryEmbedding(query, key, positions) — 应用RoPE
          → Attention(query, key, value, attn_metadata) — PagedAttention
            → torch.ops.vllm.paged_attention() — CUDA kernel
            → tp all-reduce (如果张量并行)
          → Residual connection
          → RMSNorm(hidden_states)
          → MLP 或 MoE:
            → MLP: SiluAndMul(gate×up) → Linear(down)
            → MoE: Router(top_k) → Expert Parallel → all2all
          → Residual connection
        → Final RMSNorm → Linear(logits) → LogitsProcessor
      → Sampler(logits, sampling_params) → sampled_token_ids
        → torch.ops.vllm.sample() — CUDA采样kernel
    → 构建AsyncModelRunnerOutput(logits, token_ids, kv_connector_output)
阶段4:输出处理与返回
EngineCore.update_from_output():
  → Scheduler.update_from_output()
    → 更新请求状态(RUNNING→FINISHED/STOPPED/LENGTH/...)
    → KVCacheManager.free() — 释放已完成请求的KV blocks
    → KVConnector.request_finished() — 通知连接器请求完成
  → 构建EngineCoreOutput

EngineCoreClient.get_output():
  → OutputProcessor.process()
    → Detokenizer.decode_incremental() — 增量解码token→text
    → 检查stop_strings / max_tokens / repetition
    → ToolParser.extract_tool_calls() — 如果有工具调用
    → 构建RequestOutput(text, token_ids, finish_reason, logprobs)

AsyncLLM → SSE streaming → Client

3.3 模块间数据传递汇总表

调用方 被调用方 传递数据 数据格式
API Server AsyncLLM 用户请求 ChatCompletionRequest(JSON)
AsyncLLM InputProcessor 原始prompt PromptType(str/list/dict) + SamplingParams
InputProcessor EngineCoreClient 处理后请求 EngineCoreRequest(msgspec.Struct)
EngineCoreClient EngineCore IPC传输 ZMQ消息 + TensorIPC(共享内存)
EngineCore Scheduler 触发调度 内部方法调用
Scheduler KVCacheManager 分配/释放 KVCacheBlocks(tuple[list[KVCacheBlock],...])
Scheduler Executor 调度结果 SchedulerOutput(new/cached/grammar数据)
Executor Worker 执行指令 SchedulerOutput(透传)
Worker ModelRunner 模型输入 input_ids + positions + block_tables + attn_metadata
ModelRunner Model 前向传播 hidden_states(Tensor) + kv_caches(dict)
Model Attention QKV计算 query/key/value(Tensor) + attn_metadata
Model FusedMoE 专家计算 hidden_states + router_output(top_k indices/weights)
Worker Executor 执行结果 AsyncModelRunnerOutput(Future)
EngineCore EngineCoreClient 推理输出 EngineCoreOutput(request_id, token_ids, finish_reason)
OutputProcessor Detokenizer token→text token_ids(list[int]) → str
AsyncLLM API Server 最终结果 RequestOutput(text+logprobs+finish_reason)

3.4 关键设计决策总结

设计决策 选择 原因
KV Cache管理 PagedAttention(分页) 消除显存碎片,支持prefix caching和KV传输
批处理策略 Continuous Batching 迭代级调度(prefill+decode混合),最大化GPU利用率
进程架构 Frontend/Core分离 API服务不阻塞调度循环,Core可独占GPU调度
调度算法 统一token级调度(无prefill/decode区分) 简化调度器,避免两阶段协调开销
模型加载 延迟导入(Lazy Import) 296种模型类按需加载,减少启动时间和内存
量化支持 注册表+工厂模式 25+量化方法可插拔扩展,运行时按配置选择
分布式通信 NCCL+CustomAllReduce 标准通信(兼容性) + 用户态RDMA(低延迟)
编译优化 torch.compile集成 自定义14步Pass+CUDAGraph,O0-O3渐进优化
多模态 Registry+Processor模式 不同模型的多模态处理可独立扩展
工具调用 40种解析器策略模式 兼容各厂商的不同工具调用格式
分离式推理 11种KV Connector 适配不同网络/存储后端(NIXL/Mooncake/3FS/…)
注意力后端 运行时自动选择 根据GPU架构+配置自动选择最优实现(FA3/FlashInfer/Triton)

四、总结

vLLM是一个分层管道架构的高性能LLM推理引擎,全局6层(入口→引擎→执行器→模型→内核→分布式),横切关注点(配置/分词/LoRA/多模态/平台/编译)以注册表模式注入各层。

8大核心创新点

  1. PagedAttention:将KV Cache按block管理,消除显存碎片,支持prefix caching和跨节点KV传输
  2. Continuous Batching:迭代级统一token调度,动态组合prefill/decode,最大化吞吐
  3. 进程分离:EngineCore独立子进程运行调度循环,Frontend不阻塞调度
  4. 插件式注册:模型(296种)/量化(25+)/注意力后端/连接器均可动态注册扩展
  5. 5维并行:ExternalDP×DP×PP×PCP×TP的完整分布式布局+弹性扩缩容
  6. 编译优化:torch.compile集成+自定义14步Pass管线,O0-O3渐进优化
  7. 11种KV Connector:适配不同分离式推理场景(NIXL/Mooncake/3FS/LMCache/…)
  8. 40种工具解析器:兼容各厂商工具调用格式(JSON标签/XML标签/专有协议)

一句话架构总结:请求从API入口进入,经InputProcessor预处理(分词+多模态)后通过IPC发送到EngineCore子进程;Scheduler统一token级调度后下发Executor;Worker中的ModelRunner执行模型forward,经PagedAttention和CUDA内核完成推理;结果经Detokenizer解码后流式返回客户端——整个链路各层通过明确的接口和数据结构解耦,横切关注点(配置/分词/LoRA/多模态/平台)以注册表模式注入。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐