1. 概述

大语言模型(LLM)推理时显存占用分为四个主要部分:

组件占比是否与序列长度相关是否与 batch size 相关
模型参数~30-50%
KV Cache~30-60%
激活值 (Activations)~5-15%
其他(中间缓冲区等)~5-10%部分相关部分相关

2. 模型参数显存

2.1 参数存储格式

模型参数占用与参数数量和数据类型直接相关:

显存 = 参数数量 × 每个参数占用的字节数

常用数据类型的占用:

数据类型位宽字节数典型场景
FP3232-bit4 bytes训练、精度基准
FP16/BF1616-bit2 bytes常见推理精度
INT88-bit1 byte量化推理
INT44-bit0.5 bytes极致量化推理

示例: LLaMA-70B 模型

  • FP16: 70 × 10⁹ × 2 = 140 GB
  • INT8: 70 × 10⁹ × 1 = 70 GB
  • INT4: 70 × 10⁹ × 0.5 = 35 GB

2.2 模型架构参数分解

以标准 Decoder-only Transformer 为例,N 层、注意力头数 H、隐藏维度 D、中间层维度 4D:

组件参数数量说明
QKV 投影(合并)N × D × 3D × 2 组(权重+偏置)注意力机制
Attention 输出投影N × D × D注意力输出变换
FFN gate + up 投影N × D × 4D × 2SwiGLU 等门控 FFN
FFN down 投影N × 4D × D降维投影
Embeddingvocab_size × DToken 嵌入表
LayerNormN × D × 2 组RMSNorm 参数
LM HeadD × vocab_size(可与 Embedding 绑定)最终预测层

2.3 多 GPU 分片

当模型参数无法单卡容纳时,使用张量并行(Tensor Parallelism, TP)或流水线并行(Pipeline Parallelism, PP):

单卡参数显存 = 总参数显存 / TP_size

以 70B-FP16 在 8×GPU 上:140 GB / 8 = 17.5 GB/卡


3. KV Cache

3.1 核心原理

在自回归解码中,每生成一个 token,注意力计算需要关注所有之前的 token。KV Cache 缓存之前所有层的 Key 和 Value 矩阵,避免重复计算。

对于单个请求、单个层、单个注意力头:

每层 KV Cache 大小 = 2 × 序列长度 × 头维度

其中因子 2 来自 Key 和 Value 两份缓存。

3.2 完整公式

单请求 KV Cache = 2 × N_layers × n_kv_heads × head_dim × seq_len × dtype_bytes
               = 2 × N_layers × (D / n_heads) × n_kv_heads × seq_len × dtype_bytes
               = 2 × N_layers × D × seq_len × dtype_bytes(总头维度 = D)

注意: GQA(Grouped Query Attention)场景下,n_kv_heads < n_heads,KV Cache 会成比例减少。

3.3 MHA、GQA、MQA 对比

类型Key-Value 头数KV Cache 相对大小典型模型
MHA= Query 头数100%LLaMA-1
GQA< Query 头数1/2 ~ 1/8LLaMA-2-70B, LLaMA-3
MQA11/HPaLM, Falcon

3.4 实际计算示例

LLaMA-3-70B:N=80, D=8192, seq_len=4096, FP16

单请求 KV Cache = 2 × 80 × 8192 × 4096 × 2 bytes
                = 10,737,418,240 bytes
                ≈ 10 GB

再乘以 batch size B(常见 4-64):

B=16:  160 GB(需多卡分摊)
B=64:  640 GB

结论: KV Cache 在长序列、大 batch 场景下是显存瓶颈。

3.5 多轮对话的 KV Cache

对话场景下,KVCache 随对话轮次持续增长。假设每轮输出 M 个 token:

第 t 轮后 KV Cache 大小 ≈ 2 × N × D × (prompt_len + t × M) × dtype_bytes

典型优化:

  • Prefix Caching:命中相同前缀时复用 KV Cache
  • 连续批处理(Continuous Batching):不同请求的 KV Cache 动态管理

4. 激活值显存

4.1 激活值的产生

