大模型推理面¶
一个 7B 模型使用 GQA(分组数=4),FP16 推理,输入 4096 token,batch=8,KV Cache 占多少显存?¶


我们以典型的 LLaMA‑7B 架构为例进行精确计算。LLaMA‑7B 的主要参数:

每个 token 在每一层的 Key 缓存大小:

同样,Value 缓存也是 1024 字节。因此每 token 每层的 KV 缓存总大小为 2×1024=2048 字节。
对于 32 层,单个 token 的 KV 缓存为:

这个数值不到 MHA 的 1/8(MHA 下有 32 个头,每 token 每层的 KV 大小为 32×128×2×2=16 384 字节,单 token 总缓存为 512 KB),GQA 确实极大地压缩了 KV Cache。
现在计算给定配置下的总 KV Cache:
-
Batch size B=8
-
每个序列长度 S=4096 token(这是 Prefill 完成后的序列总长度,或者 Decode 过程中的最大长度)
总 KV Cache 大小为:

我们先算 B×S=32768 个 token,再乘以每 token 每层 2048 字节,得到所有 token 在单层的缓存:32 768×2048=67 108 864 字节 ≈ 64 MB。 再乘以 32 层,总大小:

📌 总结:7B 模型,GQA=4,FP16,输入 4096,batch=8 → KV Cache ≈ 2 GB。这个计算清晰展示了 GQA 对于大 batch 和长序列推理的必要性。

推理时显存主要被哪几部分占用?各自占比大概多少?¶

大模型推理的显存占用,可以看作一座漂浮的冰山。我们能直接看到的是庞大的模型权重,但水面下还有两块巨大的“底座”:KV Cache(键值缓存) 和激活值/中间缓冲区。它们的占比并不是固定不变的,而是随着上下文长度和批量大小剧烈变化。
-
模型权重:这是推理的入场券。无论你问一个字还是万字长文,整个模型的参数都必须安静地躺在显存里。对于FP16精度的7B模型,这部分固定占约14 GB。它是冰山海面以上的部分。
-
KV Cache:这是推理过程的“记忆成本”。每生成一个词,模型的所有层都要把当前词对应的Key和Value向量追加保存,以便后续词不再重算历史。它的显存占用会随着序列长度和batch size线性增长,是长文本推理中最凶猛的“吞金兽”。在短文本下它可能只占5%,但在超长上下文(如32k)时,它甚至可以超过权重本身,达到60%以上。
-
激活值与临时缓冲区:在“预填充”阶段,当模型一口气吃下整个Prompt时,内部会产生大量的中间计算结果(如注意力矩阵、残差连接等)。这部分峰值显存有时非常可观,尤其是在未使用FlashAttention等优化时,注意力矩阵的大小是序列长度的平方级。但在“解码”阶段,由于每次只处理一个词,这部分占用通常很小且稳定。此外,深度学习框架本身(如PyTorch)和显存碎片也会额外吃掉0.5~2 GB。
-
其他固定开销:包括CUDA运行时上下文、内核驱动占用等,通常在一百兆到几百兆之间。
如果用一张粗略的饼图来描绘不同场景下的占比,它会是这样变化的:
| 占用组件 | 短文本交互 (512 tokens) | 中等长度 (2048 tokens) | 长文本分析 (32768 tokens) |
|---|---|---|---|
| 模型权重 | ~85% (主导) | ~60% | ~25% |
| KV Cache | ~5% | ~25% (显著增长) | ~65% (成为绝对主导) |
| 激活/缓冲 | ~8% | ~12% (预填充峰值) | ~8% (经FlashAttention优化后) |
| 框架开销 | ~2% | ~3% | ~2% |
💡 核心洞察:上下文长度是决定显存压力模式的核心变量。 在短对话中,你的钱主要花在“买模型”上;而在长文档分析中,你的钱主要花在“维持记忆”上。优化长文本推理,首要目标是砍向 KV Cache。
写出 MHA 下 KV Cache 显存的计算公式,并解释每个变量。¶
在标准的多头注意力(MHA)机制下,每一层Transformer都需要缓存所有历史token的Key和Value向量。计算这部分显存占用,是每位推理工程师的基本功。
公式如下:

我们来逐一拆解每个变量,并赋予它们工程直觉:
-
2(Key和Value两份):每一层、每个头都需要同时存储Key和Value,两者完全对称,大小相同。这是最直接的2倍关系。 -
L(层数, Layers):每一层都有自己独立的K、V投影矩阵,不同层之间的缓存互不共享,必须全部保留。这是模型深度的代价。 -
B(批量大小, Batch Size):不同的推理请求是完全独立的,它们的KV Cache严格隔离。因此,显存占用会随并发请求数线性增长。这是推理服务吞吐量的核心限制。 -
S(序列总长度, Sequence Length):即“Prompt长度 + 已生成token数”。这是变量,会随着生成过程从0线性增长。当上下文达到数万时,这个因子会变得极为恐怖。 -
D_{\text{model}}或H \times d_h(模型宽度):这是每个token表征的维度。H是注意力头数,d_h是每个头的维度。在7B模型中,这通常是4096。模型的宽度越宽,每一步需要记忆的信息就越多。 -
sizeof(dtype)(精度字节数):FP16为2字节,INT8为1字节,INT4为0.5字节。对KV Cache进行量化是节省显存最直接的手段之一。
💡 直觉理解:可以把KV Cache想象成一个巨大的Excel表格,行是
L层,列是S个时间步,每个单元格里都存放着一对维度为D_{\text{model}}的Key和Value向量。每处理一个新词,就在表格右侧新加一列。
一个 7B 模型,FP16 精度,推理时权重占多少显存?¶
这是一个直接而关键的计算,它定义了我们推理的“地板”——无论如何都无法逾越的最低显存门槛。
-
参数总量:7B(70亿)个参数。
-
精度:FP16(半精度浮点),每个参数占用2字节。
-
计算公式:
7 × 10^9 × 2 bytes = 14 × 10^9 bytes。

同样 7B 模型,若用 MHA,推理时输入长度 2048,batch=1,KV Cache 占多少显存?¶
现在我们要让模型真正“思考”起来。当输入长度为2048个token,且一次只回答一个问题(batch=1)时,模型需要“记住”这些token的KV对。我们需要代入具体模型架构参数。以标准的LLaMA-7B为例:
-
L= 32层 -
D_{\text{model}}= 4096 -
H= 32个头 (这里D_model = H * d_h, d_h=128) -
S= 2048 -
B= 1 -
sizeof(dtype)= 2 (FP16)
我们代入公式:

