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 数
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
相关概念
- kv-cache — KV Cache 实现细节
- batch-decode — 批量解码机制
- backend — 不同后端的 cache 实现