Luxsynthesis Blog
返回全部
基建

为什么 AI 不只吃算力,还吃内存:训练、推理和缓存讲明白

同一个大模型,训练时可能需要上百 GB 显存,推理时却能在一张 24GB 显存的 GPU 上运行。差别不只在算力,更在内存里要放什么、数据能多快送到 GPU。这篇从 HBM、主机内存和 SSD 讲起,解释训练、推理和缓存价格背后的机制。

作者
Luxsynthesis
发布日期
阅读时长
10 分钟阅读
为什么 AI 不只吃算力,还吃内存:训练、推理和缓存讲明白

谈到 AI 硬件,大家最先想到的通常是 GPU 算力。但在实际运行中,GPU 经常遇到另外两个问题:数据装不下,或者数据送得不够快。

以一个 7B 模型为例。7B 表示它大约有 70 亿个参数。在常见配置下,如果让这 70 亿个参数全部参与训练,显存需求通常会超过 100GB;如果一次同时训练的样本更多、输入更长,占用还会继续增加。到了推理阶段,同一个模型在适当配置下可以放进一张 24GB 显存的 GPU。

训练和推理用的是同一个模型,为什么内存需求会差这么多?要回答这个问题,需要先分清三件事:训练时内存里放什么,推理时内存里放什么,以及 HBM、主机内存和 SSD 各自负责什么。

HBM、主机内存和 SSD 有什么区别

大模型系统常用三层存储。它们的区别可以先记成一句话:越靠近 GPU,速度越快,但容量越小、价格也越高。

存储层直观理解速度容量主要作用
HBM(显存)学生面前的书桌最快最小放正在参与计算的数据
DRAM(主机内存)书桌旁的抽屉较慢较大临时存放显存装不下、又可能很快要用的数据
SSD(硬盘)教室后面的书柜最慢最大放数据集、训练存档和暂时不用的缓存
三层存储数据流动示意

显存压力大时,权重和优化器状态被卸载到 DRAM / SSD;激活值用完即弃或重计算。

GPU
HBM(显存)书桌
~2 TB/s
DRAM(内存)抽屉
~100 GB/s
SSD(硬盘)书柜

数据块边框颜色 = 目标存储层。方块沿虚线通道流动,点击切换查看训练与推理的流向差异。

可以把 GPU 想成一个正在写作业的学生。正在用的课本和草稿纸要放在书桌上;放进抽屉或教室后面的书柜,可以腾出桌面,但再次使用时要先取回来。真正参与 GPU 计算的数据也一样,最终要进入 HBM。

训练和推理都在使用这三层存储,但两者遇到的问题不同。简单来说,训练通常先被容量卡住,推理则经常被带宽卡住。

这里的带宽,可以理解为单位时间内能搬运多少数据。书桌能放多少本书,对应容量;一分钟能从抽屉里取出多少本书,对应带宽。容量回答"能装多少",带宽回答"取数据有多快"。

训练为什么需要这么多显存

训练会根据数据不断修改模型。因此,GPU 除了保存模型本身,还要保存修改模型所需的中间信息。

主要有四类:

  • 模型权重:模型已经学到的参数。
  • 激活值:数据经过每一层计算时产生的中间结果。后面计算如何修改参数时还要用到。
  • 梯度:告诉系统每个参数应该往哪个方向调整、调整多少。
  • 优化器状态:记录过去几次调整的方向和幅度,帮助训练过程更稳定。

训练有点像学生做完一道题后订正。模型权重是已经学会的解题方法,激活值是草稿纸上的计算步骤,梯度是老师标出的修改方向,优化器状态则像订正记录,记着前几次往哪个方向改、改了多少。要把解题方法改对,这些材料都要留着。

训练显存构成(可交互)

点击下方组件切换显示,查看训练显存是如何从 14 GB 涨到 104 GB 的。

推理基线14 GB
模型权重 14 GB
梯度 14 GB
优化器状态 56 GB
激活值 20 GB
训练总计104 GB

当前显存 104 GB,是纯推理(14 GB)的 7.4 倍。

推理主要是读取权重,训练却要同时保存这四类数据。模型越大、一次处理的样本越多、输入文本越长,显存占用就越高。所以,一个模型能在单张 GPU 上回答问题,却未必能在同一张卡上做全参数训练。

具体需要多少显存,没有一个适用于所有模型的固定数字。数据精度、一次同时处理多少样本(batch size)、输入长度、优化器和训练框架都会影响结果。但量级上的差别很稳定:7B 模型的权重本身只有十几 GB,全参数训练加上梯度、优化器状态和激活值后,通常会上升到 100GB 以上。

更直观的对比来自单 token 视角。以 Llama-3-8B 为例:推理时一个 token 的 KV Cache 约 0.25 MB(FP16);训练时一个 token 在前向传播中产生的激活值约 8.7 MB(FP16)——是推理单 token 的 35 倍。