前向传播过程中,中间层的输入和输出结果占据额外显存,包括:

  1. Attention 中间结果:Q、K、V 矩阵、Attention Score(softmax前/后)、Context 矩阵
  2. FFN 中间结果:gate、up 投影结果、非线性激活输出、down 投影输入
  3. LayerNorm 输入/输出
  4. Dropout Mask(推理通常不使用)

4.2 激活值大小估算

以单层计算为例:

中间变量形状占用 (FP16)
QB × S × D2BSD
KB × S × D2BSD
VB × S × D2BSD
Score(可选,FlashAttention 下不存在)B × H × S × S2BHS²
Softmax 输出B × H × S × S2BHS²
ContextB × S × D2BSD
FFN gateB × S × 4D8BSD
FFN upB × S × 4D8BSD
FFN down 输入B × S × 4D8BSD

核心观察: 使用 FlashAttention 可以消除 BHS² 级别的 Score 矩阵显存占用,大幅降低激活值。

4.3 精简估算

单层激活 ≈ (8 ~ 12) × B × S × D
总激活 ≈ N_layers × (8 ~ 12) × B × S × D

示例: LLaMA-3-70B, B=1, S=4096

总激活 ≈ 80 × 10 × 1 × 4096 × 8192 × 2 bytes
       ≈ 53.7 GB

示例: B=64, S=4096

总激活 ≈ 80 × 10 × 64 × 4096 × 8192 × 2 bytes
       ≈ 3.44 TB(无法单卡承载)

注意: 推理时很多框架会逐层释放激活值,峰值显存远低于上述总和。


5. 峰值显存综合分析

5.1 Prefill 阶段 vs Decode 阶段

阶段参数显存KV Cache 显存激活显存瓶颈
Prefill固定低(逐步构建)极高激活值 > 算力
Decode固定极高(持续增长)很低(逐 token)KV Cache > 显存带宽

典型峰值分配:

  • Prefill 阶段:激活值可能超过 KV Cache + 参数
  • Decode 阶段:KV Cache 支配显存

5.2 完整显存公式

总显存 ≈ 参数显存 + KV Cache 显存 + 激活值显存 + 预留缓冲区

推理框架实际使用的简化模型(vLLM 等):

总显存 = 参数显存 + KV Cache 显存 + 预留(~10-20%)

其中 KV Cache 使用预分配机制,在服务启动时即固定最大的 KV Cache 池大小。

5.3 实际案例分析

以 LLaMA-3-70B (FP16) 在 8×A100-80GB 上推理:

组件计算总计
参数 (FP16, TP=8)140 GB / 817.5 GB/卡
KV Cache (B=16, S=4096)10 GB × 16 / 820 GB/卡
激活值 (估算峰值)~2 GB2 GB/卡
预留10%~4 GB
合计~43.5 GB/卡

仍有充裕空间,可以进一步提高 batch size 或序列长度。


6. Batch Size 与并发用户数对显存的影响

6.1 Batch Size 对显存各组件的影响

Batch size 对不同显存组件的影响呈非线性:

组件与 B 的关系增长率说明
模型参数无关0所有 batch 共享同一份参数
KV Cache线性增长 O(B)每个请求独立缓存 KV,互不干扰
激活值(标准 Attention)线性 O(B) + 二次 O(B·S²)1× ~ S×Score 矩阵使 B 和 S 的影响叠加
激活值(FlashAttention)线性 O(B)~1×消除了 B·S² 项,B 仅影响线性项

KV Cache 随 B 增长:

总 KV Cache = 单请求 KV Cache × B

激活值随 B 增长(FlashAttention 场景):

总激活 ≈ N × (5 ~ 8) × B × S × D
        ───────── ─── ─ ─ ─
        层数      系数  B  S  D

6.2 Batch Size 与序列长度的交互效应

Batch size 和序列长度并非独立——它们的乘积 B×S 决定了对显存的实际压力。

显存与 B×S 的关系:

组件与 B×S 的关系实际限制因素
KV CacheO(B×S)受 max_num_seqs × max_model_len 上限约束
激活值 (前置层)O(B×S)LayerNorm、Embedding 等
激活值 (Attention Score,无 FA)O(B×S²)长序列下极快膨胀
激活值 (标准 FA)O(B×S)线性增长

