Skip to content

注意力优化与推理加速

KV Cache 原理、Prefill 与 Decode 阶段区别、MHA/MQA/GQA 演进、FlashAttention 与 Prompt Caching。

Updated View as Markdown
For humans

注意力优化与推理加速

校招考察频度:★ 高频(核心必背·高频生死线) 一句话速记:自回归生成每步复用历史 KV(Prefill 算全量,Decode 算单字);MQA/GQA 共享 KV 头狂砍显存,FlashAttention 在 SRAM 分块融合省 IO,Prompt Caching 前缀复用秒级降首字延迟。

在大模型从“实验室预训练”走向“工业级落地”的过程中,推理成本与显存占用(Memory Bound) 是最核心的工程挑战。面试官高频必考:KV Cache 的底层运作原理、Prefill 与 Decode 两大阶段的性能特征、GQA 与 FlashAttention 的优化本质,以及 Prompt Caching 前缀缓存机制。


一、KV Cache:大模型自回归推理的核心加速器

大模型生成文本是自回归模式(Autoregressive):每生成第 t 个 Token,必须依赖前 t-1 个已生成的 Token。

1. 为什么会有 KV Cache?(生活草稿纸比喻)

  • 无 Cache 的低效做法:每次生成一个新词,都要把前面所有已生成的词从头重新做一次 Q、K、V 矩阵映射并计算全局注意力。第 1 步算 1 个,第 1000 步算 1000 个,重复计算极其浪费算力。
  • KV Cache 优化:前面历史 Token 的 Key 和 Value 向量在计算完毕后永远不会再发生改变!因此可以用一张“草稿纸”(显存缓存)把它们保存下来。
    • 生成第 t 个新 Token 时,只需要计算当前这个 Token 自己的 Q_t, K_t, V_t;
    • 将 K_t, V_t 追加写入缓存;
    • 拿 Q_t 直接与缓存中所有的历史 K 做点积注意力计算,加权求和历史 V,即可产出下一个 Token 的预测分布!复杂度从多次平方求和降为单次增量。

2. Prefill 阶段 vs Decode 阶段(硬核面试必问!)

大模型推理时序被清晰地划分为两个截然不同的阶段:

阶段名称业务表现指标计算与硬件瓶颈特征优化核心
Prefill 阶段(预填充 / 提示词处理)首字延迟(TTFT, Time To First Token):用户发问到屏幕弹出第一个字的时间。一次性输入完整的 Prompt(可能几千 Token),所有 Token 完全并行计算。属于典型的 计算密集型(Compute-Bound),GPU 核心计算单元被充分吃满。靠算力并行加速、Chunked Prefill 防止打断其他任务、Prompt Caching 命中跳过计算。
Decode 阶段(解码 / 逐字吐出)生成吞吐(Tokens Per Second):屏幕打字速度。每一步输入只有 1 个 Token,模型参数量巨大但单步计算量极小。主要时间全花在“从高带宽显存(HBM)把海量模型权重和 KV Cache 搬运到 GPU 计算核心”,属于典型的 显存带宽密集型(Memory-Bound)!核心是减少显存搬运量(这正是 MQA/GQA、PagedAttention 和量化的发力点!)。

二、MHA、MQA 与 GQA 演进:显存狂瘦身

多头注意力(MHA)中,每个头都有自己独立的一套 Q, K, V。随着并发请求增加和长上下文普及,KV Cache 占用的显存会迅速超越模型权重本身!

MHA vs MQA vs GQA 键值头共享模式对比

  • MHA(Multi-Head Attention):8 个 Q 头配 8 个 K/V 头。模型表达力最好,但 KV Cache 极占显存。
  • MQA(Multi-Query Attention):8 个 Q 头共享同 1 个 K/V 头。显存砍掉 8 倍,但对复杂逻辑和多实体建模能力有明显折损。
  • GQA(Grouped-Query Attention):现代大模型工业界黄金折中标配(如 Llama 3、DeepSeek、Qwen)。例如将 32 个 Q 头分成 8 组,每组 4 个 Q 头共享 1 个 K/V 头。显存降低 4~8 倍,吞吐翻倍,而模型生成质量几乎无损!