单 Token 内存代价:训练 vs 推理

同一个模型,训练时一个 token 的激活值是推理时 KV Cache 的数十倍。

推理
0.25 MBKV Cache用完即弃
×35
训练
8.7 MB激活值保留到反向传播
激活重计算:训练中用 20–30% 的额外计算换掉大部分激活值存储。推理没有反向传播,激活值用完即弃,不需要这个技巧。

Llama-3-8B:训练一个 token 的激活值(8.7 MB)是推理 KV Cache(0.25 MB)的 35 倍。

显存不够时怎么办

训练系统常用三类方法降低显存需求:

方法用通俗的话说代价
分片(如 ZeRO)一套资料太多,就拆开分给几张书桌,也就是多张 GPU 保存GPU 之间需要频繁通信
卸载(Offload)把暂时不用的书放进抽屉(DRAM),甚至送到书柜(SSD)需要等待数据搬运
激活值重计算不保存全部草稿,也就是激活值,需要时再算一遍增加计算量和训练时间

这三类方法都没有让数据凭空消失。它们只是用更多通信、搬运或重复计算,换取更少的显存占用。

显存不够时的三种换法

点击下方策略,看显存压力如何下降,代价如何上升。数据不会凭空消失。

显存压力100%
GPU 显存(书桌)
付出的代价
GPU 间通信
0%
数据搬运
0%
重复计算
0%

当前显存压力 100%。开启任意策略,用通信、搬运或重复计算来换取显存。

训练过程中还会定期保存 checkpoint,也就是把当前权重和优化器状态写入 SSD。这像学生每做完一部分作业,就把进度保存好;即使电脑突然断电,也不用从第一题重新开始。checkpoint 主要用于容错,不是为了加快当下这一步计算。

推理为什么更关心带宽

推理是用训练好的模型回答问题。它不需要计算梯度,也不需要保存优化器状态,所以内存里的数据种类少了很多。除了模型权重,最重要的一项是 KV Cache

KV Cache 是什么

大模型生成回答时,是一个 token 接一个 token 往后写。token 可以理解为模型切分文字时使用的小单位,可能是一个字、一个词的一部分,也可能是一个标点。生成下一个 token 时,模型需要参考前面的输入和已经生成的内容。

如果每生成一个 token,都把前文从头计算一遍,会浪费大量算力。KV Cache 会保存前文已经算过的中间结果,让后面的生成直接复用。它保存的是模型处理文字后得到的计算结果,聊天原文仍然是输入的一部分。

KV Cache 可以理解成学生读长文章时做的笔记。没有笔记,每写一句回答都要从第一页重新读;有了笔记,就能直接查看前面已经整理好的重点内容。KV Cache 保存的就是这类供后续计算使用的"笔记"。

这样做能减少重复计算,但会占用显存。上下文越长、同时服务的用户越多,KV Cache 就越大。

具体来说,一个 token 的 KV Cache 有多大?以 FP16 精度为例:

模型单 token KV Cache(估算值)
Llama-2-7B约 1.0 MB
Llama-3-8B约 0.25 MB
Llama-3-70B约 0.63 MB
DeepSeek-V3 671B (MoE)约 0.5–1 MB
GPT-3 175B约 14.0 MB

同样是 70 亿到 80 亿参数级别的模型,Llama-3-8B 的单 token KV Cache 只有 Llama-2-7B 的 1/4。原因是 Meta 在 Llama-3 中引入了 GQA(分组查询注意力),把 Key 和 Value 的头数压缩到原来的 1/4。

更极端的例子是 DeepSeek-V3。它虽然参数量巨大(671B),但用了 MLA(多头潜注意力,Multi-head Latent Attention),把 KV 压缩成低秩潜向量再存储,单 token KV 反而被压到主流稠密模型的 1/10 到 1/4。这也是 DeepSeek 官方宣称"KV Cache 成本降到前代 1/10"的架构原因。

与这些架构创新形成对比的是 GPT-3 175B。它发表于 GQA 之前,没有做 KV 头压缩,单 token KV 高达 14 MB——这也是为什么长上下文在老架构上几乎不可行。

注意力架构如何压缩 KV Cache

切换架构,看 KV 头数和单 token 缓存大小如何被一步步压下来。

KV 头数8 / 8

亮色格子 = 实际存储的 KV 组。MHA 把 8 个查询头的 KV 压成 8 份。

单 token KV Cache14 MB
MHA 基线 14 MB
×1
代表模型GPT-3 175B

MHA每个查询头都有自己的 Key 和 Value,没有压缩。

MHA 是基线:每个头独立存储 KV,长上下文下缓存膨胀最快。

这些数字叠加上下文长度后增长很快:

