vllm 调优参数(2)--enable-prefix-caching
在 token 级别,复用已计算过的 prompt 前缀 KV Cache,跳过 Prefill,从而显著降低 TTFT。
在 vLLM(包括 0.13.0)中:
KV Cache 是强制开启的基础能力,不存在“不开 KV Cache 的推理模式”。
原因有三点:
-
PagedAttention 架构
- vLLM 的核心设计就是围绕 KV Cache
- 没有 KV Cache,vLLM 就无法进行高效 decode
-
Decode 阶段必然依赖 KV Cache
- 每生成一个新 token,都需要历史 K/V
- vLLM 默认把 K/V 存在 GPU 显存中
-
没有任何参数可以关闭 KV Cache
-
你能控制的只是:
- KV Cache 的容量上限
- KV Cache 的复用策略(prefix caching)
-
如果没有使用--enable-prefix-caching,
不同请求之间不会共享 KV Cache
多轮聊天中:
每一轮都会重新计算前缀的 KV
TTFT 会更高
原理细节
是的,你的理解方向是对的,但需要做一个工程级的精确修正,否则在设计和预期性能时容易产生误判。
下面我用 vLLM 0.13.x 的真实实现语义来解释。
一、结论先行(精确版)
--enable-prefix-caching并不是“字符串相同就直接命中 KV Cache”
而是:
当两个请求在 token 序列层面 存在完全一致的前缀时,vLLM 会复用该前缀对应的 KV Cache,跳过这部分 token 的 Prefill 计算。
关键点只有一个:
复用发生在 token-id 序列,不是字符串层面
二、Prefix Caching 在 vLLM 中到底做了什么
1️⃣ 没开 Prefix Caching(你现在的状态)
每个请求:
[ token1, token2, token3, ..., tokenN ]
-
Prefill 阶段:
- 所有 token 都要跑一遍 attention
- 每个请求各算各的 KV
-
即使 prompt 完全一样,也不会复用
2️⃣ 开了 --enable-prefix-caching
vLLM 内部逻辑是:
- 对 prompt 做 tokenizer → token_id 序列
- 查一个 prefix → KV Cache 的映射表
- 找到 最长完全匹配的 token 前缀
- 直接复用该前缀的 KV Cache
- 只对“没命中的 token”做 Prefill
示意:
请求 A prompt:
[token1, token2, token3, token4, token5]
请求 B prompt:
[token1, token2, token3, token4, token6]
-
命中前缀:
token1 ~ token4 -
只计算:
- A: token5
- B: token6
三、为什么我说“不是字符串层面”
1️⃣ tokenizer 是决定性因素
以下两个字符串:
"Hello, world"
"Hello, world"
-
人眼看很像
-
tokenizer 后:
- token 序列 很可能不同
-
Prefix Cache 无法命中
2️⃣ 模板稍有变化也无法命中
典型 Chat 场景:
System: You are a helpful assistant.
User: xxx
如果:
- system prompt 有一个空格不同
- role 标签不同
- JSON key 顺序不同
→ token 不完全一致
→ 前缀不命中
四、Prefix Caching 能带来什么真实收益
✅ 明显收益的场景
-
多轮对话
- system prompt + 历史对话固定
- 每轮只在末尾追加新 token
-
RAG / 工具调用
- 大段固定 instructions
- 不同 query 拼在后面
-
批量同模板推理
-
如:
请总结以下内容: {{document}}
-
❌ 收益很小的场景
- 单轮短 prompt
- prompt 每次完全不同
- prompt 本身很短(<200 tokens)
五、几个常见误解,必须澄清
❌ 误解 1:Prefix caching = 跳过 decode
不对。
-
Prefix caching 只影响 Prefill
-
Decode(逐 token 生成):
- 仍然必须一步一步算
❌ 误解 2:Prefix caching 会无限占显存
不对。
- 受
gpu-memory-utilization - 受 block manager 约束
- vLLM 会回收不再引用的 prefix
❌ 误解 3:Prefix caching 会影响输出正确性
不对。
- KV Cache 是确定性的
- 复用不改变模型计算路径
六、工程级一句话总结
--enable-prefix-caching的本质是:
在 token 级别,复用已计算过的 prompt 前缀 KV Cache,跳过 Prefill,从而显著降低 TTFT。
你理解的这句话:
“不需要逐个 token 计算”
是对的,但前提是:这些 token 在 token-id 层面完全一致。
如果你愿意,下一步我可以帮你做三件事之一:
- 给你一个最容易命中 prefix cache 的 prompt 设计模板
- 告诉你如何在日志里确认 prefix cache 是否命中
- 量化:4090 + Qwen14B,开 / 不开 prefix caching 的 TTFT 差多少
你选一个,我直接往下讲。

浙公网安备 33010602011771号