关键比率: 对于固定显存预算,B 和 S 存在 trade-off:

B × S ≈ 常数(给定 KV Cache 预算下)

这意味着——增大 batch size 就必须缩短序列长度,反之亦然。

6.3 并发用户数与显存的关系

并发用户数(Concurrent Users)并不直接等于 batch size,中间经过请求调度器

6.3.1 核心公式
running_batch = min(pending_requests, max_num_seqs, 显存余量决定的物理上限)

其中:

  • pending_requests:当前排队的请求数(受并发用户数影响)
  • max_num_seqs:推理框架配置的最大同时处理数
  • 显存余量决定的物理上限:KV Cache 池剩余 slot 数
6.3.2 静态 Batching(传统方案)
内存占用 = max_batch_size × 单请求 KV Cache

所有请求集中等待,凑齐一个 batch 后一起处理:

并发用户数batch sizeKV Cache 显存平均排队时延
11单请求0
161616×可变
6432 (拆批)32×
N >> MM(cap)极高

问题: 静态 batching 必须等待所有请求到达或填满 batch 才开始推理,导致:

  • 请求到达率波动时显存利用不均
  • 空闲时 GPU 利用率低
  • 请求必须对齐处理(所有请求同时结束才算完)
6.3.3 Continuous Batching(vLLM 等现代方案)

Continuous Batching 在 token 级别进行动态调度,每个请求独立推进解码步。

内存视图(某时刻 t):

KV Cache Pool(预分配固定大小) Req A 解码中... Req B 解码中... Req C 解码中... Req D 已完成 ✓ Req E 已完成 ✓ Req F 正在加入... ▸ 即将解码 ... 正在解码 已结束(slot 待释放) 新加入请求

Continuous Batching 的核心优势:

特性静态 BatchingContinuous Batching
内存分配时机请求到达时集中分配token 粒度动态分配
请求退出时机全 batch 完成逐请求独立退出
新请求加入时机下一个 batch任意 decode 步
显存碎片低(PagedAttention)
有效吞吐(同延迟约束)1.5~3×

显存效率量化:

对于 M 个并发用户,平均序列长度 S_avg,Continuous Batching 的实际 KV Cache 需求:

峰值 KV Cache ≈ peak_concurrency × S_max × 单 token KV Cache

而静态 batching 的需求:

峰值 KV Cache ≈ batch_size × S_max × 单 token KV Cache

peak_concurrency > batch_size 时,Continuous Batching 通过动态调度将等待队列中的请求在显存中<无占用状态>,大幅降低峰值需求。

6.3.4 并发用户数 vs 显存占用曲线
显存占用
  │
  │  ① 参数(固定)────
  │                    │
  │  ② KV Cache 区 ───┤
  │                    │  ③ 预留水位
  │                    │     │
  │                    │   ══╪══ max_num_seqs 上限
  │                    │     │
  │                    │  ┌──┴──┐
  │                    │  │运行中│← continuous batching
  │                    │  └──┬──┘
  │                    │  ┌──┴──┐
  │                    │  │排队中│← 不占显存
  │                    │  └─────┘
  └──────────────────────────────→ 并发用户数

排队中的请求不占用 GPU 显存——只在达到 max_num_seqs 上限后开始排队。这是 Concurrent Batching 的关键特性。

6.4 Service Level Objectives (SLO) 与显存规划

实际部署中,显存配置必须满足服务质量目标。核心指标:

指标定义受 B/并发影响
TTFT (Time to First Token)首 token 延迟与 prefill batch size 正相关
TPOT (Time Per Output Token)每 token 间隔与 decode batch size 正相关
ITL (Inter-Token Latency)token 间延迟同 TPOT
吞吐量tokens/s与 batch size 正相关

B 与延迟的关系(近似模型):

TTFT  ∝  S_prefill × (B_prefill / GPU_compute)
TPOT  ∝  (B_decode × D × N) / GPU_memory_bandwidth

B 与吞吐的关系:

Throughput (tokens/s)  ≈  B_decode × (1 / TPOT)
                       ∝  B_decode × memory_bandwidth / (B_decode × D × N)
                       ≈  memory_bandwidth / (D × N)