这个计算过程可以这样直观理解:
-
每一层的Key或Value缓存大小 =
2048 (序列长度) × 4096 (模型宽度) × 2 (字节) ≈ 16 MB。 -
每一层完整的KV缓存(K+V两份) =
16 MB × 2 = 32 MB。 -
所有32层的KV缓存 =
32 × 32 MB = 1024 MB = 1 GB。
💡 结论:在这个场景下,KV Cache只占了大约1 GB,相比14 GB的模型权重,它还是个小角色。这也是为什么在短文本交互中,KV Cache的压力并不大。
若把上题的 MHA 换成 GQA(8 组),KV Cache 减少多少?¶
分组查询注意力(GQA)是给KV Cache“瘦身”的利器。它让多个查询头共享同一组Key和Value头,从而从源头上减少了需要缓存的头数。
机制转变:
-
在MHA中,我们有32个查询头,以及32个独立的Key/Value头。
-
在GQA-8中,我们依然有32个查询头,但它们被分成了8组。每组内的4个查询头共享同一个Key头和一个Value头。这意味着我们只需要存储8个Key/Value头,而不是32个。
减少量计算:
KV Cache的大小与需要存储的Key/Value头数成正比。所以,GQA带来的压缩比是:

减少了:1 GB - 0.25 GB = 0.75 GB (768 MB)。
🚀 工程价值:这个改动以几乎可忽略不计的性能损失,将KV Cache缩小到原来的四分之一。这也是为什么像LLaMA-2 70B、Mistral等现代大模型都纷纷拥抱GQA的原因。它让同样的显存可以服务更多并发用户,或者承载更长的上下文。
给定一张 80GB 的 A100,一个 FP16 的 13B 模型,最大能支持多长的上下文?¶

这是一个经典的“在给定预算下,我能买多少东西”的规划问题。我们手上有80GB的显存预算,需要扣除固定开销后,看看剩下的钱能“购买”多长的记忆。
-
计算固定开销(底价)
-
模型权重:13B参数 × 2字节 = 26 GB。这是必须全额支付的首付款。
-
激活值、框架与其他临时缓冲:经验上,这部分需要预留约 4 GB。它用于存放计算过程中的草稿纸。
-
剩余给KV Cache的预算:
80 GB - 26 GB - 4 GB = 50 GB。这是我们用来“租用”记忆空间的全部资金。 -
计算“记忆”的单价(每个token的成本)
我们需要知道模型架构。以典型的LLaMA-13B为例:
-
L= 40层 -
D_{\text{model}}= 5120 -
假设使用MHA,
H=40,d_h=128,或者直接使用D_{model}计算。
每生成一个token,需要为所有层新增的KV Cache大小为:

