Appearance
KV Cache 与批处理 — 概念
KV Cache 原理
Transformer 自回归生成时,每个新 token 只依赖于之前所有 token 的 K/V:
关键优势:每个 decode step 只需计算 1 个 token 的 Q/K/V,之前的 K/V 从 cache 读取。
内存布局
KV Cache 在内存中按层组织:
Layer 0: [K_cache(n_kv_max, n_embd), V_cache(n_kv_max, n_embd)]
Layer 1: [K_cache(n_kv_max, n_embd), V_cache(n_kv_max, n_embd)]
...
Layer N: [K_cache(n_kv_max, n_embd), V_cache(n_kv_max, n_embd)]n_kv_max= 最大 cache 容量(通常等于上下文长度)n_embd= KV 的 head 维度 × KV head 数- 层数使用
hparams.n_layer_all(包含 SWA/MTP 等额外层),区别于hparams.n_layer(仅标准 Transformer 层)
Batch 处理
llama.cpp 的 batch 允许同时处理多个 token(来自同一或不同序列):
c
struct llama_batch {
llama_token * token; // token IDs
int32_t * pos; // 每个token的位置
int32_t * n_seq_id; // 每个token所属序列数
llama_seq_id ** seq_id; // 每个token的序列ID列表
int32_t n_tokens; // 总token数
};Prefill vs Decode
| 特性 | Prefill | Decode |
|---|---|---|
| 每次 token 数 | N(整个 prompt) | 1 |
| 计算类型 | 矩阵 × 矩阵 | 矩阵 × 向量 |
| 并行度 | 高 | 低 |
| 用途 | 处理输入 prompt | 逐个生成 token |
Cache 淘汰
当 cache 满时,策略包括:
- Rolling — 保留最近的 token,淘汰最旧的
- Session — 保存/恢复 cache 状态
- Swa — Sliding Window Attention,只缓存窗口内的 token
SWA 优化:保存 checkpoint 时,仅写入未被 mask 的 cell,跳过 padding/masked 位置,减少磁盘 I/O。
设备端状态 (On-Device State)
使用 LLAMA_STATE_SEQ_FLAGS_ON_DEVICE 标志保存序列状态时,每个序列只能保存一个状态。保存新状态会使之前保存的状态失效。这是设备端存储的限制。
MTP 推测解码与 KV Cache
在 MTP (Multi-Token Prediction) 推测解码中,draft token 使用自己的 cache 类型 (ctk),这会影响 KV Cache 的结构。Draft token 的 KV 需要独立管理,验证后可能被丢弃。
Tensor Parallel 量化 KV Cache
在多 GPU Tensor Parallel 推理中,KV cache 现在支持量化格式:
- 正确处理跨设备的部分缓冲区视图(partial buffer views)
- CUDA 后端在启动时预分配量化工作空间
- 减少多 GPU 场景下的显存占用
DeepSeek V3.2 DSA KV Cache
DeepSeek V3.2 使用专用 KV cache 类型 llama_kv_cache_dsa:
- 在标准 KV cache 基础上附加 lightning indexer 缓存
- 当
n_embd_head_k_full == indexer_head_size时自动创建 Hadamard 旋转张量
相关概念
- kv-cache — KV Cache 实现细节
- batch-decode — 批量解码机制
- backend — 不同后端的 cache 实现