3、大模型推理基础:Transformer架构、自注意力机制、KV Cache概念、推理阶段(预填充与解码)

大模型推理的底层逻辑,本质上是对Transformer架构的逐层计算与状态管理。无论是系列、LLaMA系列还是其他主流大模型,其推理过程都遵循“预填充(Prefill)→ 解码(Decode)”的两阶段范式。理解这一范式的关键在于三个核心概念:Transformer的堆叠结构、自注意力机制的计算模式,以及KV Cache(键值缓存)如何避免重复计算。本章将从架构原理出发,逐步拆解推理阶段的计算特征、显存开销与性能瓶颈,为后续的量化、剪枝、算子优化等章节奠定理论基础。

Transformer 推理两阶段与 KV Cache 机制 阶段一:预填充(Prefill) 输入完整 Prompt(如 512 tokens) 1 2 3 … 512 并行计算所有位置 自注意力 + FFN(多层堆叠) 生成 K/V 并缓存 输出最后一个 的 logits 阶段二:解码(Decode) 逐 生成,每次只输入 1 个新 新 注意力计算(使用缓存的 K/V) Q: 当前 | K/V: 全部历史 采样下一个 循环直到生成 EOS 或达到最大长度 KV Cache 显存占用 L 层 × 2 (K/V) 每层都有独立缓存 H 个注意力头 每个头独立存储 D 维向量 每 维度 S 个 序列长度 显存公式 = 2 (K/V) × L × H × D × S × 2 bytes (FP16) 关键对比 Prefill:计算密集(矩阵乘大) | Decode:访存密集(读 KV Cache 为主)

上图展示了大模型推理的两阶段核心流程。左侧为预填充阶段,右侧为解码阶段,底部为KV Cache的存储结构。下面我们将逐一深入剖析每个环节的原理与工程含义。

3.1 Transformer架构:推理视角下的模块拆解

3.1.1 核心原理:从训练到推理的映射

现代大模型(如、LLaMA-2、Qwen等)的骨干网络均为仅解码器(Decoder-only)的Transformer。其基本单元由以下子层构成:

  • 多头自注意力(Multi-Head Self-Attention):捕捉序列内之间的依赖关系,是模型表达能力的核心。
  • 前馈神经网络(FFN):通常为两层线性变换加激活函数(如SwiGLU),对每个独立进行非线性特征变换。
  • 层归一化(LayerNorm/RMSNorm):稳定训练和推理过程中的数值分布。
  • 残差连接(Residual Connection):缓解深层网络梯度消失问题,保证信息流通。

在推理时,模型参数(权重矩阵)被加载到显存中,输入序列逐层经过上述模块计算。与训练阶段不同,推理没有反向传播和梯度更新,因此计算图是静态的,这为算子融合和内存复用提供了优化空间。

3.1.2 判断方法:识别推理时的计算热点

通过性能分析工具(如NVIDIA Nsight Systems、PyTorch Profiler)观察各模块耗时占比,可以发现:

  1. 注意力计算:在长序列场景下,QK^T矩阵乘和Softmax操作是主要耗时点。
  2. FFN层:在短序列场景下,FFN的矩阵乘(通常维度为隐藏层大小的4倍)占据主导。
  3. 归一化与残差:虽然计算量小,但涉及多次内存读写,在访存受限场景下不可忽视。
经验提醒:在GPU上,推理瓶颈通常不是“算力不足”,而是“显存带宽不足”。尤其是解码阶段,每个的生成都需要读取全部KV Cache,此时模型权重和KV Cache的访存开销远大于实际计算量。

3.1.3 案例拆解:LLaMA-2-7B的层结构参数

参数项数值推理影响
层数(L)32每层独立存储KV Cache,层数越多显存占用越大
隐藏层维度(D)4096决定矩阵乘的计算量和权重显存
注意力头数(H)32每个头维度为128,影响并行度
FFN中间维度11008FFN权重占模型总参数约2/3
上下文长度(S)4096KV Cache大小与S成正比

