关于大模型(5)预填充(Prefill)与解码(Decode)

📅 2026/8/16 5:00:21
关于大模型(5)预填充(Prefill)与解码(Decode)
5.1 预填充阶段Prefill——完整上下文并行计算、KV 初始化当用户输入一段 Prompt 给大模型时模型不会逐字计算而是一次性将整个 Prompt 所有 Token 送入网络完成一次完整的 Transformer 前向传播。这个阶段就是预填充阶段Prefill。之所以叫“预填充”是因为提前计算并缓存所有 Prompt Token 的 Key、Value为后续无限循环的解码阶段消除重复计算。Prefill 是自回归生成的“初始化阶段”。Prefill 核心执行特征输入形状[batch_size, prompt_len, hidden_dim]整段序列完全并行计算。注意力计算完整的L × L自注意力矩阵所有 Token 两两交互计算量是标准的O(L²)。层内运算大量大尺寸矩阵乘法GEMM、大规模Softmax、大规模加权求和、完整FFN运算。GPU的Tensor Core、FP16/FP8算力被充分利用。阶段瓶颈计算密集型FLOPS Bound。GPU 利用率极高通常可达 80%~100%显卡满载、功耗高、温度高。对应指标TTFTTime to First Token首token延迟TTFT 定义从请求抵达服务端 → 模型返回第一个生成 Token 的耗时。核心结论TTFT 几乎完全由 Prefill 耗时决定。Prompt 越长O(L²)计算量爆炸越明显首字越卡。这就是为什么几万字长文档问答首响应会明显延迟的根本原因。Prefill 阶段唯一输出整段序列所有层的 KV 张量写入显存缓存KV Cache序列最后一个位置的 hidden_state通过 LM Head 预测第一个生成 Token。关键Prefill 只会用最后一个位置 logits 做生成前面所有位置 logits 直接丢弃不参与解码。5.2 解码阶段Decode——单Token串行迭代、KV复用Prefill 完成、吐出第一个 Token 后模型正式进入解码阶段Decode这是大模型生成内容的主体阶段。自回归生成的天然约束第 N 个 Token 依赖第 N-1 个 Token 的结果无法并行、必须串行迭代。Decode 严谨计算流程每一步解码输入不再是完整序列仅输入最新的 1 个新 Token输入形状[batch_size, 1, hidden_dim]对当前新 Token 单独计算 Q、单步 K、单步 V从显存读取历史所有 Prompt 已生成 Token 的 KV Cache用单步 Query 与全局历史 KV 做注意力注意力矩阵尺寸为1 × L加权 V、过 FFN、层归一化、残差新 Token 的 KV 追加写入 KV Cache预测下一个 Token循环往复直到 EOS / max_new_tokens。Decode 阶段核心特征Prefill 是“算得多、搬得少”Decode 是“算得极少、搬得多”。Decode 单步计算量极低几乎没有FLOPS压力但每一步迭代都需要遍历读取整层、全序列的 KV Cache 读取全部模型权重。Decode 真实瓶颈显存带宽瓶颈Memory BoundGPU 计算单元大量空闲一直在等待数据从显存搬运到计算核心因此 GPU 利用率极低常为20%~40%。对应业务指标TPOTTime Per Output Token单token生成耗时TPOT 决定用户观感的「打字流畅度」。TPOT 越低逐字输出越丝滑TPOT 越高输出越卡顿、断断续续。生产环境中长生成场景 90% 总耗时都消耗在 Decode 阶段。5.3 两阶段核心差异对照表工业标准完整版维度Prefill 预填充阶段Decode 解码阶段输入序列长度完整 Prompt 长度 L每步仅 1 个 Token注意力矩阵尺寸L × L1 × L单步计算复杂度O(L²)O(L)总累计复杂度生成长度 NO(L²)仅一次∑O(Lt) ≈ O(N·L N²)核心瓶颈算力FLOPS 受限显存带宽访存受限GPU 算力利用率极高80%~100%极低20%~40%关键性能指标TTFT首 Token 延迟TPOT / ITL单 Token 耗时主要优化方向FlashAttention、大 Batch、矩阵加速KV Cache 优化、量化、PagedAttention、连续批处理KV Cache 增长趋势一次性分配固定 KV 显存L随生成长度线性递增追加L→LN瞬时显存峰值隐藏陷阱极高注意力分数 L×L 矩阵瞬时尖峰较低仅逐 Token 增量追加关键现象Prefill 阶段 GPU 满载、温度高Decode 阶段 GPU 空闲、带宽跑满、温度回落。这是完全正常的硬件特征算力密集型任务发热高于访存密集型任务哪怕带宽跑满算力单元空载也会降低功耗与温度。5.4 Batch1 完整逐行推理流程以 LLaMA-7B32层、hidden_dim4096、head_dim128为例Prompt「今天天气」4 Tokenmax_new_tokens3。1. Prefill 阶段完整流程文本分词得到 4 个 Token IDEmbedding 查表得到张量形状[1, 4, 4096]送入32层 Transformer 并行计算每层一次性计算4个Token的QKV每层生成尺寸为[4, 4]的注意力分数矩阵全局交互每层计算完成后保存该层 KVKV 形状[num_layers, 2, 4, head_num, head_dim]输出隐藏态 [1,4,4096]仅取最后一个位置 [1,4096] 送入 LM Head输出 logits、Softmax、采样得到第一个生成 Token「真」。至此 Prefill 结束KV Cache 初始化完成。2. Decode 阶段迭代流程第一次解码第5个Token输入仅新 Token「真」嵌入维度 [1,1,4096]仅计算当前Token的 Q、K、V从显存读取历史4个Token的KV拼接得到全局5序列KV注意力尺寸变为 1×5极快完成加权求和新 KV 追加进缓存KV 长度更新为5预测下一个 Token「好」。后续每一步解码逻辑完全一致KV 长度线性递增6→7→8……直到生成 Token 数量达到 max_new_tokens 或命中 EOS生成终止。5.5 复杂度真相与核心误区推理策略单步峰值复杂度最后一步总体累计复杂度全程无 KV Cache朴素自回归O((LN)²)∑(Lt)² ≈O(N·(LN)²)当 N ≈ L 时退化为O(N³)立方级爆炸有 KV Cache现代引擎O(LN)即 1 × L 扁平矩阵∑(Lt) ≈O(N·L N²)当 N ≈ L 时约为O(N²)平方级可落地常见错误将“单步峰值 O(L²)”误写为“整体推理复杂度 O(L²)”忽略了序列长度动态增长的累加效应。没有 KV Cache 时总体累计计算量实际是O(N³)立方级而非 O(N²) 或 O(L²)。结论没有 KV Cache 的推理复杂度是 O(N²)完全不可用每生成一个字重算整段上下文长文本推理算力爆炸、延迟爆炸。有 KV Cache 的推理复杂度Prefill O(N²)Decode O(L)工业界所有大模型服务全部依赖这一优化才得以落地。两阶段优化天然冲突Prefill 要大 Batch、大并行、榨干算力Decode 要小访存、高缓存命中、省显存。vLLM、TensorRT-LLM、PagedAttention、连续批处理本质都是调和两阶段优化冲突。5.6 工程实操补充生产必备1.KV Cache 不会自动释放原生 HuggingFace 推理循环如果不手动管理会持续 Append、显存泄漏越跑越卡2.多请求并发独立管理:每个请求拥有独立 KV Cache长度各不相同是动态显存管理如 PagedAttention的最大难点3.指标分布规律Prompt 越长TTFT 越高但 TPOT 基本不变生成越长TPOT 缓慢上升、TTFT 不变4.优化侧重量化、KV 压缩、GQA、PagedAttention 全部优先优化 Decode 阶段因为 Decode 占总耗时 90%。5.⚠️Prefill 瞬时显存尖峰极易被忽略的 OOM 元凶)在 Prefill 阶段注意力分数矩阵 ( L \times L ) 是瞬时分配的。以 L10000 为例该矩阵在 FP16 下占用约 200MB虽在该层结束后立即释放但瞬时峰值显存远大于 Decode 阶段的稳态占用。这意味着即使 KV Cache 总量加上模型权重并未超过 GPU 显存上限长 Prompt 的 Prefill 仍可能因这张临时“方阵”触发 OOM。这是生产环境中极容易被误判为“显存不足”但实际是“显存尖峰”的经典陷阱。5.7 高级延伸分块预填充Chunked Prefill——打破两阶段界限在传统的两阶段认知中Prefill 必须一次性计算完整个长 Prompt 才能进入 Decode。但这一逻辑在长文本 10k tokens场景下存在严重的队头阻塞Head-of-Line Blocking问题一个超长 Prompt 的 Prefill 会长时间独占 GPU 算力导致后续所有短请求的 Decode 步骤被迫排队等待GPU 在 Prefill 计算期间无法处理任何 Decode 请求。工业界解法vLLM 0.6.0 / SGLang 核心特性核心思想将超长 Prompt 的 Prefill 计算切分为多个 Chunk块不再一次性完成全部 Prefill。调度策略每完成一个 Chunk 的 Prefill 计算并生成该 Chunk 对应的 KV Cache调度器立即穿插执行其他请求的 Decode 步骤。最终效果Prefill 与 Decode 从“串行独占”变为微交错并行有效消除了长尾请求对短请求的阻塞大幅提升整体吞吐量和 P99 延迟稳定性。工程结论Chunked Prefill 实质上模糊了 Prefill 与 Decode 的传统物理边界是当代高并发推理引擎区别于早期 Hugging Face 朴素实现的标志性进化。本章总结Prefill 是计算密集、全局并行、O(L²)决定首字延迟 TTFT需警惕注意力分数矩阵 ( L \times L ) 带来的瞬时显存尖峰。Decode 是访存密集、串行迭代、O(L)决定流畅度 TPOT是推理耗时与显存占用的绝对主体90%KV Cache 是两阶段的桥梁Prefill 建缓存、Decode 增量复用缓存将总累计复杂度从 O(N³) 暴力拉回 两个阶段瓶颈完全不同优化策略完全不同Prefill 优化靠FlashAttention 和算力榨取Decode 优化靠量化、PagedAttention 和连续批处理。现代推理引擎vLLM、SGLang通过 Chunked Prefill 和 Continuous Batching进一步打破两阶段界限在微观时间片上交错执行 Prefill 与 Decode榨干 GPU 每一寸算力和带宽。所有长文本推理、显存优化、吞吐优化的工程实践全部建立在以上两阶段原理的物理认知之上。