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 数
  • 层数使用 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

特性PrefillDecode
每次 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 旋转张量

相关概念