以FP16精度计算,该模型权重显存约为14GB(70亿参数×2字节)。当序列长度为4096时,KV Cache占用约为:2×32×4096×128×2字节 ≈ 1GB。可见,KV Cache在长上下文场景下是不可忽视的显存开销。

3.2 自注意力机制:从数学公式到计算模式

3.2.1 核心原理:缩放点积注意力

自注意力的计算可以表示为:

Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V

其中,Q(查询)、K(键)、V(值)均由输入序列通过三个不同的权重矩阵(W_Q, W_K, W_V)线性变换得到。在多头注意力中,该过程被拆分为H个独立的子空间并行计算,最后拼接并经过输出投影矩阵W_O。

从推理角度看,该公式揭示了两个关键特性:

  • 间依赖:每个的Q会与所有的K计算相似度,因此注意力权重反映了序列内部的关联强度。
  • 位置无关性:自注意力本身不感知位置顺序,需要额外加入位置编码(如RoPE旋转位置编码)来注入位置信息。

3.2.2 操作流程:解码阶段的注意力计算步骤

  1. 生成Q:仅对当前新计算Q向量(1×d_k)。
  2. 加载K/V:从KV Cache中读取历史所有的K和V矩阵(S×d_k)。
  3. 计算分数:Q与所有K做点积,得到1×S的相似度向量。
  4. 缩放与Softmax:除以√d_k后做Softmax归一化,得到注意力权重。
  5. 加权求和:注意力权重与V矩阵相乘,得到当前的输出向量。
风险提示:在预填充阶段,Q、K、V都是完整的S×d矩阵,计算是密集矩阵乘;但在解码阶段,Q只有1行,而K/V是S行,这导致GPU的矩阵乘单元利用率极低(通常低于5%),系统变为访存受限。

3.2.3 实战场景:FlashAttention的优化动机

传统注意力实现需要将S×S的注意力矩阵写入HBM(高带宽内存),再读回做Softmax和加权求和,产生大量内存访问。FlashAttention通过分块计算(Tiling)和在线Softmax,将注意力计算融合在SRAM中完成,避免中间矩阵的往返读写。在A100 GPU上,FlashAttention可将注意力计算速度提升2-4倍,同时减少显存占用。

对于推理场景,FlashAttention-Decoding进一步优化了解码阶段的计算模式,通过分裂KV(Split-KV)方式并行处理长序列,减少线程束发散。

3.3 KV Cache:空间换时间的核心工程实践

3.3.1 核心原理:为什么需要缓存

在解码阶段,每生成一个新,都需要计算其与历史所有的注意力。如果不做缓存,每次都要重新计算历史的K和V,计算量将随序列长度呈平方级增长。KV Cache的核心思想是:在预填充阶段一次性计算并存储所有的K和V,在解码阶段仅计算新的K和V并追加到缓存中。

KV Cache的存储结构为:[L, 2, B, H, S, D_head],其中L为层数,2表示K和V,B为批次大小,H为头数,S为当前序列长度,D_head为每个头的维度。

3.3.2 判断方法:显存容量估算与配置

在部署推理服务前,必须精确计算KV Cache的显存需求。以下是一个实际估算流程:

# 以LLaMA-2-7B为例,FP16精度
L = 32          # 层数
H = 32          # 注意力头数
D_head = 128    # 每头维度
S = 2048        # 平均序列长度
B = 8           # 并发批次大小
bytes_per_elem = 2  # FP16

kv_cache_bytes = 2 * L * B * H * S * D_head * bytes_per_elem
print(f"KV Cache 显存: {kv_cache_bytes / 1024**3:.2f} GB")
# 输出: KV Cache 显存: 8.00 GB