当 B 足够大时,吞吐趋向于受内存带宽限制的饱和值;B 过小时,吞吐受计算延迟限制。

SLO 指导下的 max_num_seqs 选择:

给定 TPOT SLO = 50ms,TPOT = B × C (C 为每请求 token 延迟系数)

max_B = 50ms / C(满足延迟 SLO 的最大 batch)
max_num_seqs ≤ max_B(同时需满足显存容量上限)

6.5 Batch Size 的优化选择:吞吐 vs 延迟

不同 Batch Size 下的行为区间:

区间Batch Size显存压力延迟特征吞吐特征适用场景
延迟优化1~4低延迟低吞吐实时对话、流式应用
均衡4~32可接受较高通用在线服务
吞吐优化32~128高延迟最高吞吐离线批处理、数据标注
过载>128极高(OOM 风险)不可接受下降(显存压力导致)

典型场景下的推荐值:

场景模型推荐 max_num_seqs内存策略
实时聊天8B-INT44~8低延迟优先,预留充足空闲显存
代码补全7B-FP1616~32平衡延迟和吞吐
文档分析70B-FP168~16KV Cache 大,需限制并发
离线批量推理任意64~128极限吞吐,可接受高延迟
API 聚合服务70B-INT432~64适配多用户突发流量

6.6 并发用户数规划实战案例

场景: 使用 8×A100-80GB 部署 LLaMA-3-70B (FP16),目标服务 1000 并发用户

步骤 1:确定单卡可用 KV Cache 显存

总显存        = 80 GB
参数显存      = 17.5 GB
预留          = 8 GB  (10%)
可用 KV Cache = 80 - 17.5 - 8 = 54.5 GB / 卡
总可用 KV Cache = 54.5 × 8 = 436 GB

步骤 2:计算单请求 KV Cache

单请求 KV Cache = 2 × 80 × 8192 × 4096 × 2 = 10 GB

步骤 3:估算最大并发数

max_concurrent = 436 / 10 = 43.6 ≈ 43 请求(S=4096 场景)

步骤 4:验算 SLO

TPOT ≈ (43 × 80 × 8192 × 2) / (2 TB/s × 8 GPU)
     = 56.3 ms / token(满足一般交互式 SLO < 100ms)

步骤 5:1000 并发用户时

每秒到达率 = 1000 用户 × (1 / 平均思考时间) 请求/秒
假设平均思考时间 = 10s,到达率 = 100 请求/秒

平均排队长度 = 100 请求/秒 × (43 / 100) ≈ 43 请求排队
平均排队时延 ≈ 43 / 100 ≈ 0.43 秒

1000 并发用户下,系统保持约 43 请求同时在 GPU 中处理,其余排队等待,平均排队时间 < 0.5s,可接受。

6.7 关键量化结论

#结论
1KV Cache 随 B 线性增长,通常在 B > 8 时即超过参数显存,成为最大组件
2并发用户 ≠ batch size:连续批处理将显存占用与并发解耦,排队不占显存
3B×S 乘积决定显存真实压力,两者存在显存预算下的 trade-off
4延迟 SLO 约束了 B 的上限,即使显存充足,也需平衡 TPOT 指标
5Continuous Batching + PagedAttention 是现代高并发服务的显存管理基石,将有效利用率从 60% 提升至 95%
6显存规划需考虑峰值:用户行为有突发性,建议 max_concurrency = 预估均值的 2~3 倍

7. 显存优化技术

7.1 量化

量化方案位宽参数显存缩减质量影响典型框架
FP88-bit50%极小TensorRT-LLM
INT88-bit50%LLM.int8()
INT4(GPTQ)4-bit75%较小AutoGPTQ
INT4(AWQ)4-bit75%较小AWQ
NF44-bit75%较小bitsandbytes
混合精度(FP16 + INT8)部分8-bit30-40%很小vLLM

7.2 显存管理策略

