vLLM 是什么?—— 一个为推理而生的引擎
说实话,我第一次接触 vLLM 的时候,心里想的是:「又一个推理框架?」
但用了一段时间后,我改变了看法。vLLM 不是一个普通的推理框架。它专门为 LLM 推理场景设计,核心目标就一个:把 GPU 的每一分算力都榨干。
你想想看,传统推理方式有个很大的问题——显存浪费严重。每个请求来了,都得给 KV cache 分配一整块连续显存。但请求长度不一样,有的长有的短,结果就是大量显存碎片,利用率可能不到 60%。
vLLM 就是来解决这个问题的。它由加州大学伯克利分校开发,现在已经是 LLM 推理部署领域的事实标准之一。我在生产环境里跑了快一年,说实话,还没找到比它更稳的方案。
一句话总结:vLLM 是一个高性能、低延迟的 LLM 推理引擎,核心卖点是显存效率和吞吐量。
核心特性:为什么 vLLM 这么能打?
1. PagedAttention —— 显存管理的革命
这是 vLLM 最核心的发明。我当年第一次看到这个设计时,真的拍了一下大腿——太巧妙了。
传统做法是:给每个请求的 KV cache 分配一整块连续显存。但问题是,请求长度不确定,你没法提前知道该分配多大。分配大了浪费,分配小了又得动态扩容,性能很差。
PagedAttention 的思路很简单:把 KV cache 切成固定大小的「页」,像操作系统的虚拟内存一样管理。
- 每个页大小固定(比如 16 个 token 的 KV cache)
- 不要求物理上连续,逻辑上连续就行
- 用页表来映射逻辑地址到物理地址
这样做的好处是什么?
- 零碎片:显存利用率从 60% 提升到 95% 以上
- 按需分配:请求来了才分配页,不浪费
- 共享方便:多个请求可以共享相同的 KV cache 页(比如 beam search 场景)
我的经验:曾经有个项目,用传统方式部署 LLaMA-13B,8 张 A100 只能同时处理 32 个请求。换成 vLLM 后,同样的硬件,并发数直接翻到 128。PagedAttention 功不可没。
2. 连续批处理 —— 把 GPU 喂饱
GPU 这玩意儿,最怕的就是「等」。你想想看,如果一次只处理一个请求,GPU 大部分时间都在空转。
连续批处理(Continuous Batching)就是解决这个问题的。传统批处理是:等一批请求凑齐了,一起推理。但这样有两个问题:
- 短请求要等长请求,延迟高
- 批大小固定,GPU 利用率不稳定
vLLM 的做法是:请求来了就加入当前批次,请求完成了就移出。每个推理步骤(prefill 或 decode)都动态调整批次。
举个例子:
- 当前批次有 4 个请求,正在 decode
- 第 5 个请求来了,直接加入批次
- 第 2 个请求生成了结束 token,移出批次
这样 GPU 永远在处理「当前最需要处理」的请求,利用率自然就上去了。
注意:连续批处理虽然好,但也不是没有代价。它要求推理引擎能动态调整批次大小,这对底层实现要求很高。vLLM 做到了,但很多其他框架做不到。
3. 模型支持列表 —— 你想要的它都有
vLLM 支持的模型列表一直在扩展。我整理了一份当前主流支持的模型:
| 模型系列 | 代表模型 | 支持状态 | 备注 |
|---|---|---|---|
| LLaMA 系列 | LLaMA 2/3, LLaMA 3.1 | ✅ 完整支持 | 最稳定的系列 |
| Mistral 系列 | Mistral 7B, Mixtral 8x7B | ✅ 完整支持 | MoE 模型也支持 |
| Qwen 系列 | Qwen 2, Qwen 2.5 | ✅ 完整支持 | 中文场景首选 |
| ChatGLM 系列 | ChatGLM 3, GLM-4 | ✅ 完整支持 | 国内常用 |
| Falcon 系列 | Falcon 7B, Falcon 40B | ✅ 完整支持 | 老牌模型 |
| Baichuan 系列 | Baichuan 2, Baichuan 3 | ✅ 完整支持 | 中文优化 |
| DeepSeek 系列 | DeepSeek V2, DeepSeek Coder | ✅ 完整支持 | 代码能力强 |
| 其他 | Phi-3, Gemma 2, Yi 系列 | ✅ 完整支持 | 持续更新中 |
避坑指南:我曾经遇到过一个问题——用 vLLM 加载一个刚发布的模型,结果报错说「不支持」。后来发现,vLLM 的模型支持列表更新很快,但文档可能滞后。我的习惯是:先跑一下 vllm --help 看看支持的模型列表,或者直接看 GitHub 上的 supported_models.py 文件。
vLLM 的核心架构图
下面这张图是我自己画的,展示了 vLLM 的核心工作流程。你看一眼就能明白它怎么运作的:
为什么选择 vLLM?—— 我的真实感受
说实话,市面上推理框架不少。Hugging Face 的 TGI、NVIDIA 的 Triton、还有各种自研方案。但我为什么最终选择了 vLLM?
三个原因:
- 显存效率高:PagedAttention 带来的提升是实打实的。我做过对比测试,同样 8 张 A100,vLLM 能承载的并发量是传统方案的 2-3 倍。
- 部署简单:vLLM 的 API 设计很干净。你不需要写一堆配置,几行代码就能跑起来。我经常跟团队说:「vLLM 是那种你看了文档就能上手的工具」。
- 社区活跃:GitHub 上 4 万多 star,Issues 响应很快。我提过几个 bug,基本 24 小时内就有回复。
我的建议:如果你正在选型推理框架,vLLM 值得优先考虑。尤其是你的场景对吞吐量要求高、显存资源有限的时候。当然,如果你需要多模态支持或者自定义算子,那可能得看看其他方案。但纯文本 LLM 推理,vLLM 是目前最稳的选择。
快速上手:一行代码跑起来
说了这么多,不如直接上手试试。vLLM 的安装和使用非常简单:
# 安装
pip install vllm
# 启动服务(以 Qwen2.5-7B 为例)
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--port 8000 \
--tensor-parallel-size 1
# 调用
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [{"role": "user", "content": "你好"}]
}'
嗯,就这么简单。你不需要理解 PagedAttention 的底层实现,也不需要关心连续批处理怎么调度。vLLM 帮你搞定了。
小技巧:我第一次用的时候,忘了指定 --tensor-parallel-size,结果只用了单卡。如果你有多张 GPU,记得加上这个参数。比如 4 张卡就写 --tensor-parallel-size 4,吞吐量能翻好几倍。