这意味着,在8个并发请求、平均2048 长度的场景下,仅KV Cache就需要8GB显存,加上模型权重14GB和激活值开销,单卡A100(80GB)可勉强支撑,但若序列长度翻倍或并发数增加,则必须考虑KV Cache量化(如INT8)或PagedAttention等优化手段。

3.3.3 常见误区与优化方向

  • 误区一:认为KV Cache只与模型大小相关。实际上,它主要与序列长度、并发数和层数相关,与模型参数量关系不大。
  • 误区二:忽略动态形状变化。解码阶段S是逐增长的,导致KV Cache显存动态变化,容易产生碎片化。vLLM的PagedAttention通过分页管理KV Cache,类似操作系统的虚拟内存,显著提升显存利用率。
  • 优化方向:KV Cache INT8量化(将FP16压缩为INT8,显存减半)、滑动窗口注意力(只缓存最近N个)、以及共享前缀缓存(多轮对话中复用系统提示词的KV)。

3.4 推理阶段:预填充与解码的差异化分析

3.4.1 核心原理:两阶段的计算特征对比

维度预填充(Prefill)解码(Decode)
输入规模整个Prompt(如512~2048 )单(1个)
计算模式密集矩阵乘,GPU利用率高访存密集,矩阵乘单元利用率低
延迟特征一次性计算,延迟与Prompt长度成正比逐生成,每个延迟相对稳定
显存行为生成完整KV Cache,显存峰值高KV Cache持续增长,显存逐步增加
优化重点减少计算量(如FlashAttention)减少访存量(如KV Cache量化、算子融合)

3.4.2 操作流程:一次完整推理的时序拆解

  1. 客户端请求:用户输入Prompt,服务端将其化。
  2. 预填充阶段:模型并行处理所有Prompt ,计算各层K/V并缓存,同时生成第一个输出的logits。
  3. 采样:对logits做Softmax并采样(如Top-p或温度采样),得到第一个生成。
  4. 解码循环:将新作为输入,重复“计算Q→读取KV→注意力→FFN→采样”的步骤,直到生成EOS或达到最大长度。
  5. 返回结果:将生成的序列解码为文本返回给用户。

3.4.3 案例拆解:连续对话场景下的性能优化

场景背景:某在线客服机器人使用LLaMA-2-13B模型,平均每轮对话包含系统提示词(约200 )和用户问题(约100 ),期望生成200 的回答。并发请求数为16,目标首延迟(TTFT)小于500ms,每个生成延迟(TPOT)小于50ms。

初始现象:实测TTFT为800ms,TPOT为65ms,均不达标。通过Nsight分析发现:

  • 预填充阶段耗时400ms,主要瓶颈在注意力计算(未使用FlashAttention)。
  • 解码阶段每个耗时65ms,其中读取KV Cache占40ms,矩阵计算仅占15ms。

优化操作:

  1. 启用FlashAttention-2,预填充耗时降至250ms。
  2. 将KV Cache从FP16量化为INT8,显存占用减半,访存带宽压力降低,TPOT降至45ms。
  3. 使用vLLM的PagedAttention管理KV Cache,显存碎片减少,支持更大的并发批次。

结果对比:TTFT降至320ms,TPOT降至42ms,均满足SLA要求。同时,由于显存利用率提升,单卡可支撑的并发数从16提升至24。

复盘经验:推理优化必须先定位瓶颈是计算密集还是访存密集。对于短Prompt长生成场景,解码阶段的访存优化收益最大;对于长Prompt短生成场景,预填充的计算优化更关键。

本章核心要点总结:
  • Transformer推理的核心是自注意力机制,其计算模式在预填充和解码阶段截然不同。
  • KV Cache是空间换时间的典型工程实践,其显存占用与层数、头数、序列长度和并发数线性相关。
  • 预填充阶段是计算密集型,解码阶段是访存密集型,优化策略需分别对待。
  • 实际部署中,需综合使用FlashAttention、KV Cache量化、PagedAttention等技术,才能满足低延迟、高吞吐的推理需求。