策略机制效果
PagedAttention分页式 KV Cache 管理,类似虚拟内存消除显存碎片,利用率提升至~95%
Prefix Caching自动检测并复用公共前缀 KV Cache多轮对话/系统提示词场景节省 30-60%
Continuous Batching请求级别动态调度,替换静态 batch显存利用率大幅提升
Memory SharingMulti-LoRA 共享基座模型参数多 LoRA 场景显存近乎零增长
激活值 Checkpointing (推理)不保存中间激活,需要时重算激活值显存降至接近 0
显存 OffloadingKV Cache / 参数卸载到 CPU/NVMe突破 GPU 显存上限,但增加延迟

7.3 FlashAttention

FlashAttention 在不近似的情况下将 Attention 计算分块进行,核心收益:

  1. 消除 Score 矩阵(B×H×S×S)显存占用:不实例化完整的 S×S 注意力矩阵
  2. 减少 HBM 读写:通过 tiling 在 SRAM 中完成计算
  3. 不等价于近似:与标准 Attention 数学严格等价

显存收益公式(单层):

标准 Attention + 非 in-place 操作:
  峰值显存 ≈ 2BSD + 3BSD + 2BHS² + 2BHS² + 2BSD = 10BSD + 4BHS²

FlashAttention:
  峰值显存 ≈ 2BSD + 3BSD + 少量 tile 缓存 ≈ 5BSD + 极小

7.4 深度优化的推理策略

策略描述适用场景
Chunked Prefill将长 prompt 拆分为多个 chunk 混合 decode减少 TTFT,抑制 OOM
Speculative Decoding小模型起草 + 大模型验证,减少大模型调用降低 KV Cache 峰值占用(间接)
SplitFuse动态拆分 prefill 和 decode,消除静默期提升 GPU 利用率,稳定显存
Sparse Attention只保留部分 token 的注意力连接超长序列场景

8. Batch Size 与并发用户规划速查

8.1 不同模型在不同并发下的显存估算

以下估算基于 FP16、seq_len=4096、Continuous Batching 场景,单卡 A100-80GB:

模型参数量(FP16)可用 KV Cache/卡单请求 KV Cache每卡最大并发(seq=4K)8卡最大并发
LLaMA-3-8B16 GB56 GB (1卡)1.1 GB~50
LLaMA-3-70B (TP=8)17.5 GB54.5 GB10 GB/8=1.25 GB~43~43
LLaMA-3-70B (INT4, TP=4)8.75 GB63.25 GB10 GB/4=2.5 GB~25~100
Qwen2.5-72B (TP=8)18.2 GB53.8 GB~1.3 GB~41~41
LLaMA-3.1-405B (FP8, TP=16)25.3 GB46.7 GB~0.6 GB~77~77

8.2 并发用户与所需 GPU 数量速查

目标:TPOT < 100ms/token,seq_len=4096,FP16

并发用户数模型 8B (INT4)模型 8B (FP16)模型 70B (FP16, TP=8)模型 405B (FP8, TP=16)
101×GPU 24GB1×GPU 24GB4×GPU 80GB8×GPU 80GB
501×GPU 80GB2×GPU 80GB4×GPU 80GB16×GPU 80GB
1002×GPU 80GB4×GPU 80GB8×GPU 80GB32×GPU 80GB
5004×GPU 80GB8×GPU 80GB32×GPU 80GB64×GPU 80GB
10008×GPU 80GB16×GPU 80GB64×GPU 80GB128×GPU 80GB

假设平均请求长度 4096 tokens,输出 1024 tokens,Continuous Batching 效率 ~90%,TPOT SLO < 100ms。

8.3 显存配置速查公式

最大并发数 ≈ 可用 KV Cache 总显存 / 单请求 KV Cache

可用 KV Cache 总显存 = (GPU 总显存 - 参数显存) × 0.9(预留 10% 开销)

单请求 KV Cache = 2 × N_layers × D × avg_seq_len × dtype_bytes

所需 GPU 数 = 参数显存 / 单卡显存(参数维度)
             ∩ 目标并发 × 单请求 KV Cache / 单卡可用 KV Cache(并发维度)
            取两者最大值

9. 显存估算速查表

9.1 常见模型参数大小

