本文探讨了大模型推理中显存溢出(OOM)的根源——KV Cache。为解决有限显存下的速度与并发瓶颈,文章详解了四种主流优化技术:利用FlashAttention减少内存访问加速计算;通过PagedAttention(如vLLM)实现显存动态管理;采用MQA/GQA架构从源头降低KV Cache占用;以及使用量化技术进一步压缩显存。掌握这些技术组合,能显著提升推理服务的吞吐量与效率。
引言
假设你要部署一个 LLaMA-70B 的推理服务。
第一个问题是:显存够吗?模型权重 140GB(FP16),一张 H100 80GB 显存装不下,至少需要两张卡。
好,上了两张卡,模型加载成功。开始推理,第一个请求正常返回。但随着请求增多,你发现显存占用持续上涨,很快就 OOM 了。
这时候你可能会问:模型权重是固定的,为什么显存还会涨?
答案是KV Cache——推理过程中缓存的中间状态。每生成一个 token,KV Cache 就增长一点。请求越多、上下文越长,KV Cache 占用越大。
这就引出了大模型推理的核心挑战:如何在有限的显存中,让模型跑得更快、服务更多请求?
本文将沿着这个问题,一步步介绍四种主流的优化技术。
显存都去哪了?
在深入具体技术之前,先搞清楚一个基础问题:推理时显存都被什么占用了?
主要有三部分:
- 模型权重:固定占用,与模型大小成正比
- KV Cache:动态增长,与序列长度和并发请求数成正比
- 中间激活值:计算过程中的临时数据,计算完成后释放
对于推理服务来说,模型权重是固定成本,真正的变量是 KV Cache。
以 LLaMA-70B 为例,单个 token 的 KV Cache 约占 1.6MB。如果一个请求生成 4096 个 token,KV Cache 就需要 6.5GB。10 个并发请求?65GB。这还没算输入的 prompt 部分。
所以,优化大模型推理,核心是两件事:
- 让计算更快:减少每个 token 的生成时间
- 让内存更省:在相同显存下服务更多请求
接下来的四种技术,分别从不同角度解决这两个问题。
技术详解
一、FlashAttention:让计算更快
我们先从计算效率说起。
Transformer 的核心是注意力计算,公式很简单:
Attention(Q, K, V) = softmax(QK^T / √d) × V但这个公式有个隐藏的性能陷阱。
问题在哪?
计算 QK^T 会生成一个 N×N 的矩阵(N 是序列长度)。当 N=8192 时,单个注意力头的这个矩阵就需要 256MB。多头、多层叠加后,显存占用爆炸式增长。
但这还不是最大的问题。
GPU 有两种存储:高速缓存(SRAM,快但小)和显存(HBM,大但慢)。标准 Attention 的计算流程是:
- 从 HBM 加载 Q、K、V
- 计算 QK^T,写回 HBM
- 从 HBM 加载,计算 softmax,写回 HBM
- 从 HBM 加载,与 V 相乘,写回 HBM
发现问题了吗?数据在 HBM 和计算单元之间来回搬运了好几次。GPU 的计算速度极快,但 HBM 的带宽是瓶颈。大量时间浪费在"搬数据"而不是"算数据"上。
FlashAttention 的解法
既然瓶颈是内存访问,那就减少访问次数。
FlashAttention 的核心思想是分块计算(Tiling):把 Q、K、V 切成小块,每次只加载一小块到 SRAM,在 SRAM 里完成所有计算,只把最终结果写回 HBM。
这里有个技术难点:softmax 需要知道整行的数值才能计算(因为要除以总和)。分块之后,每次只看到一部分,怎么算?
答案是在线 Softmax:通过数学技巧,边算边更新,最终结果和一次性算完全一致。
效果如何?
- 内存占用从 O(N²) 降到 O(N)
- 训练速度提升 2-4 倍
- PyTorch 2.0+、Hugging Face Transformers 已内置支持
FlashAttention 解决了计算效率问题。但还记得我们开头说的 KV Cache 问题吗?FlashAttention 没有解决这个。
二、PagedAttention:让内存管理更高效
FlashAttention 让单次计算更快了。但在实际的推理服务中,还有一个工程问题:KV Cache 的内存管理。
问题在哪?
不同请求的序列长度不同:有的请求只生成 100 个 token,有的要生成 4000 个。而且生成是动态的,一开始不知道最终会有多长。
传统做法是预分配:假设最大长度 2048,为每个请求都预留 2048 tokens 的空间。
这会导致严重的浪费。实际测量显示,KV Cache 的有效利用率往往不足 50%。内存被白白占着,本可以多服务几个请求。
操作系统的启发
这个问题,操作系统早就解决过了。
物理内存有限,每个进程都想要大块连续内存。操作系统怎么做的?虚拟内存 + 分页:把内存分成固定大小的页,按需分配,进程看到的是"连续地址",实际物理位置可以不连续。
PagedAttention 把这个思想搬到了 KV Cache 管理上:
核心机制:
- 固定大小的 Block:把 KV Cache 划分为固定大小的块(如 16 tokens/块)
- 动态分配:用多少分配多少,不预占
- Block Table:维护逻辑地址到物理地址的映射
- 非连续存储:一个请求的 KV Cache 可以散落在不同位置
vLLM 的实现
vLLM 是 PagedAttention 的代表性实现,效果显著:
- 内存利用率从不足 50% 提升到接近 100%
- 吞吐量比 HuggingFace Transformers 提升 2-4 倍
- 支持 Prefix Caching(多请求共享相同前缀的 KV Cache)
到这里,我们解决了两个问题:FlashAttention 让计算更快,PagedAttention 让内存管理更高效。
但有没有办法从根源上减少 KV Cache 的大小?
三、MQA 与 GQA:从架构层面减少 KV Cache
前面两种技术是"优化使用",这种方法是"减少需求"。
问题在哪?
标准 Transformer 使用 Multi-Head Attention(MHA):每个注意力头都有独立的 Q、K、V。一个 32 头的模型,KV Cache 要存 32 组 K 和 V。
能不能让多个头共享 K、V?
MQA:激进的共享
MQA(Multi-Query Attention)的做法很激进:所有 Q 头共享同一组 K、V。
标准 MHA:32 个 Q 头 + 32 个 K 头 + 32 个 V 头 MQA: 32 个 Q 头 + 1 个 K 头 + 1 个 V 头KV Cache 直接减少到 1/32。但代价是模型质量有所下降。
GQA:平衡的选择
GQA(Grouped-Query Attention)是折中方案:把 Q 头分组,每组共享一套 K、V。
标准 MHA:32 个 Q 头,32 个 KV 头 GQA-8: 32 个 Q 头,8 个 KV 头(每 4 个 Q 共享 1 个 KV) GQA-4: 32 个 Q 头,4 个 KV 头(每 8 个 Q 共享 1 个 KV) MQA: 32 个 Q 头,1 个 KV 头实际应用
- LLaMA 2 70B:使用 GQA-8
- Mistral:使用 GQA
- Gemma:使用 MQA
GQA 在效率和质量之间找到了平衡,已成为大模型的主流选择。
但要注意:MQA/GQA 是模型架构层面的改动,需要在训练时就确定。已训练好的 MHA 模型无法直接转换。
到这里,我们从计算、内存管理、架构三个层面优化了推理效率。还有没有进一步压缩的空间?
补充:其他相关技术
除了上述三大核心技术,还有几种值得了解的优化方法。
KV Cache 量化
把 KV Cache 从 FP16 量化到 INT8 甚至 INT4:
- 内存占用减少 50%-75%
- 可能有轻微精度损失
- vLLM、TensorRT-LLM 已支持
Speculative Decoding(投机解码)
大模型生成是自回归的,每次只能生成一个 token,是串行瓶颈。
投机解码的思路:用小模型快速"猜"多个 token,再用大模型一次性验证。猜对了直接用,猜错了回退。
- 在不损失质量的情况下,推理速度提升 2-3 倍
- 需要小模型和大模型使用相同的分词方式
Sliding Window Attention
限制每个 token 只关注固定窗口内的上下文:
- Mistral 使用 4096 的滑动窗口
- KV Cache 大小恒定,不随序列长度增长
- 代价是超出窗口的信息会丢失
技术对比
各技术特点对比
回顾一下这些技术各自解决的问题:
- FlashAttention
- 解决问题:注意力计算的内存访问瓶颈
- 作用阶段:训练 + 推理
- 是否需要重新训练:否
- 主要收益:减少显存峰值,加速计算
- PagedAttention
- 解决问题:KV Cache 的内存碎片化
- 作用阶段:推理
- 是否需要重新训练:否
- 主要收益:提升内存利用率和并发能力
- MQA/GQA
- 解决问题:KV Cache 本身过大
- 作用阶段:训练 + 推理
- 是否需要重新训练:是
- 主要收益:从根源减少 KV Cache 占用
- KV Cache 量化
- 解决问题:KV Cache 精度冗余
- 作用阶段:推理
- 是否需要重新训练:否
- 主要收益:内存占用减少 50%+
场景适用性对比
不同场景下,推荐的技术组合:
- 高并发在线服务:PagedAttention(首选)+ KV Cache 量化
- 长上下文应用(RAG、文档问答):FlashAttention + PagedAttention + Sliding Window Attention
- 资源受限部署:选用 GQA 架构的模型 + KV Cache 量化
- 模型训练:FlashAttention(必选)+ GQA 架构(推荐)
- 低延迟场景:Speculative Decoding + FlashAttention
技术组合建议
这些技术并不互斥,可以叠加使用:
- 训练阶段:FlashAttention(必选)+ GQA(推荐)
- 推理阶段:FlashAttention + PagedAttention + KV Cache 量化
- 长序列场景:上述全部 + Sliding Window Attention
总结
让我们回到开头的问题:如何在有限的显存中,让模型跑得更快、服务更多请求?
这篇文章介绍的四种技术,从不同层面给出了答案:
FlashAttention:优化计算过程,减少内存访问,让每次计算更快。
PagedAttention:优化内存管理,消除碎片浪费,让相同显存服务更多请求。
GQA:优化模型架构,从根源减少 KV Cache,让内存需求本身变小。
量化:优化数据精度,在可接受的精度损失下,进一步压缩内存占用。
如果你在训练模型,FlashAttention 是必选项,架构上考虑 GQA。
如果你在部署推理服务,直接用 vLLM 或 TensorRT-LLM,它们已经集成了大部分优化。
这些技术的出现,让大模型从实验室走向生产环境成为可能。理解它们的原理,有助于在实际工程中做出更合理的决策。
如何系统的学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
01.大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
02.大模型 AI 学习和面试资料
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。