⚠️ 现实中的“摩擦成本”
理论值65k是一个理想上限。在实际的“预填充”阶段,模型还需要为注意力计算分配巨大的临时空间(即使经过FlashAttention优化,也仍有开销)。这就像租房还要付押金和中介费一样,会挤占我们的预算。因此,真实可用的最大长度会略低于理论值,通常在 50k 到 60k 之间。
如果模型采用GQA,例如G=10,那么KV Cache单价会变为原来的1/4,最大长度便可轻松突破20万tokens。
什么是推理时的“预填充”(Prefill)和“解码”(Decode)阶段?它们的计算和显存特点有何不同?¶
理解这两个阶段,就理解了推理性能优化的全部核心。它本质上是“并行处理”与“串行循环”两种计算模式的切换。
-
预填充 (Prefill) 阶段 —— 并行计算的冲刺
-
它在做什么? 当你把一个问题(Prompt)发送给模型时,它会把整个Prompt序列一次性“吞入”肚子里。在这一步,它并行计算出所有token的注意力,并为每个token生成第一批Key和Value缓存。这相当于一个学生花几分钟一口气读完一道冗长的材料题。
-
计算特点:计算密集型。大量的矩阵乘法(比如
Q × K^T)在这个阶段同时发生,能将GPU的Tensor Core算力占满。GPU在此时就像一台全速运转的涡轮发动机。 -
显存特点:显存峰值高。并行处理意味着需要在显存中同时展开整个计算图,会产生一个巨大的、与序列长度平方成正比的注意力矩阵(如果未使用FlashAttention),这会形成一个瞬时的显存高峰。这就像冲刺时需要大口呼吸,消耗大量氧气。
-
解码 (Decode) 阶段 —— 串行循环的马拉松
-
它在做什么? 预填充完成后,模型进入“一个字一个字”的生成过程。每生成一个新词,它只计算这个新词的查询向量(Q),然后从显存中读取之前存好的所有历史Key和Value,完成注意力计算。这就像学生动笔答题,每写一个字都要回顾一遍整篇材料。
-
计算特点:显存带宽受限。每生成一个词,计算量极小,但需要从显存中读取整个模型权重(数十GB)和全部的KV Cache(可达数GB)到计算核心。此时,GPU的99%算力都在闲置等待数据,就像一个法拉利引擎被堵在早高峰的车流中。它的速度完全取决于显存搬运数据的快慢(带宽)。
-
显存特点:动态稳定增长。临时计算的“草稿纸”(激活值)占用很小且稳定,但KV Cache这座“记忆仓库”会随着每个新词的生成而线性扩建,成为显存占用的主体。
为什么 Decode 阶段通常是显存带宽受限的,而非计算受限?¶
要理解这个问题,可以想象一个仓库管理员。他的工作不是自己生产东西,而是每收到一张新订单(一个 token),就跑到巨大的仓库(显存)里,把整个产品目录(模型权重)和所有客户的档案(KV Cache)都搬出来,核对一下,然后只做一点点更新工作。
-
计算量极小:在 Decode 阶段,每次只处理一个新 token。矩阵乘法的维度很小,比如
[1, 4096] × [4096, 4096],这种计算对 GPU 来说连热身都算不上。 -
数据搬运量极大:为了完成这点微小的计算,GPU 必须从显存中读取整个模型权重(7B 模型约 14 GB)和迄今为止的全部 KV Cache(在长序列下可达数 GB)。
-
硬件能力严重错配:以 NVIDIA A100 为例,它的 FP16 算力高达 312 TFLOPS(每秒 312 万亿次计算),但显存带宽“只有”2 TB/s(每秒 2 万亿字节)。这意味着,每从显存搬运 1 个字节的数据,就需要完成约 150 次浮点运算,才能让计算单元不闲着。而在 Decode 阶段,搬完所有数据后能做的计算量远远达不到这个比例,导致绝大多数计算单元空转等待。
工程直觉:可以将 Decode 阶段想象成一个给超级跑车加油的过程。车的速度(算力)极快,但加油枪的流速(带宽)很慢,车大部分时间都停在加油站,而不是在赛道上飞驰。因此,任何提升带宽利用率、减少数据搬运量的技术(如 GQA、KV Cache 量化、FlashAttention)对 Decode 的加速效果,远比提升算力本身显著。
如何估算给定模型和硬件下支持的最大 batch size?写出推演过程。¶
估算最大 batch size 本质上是一个“显存预算分配”问题。你手上有一笔固定资金(总显存),需要扣除“房租”(模型权重)和“生活费”(激活值等固定开销)后,剩下的钱才能用来“雇佣”更多工人(并发请求),每个工人需要一笔“安置费”(单个请求的 KV Cache)。
推演过程:
第一步:明确总预算 M_total
假设我们有一张 80 GB 的 A100 显卡。
第二步:扣除“固定开销” M_fixed
-
模型权重
M_weight:参数量 × 精度字节数。例如,13B 模型,FP16 精度,13 × 10^9 × 2 = 26 GB。 -
激活值、框架开销等
M_overhead:这部分用于存储中间计算结果和框架运行所需空间,根据经验通常预留 2~4 GB。我们取 4 GB。 -
固定开销
M_fixed = 26 + 4 = 30 GB。
第三步:计算可用于 KV Cache 的“剩余预算” M_kv_budget
M_kv_budget = M_total - M_fixed = 80 - 30 = 50 GB。
第四步:计算单个请求在给定序列长度下所需的“KV Cache 单价” M_kv_per_seq
这里需要模型架构参数。假设该 13B 模型采用标准 MHA,层数 L=40,模型宽度 D=5120,精度 FP16,我们要支持最大序列长度 S=2048。
-
单个 token 在每层的 KV Cache 大小:
2 × 1 × 1 × 5120 × 2 = 20,480 bytes = 20 KB。 -
整个序列在每层的 KV Cache 大小:
2048 × 20,480 bytes = 41,943,040 bytes ≈ 40 MB。 -
整个模型(所有层)在单个请求的 KV Cache 总大小:
M_kv_per_seq = 40 × 40 MB = 1600 MB ≈ 1.6 GB。
第五步:估算最大并发数 B_max
B_max = floor( M_kv_budget / M_kv_per_seq ) = floor( 50 GB / 1.6 GB ) ≈ 31。
实际限制:上述计算是静态的。在 Prefill 阶段,由于需要一次性处理整个 Prompt,其激活值峰值会非常高,可能成为比 KV Cache 更紧迫的显存瓶颈。因此,实际部署时往往需要通过 vLLM 这类框架进行动态显存管理(PagedAttention),才能接近理论估算的并发上限。
若把权重从 FP16 量化为 INT4,推理显存大约降到原来的多少?¶
将模型权重从 FP16(每个参数 2 字节)量化为 INT4(每个参数 0.5 字节),权重部分的显存直接降为原来的 1/4。但对总显存的降幅,则取决于权重在总显存中的占比。
-
短文本、单批次场景:权重是显存的绝对主体。例如,一个 7B 模型,FP16 权重 14 GB,KV Cache 1 GB,其他 3 GB,总显存 18 GB。INT4 量化后,权重降至 3.5 GB,总显存约 7.5 GB,降幅约 58%。
-
长文本、大并发场景:KV Cache 成为显存主体。例如,一个 13B 模型,FP16 权重 26 GB,KV Cache 40 GB,其他 4 GB,总显存 70 GB。INT4 量化后,权重降至 6.5 GB,总显存约 50.5 GB,降幅仅约 28%。
核心洞察:权重量化节省的是“存储空间”,但对 Decode 阶段“带宽瓶颈”的缓解有限,因为量化后的权重在计算时通常要反量化回 FP16/BF16 使用,读入计算单元的数据量本身变化不大(除非硬件有原生 INT4 计算单元)。它最大的价值是让模型能跑在更小显存的设备上,或是腾出更多空间给 KV Cache 以支撑更长的上下文。
在长文本推理中,除了权重和 KV Cache,还有哪些部分会占用显存?¶
在超长文本(如 32k 或更高)场景下,一些日常忽略的“配角”会突然变成“吞金兽”。
-
注意力得分矩阵:在 Prefill 阶段,计算
Q × K^T会产生一个形状为[batch, heads, S, S]的巨大矩阵。对于 S=32k、32 个头的 MHA 模型,这个矩阵在 FP16 下可达1 × 32 × 32768 × 32768 × 2 ≈ 68 GB!直接存储会导致瞬间 OOM。FlashAttention 等算法的核心就是通过分块计算避免完整存储这个矩阵,将其显存开销降至与序列长度线性相关。 -
Prefill 阶段的中间激活:一次性处理整个长 Prompt 时,Transformer 每一层的残差连接、LayerNorm 输出等需要临时保留,它们的显存占用与序列长度成正比,在长序列下不可小觑。
-
显存碎片与框架缓存:PyTorch 的显存分配器在频繁申请、释放大小不一的内存块时,会产生大量碎片。这就像一个大房间,虽然总剩余空间足够,但因为全是不连续的小块,无法放进一个大件家具,从而触发 OOM。推理引擎(如 vLLM)通过预分配大块内存和精细化管理(PagedAttention)来规避碎片。
为什么不能简单地把整个模型权重加载到显存来估算,还需考虑额外缓冲?¶
把模型部署到 GPU,类似于把一个巨型乐队请到一个录音棚。你不能只计算乐器和乐手(模型权重)占用的空间,还必须为以下各项留出充足的空间:
-
乐谱架和调音台(计算工作区):矩阵乘法等操作不能在原地执行,需要在显存中开辟新的临时空间存放输入、输出和中间结果。
-
实时录音档案(KV Cache):这是一个不断增长的专属存储区,用于记住所有已经演奏过的音符,对于长乐曲至关重要。
-
排练时的草稿纸(激活值缓冲区):在“预填充”阶段一次性看完整首乐谱时,需要在“大脑”中同时记录大量的临时信息。
-
过道和通风系统(框架开销与碎片):PyTorch 框架本身占用一些显存,显存分配器也像动态的仓库管理员,会在空间中留下难以利用的碎片。
因此,显存规划是一项系统工程,必须把模型权重、KV Cache、激活值、框架开销这“四大金刚”都考虑进去,才能避免在实际运行中遭遇 OOM。
推理时如果 batch size 增大一倍,KV Cache 显存如何变化?¶
线性倍增。KV Cache 是每个独立推理请求的“专属记忆”,它们之间完全隔离,无法共享。因此,当你同时处理 2 个请求时,就需要为它们各自分配完整的一份 KV Cache,其总大小自然就是单个请求的 2 倍。这个简单的线性关系,是限制在线推理服务高并发吞吐的核心瓶颈。要提升吞吐,就必须千方百计降低单个请求的 KV Cache 大小(GQA、KV Cache 量化等)。
假设 7B 模型在 FP16 下推理需要 14GB 显存放权重,如果换成 GQA 加 INT4 量化,KV Cache 不变,总显存大概降多少?¶
我们做一个清晰的对比计算:
- 原始配置 (MHA + FP16)
- 模型权重:14 GB
- KV Cache:假设为
XGB - 其他开销(激活、框架等):假设为 2 GB
-
总显存 = 16 + X GB
-
新配置 (GQA-8组 + INT4权重)
- 模型权重:14 GB ÷ 4 = 3.5 GB (INT4)
- KV Cache:
XGB (假设不变,即序列长度和精度未变) - 其他开销:2 GB (不变)
- 总显存 = 5.5 + X GB
结论:无论 X 是多少,总显存都减少了 (16 + X) - (5.5 + X) = 10.5 GB。这 10.5 GB 完全来自于权重的极致压缩。这节省下来的宝贵空间,可以被直接用于支持更长的上下文(增大 X),或者提升并发用户数(增加 batch size)。
部署 30B 模型到单张 24GB 显卡,可能吗?需要用到哪些技术?¶
答案是:可能,但这属于一场极限挑战。30B 模型在 FP16 下仅权重就高达 60 GB,是 24 GB 显卡容量的 2.5 倍。要把这头“大象”塞进“冰箱”,必须动用一组顶级的压缩和优化技术。
-
🧠 INT4 权重量化(核心前提):使用 GPTQ 或 AWQ 等算法,将权重压缩到约 15 GB。这是整个方案的基石,没有它一切免谈。
-
📉 应用 GQA(架构优化):如果模型本身不是 GQA,可在微调或转换时进行“GQA 化”,将 KV Cache 大小缩减到原来的 1/4~1/8,为紧张的显存省出宝贵空间。
-
✂️ 限制最大上下文长度:必须设定一个较短的上限(如 1024 或 2048 tokens),绝不允许 KV Cache 无限制增长。
-
⚙️ 极致显存管理:使用 vLLM 或 TensorRT-LLM 等框架,开启 PagedAttention 和 INT8/FP8 KV Cache 量化,最大程度减少碎片并压缩记忆开销。
-
📦 CPU Offload(兜底方案):如果上述努力后仍 OOM,可将模型中不常用的几层权重放在 CPU 内存中,在计算时动态加载。这会极大地牺牲推理速度,但能在“跑起来”和“跑得快”之间做出妥协。
现状:在 24GB 的消费级显卡(如 RTX 3090/4090)上,通过 4-bit 量化 + GQA + FlashAttention + vLLM 的组合方案,已经可以流畅运行 30B 甚至 34B 的模型,在 2048 长度的上下文中进行对话。这背后是无数工程师在算法和系统工程上的极致优化。
❓ 为什么 KV Cache 的显存公式中有一个系数 2?它代表什么?¶
在 KV Cache 的计算公式中,系数 2 直接对应的是 Key 和 Value 两个张量。注意力机制需要缓存的不是单一向量,而是一对向量:
-
Key 向量 K,用于与 Query 计算注意力分数
-
Value 向量 V,用于加权聚合信息
对于每个 token、每一层、每一个注意力头(或者 GQA 中的每一组),都必须同时存储 KK 和 VV。两者形状相同,占据相同的字节数。因此,总缓存大小就是 (K的大小) + (V的大小) = 2 × (K的大小)。
这个 2 是硬件成本的直接体现。没有缓存 Key,注意力计算无法进行;没有缓存 Value,也无法生成输出。两者缺一不可。
值得注意的是,Query 是不需要缓存的。因为在自回归生成中,每次只处理当前 token 的 Query,历史 token 的 Query 不会在后续步骤被复用,所以用完即可丢弃。只有 Key 和 Value 需要永久保留。
🔑 直观理解:想象你在开会,每个人的发言(Value)需要被记录,而为了知道谁说过什么、对当前话题贡献多少(注意力权重),你还需要一个索引卡片(Key)。这两个东西必须配对保存。
💻 推理时,除了权重和 KV Cache,还有哪些显存开销?大约占总显存的多少?¶
推理时的显存占用是一个多层次的结构,权重和 KV Cache 只是冰山露出水面的部分。其余的“隐藏”开销主要包括:
- 🧠 激活值/中间缓冲区
在每一层的前向计算中,需要临时存储一些中间结果,比如 Attention 的 Q×K 得分矩阵、Softmax 输出、残差连接的中间值等。这些激活值的生命周期很短,只存在于当前层的计算过程中,但它们的峰值大小可能非常可观,尤其是在 Prefill 阶段,因为需要处理长序列的全部 token。
- 📦 CUDA 上下文与框架开销
PyTorch 或 TensorFlow 框架本身需要占用几百 MB 的显存来维护 CUDA 上下文、内核缓存、内存分配器等。这部分通常是固定的。
- 🧩 显存分配器碎片
类似操作系统内存碎片,GPU 的显存分配器在频繁分配和释放大小不一的内存块时,会产生无法使用的小碎片。这部分虽然理论上是空闲的,但因为不连续,无法被大块请求利用。PagedAttention 正是为了缓解这个问题。
-
📊 输出 logits 和概率缓冲区 在生成下一个 token 时,需要计算整个词表的 logits,这会产生一个
[batch_size, vocab_size]的临时张量,对于大词表(如 32000),这个缓冲区的大小不可忽视。之后进行采样还会产生额外的临时张量。 -
🧾 输入嵌入和位置编码
模型的嵌入层权重通常包含在总参数量中,但如果使用了共享的嵌入和输出头,这部分不算额外。对于 Transformer 架构,位置编码如果是可学习的,也会占用少量显存。
- 🔁 梯度(仅训练时)
推理时不涉及梯度和优化器状态,所以没有这部分的显存消耗。这也是推理显存远小于训练显存的原因。
占比估算(以 7B 模型,FP16,短文本推理为例):
-
模型权重:~14 GB,约占 65%
-
KV Cache(batch=1, seq=2048, GQA):~0.25 GB,约占 1%
-
激活值及临时缓冲区:~3‑5 GB,约占 15‑25%
-
框架及碎片:~1‑2 GB,约占 5‑10%
-
其他(logits 等):~1 GB,约占 5%
在长文本或大 batch 下,KV Cache 占比会急剧升高,甚至超过权重成为第一大户。
⏱️ 在 Prefill 阶段和 Decode 阶段,显存占用的峰值分别在什么时候?为什么?¶