模型8K 上下文32K 上下文128K 上下文
Llama-3-8B约 2 GB约 8 GB约 32 GB
Llama-3-70B约 5 GB约 20 GB约 80 GB
GPT-3 175B约 112 GB约 448 GB约 1.8 TB

一张 80GB 显存的 H100,在 128K 上下文下跑 Llama-3-70B,光 KV Cache 就几乎吃满。这也是为什么 DeepSeek、Mooncake、vLLM 都在拼命做 KV 压缩和分层存储——长上下文场景下,KV Cache 是显存的第一杀手。

KV Cache 随上下文长度增长

拖动滑块改变上下文长度,看 KV Cache 如何线性增长,何时顶破 H100 的 80 GB 显存上限。

上下文长度32K tokens
0
20
40
60
80
H100 80 GB
8 GB
Llama-3-8B
20 GB
Llama-3-70B

当前 32K 上下文:两个模型的 KV Cache 都在 80 GB 以内。

为什么 GPU 会"等数据"

生成回答的阶段通常叫 Decode。模型每生成一个 token,都要读取大量模型权重,以及此前积累的 KV Cache。

如果这些数据不能足够快地送进计算单元,GPU 即使还有空闲算力,也只能等待。这个时候,速度取决于每秒能从显存里读出多少数据。这就是内存带宽瓶颈。

想象一个写字很快的学生,每写一个词都要先翻一遍旁边的笔记。如果递笔记的速度太慢,他大部分时间只能坐着等。学生写字有多快,对应 GPU 的算力;笔记送到手边有多快,对应内存带宽。

推理为什么受限于带宽

推理每生成一个 token 都要把全部权重和 KV Cache 重新读一遍;读得不够快,GPU 就只能干等。

GPU 计算计算(写得多快)
等待数据中…
VRAM → GPU带宽(数据到得多快)
供不上
瓶颈: 显存带宽
GPU 利用率空闲 60%
计算
等数据

计算很快,但每个 token 都要重读全部权重和 KV Cache;带宽跟不上,GPU 就只能空转。这就是「推理看带宽」。

"训练看容量,推理看带宽"是一条便于理解的经验规律,不是对所有任务都成立的定律。短输入、高并发批处理或不同模型架构,可能让计算、容量和带宽的重要性发生变化。但对于常见的大模型训练和逐 token 生成,它能解释大部分现象。

KV Cache 放不下时,系统怎么处理

推理系统也会把数据分层存放:

存储层推理时通常放什么
HBM(显存)模型权重和正在生成回答的 KV Cache
DRAM(主机内存)暂时不活跃、但可能很快继续使用的 KV Cache
SSD(硬盘)更久没有使用、但仍有复用价值的缓存

系统会优先把当前请求需要的数据留在 HBM,把不那么紧急的数据移到主机内存或 SSD。就像学生把正在用的笔记放在桌面,刚用过的收进抽屉,很久不用的放回书柜。请求重新活跃时,系统再把相应缓存取回来。

Mooncake(月之暗面/Kimi)就是一个公开案例。它把 GPU 显存、主机内存和 SSD 组织成更大的 KV Cache 池,目标是在满足延迟要求的前提下,减少重复计算。vLLM、SGLang 等推理框架也在支持类似的分层缓存能力。

SSD 容量大、价格低,但速度远低于 HBM。它适合扩大可复用缓存的范围,却不能直接代替显存。系统需要提前取回数据,并在 GPU 用到之前送进 HBM;如果预测不准或搬运太慢,缓存反而会拖慢生成速度。

KV Cache 三级存储与动态调度

点击下方请求切换『当前生成中』的目标。系统会把它提升回 HBM,必要时把最久未用的缓存逐级下沉——就像把书桌腾出位置。

HBM(显存)· 书桌· 容量 2
DRAM(内存)· 抽屉· 容量 2
SSD(硬盘)· 书柜
请求 AHBM
请求 BHBM
请求 CDRAM
请求 DDRAM
请求 ESSD

HBM 装不下时,最久未用的缓存被下沉到 DRAM 或 SSD;请求重新活跃时再提升回 HBM。预取必须赶在 GPU 需要之前完成,否则反而拖慢生成。

为什么"缓存命中"的价格更便宜

理解了 KV Cache,厂商定价表里的"缓存命中"和"缓存未命中"就容易理解了。

一次推理可以粗略分成两个阶段:

  • Prefill:读取整段输入,并为它计算 KV Cache,相当于第一次读文章并做好笔记。
  • Decode:利用前面的计算结果,逐 token 生成回答,相当于看着笔记开始答题。

如果一个新请求的开头和此前处理过的内容完全相同,例如同一个系统提示词或同一份长文档,系统就可以直接复用已经保存的 KV Cache。被复用的部分不需要再次做 Prefill,只需要读取缓存,因此成本更低。

