vllm

Ikko Lv4

特性

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.
Comments