vLLM 架构设计与核心原理
vLLM 是当前最流行的大语言模型推理引擎之一,其核心创新在于 PagedAttention 机制和 Continuous Batching 调度策略,显著提升了 GPU 利用率和推理吞吐量。
整体架构
vLLM 的架构可以分为以下几个核心模块:
- LLMEngine:顶层推理引擎,协调调度器、块管理器和模型执行器
- Scheduler:请求调度器,决定每步哪些请求参与计算
- BlockManager:KV Cache 块管理器,基于虚拟内存思想管理显存
- ModelExecutor:模型执行器,负责实际的 GPU 计算前向传播
- Worker:分布式工作进程,每个 GPU 对应一个 Worker
python
from vllm import LLM, SamplingParams
# 初始化推理引擎
llm = LLM(
model="meta-llama/Llama-2-7b-hf",
tensor_parallel_size=2,
gpu_memory_utilization=0.9,
max_model_len=4096,
)
# 配置采样参数
sampling_params = SamplingParams(
temperature=0.8,
top_p=0.95,
max_tokens=512,
)
# 批量推理
outputs = llm.generate(["你好,请介绍一下自己"], sampling_params)
for output in outputs:
print(output.outputs[0].text)请求处理流程
vLLM 的请求处理遵循以下流程:
- 请求通过 API Server 进入等待队列
- Scheduler 根据显存预算从队列中选取请求
- BlockManager 为新请求分配 KV Cache 块
- ModelExecutor 执行模型前向计算
- 生成的 Token 写入对应请求的输出流
- 完成的请求释放 KV Cache 块
核心优势
vLLM 的 PagedAttention 将 KV Cache 按块管理,避免了传统方案中预分配固定大小显存导致的碎片化问题,显存利用率可提升至 90% 以上。
异步执行模型
vLLM 采用了异步执行架构,CPU 上的调度逻辑与 GPU 上的计算可以重叠执行:
- Step 1:Scheduler 在 CPU 上准备下一批次的输入张量
- Step 2:GPU 执行当前批次的前向计算
- Step 3:两者通过双缓冲机制实现流水线化
这种设计使得调度开销几乎可以完全隐藏在 GPU 计算时间中。
分布式推理支持
vLLM 原生支持张量并行(Tensor Parallelism),通过 NCCL 实现多 GPU 间的通信:
python
# 张量并行推理启动
from vllm import LLM
llm = LLM(
model="meta-llama/Llama-2-70b-hf",
tensor_parallel_size=4, # 4卡并行
pipeline_parallel_size=1,
)注意
张量并行度需要与模型的注意力头数对齐。例如 Llama-2-70B 有 64 个注意力头,TP=4 时每个 GPU 处理 16 个头,这是合法的配置。
与传统方案对比
| 特性 | vLLM | HuggingFace TGI | Triton |
|---|---|---|---|
| KV Cache 管理 | PagedAttention | 连续分配 | 连续分配 |
| 批处理策略 | Continuous Batching | Dynamic Batching | Dynamic Batching |
| 显存利用率 | ~90% | ~60-70% | ~60-70% |
| 张量并行 | 原生支持 | 原生支持 | 需额外配置 |