因此,prefill 的峰是“计算峰”,由临时激活值导致;decode 的峰是“记忆峰”,由持续积累的 KV Cache 导致。对于长文本,prefill 的峰值可能更大;对于高并发,多个请求的 KV Cache 累积可能成为瓶颈。
🧪 什么是“激活值显存”?推理时激活值是否需要像训练一样全部保留?¶
激活值显存指的是神经网络在前向传播过程中产生的中间输出张量所占用的显存。这些张量是各层计算的临时结果,比如:
-
卷积/线性层的输出
-
激活函数(ReLU/GELU)的输出
-
注意力权重矩阵
-
残差连接的中间结果
在训练时,这些激活值必须全部保留在显存中,因为反向传播时需要用到它们来计算梯度。所以训练时激活值显存是巨大开销,通常远大于模型权重。
但在推理时,我们只有前向传播,没有反向。因此,激活值不需要全部保留。在计算完当前层并传递给下一层后,当前层的激活值就可以立即释放,只保留最终的输出和必要的状态(如 KV Cache)。所以推理时的激活值显存只是前向计算过程中的“临时草稿纸”,用后即丢。这使得推理的激活内存峰值远小于训练,且可以通过算子融合、内存复用来进一步优化。FlashAttention 就是通过融合算子和重计算,避免了在显存中保留完整的注意力得分矩阵,极大降低了激活值峰值。
🧬 如果模型使用了 SwiGLU 激活函数,FFN 层的参数量和标准 FFN 相比增加了多少?这如何影响显存?¶
标准 Transformer FFN 由两个线性层组成:

对显存的直接影响是:权重显存相应增加。同时,FFN 计算时会产生更多临时激活值(多了一个门控输出),略微增加激活内存。在推理阶段,由于不存梯度,主要影响就是模型权重变大,KV Cache 不变(FFN 不影响注意力缓存)。因此,如果模型用 SwiGLU,推理时需要更多显存放权重,但不影响 KV Cache。
⚡ 使用 FlashAttention 对推理显存有什么直接影响?省的是哪部分?¶
FlashAttention 最大的显存节省在于消除了对完整注意力得分矩阵的存储。
标准注意力计算:

其中 S 和 P 都是形状为 [batch, heads, seq_len, seq_len] 的矩阵。在长序列下,这两个矩阵会占用巨大的显存。例如,32k 序列、32 个头的单 batch,FP16 下仅 SS 矩阵就需要 8 GB 显存,这在推理中是无法接受的。
FlashAttention 通过分块(Tiling) 技术,将 Q、K、V 分割成小块,在高速 SRAM 中逐块计算注意力,并将中间结果立即进行 softmax 归一化后乘到 V 上,全程不将完整的 S 和 P 矩阵写回 HBM(全局显存)。它利用在线 softmax 算法,动态更新统计量,保证了计算的数值精度。

-
Prefill 阶段可以处理更长的 prompt,不会因 S 矩阵而 OOM。
-
对于 Decode 阶段,虽然只处理一个 token,似乎没有 S 矩阵的困扰,但 FlashAttention 的分块策略也能优化 KV Cache 的读取模式,减少临时缓冲。
-
整体上,推理时的显存峰值大幅降低,KV Cache 成为主要的显存消耗者,而不再是临时的激活值。
📌 简单说,FlashAttention 让“显存里不再出现那个巨大的正方形矩阵”,这是一次内存管理的革命。
📉 推理时使用 INT4 量化权重,但 KV Cache 保持 FP16,总显存能降到原来的多少?请以 7B 模型为例估算。¶
我们以 7B 模型、单 batch、2048 长度、GQA 为例,分步计算。
原始配置(FP16 权重 + FP16 KV Cache):

