大模型训练实战(4)——vLLM 为什么突然成了大模型部署圈的“标配”?一篇讲透原理、性能和实战
🤵♂️ 个人主页:小李同学_LSH的主页
✍🏻 作者简介:LLM学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
一、vLLM 到底是什么?为什么它现在这么常见
二、vLLM 真正解决的问题,不是“推理”,而是“服务”
1. 请求长度和生成长度都不一致
2. batch 很难“整齐”
3. KV Cache 是大头
三、PagedAttention 到底好在哪?为什么大家一提 vLLM 就提它
四、为什么 vLLM 通常会比“直接起 Transformers 服务”更有优势
1. 连续批处理(Continuous Batching)
2. 前缀缓存(Prefix Caching)
3. OpenAI 兼容服务接口
4. 更强的生产特性
五、最实用的部分:vLLM 到底怎么上手?
1. 安装
2. 离线推理:最适合本地先试通
3. 在线服务:真正适合接应用
4. 用 OpenAI Python SDK 去调本地 vLLM
六、vLLM 为什么对并发和长上下文更友好?
七、vLLM 适合什么场景,不适合什么场景?
更适合 vLLM 的场景
1. 你真的在做服务
2. 你想要 OpenAI 风格 API,但后端自己掌控
3. 你要跑大模型,尤其是长上下文、多请求场景
不一定非得上 vLLM 的场景
1. 你只是本地做很小的单次推理实验
2. 你根本不关心吞吐和服务
3. 你的部署环境很特殊,当前模型或硬件支持链路不顺
八、一个很容易踩的误区:vLLM 不是“无脑更快”
九、小结:vLLM 值得学,不是因为它火,而是因为它确实抓住了服务层最痛的点
这两年,大模型应用开发有一个很明显的变化:
前面大家还在卷“模型效果”,后面就开始卷“怎么把模型真正跑起来”。
因为一旦你的应用开始上线,问题立刻就变了:
- 同样一张卡,为什么别人吞吐更高?
- 同样是 7B/14B 模型,为什么别人首 token 更快?
- 为什么一到并发,显存就开始紧张?
- 为什么模型明明能加载,服务却一跑就抖?
这时候,vLLM 就会越来越频繁地出现在你的视野里。
它之所以火,不是因为它“又是一个推理框架”,而是因为它抓住了 LLM 服务里最贵、最痛、最容易被忽略的东西:KV Cache 的管理。
vLLM 的原始论文把核心思路概括得很明确:它通过PagedAttention来做更高效的 KV Cache 内存管理,尽量减少碎片和冗余拷贝;在论文评测里,vLLM 在相近延迟水平下,相比当时的系统如 FasterTransformer 和 Orca,吞吐能提升2–4 倍,而且在更长上下文、更大模型、更复杂解码下优势更明显。
vLLM 的价值,不只是“跑模型”,而是把大模型服务里最容易浪费显存和吞吐的那一层,重新做了一遍。
一、vLLM 到底是什么?为什么它现在这么常见
vLLM 官方现在给自己的定位很直接:高吞吐、内存高效的 LLM 推理与服务引擎。官方文档和 GitHub README 里都把几个核心点写得很清楚:PagedAttention、连续批处理(continuous batching)、前缀缓存(prefix caching)、chunked prefill、量化、多种并行方式、OpenAI 兼容 API 服务、流式输出、结构化输出、工具调用支持等。它还强调与 Hugging Face 模型的无缝集成,并支持大量模型架构,包括 decoder-only、MoE、多模态、embedding/retrieval 模型等。
这件事很重要,因为它意味着 vLLM 已经不是“研究代码”,而是一个很明显面向生产的系统:你既可以用它做离线批量推理,也可以直接把它起成一个 OpenAI 兼容服务,给你的应用、前端、SDK 甚至 LangChain/LlamaIndex 去接。
官方 Quickstart 就是按这两条路来组织的:
LLM类做离线推理,vllm serve做在线服务。
二、vLLM 真正解决的问题,不是“推理”,而是“服务”
很多人第一次接触 vLLM,会把它简单理解成“一个更快的 Transformers 推理后端”。这理解不算错,但不够准确。
vLLM 真正关注的不是“单条输入跑一次生成”,而是:
当很多请求一起进来,而且每个请求长度、生成进度、上下文状态都不一样时,系统怎么还保持高吞吐和较低浪费。
因为线上服务和本地model.generate()完全不是一回事。
线上推理至少有三个典型难点:
1. 请求长度和生成长度都不一致
不同用户的 prompt 长短不同,输出长短也不同,KV Cache 会动态增长和释放。vLLM 论文正是从这个问题切入:传统系统在 KV Cache 的分配和回收上容易产生严重浪费和碎片。
2. batch 很难“整齐”
真实线上请求不是同时开始、同时结束的。你很难像训练那样拿到一个规整 batch。官方文档把continuous batching作为核心特性之一,就是因为服务系统必须动态把新请求塞进正在运行的批次里。
3. KV Cache 是大头
大模型服务并不是“模型权重加载完就完事”,生成阶段的 KV Cache 会随着上下文长度增长持续占用显存。vLLM 论文就是围绕“如何更高效管理 KV Cache”展开的。
如果写成一个很粗略但够用的工程表达式,单请求的 KV Cache 大小可以近似看成:
三、PagedAttention 到底好在哪?为什么大家一提 vLLM 就提它
| 维度 | 直接用 Transformers | vLLM |
|---|---|---|
| 定位 | 更偏模型使用 | 更偏推理与服务系统 |
| 动态批处理 | 通常要自己做很多工程 | 原生强调 continuous batching |
| KV Cache 管理 | 不是核心卖点 | PagedAttention 是核心卖点 |
| OpenAI 兼容 API | 需要自己封装 | vllm serve直接提供 |
| Prefix Caching | 通常要额外实现 | 官方原生支持 |
| 并行与服务特性 | 视你自己工程能力而定 | 文档里有系统化支持 |
如果只说一句话,PagedAttention 的直觉其实很像操作系统里的分页内存:
不要把一条请求的 KV Cache 强行看成必须连续的一大块内存,而是拆成一个个块来管理。
vLLM 论文明确写到,PagedAttention 的灵感来自虚拟内存和 paging:通过块级内存管理,把 attention 的 key/value 存在非连续的 paged memory里,减少碎片和冗余,从而让批量大小能做得更大。
如果你把传统 KV Cache 想成“必须一整条连续铺开”,那请求中途结束、长度不齐、动态增减时就容易浪费。
而 PagedAttention 更像:
- 先按块切开
- 每个请求只维护自己的 block table
- 真正访问时再按表去找块
于是系统更容易做到:
- 减少碎片
- 更灵活共享
- 更容易在动态 batch 里调度
四、为什么 vLLM 通常会比“直接起 Transformers 服务”更有优势
这一点不用神化,它也不是任何场景都一定赢,但在“多用户、大并发、长上下文、持续服务”这些场景里,vLLM 的优势通常很明显。原因主要在四个点。
1. 连续批处理(Continuous Batching)
vLLM 官方把它列成核心特性之一。它不是等一整个 batch 都结束再接新请求,而是允许新的请求不断进入正在运行的调度系统里,这对真实线上负载非常重要。
2. 前缀缓存(Prefix Caching)
官方文档把 prefix caching/automatic prefix caching 当成重点功能,这对系统 prompt、大量共享前缀、多轮会话等场景特别实用。前缀相同的请求不必重复走一遍完整 prefill,吞吐和时延都会受益。
3. OpenAI 兼容服务接口
vllm serve起起来之后,就可以用接近 OpenAI API 的方式调用。官方 Quickstart 明确给了/v1/completions、/v1/chat/completions的 curl 和 Python SDK 示例。对应用开发来说,这一点非常香:很多上层代码几乎不用大改。
4. 更强的生产特性
官方 README 里还列了不少生产向能力:结构化输出、工具调用、流式输出、多种并行(tensor/pipeline/data/expert/context)、多 LoRA 支持、多硬件支持等。
五、最实用的部分:vLLM 到底怎么上手?
vLLM 的上手路径其实很清楚,官方 Quickstart 也是这么组织的:
- 一条路是离线推理
- 一条路是在线服务。
1. 安装
官方 README 推荐用
uv pip install vllm安装。
如果你就是普通pip环境,也可以直接:
pip install vllm
2. 离线推理:最适合本地先试通
官方文档里,LLM类是离线推理的主入口,SamplingParams用来控制采样参数。
3. 在线服务:真正适合接应用
官方 Quickstart 给出的最简单命令就是:
vllm serve Qwen/Qwen2.5-1.5B-Instruct
服务起来后,可以直接访问:
curl http://localhost:8000/v1/models
也可以用 completions:
curl http://localhost:8000/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "Qwen/Qwen2.5-1.5B-Instruct", "prompt": "vLLM is", "max_tokens": 32, "temperature": 0 }'这些命令都来自官方 Quickstart。
4. 用 OpenAI Python SDK 去调本地 vLLM
这个是很多人最喜欢的部分,因为迁移成本低。官方 Quickstart 直接给了示例:修改base_url指向本地 vLLM 服务即可。
from openai import OpenAI client = OpenAI( api_key="EMPTY", base_url="http://localhost:8000/v1", ) resp = client.chat.completions.create( model="Qwen/Qwen2.5-1.5B-Instruct", messages=[ {"role": "system", "content": "你是一个简洁的技术助手。"}, {"role": "user", "content": "一句话解释 vLLM 的核心价值。"}, ], temperature=0.2, ) print(resp.choices[0].message.content)这个能力为什么重要?因为它意味着:
你可以先按 OpenAI SDK 那套应用代码开发,后面把后端切到 vLLM,本地或私有化部署就顺很多。
六、vLLM 为什么对并发和长上下文更友好?
根本原因还是那几个关键词:KV Cache、连续批处理、前缀缓存、调度。官方文档把 continuous batching、chunked prefill、prefix caching 全都列成了核心特性;原始论文则强调 PagedAttention 对长序列、复杂解码的收益更明显。
如果用一个很粗略的服务视角去看,吞吐可以近似理解成:
而 vLLM 做的事情,本质上就是尽量提高“有效生成 token 数”,同时减少因为内存浪费、调度空转、重复 prefill 带来的损失。
near-zero waste in KV cache memory
七、vLLM 适合什么场景,不适合什么场景?
这点非常现实。
更适合 vLLM 的场景
1. 你真的在做服务
不是本地跑两句 demo,而是要:
- 接并发
- 接应用
- 做长时间在线服务
- 控吞吐和延迟
2. 你想要 OpenAI 风格 API,但后端自己掌控
这是 vLLM 非常典型的使用姿势。官方 Quickstart 就是围绕这一点设计的。
3. 你要跑大模型,尤其是长上下文、多请求场景
论文已经说明了,vLLM 的收益在长序列、更大模型、更复杂解码里更明显。
不一定非得上 vLLM 的场景
1. 你只是本地做很小的单次推理实验
这时候直接 Transformers 也可能够用。
2. 你根本不关心吞吐和服务
如果就是写个 notebook、测个 prompt,vLLM 的优势体现不充分。
3. 你的部署环境很特殊,当前模型或硬件支持链路不顺
vLLM 支持面很广,但工程环境永远要先做兼容性验证。官方 README 虽然列出了很多硬件与模型支持,但真正上线前还是建议先做小规模压测。
| 场景 | 建议程度 | 原因 |
|---|---|---|
| 本地快速做实验 | 中 | 能用,但优势未必完全体现 |
| 单机单用户偶尔推理 | 中 | 可以上,但不是必须 |
| 在线服务 / API 化 | 高 | OpenAI 兼容服务、调度和吞吐优势明显 |
| 多并发 / 长上下文 / 大模型 | 很高 | 这正是 vLLM 的强项 |
| 需要 Prefix Caching / 流式输出 / Tool Calling | 高 | 官方已有成体系支持 |
八、一个很容易踩的误区:vLLM 不是“无脑更快”
这一点必须讲清楚。
vLLM 很强,但不是任何场景下都能“无脑吊打一切”。原因很简单:
- 模型不同
- 请求分布不同
- prompt 长度不同
- 采样参数不同
- 硬件不同
- 并发不同
- batch 特征不同
原始论文给出的是一组有代表性的实验结果:2–4 倍吞吐提升,而且在某些条件下更明显。这个数字非常有参考价值,但不是说你上线以后一定就能原样拿到。
所以最成熟的使用姿势不是“听说 vLLM 快就直接切”,而是:
- 先用离线推理试通模型
- 再起服务
- 再用你自己的真实请求压测
- 再比较吞吐、TTFT、延迟、显存占用
只有这样,vLLM 的价值才是“落在你业务上的价值”。
九、小结:vLLM 值得学,不是因为它火,而是因为它确实抓住了服务层最痛的点
- vLLM 不是普通的推理脚手架,而是围绕 LLM 服务设计的高吞吐、内存高效引擎。
- 它最核心的突破点是 PagedAttention:把 KV Cache 的管理方式重新做了一遍。
- 它的优势不是“单条生成神奇更快”,而是在真实服务场景里更能扛住动态请求、长上下文和并发。
- 它提供了离线推理和 OpenAI 兼容在线服务两条清晰路径,上手门槛并不高。
- 如果你正在做大模型应用上线,vLLM 很可能不是“可选项”,而是你迟早会认真研究的一层基础设施。
vLLM 真正厉害的地方,不是把模型跑起来,而是把“模型跑成服务”这件事,终于做得更像工程了。
