vLLM是UC Berkeley LMSYS团队开源的大模型推理框架,核心创新是PagedAttention分页注意力机制,将显存利用率提升至90%以上,在相同硬件下实现数倍至数十倍的吞吐提升。
vLLM概述
vLLM是专为大语言模型/多模态大模型设计的高吞吐、低延迟推理与服务框架。
核心能力:
- 支持自回归语言模型、多模态大模型、MoE模型推理
- 兼容OpenAI API协议,可无缝替换现有OpenAI接口应用
- 支持主流量化方案、分布式推理、动态LoRA加载、超长上下文推理
发展历程
| 时间 | 里程碑 |
|---|
| 2023年4月 | 首次发布,PagedAttention落地,吞吐达HF Transformers 20倍以上 |
| 2023年9月 | PagedAttention论文发布 |
| 2024年 | 支持GPTQ/AWQ/FP8量化、多模态、MoE、分布式并行 |
| 2025-2026年 | 支持10M+ token超长上下文、端侧适配、RDMA多节点缓存共享 |
核心优势
| 特性 | 核心价值 |
|---|
| 极致显存利用率 | PagedAttention消除内存碎片,KV缓存利用率90%+ |
| 超高吞吐 | 连续批处理+分页内存管理,吞吐提升5-20倍 |
| 极低部署门槛 | 开箱即用,一行命令启动OpenAI兼容服务 |
| 全场景适配 | 离线批量推理、在线服务、多租户SaaS、长上下文RAG |
核心原理
自回归生成模式下,每步生成都依赖之前所有token的上下文信息。
KV缓存机制:
- Prefill阶段:一次性计算所有prompt token的$K,V$并缓存
- Decode阶段:每步仅计算当前token的$K,V$,追加到缓存后计算注意力
传统KV缓存痛点:
- 严重内存碎片化,显存利用率低(20%-30%)
- 静态批处理效率差,长序列拖慢整个批次
- 无法高效共享缓存,RAG场景显存冗余
PagedAttention核心设计
将KV缓存切分为固定大小的物理块(Block),每个块存储固定数量token的$K,V$向量。为每个序列维护逻辑块-物理块映射表。
核心收益:
- 消除内存碎片:固定大小块可任意复用,显存利用率90%+
- 灵活动态扩缩容:长度增长只需分配新物理块
- 高效缓存共享:多序列可映射到同一物理块,实现零拷贝共享
连续批处理
以token生成step为最小调度单元,每step结束后立即移出已完成序列、加入新序列,批次大小动态调整,GPU始终满负荷。
配套核心技术
| 技术 | 说明 |
|---|
| 分布式推理 | 支持张量并行、流水线并行、专家并行 |
| 异构内存管理 | CPU-GPU异构调度,支持超长上下文 |
| 量化支持 | FP8/INT8/AWQ/GPTQ等 |
| 多租户LoRA | 动态加载多个LoRA适配器 |
快速上手
安装
离线批量推理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| from vllm import LLM, SamplingParams
sampling_params = SamplingParams(
temperature=0.7, top_p=0.9, max_tokens=1024
)
llm = LLM(
model="Qwen/Qwen2-7B-Instruct",
tensor_parallel_size=1,
gpu_memory_utilization=0.9
)
prompts = ["请解释PagedAttention的核心优势?", "用Python写快速排序"]
outputs = llm.generate(prompts, sampling_params=sampling_params)
|
OpenAI兼容服务
1
2
3
4
| vllm serve Qwen/Qwen2-7B-Instruct \
--port 8000 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.9
|
1
2
3
4
5
6
| from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
model="Qwen/Qwen2-7B-Instruct",
messages=[{"role": "user", "content": "什么是vLLM?"}]
)
|
动态LoRA推理
1
2
3
4
5
6
7
| llm = LLM(
model="Qwen/Qwen2-7B-Instruct",
enable_lora=True,
max_loras=4
)
llm.load_lora(lora_name="customer_service", lora_path="./lora/customer_service")
outputs = llm.generate(prompts, lora_request=["customer_service"])
|
生产环境最佳实践
核心参数调优
| 参数 | 调优建议 |
|---|
gpu_memory_utilization | A100推荐0.9-0.95;RTX消费级卡推荐0.85-0.9 |
block_size | 长上下文调大至32/64;高并发短序列调小至8 |
max_num_batched_tokens | 高吞吐离线场景调大;低延迟在线场景调小 |
quantization | Hopper架构优先FP8;Ampere优先AWQ |
常见问题解决
| 问题 | 解决方案 |
|---|
| OOM | 降低gpu_memory_utilization;开启量化;开启CPU offload |
| 延迟过高 | 减小max_num_batched_tokens;开启张量并行 |
| 精度下降 | 更换高精度量化方案(FP8/AWQ);检查权重加载 |
适用场景
- 高吞吐在线API服务
- 长上下文RAG与文档处理
- 多租户企业级大模型平台
- 离线批量推理
- 多模态大模型部署
竞品对比
| 框架 | 吞吐 | 易用性 | 量化支持 |
|---|
| vLLM | 顶级 | 极高 | 全方案 |
| TensorRT-LLM | 顶级 | 较低 | 全方案 |
| TGI | 中等 | 高 | 主流方案 |
| HF Transformers | 低 | 极高 | 主流方案 |
学习资源
Comments