预填充阶段
3 秒看懂
Prefill 是大模型推理的第一个阶段:把一整段用户输入(prompt)一口气跑完,生成后续生成所需的所有隐藏状态(KV Cache)。它决定首 token 延迟,计算密度极高,可以并行处理输入中的所有 token。
3 分钟产业解释
当用户向大语言模型输入一段提示(prompt)时,推理服务器并不会逐字逐 token 慢慢处理,而是将整个 prompt 一次性输入模型。这个一次性处理的过程就是 Prefill(预填充)。 Prefill 阶段会计算输入序列所有层的 Key、Value 向量,并存入 KV Cache,同时输出最后一个 token 的隐状态作为解码起点。此后进入 Decode(解码) 阶段,模型一个 token 一个 token 地自回归生成回复。
Prefill 的计算特点是:
- 计算密集: 对 prompt 的每一层执行矩阵乘法,计算量大但高度并行,能打满 GPU 算力。
- 延迟主导首 token: 用户感知的“首个 token 生成时间”(TTFT)主要由 Prefill 耗时决定。
- 与 prompt 长度的关系: 计算量通常与 prompt 长度呈平方或线性关系(取决于注意力实现),prompt 越长,Prefill 时间越长。
工业界围绕 Prefill 做了大量优化,比如 分块预填充(Chunked Prefill)、与 Decode 的混合调度,以及将长 prompt 拆成多个 Prefill 任务以避免阻塞解码请求。
15 分钟专家深入
在 Transformer 自回归推理过程中,Prefill 阶段本质上是一次非自回归的前向传播。因为输入序列的所有 token 已经完整给定,不存在 token 间的时序依赖,所以可以像训练时一样,用大规模矩阵乘法一次完成所有位置的计算。
Prefill 阶段的主要任务:
- 对输入序列全部 token 计算每一层自注意力的 Query(Q)、Key(K)、Value(V)。
- 执行注意力分数计算和 softmax,得到每个层对所有位置的注意力输出。
- 将每一层的 K、V 张量存入 KV Cache,供后续 Decode 阶段复用,避免重复计算历史 token。
- 输出序列最后一个 token 的隐状态,作为自回归生成第一个新 token 的起始条件。
从系统调度角度看,一个推理请求经历 Prefill 后,会创建一个 KV Cache 块,并与该请求绑定。这个阶段通常会独占 GPU 的计算资源,直到 Prefill 完成,才会释放部分算力给其他请求的 Decode 步骤。
针对超长 prompt,业界发展出 Chunked Prefill:将长 prompt 切分成多个固定长度的块(chunk),每次只预填充一个 chunk 并保存部分 KV Cache,中间可以穿插其他请求的 Decode,以减少队头阻塞。但这并非让当前请求在 Prefill 期间就能开始解码;其解码仍需所有 chunk 完成后才启动,整体吞吐提升来自交错调度其他请求的解码。
vLLM 等框架更是实现了 Prefill 与 Decode 的统一调度:调度器动态决定将一次迭代分配给某个请求的 Prefill Chunk,还是某个请求的 Decode 步骤,从而在首 token 延迟与吞吐量之间取得更优平衡。
在分布式推理中,Prefill 可能触发跨卡通信。张量并行下,注意力计算中的矩阵乘法会被切分,中间结果需要 AllReduce;序列并行下,长 prompt 可能被分割到不同设备,计算注意力时涉及额外的通信。这些都会影响 Prefill 的延迟和扩展效率。
技术原理(最深层次)
计算过程与关键参数
给定输入序列长度 S,层数 L,隐藏维度 d,注意力头数 H,每头的维度 d_h。
在 Prefill 阶段,输入形状为 [batch\_size, S, d](推理时 batch_size 常为 1)。
- 线性投影:
通过权重矩阵
W_Q, W_K, W_V \in mathbb(R)^{d \times d}一次性映射出 Q, K, V,形状均为[b, S, H, d_h]。 - 注意力分数与加权: 标准缩放点积注意力:
text(Attention)(Q, K, V) = text(softmax)\!\left(frac(Q K^T){sqrt(d_h)}\right) V
这里 Q K^T 是一个 [b, H, S, S] 的矩阵,计算量 O(H \cdot S^2 \cdot d_h)。对于长序列,这部分的显存和计算开销急剧增长。FlashAttention 等优化算法通过分块计算避免完整 S×S 矩阵的物化,在不改变总计算量的情况下,通过减少对全局内存的读写将 I/O 开销的常数因子大幅降低,但计算总量不变。
3. KV 缓存更新:
每一层的 K、V 直接存储到 KV Cache 结构中,形状 [b, H, S, d_h]。后续解码阶段每生成一个新 token,只需计算该 token 的 Q,并与已缓存的完整 K、V 进行注意力运算。
4. 输出准备:
注意力输出经输出投影后,通过前馈网络(FFN),最终得到形状 [b, S, d]。通常只取最后一个位置的隐状态 h_S 用于预测下一个 token 的 logits。
计算量估算:
- 多头注意力的矩阵乘法:
4 \cdot b \cdot S \cdot d \cdot d(投影部分)+O(b \cdot H \cdot S^2 \cdot d_h)(注意力计算)。 - 前馈网络:通常两个线性层,形如
4 \cdot b \cdot S \cdot d \cdot d_{ff}(其中d_{ff}是 FFN 中间维度,常为 4d 或 8d/3 等)。 综合来看,Prefill 的 FLOPs 与输入长度呈近似线性到平方关系,取决于注意力复杂度占主导时的 S² 项。在 S 较小(如几百)时,线性部分主导;S 很大(数千或数万)时,平方项开始显著影响。
内存与显存占用
Prefill 阶段显存增量以 KV Cache 为主。每层的 KV Cache 大小 = 2 \cdot b \cdot H \cdot S \cdot d_h \cdot 2 字节(FP16 下)。总 KV Cache 大小 = 2 \cdot 2 \cdot L \cdot b \cdot H \cdot S \cdot d_h 字节。对于 7B 模型,L=32,H=32,d_h=128,单请求 2048 token 的 KV Cache 约 1 GB;S=2万时则膨胀至数 GB,直接限制并发请求数。
分段执行示例(ASCII 流程图)
时间 →
请求到达: [prompt tokens: x1, x2, ..., xn]
↓
[Prefill Start]
| 输入 Embedding: [b, n, d]
| 层 i=1..L:
| Linear(Q,K,V) [b, n, d] → [b, n, H, d_h]
| Attention(Q, K, V) 计算 [b, H, n, n] 注意力
| └─ 将 K, V 写入 KV Cache
| FFN: SwiGLU / ReLU 等
| 输出: [b, n, d]
| (通常仅保留最后一个位置) → 解码起点
[Prefill End]
↓
[Decode Loop]
| 层 i=1..L:
| 仅输入新 token x_t,计算其 Q,与 KV Cache 中之前所有 K,V 做注意力
| 更新 KV Cache(新增一个位置)
| 输出 x_{t+1} 直至 EOS
关键优化技术:
- 分块预填充: 将 n 个 token 分成 k 个块,每次只计算一个块,可穿插解码,平衡延迟与吞吐。
- MLA / MQA / GQA: 减少 KV 缓存头数,缩短 KV Cache 长度,间接降低 Prefill 的内存和计算压力。
- Pipeline 并行: 将 Prefill 分布在多张 GPU 上,通过微批次流水线减少气泡。
技术演进史
- 原始 Transformer 推理(2017-2019): 没有明确的 Prefill 概念,早期框架将输入序列逐 token 送入或一次性前向,但未系统性区分两个阶段,也未充分优化 KV Cache 管理。
- KV Cache 成为标准(2019-2020): 以 HuggingFace Transformers 为代表,实现
use_cache=True,自动在第一次 forward 时缓存所有层的 K、V,并用于后续自回归步骤。Prefill 一词逐渐被社区用来指代这第一次缓存计算的过程。 - 高效推理系统兴起(2022-2023): vLLM、TensorRT-LLM 等专门推理引擎出现,显式地将请求处理分为 Prefill 和 Decode 两个调度阶段。vLLM 提出 PagedAttention,将 KV Cache 以块管理,Prefill 时动态分配块,支持更灵活的显存共享。
- Chunked Prefill 与混合调度(2023-2024): 为解决长 prompt 阻塞问题,Sarathi-Serve、vLLM 等引入分块预填充。将 Prefill 切割为多个 step,与 Decode 交替执行,大幅降低长序列请求的平均延迟和队头阻塞。
- Disaggregated Prefill 探索(2024-): 学界和业界开始尝试将 Prefill 和 Decode 分离到不同的硬件池(Prefill 节点计算密集,Decode 节点内存带宽密集),独立扩缩容,以精细化资源利用率。部分开源项目已实现原型。
技术路线对比
| 维度 | 全量 Prefill (Naive) | Chunked Prefill | Disaggregated Prefill |
|---|---|---|---|
| 调度策略 | 整个 prompt 一次性计算完,期间不响应 Decode | 将 prompt 分成固定长度块,块间可插入 Decode 步骤 | Prefill 和 Decode 物理分离,各自独立调度 |
| 首 token 延迟 | 长 prompt 下很高,且易阻塞其他请求 | 首 token 延迟仍等于全序列 Prefill 完成时间,分块本身不降低本请求 TTFT | 端到端延迟增加一次跨节点数据传输,但可弹性扩缩容 |
| 吞吐量 | 长 prompt 时 GPU 利用率高,但请求排队严重 | 高,通过混合调度最大化硬件利用 | 可针对 Prefill 和 Decode 分别配置算力/内存带宽优化的硬件 |
| KV Cache 管理 | 一次性分配所有块 | 逐块分配,内存碎片更少 | 需要在 Prefill 节点与 Decode 节点间传输 KV Cache,增加网络开销 |
| 系统复杂度 | 低 | 中等,需实现分块和混合调度 | 高,需解决 KV 传输、一致性、负载均衡 |
| 代表实现 | 早期 vLLM ≤0.2.x, HuggingFace generate | vLLM ≥0.3.x, Sarathi-Serve | Splitwise, DistServe 等学术系统 |
上下游
上游:
- 模型架构: 注意力机制(MHA、GQA、MLA)、归一化层、激活函数,影响 Prefill 计算量和显存占用。
- 模型训练: 预训练得到的权重影响推理效率,训练时蒸馏/量化可为 Prefill 加速准备。
- 算子库: FlashAttention、FlashInfer、cuBLAS 等高度优化的核函数直接决定 Prefill 的浮点效率。
- 硬件: GPU(NVIDIA H100/H800/B200)、NPU、ASIC 等,其矩阵乘法吞吐量和显存带宽是 Prefill 性能的天花板。
下游:
- 推理服务框架: vLLM、SGLang、TensorRT-LLM、OpenLLM,直接面向用户的 API 延迟和吞吐。
- 上层应用: 聊天助手、代码补全、文本摘要、多模态交互等,其对 TTFT 的敏感度不同,影响 Prefill 优化的侧重点。
- 云服务与托管平台: 按 token 计价的 MaaS,Prefill 的效率直接影响毛利率和调度策略。
- 硬件采购决策: 对 Prefill 高比重场景,倾向高算力 GPU;对 Decode 高比重,倾向高带宽 GPU。
关键指标
- 首 token 生成时间 (TTFT): 从请求发出到首个生成 token 的延迟,Prefill 耗时占主导。
- Prefill 吞吐量 (tokens/s): 单位时间处理的 prompt 总 token 数,反映计算效率。
- KV Cache 占用 (GB): 每个请求的显存开销,影响最大并发数。
- 长序列衰减系数: 当 prompt 长度加倍时,TTFT 增长的比率。标准Transformer自注意力计算复杂度为O(n²),FlashAttention等优化仅降低I/O开销,未改变平方特性,因此实际增长接近平方而非线性;只有采用线性注意力机制才可能实现近似线性增长。
- 调度组合效率: 在混有不同长度请求的场景下,Prefill 策略对整体请求队列等待时间的影响。
供需与市场数据
- 需求侧: 随着 Agent 工作流、检索增强生成(RAG)、长文档分析普及,prompt 长度已从几百 token 激增至数万甚至数十万 token。谷歌 Gemini 1.5 Pro 支持 100 万 token 上下文窗口,推高了对极致 Prefill 性能的需求。
- 供给侧: NVIDIA 新一代 GPU 的算力(H200 的 1979 TFLOPS FP8)和显存带宽(H200 的 4.8 TB/s)持续提升,配合 FlashAttention-3 等算法,Prefill 处理能力每代有 1.5-2 倍提升。[根据英伟达产品白皮书估算]
- 定价影响: 部分推理 API 开始区分输入 token 和输出 token 的单价(输入通常低价,因为计算效率高),但输入 token 价格隐含了 Prefill 成本。若未来长 prompt 成为主流,输入 token 定价可能上浮以覆盖显存带宽压力。
- 产业链规模: 暂无专门针对 Prefill 环节的独立市场规模统计,但它依附于大模型推理市场。据 Ark Invest 等机构预测,2030 年全球推理市场可达数百亿美元,其中 Prefill 相关的软硬件优化将分享可观份额。
代表公司与资本映射
- NVIDIA: 硬件龙头,GPU 算力和 TensorRT-LLM 推理库直接定义 Prefill 性能基线。其 Grace Hopper 架构中 high-bandwidth memory 专门缓解 KV Cache 带宽瓶颈。
- AI 推理框架公司/项目:
- vLLM(加州大学伯克利分校发起,已成为社区主流):率先引入PagedAttention,并后续集成了Chunked Prefill技术(该技术最早由Sarathi-Serve提出),是Prefill优化领域的标杆项目。
- Anthropic: 其内部推理系统可能已采用 Disaggregated 或类似技术,但未公开细节。Claude 长上下文能力背后依赖高效 Prefill。
- OpenAI: 通过分层缓存、推测解码等综合技术降低 TTFT,间接优化 Prefill 感知延迟。
- 云计算厂商(AWS、Azure、GCP):自研推理加速芯片(Trainium、Inferentia、TPU)时需专门设计 Prefill 流水线,例如 TPU v5p 的 SparseCore 可能被用于加速注意力计算。
- 创业公司:
- d-Matrix: 针对推理的存内计算芯片,强调 Prefill 和 Decode 的异构计算。
- Groq: LPU 架构擅长低延迟,其 Prefill 处理因确定性调度而表现出极低的首 token 延迟。
投资逻辑
- 长上下文应用爆发带来的 Prefill 优化刚需: RAG、法律合同审查、生物序列分析等场景要求处理超长 prompt,能够用线性或亚线性复杂度处理 Prefill 的技术(如 Mamba、RWKV、线性注意力)或硬件可能获得超额收益。
- 推理成本结构分化: 当输入 token 远多于输出 token(如摘要生成),总体推理成本主要由 Prefill 驱动。投资能大幅降低 Prefill 单位成本(例如专用 ASIC)的公司将受益于知识密集型应用的扩展。
- 推理基础设施的分化: 未来可能出现 Prefill 和 Decode 分别优化的异构集群,服务器、交换机、内存厂商将在该趋势中寻找新机遇。
- 软件生态壁垒: Chunked Prefill、Disaggregated 等方案需要深度集成到推理框架,已建立生态的框架(如 vLLM 社区)具有先发优势,相关商业支持公司具备资本价值。
常见误读纠偏
-
误读:“Prefill 阶段就是模型的一次训练前向”
- 纠偏: 虽然都包含完整前向传播,但训练前向需要保留所有中间激活用于反向传播,而 Prefill 只保留 KV Cache,且目标是最小化延迟,因此在内存分配、计算融合、精度上差异显著。Prefill 可以采用非确定性算法(如 FlashAttention 的 recompute 技巧)和更低精度(INT8/FP8/FP4),而训练通常难以直接套用。
-
误读:“Chunked Prefill 把 Prefill 拆小会降低 GPU 利用率”
- 纠偏: 长 prompt 一次 Prefill 的确能让 GPU 满载,但这会导致其他短请求排队等待,整体 GPU 虽然“看起来”利用率高,但系统吞吐量可能因队头阻塞反而降低。Chunked Prefill 通过穿插短请求的 decode 步骤,让 GPU 计算单元和内存带宽更均衡地忙碌,实际整体吞吐提升,尾延迟降低。尤其在批量推理场景下,混合调度比纯全量 Prefill 更优。
学习路径
- 基础: 阅读 Transformer 原论文《Attention Is All You Need》,理解自注意力机制,手动推导 Prefill 与 Decode 的差异。
- 动手: 使用 HuggingFace
model.generate()开启return_dict_in_generate,观察 KV Cache 状态;尝试调用 vLLM 的离线推理并设置max_num_batched_tokens感受分块调度。 - 深入系统: 阅读 vLLM 论文《Efficient Memory Management for Large Language Model Serving with PagedAttention》及 Chunked Prefill 相关 blog,理解调度器设计。
- 硬核内核: 学习 FlashAttention 和 FlashInfer 的实现,理解如何在 CUDA 核函数中通过 tiling 避免完整注意力矩阵读写,并映射到 Prefill 的高吞吐。
- 前沿: 跟踪 Disaggregated Prefill 论文《Splitwise: Efficient Generative LLM Inference Using Phase Splitting》及开源项目 DistServe,思考分离式架构的商业可行性。
一句话总结
Prefill 是 LLM 推理中将 prompt 一次处理并奠定生成基础的阶段,其计算密集特性与优化方向直接定义了大模型应用的首延迟体验和成本结构。
延伸阅读与来源
- Vaswani et al., 《Attention Is All You Can》, NeurIPS 2017.
- Kwon et al., 《Efficient Memory Management for Large Language Model Serving with PagedAttention》, SOSP 2023.
- Agrawal et al., 《Sarathi-Serve: A Low-Latency and High-Throughput Scheduling for LLM Inference》, OSDI 2024.
- Patel et al., 《Splitwise: Efficient Generative LLM Inference Using Phase Splitting》, ISCA 2024 (or arXiv 2311.18677).
- NVIDIA TensorRT-LLM 文档, FlashAttention 算法系列 (Dao et al., 2022, 2023).
- vLLM 项目 GitHub: https://github.com/vllm-project/vllm
- 各公司财报/技术博客中对推理延迟和吞吐的公开披露(未提供具体数值,但可用于验证趋势)。