- 激活/框架等:预估 2 GB
总显存 ≈ 14 + 0.125 + 2 ≈ 16.1 GB
量化后(INT4 权重 + FP16 KV Cache):
-
权重:14 GB / 4 = 3.5 GB(INT4 理论大小,实际因 group-wise 量化会略大,约为 3.7 GB)
-
KV Cache:保持 0.125 GB
-
激活/框架等:仍约 2 GB
总显存 ≈ 3.5 + 0.125 + 2 ≈ 5.6 GB
总显存下降比例:从 16.1 GB 降到 5.6 GB,降幅约 65%。如果是在长文本、大 batch 下,KV Cache 占比更大,总显存降幅会相应降低,因为权重的节省被 KV Cache 冲淡。但无论哪种情况,仅权重量化就能节省超过 10 GB 的显存,对消费级显卡非常关键。
📌 这就是为什么我们通常称 INT4 量化可以让 7B 模型在 8 GB 显存显卡上运行,并为 KV Cache 和批处理留出空间。
🔥 为什么大模型推理时通常不对激活值做 INT8 量化?难点在哪?¶
在大模型推理中,权重量化(W4A16 或 W8A16)已经非常普遍,但将激活值也量化到 INT8(W8A8)却很少用于生产。根本原因在于激活值的动态性和极端分布使得低精度量化极易造成不可接受的精度损失,而工程实现也远较权重量化复杂。
📊 激活值的独特难题¶
- 动态范围与离群值
激活值是每个输入样本实时计算出来的,其数值分布随输入数据、序列位置和模型层数剧烈变化。Transformer 层中常出现通道级离群值——某些隐藏维度的激活值比其他维度大几十倍,甚至出现固定的“离群 token”(如第一个 token 的激活异常高)。如果对整个激活张量采用统一的 INT8 量化尺度,离群值会撑大尺度因子,导致绝大多数正常值被量化到极低的分辨率(甚至全部变为 0),信息严重丢失。而权重量化可以离线、逐通道地精细校准,不存在这种动态离群值问题。
- 校准数据的代表性
激活值的量化参数(scale、zero point)必须通过校准数据集统计得到。然而,校准数据只是真实世界数据的一个子集,永远无法覆盖线上可能出现的所有分布。一旦线上输入分布与校准集偏差较大,激活值的量化参数就会失效,导致精度雪崩。权重是静态的,不存在这种分布漂移风险。
- 累积误差与层间漂移
每一层的激活值都是下一层的输入。当所有层的激活都被量化时,量化误差会逐层累积并放大,深层网络的实际输入分布可能与校准时的统计完全偏离,产生“量化漂移”。这种累积效应使得即使每层单独校准时表现良好,整体模型却可能崩溃。要缓解这一现象,通常需要量化感知训练(QAT)或逐层误差补偿,这又失去了 PTQ 快速部署的优势。
- 硬件与算子支持不成熟
虽然现代 GPU(如 A100)的 Tensor Core 支持 INT8 矩阵乘法,但高效的 INT8 激活值推理需要将权重的反量化和激活值的量化融合进 kernel,并且与 FlashAttention、PagedAttention 等优化兼容。目前主流推理框架(vLLM、TensorRT‑LLM)对 W8A8 的支持仍不如 W4A16 成熟,尤其是处理动态批处理和变长序列时。
- 延迟收益有限
在自回归解码(Decode)阶段,瓶颈通常是显存带宽而非计算。量化激活值虽然可以减少部分计算数据搬运,但 KV Cache 的读取才是大头,激活值本身的数据量(每次只处理一个新 token)极小。因此 W8A8 带来的延迟降低在多数场景下并不明显,却要承担上述所有精度风险。
💡 综上,激活值量化是一个“高风险、低回报”的选择。工业界更倾向于只量化权重,保持激活为 FP16/BF16,或者采用 SmoothQuant 等迁移量化方案,将激活值的量化难度部分转移给权重。
🖼️ 多模态大模型推理时,视觉编码器会额外占用多少显存?如何估算?¶
多模态大模型(如 LLaVA、Qwen‑VL)通常由三个部分组成:视觉编码器(Vision Encoder,如 CLIP ViT‑L)、投影器(Projector,一个或几层 MLP)和语言模型(LLM)。视觉编码器独立于语言模型,会带来额外的权重和激活显存。
📦 显存估算方法¶
- 视觉编码器的权重显存

- 投影器
投影器通常很轻量,如两层 MLP,参数量约几百万,可忽略。
- 与语言模型共享的显存
视觉 token 进入 LLM 后,会与文本 token 一同参与自注意力计算,因此会占用 LLM 的 KV Cache 和临时激活。这部分显存已在 LLM 的估算中考虑,但需要额外加上视觉 token 的 KV Cache。
📊 快速估算实例¶
以 LLaVA‑1.5(ViT‑L/14 + LLaMA‑7B)为例:
-
视觉编码器权重:0.6 GB
-
视觉编码器激活:< 1 GB(通常可忽略)
-
语言模型部分按标准 7B 估算
因此,多模态部分额外显存约 1‑2 GB,对于一张 24 GB 显卡,多模态推理的总显存占用与纯文本 7B 模型相比增加不多,主要瓶颈仍然是 LLM 的权重和 KV Cache。
💡 注意:若使用高分辨率图像或视频(多帧),视觉 token 数量激增,KV Cache 和激活显存可能显著增大,需要专门优化(如 Token Merging)。
🧩 MoE 模型(如 Mixtral 8×7B)在推理时,总参数量 47B,但激活参数只有 13B。权重显存应该按 47B 还是 13B 来估算?为什么?¶
必须按总参数量 47B 来估算权重显存,尽管每次推理只激活 13B 参数。
🔍 原因¶
MoE 模型将 FFN 层替换为多个“专家”,每个专家是一个独立的 FFN 子网络。在 Mixtral 8×7B 中,有 8 个专家,每次 token 只激活 top‑2 专家。因此计算时仅需执行这 2 个专家的前向传播,激活参数量约为 13B。
但是,所有 8 个专家的权重都必须常驻在显存(或至少可被快速访问的存储器)中。因为不同的 token 可能激活不同的专家,推理引擎无法预知哪个 token 会激活哪个专家。如果每次需要时才从 CPU 或磁盘加载专家权重,会产生巨大的延迟(数百微秒到毫秒级),完全破坏推理的实时性。因此,完整的 47B 参数必须全部放在显存中。
💡 激活参数仅影响计算量,不影响显存¶
-
计算量(FLOPs)由激活参数 13B 决定,因此 MoE 模型的推理速度远快于同等总参数量的稠密模型。
-
显存占用由总参数量 47B 决定。在 FP16 下,仅权重就需要约 94 GB 显存,远超过单张 80 GB A100 的容量,因此必须使用多卡并行(如 TP=2 或 TP=4)。
📌 简单记:MoE 是“用显存放全部专家,用计算激活部分专家”。显存看总量,速度看激活量。
🧩 在 MoE 推理中,所有专家的权重都必须常驻显存吗?有什么卸载策略?¶
并非绝对必须全部常驻显存,但在线服务场景下几乎必须如此。 存在一些卸载策略可以缓解显存压力,但会以增加延迟为代价。
🛠️ 卸载策略¶
- CPU 内存卸载(Offloading)
将部分不常被激活的专家权重放在 CPU 内存中,仅在需要时通过 PCIe 传输到 GPU 显存。例如,根据统计,某专家被激活的频率很低,可将其卸载。但每次卸载/加载会引入数百微秒的延迟,对于延迟敏感的在线服务不适用。离线批处理或低频推理场景下可行。
- 专家并行 + 分层存储
在多 GPU 环境下,可以将不同专家放置在不同 GPU 上,结合 NVLink 或 InfiniBand 进行跨 GPU 通信。这不是卸载,而是分布式存储。若仍然无法全部放入显存,可将冷门专家放在 CPU 内存池,所有 GPU 共享访问。
- 选择性加载(Speculative Loading)
类似于投机采样,用一个轻量级门控预测模型提前预测未来可能需要激活的专家,并提前从 CPU 加载到 GPU,掩盖传输延迟。实现复杂,但能有效隐藏卸载开销。
- 量化 + 卸载
对专家权重进行 INT4 量化,减小模型体积,使得尽可能多的专家能放入显存。剩余的再考虑卸载。
⚖️ 实际权衡¶
在线对话服务通常要求 TPOT < 100ms,CPU 卸载引入的延迟(即使只是偶尔触发)可能导致严重的抖动,因此绝大多数生产环境选择配备足够多的 GPU 显存来容纳完整模型。卸载策略主要用于个人开发者或低成本部署场景。
💡 结论:在云端 API 服务中,Mixtral 8×7B 必须用至少 2 张 80GB GPU(张量并行)来承载全量权重;在本地实验中,可使用量化 + CPU 卸载勉强在单张 24GB 显卡上运行,但速度极慢。
🐍 长文本推理中,输入 128K token,Prefill 阶段的显存峰值可能来自哪?如何避免 OOM?¶
处理 128K token 的 Prefill 时,显存峰值主要来自两个方面:注意力得分矩阵和中间激活值。
🧊 显存峰值来源¶