KV Cache 缓存命中 vs 未命中:120 倍成本差异

缓存命中就像第二张试卷附上了同一篇阅读材料。文章没有变,之前做的笔记可以继续用;只有新问题需要重新作答。缓存未命中则像换了一篇新文章,学生要重新阅读并做笔记。

截至 2026 年 7 月,DeepSeek 官方定价中,V4-Pro 每百万输入 token 的缓存命中价为 0.003625 美元,未命中价为 0.435 美元,相差 120 倍。价格以后可能调整,但差价背后的机制不会随定价表改变:缓存命中省掉了重复计算。

缓存命中 vs 未命中(可交互)

切换命中/未命中,拖动滑块改变前缀分界点,看 Prefill/Decode 与价格如何变化。

输入(按 token 切分)15 复用·5 新算
复用缓存(跳过 Prefill)新算 Prefill
前缀分界点前 15 个 token 可复用
相对计算成本×31
本次请求成本$0.1115/ 百万 token
命中价 $0.003625 · 未命中价 $0.435差距 ×120
执行阶段
Read Cache15 token
Prefill5 token
Decode

命中模式下,前 15 个 token 跳过 Prefill,只需读缓存。

命中前缀 15 / 20 个 token——这部分跳过 Prefill,只读缓存。省下的计算 ≈ 75%。

这里有两个容易误解的地方。

第一,缓存只降低输入中命中部分的成本。输出仍然要由模型逐 token 生成,不会因为输入命中缓存就免费。

第二,缓存匹配要求前缀相同。"意思差不多"不能算命中。系统会从输入开头开始比较,前面完全一致的部分可以复用,从出现差异的位置重新计算。

例如两份讲义的前 10 页完全相同,第 11 页开始不同,那么前 10 页的笔记可以继续使用,第 11 页之后要重新整理。

因此,在支持前缀缓存的 API 中,把固定的系统提示词和长文档放在前面,把每次变化的问题放在后面,通常更容易命中缓存。具体命中规则仍要以厂商文档为准。例如 DeepSeek 的硬盘缓存说明明确写明,缓存按前缀单元匹配,并采用尽力而为的方式,不保证每次都能命中。

训练和推理的区别,最后放在一张表里

维度训练推理
主要任务修改模型参数用已有参数生成答案
内存里主要放什么权重、激活值、梯度、优化器状态权重、KV Cache
单 token 内存代价(以 8B 模型为例)约 8.7 MB(激活值)约 0.25 MB(KV Cache)
常见瓶颈数据太多,显存装不下数据读取不够快;长上下文和高并发下也可能装不下
主机内存和 SSD 的作用保存数据集、checkpoint,以及卸载的训练数据保存暂时不用、但可能复用的 KV Cache
常见优化思路分片、卸载、重计算缓存复用、分层存储、压缩和预取
训练 vs 推理:一张表看清差别

切换模式,看两个阶段在任务、内存、瓶颈和优化思路上的根本差异。

主要任务

修改模型参数,让模型学会新东西。

内存里主要放什么
权重激活值梯度优化器状态4 类,显存占用大
单 token 内存代价(8B)
训练(激活值)
8.70 MB
推理(KV Cache)
0.25 MB
×35训练侧单 token 显存代价约是推理侧的 35 倍。
常见瓶颈
显存容量 vs 数据需求装不下
容量内
溢出
需求 150%容量 100%

数据需求约是显存容量的 1.5 倍——装不下的那部分就是瓶颈所在。

GPU 需要速率 vs 实际送达速率送不够快
GPU 需要
100%
实际送达
40%

显存带宽只能填满 GPU 需求的 40%——数据供不上,算力闲着。长上下文和高并发下也可能装不下。

主机内存 / SSD 的作用

保存数据集、checkpoint、以及被卸载出去的训练数据。

常见优化思路
分片卸载重计算

训练侧很多优化,是用更多通信和计算来换取更少的显存占用。

训练侧很多优化的目标,是用更多通信和计算减少显存占用。推理侧很多优化的目标,是用缓存减少重复计算,并及时把数据送到 GPU。

收尾

AI 系统并不是只有"算力"这一项资源。模型能不能运行、回答得快不快、API 为什么这样定价,都和内存容量、内存带宽以及数据在不同存储层之间的搬运有关。

目前 HBM 仍然负责最需要速度的部分,主机内存和 SSD 则负责扩大容量、降低成本。后两者能帮 HBM 分担多少工作,取决于缓存能否命中,以及数据能否在 GPU 需要之前及时取回。

因此,新一代 AI 芯片除了公布算力,也会反复强调 HBM 容量和带宽。GPU 的峰值算力只说明理论上限;如果数据供应不上,实际利用率仍然上不去。

返回全部