Skip to content

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

特性PrefillDecode
每次 token 数N(整个 prompt)1
计算类型矩阵 × 矩阵矩阵 × 向量
并行度
用途处理输入 prompt逐个生成 token

Cache 淘汰

当 cache 满时,策略包括:

  • Rolling — 保留最近的 token,淘汰最旧的
  • Session — 保存/恢复 cache 状态
  • Swa — Sliding Window Attention,只缓存窗口内的 token

相关概念