- 中间激活与残差
在 Prefill 时,Transformer 的每一层都需要临时存储 LayerNorm 的输出、残差连接前的值等。这些激活值的总量随序列长度线性增长,但在超长序列下也极为可观。例如,对 128K 序列,单层激活可能达到数 GB。
✅ 避免 OOM 的关键技术¶

-
分段 Prefill(Chunked Prefill):将超长 prompt 拆分成多个小块(chunks),逐块进行 prefill,并穿插 decode 步骤。这样既限制了单次 prefill 的峰值显存,又避免因 prefill 耗时过长导致 decode 请求饥饿。
-
序列并行(Sequence Parallelism):将序列切分到多张 GPU 上,每张 GPU 负责一部分 token 的注意力计算,通过通信合并结果(如 Ring Attention)。这也能分散显存压力。
-
激活重计算(Gradient Checkpointing):在训练中常用,推理 prefill 时也可选择性地不保存某些中间激活,在需要时重计算,以时间换空间。
-
KV Cache 量化:在 prefill 阶段生成的 KV Cache 可立即进行 INT8 量化,减少后续 decode 的显存占用。
💡 实践:目前,借助 FlashAttention 和分块 prefill,vLLM 等框架已经可以在 8×A100 上推理 128K 的长文本而不 OOM。
🧰 推理框架(如 vLLM)本身会占用多少额外显存?这部分如何估算?¶
推理框架本身的额外显存开销主要包括以下几个方面,通常总共在 0.5~2 GB 之间,视框架和配置而定。
📊 额外开销构成¶
-
CUDA 上下文与驱动:NVIDIA 驱动和 CUDA 运行时本身会占用约 200~500 MB 显存,这是所有 GPU 程序的基础开销。
-
模型加载与元数据:PyTorch 等框架在加载模型时会创建一些额外的缓冲区,例如梯度(即使推理时不需要,也可能预分配)、参数缓存等。约 100~300 MB。
-
推理框架内存池:vLLM 的 PagedAttention 会预先分配一大块显存池,用于物理 KV 页的分配。这个池的大小可通过
--gpu-memory-utilization参数控制,默认 0.9(即总显存的 90%)。剩余的 10% 中,一部分就是框架的管理开销和临时缓冲区。 -
内核缓存与 JIT 编译:如果使用 TensorRT‑LLM 或 vLLM 的定制 CUDA 内核,首次运行时会编译并缓存优化后的内核,占用少量显存。通常 < 200 MB。
-
通信缓冲区:多 GPU 推理时,NCCL 会分配通信缓冲区,用于 AllReduce 等集合操作。每张卡约 100~300 MB。
🔢 估算方法¶
最直接的方法是:启动推理框架,加载模型但不接受任何请求,通过 nvidia-smi 查看已占用显存,减去模型权重的理论大小,剩下的即为框架额外开销。
例如,加载一个 7B FP16 模型(权重 14 GB),nvidia-smi 显示占用 15.5 GB,则框架额外开销约为 1.5 GB。
💡 建议:在规划显存时,为框架和临时缓冲区预留 2 GB 是比较安全的经验值。
🔗 如果单卡放不下模型权重,使用张量并行(TP=2)后,每张卡上的权重显存如何变化?KV Cache 呢?¶
张量并行(TP)是将单个层的权重矩阵切分到多张 GPU 上,每张 GPU 只保存一部分权重,从而突破单卡显存限制。
🧮 权重显存变化¶
对于绝大多数层(如 Attention 的 QKV 投影、FFN 的线性层),权重可以按列或按行切分。以 TP=2 为例:

- 按行切分:权重矩阵沿着输入维度切分,输入 X 需要先切分,每张卡计算后通过 All‑Reduce 汇总。
无论哪种,每张卡上保存的权重总量大约是原始权重的 1/TP。对于 TP=2,每张卡权重显存从 14 GB 降为约 7 GB(不考虑切分引入的微小额外开销)。
🧠 KV Cache 的变化¶
KV Cache 的切分方式与 Attention 的头数切分一致。在 TP 中,通常会将注意力头平均分配到各 GPU。例如,32 个 Q 头,TP=2,每张卡负责 16 个 Q 头,同时 K 和 V 头也相应切分。因此,每张卡的 KV Cache 大小也是原来的 1/TP。这是因为每张卡只需要存储自己负责的那部分头的 KV 对。
对于 GQA,Key 和 Value 头数更少,切分后每张卡的 KV Cache 也等比减少。
📦 通信与激活¶
TP 会引入额外的 All‑Reduce 通信(每层 1~2 次),这会增加延迟,但显存收益巨大。激活值的切分与权重类似,每张卡的激活内存也大致降为 1/TP。
💡 结论:TP=2 时,每张卡的权重和 KV Cache 都大约减半,使得原本单卡装不下的模型得以运行。这正是 70B 模型能在 2×A100 上推理的原因。
🔄 流水线并行(PP)对单卡显存有什么影响?和 TP 相比,显存节省效果如何?¶
流水线并行(PP)按层切分模型。例如,一个 32 层的模型,PP=2,则 GPU0 放置第 1‑16 层,GPU1 放置第 17‑32 层。
🧠 对单卡显存的影响¶
-
权重:每张卡只保存自己负责的那部分层的权重,因此权重显存大约是原来的 1/PP。
-
KV Cache:类似,每张卡只保存自己负责的那些层的 KV Cache。但注意,对于 Decode 阶段,每张卡都需要处理它负责的层,其输入是从前一层传来的中间激活。每张卡的 KV Cache 仅限于自己层,总量也是 1/PP。
-
激活值:流水线并行中,中间激活需要在 GPU 间传递(点对点通信)。每张卡的激活峰值取决于它处理的层数和 micro‑batch 大小,通常也是 1/PP。
⚖️ 与 TP 的对比¶
| 特性 | 张量并行 (TP) | 流水线并行 (PP) |
|---|---|---|
| 切分粒度 | 层内(权重矩阵) | 层间(按层) |
| 每卡权重 | 约 1/TP | 约 1/PP |
| 每卡 KV Cache | 约 1/TP(按头切分) | 约 1/PP(按层切分) |
| 通信模式 | All‑Reduce(高频、高带宽需求) | P2P(低频,传递激活) |
| 显存节省效果 | 非常显著,但通信开销大 | 显著,通信开销较小 |
| 适用场景 | 单机内(NVLink),大模型单层放不下 | 跨机,模型层数极多 |
显存节省效果:对于相同的并行度(如 TP=2 vs PP=2),TP 通常能更均匀地切分权重和激活,显存节省比例相似,但 TP 的通信更频繁。PP 的优势在于跨节点扩展时通信压力小,且可以结合 TP 使用(TP 用于层内,PP 用于层间)。
💡 实际中,对于 70B 模型,通常先用 TP=2 解决单层权重过大问题,若多卡仍不够,再叠加 PP。单纯 PP 已很少单独用于推理,因为它的 pipeline bubble 可能降低吞吐。
📏 如何快速估算一个未经压缩的 LLaMA-65B 模型在 FP16 推理时至少需要几张 80GB 的 A100?¶
我们需要分别计算权重、KV Cache 和激活的显存需求,然后确定最小 GPU 数量。
权重显存¶

