LLM预填充基准测试解释 | AI生成和翻译

首页 2026.07

问题: 在 LLM 推理基准测试中,“prefill”是什么意思?比如“LLM prefill (8192x8192): 1,632 TFLOPS”这样的表述。

回答:

Prefill 是自回归推理的第一阶段——在生成开始之前,一次性对整个输入 prompt 进行前向传播。它不同于 decode(在 prefill 之后逐个生成 token)。

为什么是 8192x8192 这个具体数值

这是 seq_len x seq_len——一个 8192 token 的 prompt,因此注意力矩阵的大小是 8192×8192。该基准测试衡量的是对长度为 8192 的序列进行一次前向传播的吞吐量。

Prefill vs Decode——你已经关心的关键区别(KV cache 的工作)

Prefill:
  - 输入:一次性输入所有 N 个 prompt token
  - 计算:并行处理 N 个 token(一次 matmul 传递)
  - 瓶颈:受计算能力限制(大型 matmul,高算术强度)
  - 输出:所有 N 个 token 的 KV cache + 第一个生成的 token
  - 因此以 TFLOPS 来衡量——你受计算能力限制,
    所以 FLOPS/sec 是合适的指标

Decode:
  - 输入:每次输入 1 个新 token(使用 prefill 阶段缓存的 K、V)
  - 计算:batch=1(或小 batch)的 matvec,而非 matmul
  - 瓶颈:受内存带宽限制(加载权重 + KV cache
    占主导,算术强度低)
  - 因此 decode 通常以 tokens/sec 而非 TFLOPS 来衡量

为什么这个区别在实际中很重要

对于长度为 N 的 prompt,自注意力成本为 O(N²·d)(用于 QK^T 和 softmax·V)。这就是为什么 prefill 的计算量随 prompt 长度呈二次方增长,并且此时你才能真正饱和 GPU 的计算能力(MI300X 的 1,307 TFLOPS BF16 密集计算——你看到的 1,632 TFLOPS 意味着 MFU >100%……这有点可疑,除非它计算的是稀疏/结构化 FLOPS,或者是厂商的峰值营销数字,值得查一下来源)。

对一个具有 d_modeln_layers 的模型,进行长度为 8192 的序列的 prefill 的粗略 FLOPS 估算:

def prefill_flops(seq_len, d_model, n_layers, d_ff_mult=4):
    # 每层:QKV 投影 + 注意力 + O 投影 + FFN
    attn_proj = 4 * seq_len * d_model**2       # Q,K,V,O 投影
    attn_scores = 2 * seq_len**2 * d_model     # QK^T 和 softmax*V
    ffn = 2 * seq_len * d_model * (d_ff_mult * d_model) * 2  # 上+下投影
    per_layer = attn_proj + attn_scores + ffn
    return per_layer * n_layers * 2  # 乘以2是因为乘加操作

# 例如,一个 7B 左右的模型,seq_len=8192
flops = prefill_flops(seq_len=8192, d_model=4096, n_layers=32)
print(f"{flops/1e12:.1f} TFLOPs total for one prefill pass")

给定 GPU 的峰值 TFLOPS/sec,flops / peak_tflops 可以得到理论上的 prefill 延迟——当你对自己的 GPT-2 760M 或更大的训练/推理运行进行基准测试时,可以用这个来推理你的 MI300X 的预期首 token 生成时间。

你引用的 1,632 TFLOPS 数值是一个测得的吞吐量,而不是固定成本——它告诉你在那个特定的 8192×8192 prefill 工作负载下,硬件接近峰值的程度,这是厂商报告受计算能力限制的推理性能的标准方式。

参考资料:


AI生成和翻译,但整理分享仍需精力。如果觉得有帮助,欢迎 捐助支持。 微信:@lzwjavaWeChat QR · X: @lzwjava · 打个招呼 👋

返回 捐助