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 核心架构与工作流程 用户请求 调度器 连续批处理引擎 PagedAttention 显存管理器 GPU 推理 核心组件说明 🔴 调度器:管理请求队列 🟢 批处理:动态合并请求 🟣 显存管理:PagedAttention 🟡 GPU:执行推理计算 数据流方向 1. 请求进入调度器 2. 加入连续批次 3. 分配显存页 4. GPU 执行推理

为什么选择 vLLM?—— 我的真实感受

说实话,市面上推理框架不少。Hugging Face 的 TGI、NVIDIA 的 Triton、还有各种自研方案。但我为什么最终选择了 vLLM?

三个原因:

  1. 显存效率高:PagedAttention 带来的提升是实打实的。我做过对比测试,同样 8 张 A100,vLLM 能承载的并发量是传统方案的 2-3 倍。
  2. 部署简单:vLLM 的 API 设计很干净。你不需要写一堆配置,几行代码就能跑起来。我经常跟团队说:「vLLM 是那种你看了文档就能上手的工具」。
  3. 社区活跃: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,吞吐量能翻好几倍。

专注资料整理