模型参数量FP16INT8INT4
LLaMA-3-8B8.0B16 GB8 GB4 GB
LLaMA-3-70B70.6B141 GB70 GB35 GB
LLaMA-3.1-405B405B810 GB405 GB203 GB
Qwen2.5-72B72.7B145 GB73 GB36 GB
DeepSeek-V3671B (MoE, 37B active)1342 GB (74B active)
Mistral-7B7.3B14.6 GB7.3 GB3.7 GB
Mixtral-8x7B46.7B (MoE)93 GB47 GB23 GB

9.2 KV Cache 估算表

条件:N_layers × D = 80 × 8192 (LLaMA-3-70B 近似),FP16

Batch SizeSeq Len 2048Seq Len 4096Seq Len 8192Seq Len 32768
15 GB10 GB20 GB80 GB
420 GB40 GB80 GB320 GB
1680 GB160 GB320 GB1.28 TB
64320 GB640 GB1.28 TB5.12 TB

9.3 多 GPU 部署推荐配置

模型精度最低 GPU 数*推荐 GPU 数每卡显存框架
LLaMA-3-8BFP161124 GB+vLLM
LLaMA-3-8BINT4118 GB+llama.cpp
LLaMA-3-70BFP164880 GBvLLM / SGLang
LLaMA-3-70BINT41280 GBTensorRT-LLM
LLaMA-3.1-405BFP881680 GBvLLM / TRT-LLM
DeepSeek-V3FP84880 GBSGLang / vLLM

*最低 GPU 数:仅能容纳参数,实际需要 +30-50% 给 KV Cache。


10. 主流推理框架显存管理对比

特性vLLMTensorRT-LLMSGLangllama.cpp
内存管理PagedAttention自定义分配器RadixAttention简单预分配
KV Cache 复用Prefix Caching手动实现自动 Radix Tree
FlashAttention
量化支持AWQ/GPTQ/FP8FP8/INT4/INT8AWQ/GPTQ/FP8GGUF (2-8 bit)
Continuous Batching
显存利用率~95%~90%~95%~85%

11. 调优指南

11.1 显存不足时的排查步骤

显存不足(OOM)
├─ 参数过大
│   ├─ 使用更低精度(FP16 → INT8 → INT4)
│   └─ 增加 GPU 数量(增大 TP 或 PP)
├─ KV Cache 过大
│   ├─ 减小 max_num_seqs(batch size)
│   ├─ 减小 max_model_len(最大序列长度)
│   ├─ 使用 GQA/MQA 架构
│   └─ 启用 Prefix Caching
└─ 激活值过大(主要在 Prefill)
    ├─ 使用 FlashAttention
    ├─ 启用 Chunked Prefill(chunk 大小调小)
    └─ 减小 Prefill 阶段的最大 batch size

11.2 常用显存监控工具

nvidia-smi                  # 实时 GPU 显存占用
nvitop                      # 更友好的显存监控
torch.cuda.memory_summary() # PyTorch 详细显存分析
nsys profile                # NVIDIA Nsight 深度性能分析
vllm status                 # vLLM 运行状态(含 KV Cache 利用率)

12. 关键结论

  1. 推理显存三大部分:参数 + KV Cache + 激活值,其中 KV Cache 在长序列、大 batch 时占比最大
  2. Prefill vs Decode 显存特征不同:Prefill 以激活值为主,Decode 以 KV Cache 为主
  3. 显存优化最有效手段:模型量化(降低参数) + PagedAttention(提升利用率) + FlashAttention(消除激活值尖峰)
  4. MoE 架构天然优势:等效参数量下,激活参数量小,KV Cache 仅与总维度相关,参数显存仅为活跃专家部分
  5. 长上下文场景:KV Cache 成为绝对瓶颈,需要结合 Prefix Caching、Sparse Attention、Offloading 等技术
  6. 框架选择:高吞吐场景选 vLLM/SGLang,极致延迟选 TensorRT-LLM,本地部署选 llama.cpp

🔧 附录:必备工具

🚀 LLM 推理显存与性能计算器

告别手动估算,一键算出你的显存需求

在线交互式工具,输入模型参数、精度、序列长度、并发数等,自动估算显存需求和推理性能:
🔗 立即打开 → LLM 推理显存与性能计算器

更多推荐