vLLM:原理与使用
vLLM 是一个高性能 LLM 推理框架,目标是把“模型能跑”升级为“能稳定高并发、成本可控地在线服务”。它在工程上最核心的贡献通常来自:
Paged KV Cache(PagedAttention):解决 KV cache 的碎片与复用问题
Continuous Batching:让 GPU 在请求持续到达时保持高利用率
1. 为什么 vLLM 能跑得快:问题从 KV Cache 说起
LLM 自回归解码需要 KV cache(缓存历史 token 的 Key/Value)。在在线服务中,KV cache 往往是瓶颈:
请求长度不一(变长 prompt / 变长输出)→ 显存分配与回收频繁
并发高 → cache 读写带宽吃紧
如果按“每个请求一段连续显存”管理,很容易产生碎片,导致“显存还够但分配失败/吞吐下降”
2. 核心原理一:Paged KV Cache(PagedAttention)
2.1 核心思想
把 KV cache 从“每个请求一块连续的大数组”改成“按固定大小 block(页)分配”,类似操作系统的分页内存:
每个请求的 KV cache 由多个 block 组成
block 从一个全局的 block pool 里申请/归还
请求结束即可归还 block,供其他请求复用
2.2 带来的直接收益
显存碎片显著降低:不用为变长序列反复申请不同大小的连续块
更好的并发与吞吐:更容易把显存利用率打满
更稳的服务行为:减少 OOM/分配失败导致的抖动
工程直觉:在线推理的很多“不稳定”,根源不是模型,而是变长请求下的 KV cache 内存管理。
3. 核心原理二:Continuous Batching(持续动态拼 batch)
传统 batch 的问题是:要等一批请求齐了才能一起跑,或者为了低延迟只能小 batch,导致 GPU 吃不满。
vLLM 的 continuous batching 让系统可以:
请求持续进入
调度器在每个 decoding step 动态决定“当前这一步拼哪些请求一起算”
让 GPU 更接近“持续满载”
结果通常是:
吞吐上升(tokens/s)
延迟更可控(尤其是尾延迟 P95/P99)
4. 使用方式(最常见三种)
下面命令仅作为“你在自己环境里怎么用”的示例,本书工程里不强依赖安装 vLLM。
4.1 安装
建议先参考 vLLM 官方文档的安装说明(不同 CUDA/平台组合差异很大):
https://docs.vllm.ai/
4.2 Python 离线推理(本地批量生成)
典型流程是:加载模型 → 传入 prompts → 得到生成结果。你会主要关注:
batch size 与吞吐
max tokens、stop tokens、temperature/top-p 等采样参数
4.3 启动 OpenAI 兼容服务(在线推理)
vLLM 常用形态是启动一个 OpenAI-compatible 的 HTTP 服务,然后你的业务侧按 OpenAI API 方式调用(便于替换与灰度)。
上线时你需要额外补齐:
鉴权、限流、配额
审计日志
监控(tokens/s、queue time、KV cache 使用率、OOM/重试)
5. 关键配置与调参(工程角度)
5.1 上下文长度与 KV cache
上下文越长,KV cache 体积越大,往往首先卡在显存与带宽。常见策略:
控制 max context / max new tokens
用 GQA/MQA 的模型(K/V 头数更少)
必要时考虑 KV cache 量化(取决于框架支持与精度容忍度)
5.2 吞吐 vs 延迟
这是永恒权衡:
更激进的 batching 与更高吞吐,可能增加排队时间
更低延迟策略可能降低 GPU 利用率
建议上线前明确 SLA,并分桶看 P50/P95/P99。
6. 常见坑位(你很可能会遇到)
显存看似够但仍 OOM:通常是 KV cache + 并发 + 长上下文组合导致
吞吐不如预期:多半是 batch 没拼起来、或被 I/O/CPU 前处理限制
长输出拖慢整个服务:需要限额(max tokens)与调度策略
多模态模型更慢:视觉 encoder 与跨注意力成本高,必须做缓存与 token 控制
本章小结
vLLM 的工程核心是:用 Paged KV Cache + Continuous Batching 提升在线推理的吞吐与稳定性。
上线时要把“可观测 + 可控失败 + 权限边界”作为第一等公民,而不是只看离线生成效果。