激活与框架¶
在 Prefill 时,激活峰值受注意力矩阵影响。使用 FlashAttention 后,激活显存可控制在 10 GB 以内。框架额外开销约 2 GB。
总显存需求¶
权重 130 GB + KV Cache 5 GB + 激活 10 GB + 框架 2 GB ≈ 147 GB。
因此,单卡 80 GB 不够,需要至少 2 张 A100 80GB。使用 TP=2 将权重切分,每张卡 65 GB 权重 + 2.5 GB KV Cache(减半) + 5 GB 激活 ≈ 72.5 GB,刚好可以容纳。若 batch 稍大或序列更长,则需要更多显存或更大并行度。
💡 结论:65B 模型 FP16 推理,至少需 2×A100 80GB(TP=2),安全起见常用 4 卡。
📈 推理时,如果 batch size 从 1 增加到 32,显存瓶颈通常从权重转移到哪部分?¶
从模型权重转移到 KV Cache。
在小 batch 时,KV Cache 相对较小,权重占据显存大头。例如 batch=1,7B 模型权重 14 GB,KV Cache 仅 0.5 GB。当 batch 增大到 32,KV Cache 线性增长为 0.5 GB × 32 = 16 GB,瞬间成为比权重还大的显存消耗者。同时,临时激活值(如 batch 下的 prefill 激活)也会成倍增长,但通常 KV Cache 是最主要的瓶颈。
因此,限制高并发推理吞吐量的通常是 KV Cache 的显存容量,而不是权重。这也是为什么优化 KV Cache(GQA、量化、PagedAttention)对于提高 serving 效率至关重要的原因。
🧩 什么是“显存碎片”?它如何影响实际可用显存?PagedAttention 如何缓解?¶
显存碎片是指显存中虽然总空闲量足够,但因为没有足够大的连续空闲块而无法分配给新请求的现象,类似操作系统的内存碎片。
📊 碎片类型¶
-
内部碎片:分配的内存块比实际需要的稍大(例如必须按页分配,即使只需要 10 KB,也会分配一整页 64 KB),多出来的部分被浪费,无法被其他请求使用。
-
外部碎片:内存中散布着许多小的空闲块,它们之间不连续。当需要分配一个大块时,即使这些小块的总和足够,也无法满足要求,导致分配失败或触发耗时的碎片整理。
在传统推理框架中,每个请求的 KV Cache 被预先分配一大块连续显存。不同请求的生成长度不同,释放后留下大小不一的空洞,很快导致严重的外部碎片,实际可用显存大幅减少。
🛠️ PagedAttention 的缓解机制¶
PagedAttention 将 KV Cache 划分为固定大小的物理页(如每页 16 个 token)。所有请求的 KV Cache 由这些页组成,不再要求连续内存。
-
消除外部碎片:所有页大小相同,任何空闲页都可以被任何请求使用,就像整齐划一的停车位,永远不会出现“车位够但停不下”的情况。
-
减少内部碎片:按需分配页,一个请求只占满它需要的页,最后一页即使未满也不会浪费过多空间。
-
高效共享:多个请求的相同前缀可以指向同一物理页,无需复制,进一步节约显存。
通过分页,vLLM 能够将显存利用率从传统方法的 30‑40% 提升到 90% 以上,是高并发推理的基石。
🔍 给你一个陌生的模型(如新开源的 20B 模型),没有现成文档,你如何快速估算它的推理显存需求?列出你的计算步骤。¶
你需要从模型结构和推理配置两个角度出发,按照下面的步骤进行估算:
获取模型架构参数¶
查看模型配置文件(如 config.json)或通过代码加载模型打印结构。获取:
-
总参数量
P(可直接从模型信息中得到) -
层数
L -
隐藏维度
d_model -
注意力头数
H以及 GQA 头数(如果有) -
FFN 中间维度
d_ff(通常为d_model的 2.5‑4 倍) -
词表大小
V -
精度(FP16 或 BF16)
-
是否使用 SwiGLU 等(影响 FFN 参数量)
计算权重显存(基本项)¶

设定推理场景¶
确定目标:
-
最大 batch size
B -
最大序列长度
S(prompt + max_new_tokens) -
使用 KV Cache 量化吗?(若 INT8,则 KV 大小减半)
KV Cache 总显存 = B×S×(单 token KV 大小)
激活值与临时缓冲区估算¶
经验值:在 Prefill 阶段,激活峰值约为权重的 10‑30%(使用 FlashAttention 后更低)。对于长序列,可将激活粗略估计为:
-
单 batch,短序列:1‑3 GB
-
单 batch,长序列:3‑10 GB
-
大 batch:按比例放大,但通常不会线性增长(因为并行计算会复用)。
框架额外开销¶
预留 1‑2 GB。
总显存 = 权重 + KV Cache + 激活估算 + 框架¶
考虑并行策略¶
如果单卡放不下,计算 TP=N 后的单卡显存:权重和 KV Cache 大致除以 N,加上少量通信缓冲。
示例:一个陌生 20B 模型,MHA,L=40,d=5120,H=40,头维度 128¶

通过这套步骤,你可以快速对任何新模型做出显存需求的合理评估,无需依赖文档。