Skip to content

批量解码 (Batch Decode) 是 llama.cpp 的批处理机制,允许在一次 llama_decode 调用中同时处理多个 token 或多个序列。

为什么需要 batch-decode

单 token 解码(每次处理 1 个 token)无法充分利用 GPU 的并行计算能力。批量解码将多个 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 — 将整个 prompt(多个 token)一次处理
  • Parallel Decoding — 多个请求的 token 合并到一个 batch
  • Speculative Decoding — 候选 token 批量验证

Prefill vs Decode:

  • Prefill: batch 中包含同一序列的多个 token(矩阵 × 矩阵)
  • Decode: batch 中包含不同序列的单个 token(矩阵 × 多向量)

在源码中的实现

  • src/llama-batch.cpp — batch 构建工具
  • src/llama-context.cppllama_decode() 执行 batch
  • include/llama.hllama_batch 结构体定义
  • tools/server/ — server 的并发请求合并到 batch

相关概念

  • kv-cache — batch 中每个 token 的 K/V 存入 cache
  • backend — 后端负责 batch 的并行执行