大模型推理框架 vLLM:原理、优化与演进
一、大模型推理基础
1.1 什么是大模型推理?
核心定义:
大模型推理是利用训练好的大模型,对新的输入数据进行计算并输出结果的过程。
典型示例:
- 用户输入:“巴黎是法国的首都吗?”
- 模型输出:“是的,巴黎是法国的首都。”
1.2 大模型推理流程
完整推理流程包含四个关键步骤:
- 输入预处理:将文本等输入转换为模型可理解的格式(如 Token IDs)
- 前向传播:数据经过模型各层计算(注意力机制、前馈网络等)
- 输出生成:生成预测结果(分类标签、回答文本等)
- 输出后处理:将模型输出转换为用户可读的格式
🔗 可视化工具:https://bbycroft.net/llm
1.3 Transformer 架构基础
核心论文:Attention Is All You Need
大语言模型三种主流架构:
| 架构类型 | 代表模型 | 主要应用场景 |
|---|---|---|
| Encoder-only | BERT | 检索、分类、编码任务 |
| Decoder-only | GPT系列 | 文本生成、对话系统 |
| Encoder-Decoder | T5 | 翻译、摘要生成 |
推理阶段特点:
- 主要执行 Decoder-only 前向传播
- 不涉及反向传播和参数更新
- 需要重用历史计算结果(KV Cache)
二、vLLM 框架深度解析
2.1 诞生背景
面临的挑战:
- 模型规模指数级增长
- 推理成本急剧上升(计算资源 + 显存占用)
- 消费级显卡资源受限
解决方案: vLLM 应运而生,目标是以极高效率、极低资源占用实现大模型推理和服务。
2.2 项目概况
官方定位:
“vLLM is a fast and easy-to-use library for LLM inference and serving.”
发展历程:
- 起源:UC Berkeley Sky Computing Lab
- 现状:社区驱动的开源项目,学术界与工业界共同贡献
- 活跃度:每周超过 100+ Contributions
2.3 极简部署
一行命令启动服务:
bash
vllm serve Qwen/Qwen2.5-1.5B-Instruct
该命令自动完成:
- 模型下载
- 推理引擎构建
- HTTP 服务启动
- 高并发请求支持
三、vLLM 核心技术:PagedAttention
3.1 KV Cache 深度解析
重要澄清:
KV Cache 并非传统服务端的 Key-Value 缓存,而是特指 Self-Attention 机制中的 KV 缓存优化。
自回归解码挑战:
- 当前主流:90% LLM 采用自回归解码
- 核心特性:每个新生成的 Token 都依赖于所有已生成的 Token
- 性能瓶颈:序列生成必须按顺序进行,无法并行化
示例分析: “Artificial Intelligence is the future of humans.”
生成过程:
- 输入 Token 序列:{T₁, T₂, …, Tₙ}
- Token 嵌入:{x₁⁰, x₂⁰, …, xₙ⁰} (维度 D,上标表示层数)
- 多层变换:经过 L 层计算,输出 {x₁ᴸ, x₂ᴸ, …, xₙᴸ}
- 下一个 Token 预测:基于 xₙᴸ 和词汇表嵌入生成概率分布,采样得到 Tₙ₊₁
3.2 KV Cache 的复用原理
关键洞察:
当生成 Tₙ₊₁ 时,前 n 个 Token 的中间计算结果 {xᵢˡ | 1≤i≤n, 1≤l≤L} 与之前计算完全一致,可以复用。
计算复用验证:
import torch
from transformers import GPT2Tokenizer, GPT2Model
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2Model.from_pretrained('gpt2')
# 文本:"The quick brown fox jumps over the lazy"
tokens = [[464, 2068, 7586, 21831, 18045, 625, 262, 16931]]
input_n = torch.tensor(tokens)
output_n = model(input_ids=input_n, output_hidden_states=True)
# 文本:" dog"
tokens[0].append(3290)
input_n_plus_1 = torch.tensor(tokens)
output_n_plus_1 = model(input_ids=input_n_plus_1, output_hidden_states=True)
# 验证中间结果一致性
for i, (hidden_n, hidden_n_plus_1) in enumerate(zip(output_n.hidden_states, output_n_plus_1.hidden_states)):
print(f"layer {i}, max difference {(hidden_n - hidden_n_plus_1[:, :-1, :]).abs().max().item()}")
assert torch.allclose(hidden_n, hidden_n_plus_1[:, :-1, :], atol=1e-4)
输出结果: 各层误差均小于 1e-4,验证了计算复用的可行性。
3.3 推理阶段性能特征
两阶段分析:
| 阶段 | 描述 | 计算特征 | 资源需求 |
|---|---|---|---|
| Prefilling | 首个 Token 产出前 | 计算密集型 | 高计算负载 |
| Decode | 后续 Token 生成 | 内存IO密集型 | 高显存带宽 |
工业界优化趋势:PD 分离
- 将 Prefilling 和 Decode 阶段分配到不同集群
- 针对性优化不同阶段的资源需求
3.4 PagedAttention 创新设计
内存浪费三大根源:
- Reserved:请求的 KV Cache 需要长期占用空间
- Internal Fragmentation:预分配显存未充分利用(如提前生成 EOS)
- External Fragmentation:不同请求间显存分配不均
操作系统灵感:
PagedAttention 将经典操作系统概念引入 ML 系统:
| 操作系统概念 | PagedAttention 对应 |
|---|---|
| 虚拟内存 | 逻辑块地址空间 |
| 物理页帧 | GPU 显存块 |
| 页表 | Block Table |
| 内存碎片整理 | 块重新分配 |
核心优势:
- 实现显存的精细化管理
- 支持不同序列间的显存共享
- 显著提升显存利用率
🔗 技术细节:PagedAttention CUDA Kernel 实现解析
四、vLLM 演进与未来
4.1 vLLM V1:架构重构
重构背景:
原始 vLLM 作为 PagedAttention 研究项目开发,随着规模扩大面临代码冗余和维护挑战。
V1 核心改进:
- 更简洁:仅 2000-3000 行 Python 核心代码
- 更高效:全面优化主流模型(如 DeepSeek-R1)推理性能
- 更易用:降低开发者门槛,简化社区贡献流程
发布信息:
- 时间:2024年9月开始重构
- 版本:vLLM V1 Alpha
- 🔗 官方博客
4.2 社区生态
发展态势:
- 极活跃的社区贡献
- 代码架构快速迭代(月级别重大更新)
- 学术界与工业界深度融合
五、学习资源推荐
5.1 核心资料
5.2 扩展学习
- 连续批处理技术:How continuous batching enables 23x throughput
- vLLM 发展历程:知乎专栏
更多推荐

所有评论(0)