30 秒快速回答
vLLM 是一个开源的高性能大模型推理引擎,核心价值就一句话:用同样的 GPU,让你的模型吞吐量暴增 24 倍。它通过 PagedAttention 技术管理 GPU 显存,让推理服务从”一辆车占整条路”变成”高效流水线”。部署只需一行命令:vllm serve Qwen/Qwen2.5-7B-Instruct,立即可用 OpenAI 兼容 API。
为什么需要专门的推理引擎?
很多人直接用 HuggingFace Transformers 跑模型推理,代码大概长这样:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
inputs = tokenizer("你好", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=512)
能跑,但问题致命:
| 问题 | Transformers 原生推理 | vLLM |
|---|---|---|
| 显存利用率 | 仅 30-40%,KV Cache 碎片化严重 | 接近 100%,块级内存管理 |
| 并发吞吐 | 单请求串行,批处理手写复杂 | 自动连续批处理(Continuous Batching) |
| 推理延迟 | 首 token 延迟高,无优化 | 前缀缓存、CUDA Graph 加速 |
| 生产就绪 | 需自己封装 API、监控、调度 | 内置 OpenAI 兼容 API、量化支持 |
一句话:Transformers 是研究框架,vLLM 是生产框架。
vLLM 核心原理:PagedAttention
vLLM 的灵魂是 PagedAttention,论文发表于 SOSP 2023。它的灵感来自操作系统的虚拟内存分页机制。
传统 KV Cache 管理的问题
大模型推理时,每生成一个 token 都要访问之前所有 token 的 Key-Value 矩阵(KV Cache)。传统方式为每个请求预分配一整块连续显存:
- 如果预留太小 → token 生成到一半显存溢出
- 如果预留太大 → 大量显存闲置,并发量直线下降
- 不同请求之间无法共享显存块
PagedAttention 的做法
把 KV Cache 切成固定大小的”页”(Block),像虚拟内存一样按需分配:
请求A: [Block 0] -> [Block 3] -> [Block 7]
请求B: [Block 1] -> [Block 5] -> [Block 3] ← 共享 Block 3!
请求C: [Block 2] -> [Block 4]
核心收益:
- 显存零碎片:块大小固定,不存在”预留太大/太小”的问题
- KV Cache 共享:并行采样(Beam Search)时多个序列可共享同一组 KV Block
- 吞吐提升 24x:同等硬件下可同时服务 24 倍多的请求
5 分钟快速上手
1. 安装
pip install vllm
推荐在 Python 3.9+ 、CUDA 12.1+ 环境下安装。如需特定版本:
# 安装最新稳定版
pip install vllm --upgrade
# 验证安装
python -c "import vllm; print(vllm.__version__)"
2. 启动模型服务
一行命令启动一个兼容 OpenAI API 的推理服务:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.90
参数说明:
| 参数 | 含义 | 建议值 |
|---|---|---|
--host |
监听地址 | 0.0.0.0(允许外部访问) |
--port |
服务端口 | 8000 |
--max-model-len |
最大上下文长度 | 模型支持的最大值 |
--gpu-memory-utilization |
GPU 显存利用率 | 0.85-0.95 |
--tensor-parallel-size |
多卡张量并行 | 等于 GPU 数量 |
3. 调用 API
服务启动后,用标准 OpenAI 客户端调用:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
response = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[
{"role": "user", "content": "用三句话解释什么是 PagedAttention"}
],
temperature=0.7,
max_tokens=512
)
print(response.choices[0].message.content)
完全兼容 OpenAI SDK,现有项目改个 base_url 就能切过来。
推理引擎对比:vLLM vs 其他
| 特性 | vLLM | Ollama | SGLang | TensorRT-LLM |
|---|---|---|---|---|
| 定位 | 高性能生产推理 | 本地桌面易用 | 结构化生成 | NVIDIA 极致优化 |
| PagedAttention | ✅ 原创 | ❌ | ✅ RadixAttention | ❌ 自有方案 |
| OpenAI API 兼容 | ✅ 原生 | ✅ | ✅ | 需 Triton Server |
| 安装难度 | pip install |
一键安装包 | pip install |
复杂,需编译 |
| 量化支持 | GPTQ/AWQ/FP8 | GGUF | FP8 | INT4/INT8/FP8 |
| 适用场景 | 生产 API 服务 | 个人本地使用 | 结构化 JSON 输出 | 最高吞吐场景 |
| 前缀缓存 | ✅ Automatic Prefix Caching | ❌ | ✅ RadixAttention | ❌ |
选型建议:
- 搭生产级 API 服务 → vLLM
- 本地尝鲜、个人使用 → Ollama
- 需要稳定 JSON 结构化输出 → SGLang
- NVIDIA 深度绑定、极致吞吐 → TensorRT-LLM
生产环境最佳实践
1. 显存规划
# 查看模型显存需求(不启动服务)
vllm serve Qwen/Qwen2.5-7B-Instruct --dry-run
2. 开启前缀缓存
对于多轮对话场景,前缀缓存可大幅降低首 token 延迟:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--enable-prefix-caching
3. 量化部署(节省显存)
# AWQ 量化(推荐,精度损失极小)
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
--quantization awq
# GPTQ 量化
vllm serve TheBloke/Llama-2-7B-GPTQ \
--quantization gptq
4. 多卡并行
# 4 卡张量并行
vllm serve Qwen/Qwen2.5-72B-Instruct \
--tensor-parallel-size 4
5. Docker 部署
FROM vllm/vllm-openai:latest
ENV MODEL_NAME=Qwen/Qwen2.5-7B-Instruct
ENTRYPOINT ["vllm", "serve", "$MODEL_NAME"]
总结
vLLM 用操作系统的分页思想解决了大模型推理中最大的瓶颈——KV Cache 显存管理。核心就三点:
- PagedAttention:块级显存管理,消除碎片,支持 KV Cache 共享
- Continuous Batching:自动批处理,最大化 GPU 利用率
- OpenAI 兼容 API:零迁移成本,改个 URL 就能用
延伸阅读:
- vLLM 官方文档
- PagedAttention 论文:Efficient Memory Management for Large Language Model Serving
- SGLang 官方文档——RadixAttention 与结构化生成
- Ollama vs vLLM 详细对比——根据场景选工具