三、FlashAttention:打破显存 IO 墙

传统自注意力计算中,性能瓶颈并不在 GPU 算力不够,而在于 HBM(显存)读写延迟过高:计算 S = Q * K^T、P = Softmax(S)、O = P * V 时,每次中间大矩阵都需要在 HBM 显存与 SRAM 片上高速缓存之间反复写入和读取。

  • 核心思想(算子融合与分块计算 Tiling):
    • 将 Q、K、V 矩阵分块切片,直接搬进片上超高速缓存(SRAM,带宽数倍于 HBM)。
    • 在线 Softmax(Online Softmax):巧妙地通过局部归一化因子的数学等价递推,无需保存完整中间矩阵,在一个 CUDA 核函数内一气呵成算完最终注意力输出并写回显存。
  • 效果:计算复杂度未变,但大幅减少了显存读写数据量,推理与训练提速 2~4 倍,显存峰值从 O(N^2) 降至 O(N)。
  • 面试一句话总结:FlashAttention 不是改变了算法数学结果,而是通过算子融合在 SRAM 中完成分块计算,攻克了 HBM 访存 IO 瓶颈。

四、Prompt Caching(前缀缓存技术)

随着 Agent 架构、长 System Prompt(数千 Token 的角色设定与 Tool 定义)以及多轮对话的爆发,相同或重叠的前缀输入在请求中反复出现。

Request 1: [System Prompt (2000 tokens)] + [Tool Schema] + [User: 你好]
Request 2: [System Prompt (2000 tokens)] + [Tool Schema] + [User: 今天北京天气?]
                               |
              【传统模式】: 每次都把前 2000+ tokens 全量重跑 Prefill (慢且贵)
              【Prompt Cache】: 前缀直接命中内存中的 KV Cache,Prefill 耗时趋近 0!

1. 核心机制

  • 前缀匹配(Prefix Matching / Radix Tree):推理框架(如 vLLM 的 RadixAttention、SGLang、Anthropic Claude)在显存/主机内存中维护一棵前缀树。
  • 当新请求到达时,系统自顶向下哈希匹配 Token 序列。匹配到的公共前缀 Token,直接复用已经计算好的 KV Cache,完全跳过 Prefill 阶段的 GPU 矩阵计算!

2. 带来的巨大收益

  • 极速首字响应(TTFT):首字延迟可从 2~3 秒直接骤降至几十毫秒(降低 80%~90%)。
  • 降低 API 成本:主流模型服务商(OpenAI、Anthropic、DeepSeek)对命中 Cache 的输入 Token 提供 50% ~ 90% 的折扣。
  • 工程编码最佳实践:
    • 静态内容放前面:将系统人设、工具声明、知识库固定文档始终置于 Prompt 的最开端。
    • 动态变量放末尾:将时间戳、随机数、用户当轮最新输入放在最后,避免破坏前缀连续性导致 Cache 失效。

面试追问

  1. KV Cache 是什么? 缓存自回归生成中历史 Token 的 Key 和 Value 向量,避免每吐一个新字都重复计算前文。让单步生成只用算当前新 Token。
  2. GQA 为什么成为现代大模型主流? 在 MHA 的全量表达力和 MQA 的极限压缩之间取得最佳平衡。多组 Q 头共享一组 K/V,显存砍掉数倍而质量几乎无损。
  3. FlashAttention 为什么能加速? 克服了显存读写(HBM IO)瓶颈。通过在片上高速 SRAM 分块融合计算与在线 Softmax,减少中间结果回写显存的次数。
  4. Prefill 和 Decode 阶段有什么本质不同? Prefill 一次性并行输入所有 Prompt Token,属于计算密集型(Compute-Bound);Decode 逐个吐字,单步计算小但频繁搬运海量权重和 KV Cache,属于显存带宽密集型(Memory-Bound)。
  5. Prompt Caching 如何优化 Agent 系统? 通过哈希匹配前缀树复用相同的系统提示词与历史对话 KV Cache,大幅砍掉 Prefill 重复计算,不仅首字延迟降低数倍,还能节省大量 API 调用费用。
Navigation

Type to search…

↑↓ navigate↵ selectEsc close