vllm
特性
1)PagedAttention
把 KV Cache 按 block/page 管理,而不是给每个请求预留一整段连续显存,减少碎片,提高显存利用率。 
2)Continuous batching
不是等一批请求凑齐再跑,而是在每个 decode step 动态加入新请求、移除完成请求,让 GPU 一直尽量满载。 
3)Automatic Prefix Caching
相同前缀 prompt 的 KV Cache 可以复用,避免重复 prefill,尤其适合系统提示词相同、RAG 模板相同、多轮对话共前缀的场景。 
4)Chunked Prefill
把长 prompt 的 prefill 切成小块,与 decode 请求一起调度,改善 TTFT / ITL 和 GPU 利用率之间的平衡。官方文档也明确说它能把 compute-bound 的 prefill 和 memory-bound 的 decode 更好地混合调度。 
5)Speculative Decoding
用 draft model 或其他机制先猜 token,再由目标模型验证,以降低生成延迟。 
6)高性能执行优化
支持 CUDA/HIP graph,集成 FlashAttention / FlashInfer,并支持 GPTQ、AWQ、INT4、INT8、FP8 等量化。 
7)工程特性
OpenAI-compatible API server、流式输出、多种并行方式(tensor/pipeline/data/expert parallelism)、Multi-LoRA、多硬件支持。 
KV Cache 的大小如何计算?
对单层来说,KV Cache 大小约为:
\text{KV bytes per layer}
2 \times B \times S \times H_{kv} \times D \times \text{dtype_bytes}
其中:
• 2:因为有 K 和 V
• B:batch size / 活跃序列数
• S:每个序列当前缓存的 token 数
• H_kv:KV 头数
• D:每个 head 的维度
• dtype_bytes:数据类型字节数,比如 FP16/BF16 是 2 字节
如果有 L 层,则总大小:
\text{Total KV bytes}
2 \times B \times S \times L \times H_{kv} \times D \times \text{dtype_bytes}
⸻
为什么是这个公式?
因为每个 token、每一层都要存一份:
• K: [H_kv, D]
• V: [H_kv, D]
所以单 token 单层是:
2 \times H_{kv} \times D \times \text{dtype_bytes}
再乘序列长度 S,再乘层数 L,再乘 batch B。
⸻
在 MHA / GQA / MQA 下的区别
1)MHA
如果是普通 Multi-Head Attention:
H_{kv} = H_q
即 K/V 头数和 Query 头数一样。
2)GQA
Grouped Query Attention:
H_{kv} < H_q
KV 头数更少,所以 KV Cache 显著下降。
3)MQA
Multi-Query Attention:
H_{kv} = 1
KV Cache 最省。
- Title: vllm
- Author: Ikko
- Created at : 2026-03-31 00:07:25
- Updated at : 2026-04-05 00:59:50
- Link: http://ikko-debug.github.io/2026/03/31/vllm/
- License: This work is licensed under CC BY-NC-SA 4.0.