Transformer 的哪个部分最占用显存?
- 标签:Transformer
🏛 业务架构师
Transformer 最占显存的部分,分训练与推理两个场景答(答案不同,这个区分是加分项):
训练时:激活值与优化器状态是大头。粗算一笔(以 7B 模型、混合精度训练为例):
- 模型权重(FP16):约 14GB;
- 优化器状态(AdamW 的 momentum+variance,FP32):约 56GB(权重的 4 倍);
- 梯度:约 14GB;
- 激活值:随 batch×序列长度增长,大 batch 长序列时可达数十 GB——KV、中间矩阵(注意力分数 N×N、FFN 中间维)都在这。综合看优化器状态+激活值通常占 70% 以上——所以有 ZeRO 切分、梯度检查点(用计算换激活显存)这些技术。
推理时:权重 + KV Cache 二元结构:
- 权重固定(FP16 下 7B≈14GB;INT4 量化后≈3.5GB);
- KV Cache 随上下文长度×并发数线性增长——每个 token 每层要缓存 K/V 两份向量;长上下文+高并发时 KV Cache 反超权重成为第一大户(比如 128K 上下文的 KV Cache 可达数十 GB)。
所以针对性优化(业务价值所在):
- 压 KV Cache:GQA/MQA(多头共享 KV,降数倍)、量化 KV(FP8/INT4);
- 压权重:INT8/INT4 量化、MoE 稀疏激活;
- 管理显存碎片:PagedAttention(vLLM)——把 KV Cache 分页管理,并发容量翻倍。
业务视角:显存=单卡能跑多大模型、能接多少并发——直接决定推理成本。GQA 成为 2026 年主流模型标配,正是因为它在"几乎不掉点"下把 KV Cache 砍到原来的几分之一,是性价比极高的一次架构投资。
🏗 系统架构师
显存大头:KV Cache(推理时)与注意力激活(训练时),分开讲:
训练态(每层每样本的显存构成):
- 参数 + 梯度 + 优化器状态:与序列长度无关,但绝对量大(Adam 全量微调 16 bytes/参数);ZeRO/FSDP 分片解决;
- 激活值(长序列的主要矛盾):注意力 softmax 的 n×n 矩阵 + 中间结果——随序列长度平方增长:64K 序列一层注意力矩阵 fp16 就 8GB+;FFN 激活随长度线性但基数大(4×d 的中间维度)。缓解:FlashAttention(不物化 n² 矩阵,激活 O(n))、梯度检查点(重算换显存)、并行分片;
推理态:
- 权重:固定(bf16 2 bytes/参数,7B≈14GB);
- KV Cache(推理显存的第一变量):缓存每层每头的 K/V 供自回归复用——大小 = 2 × 层数 × KV头数 × 头维度 × 序列长度 × batch × 2 bytes,随上下文长度与并发数线性增长:百万 token 上下文单请求 KV 可达数十 GB——并发上限往往先被 KV Cache 打爆而不是算力。缓解:GQA/MQA(KV 头共享,缓存砍 4~8 倍)、量化 KV(fp8/int4)、PagedAttention(分页管理消灭碎片,vLLM 核心)、sliding window(只留局部);
架构师视角的容量公式:推理并发数 ≈ (总显存 - 权重) / 单请求 KV Cache——这个不等式决定了长上下文服务的经济性:GQA 与 KV 量化因此成为现代模型架构的标配设计(推理成本前置到模型结构层面解决)。
💻 全栈开发专家
分场景答(这是面试高频,要分训练/推理说清楚):
训练时最占显存的三块:
- 优化器状态(最大的隐形杀手):Adam 的动量+方差各一份 FP32,加上 FP32 主权重副本——合计约 12 字节/参数,是权重本身(2 字节)的 6 倍。7B 全量微调仅优化器状态就要 84GB——ZeRO 分片/8bit Adam 就是为它而生;
- 激活值(activation):每层的中间结果要留着算反向——随 batch×序列长度线性涨,长序列训练时最容易 OOM 的就是它(gradient checkpointing 用重算换显存,省 60%+);
- 注意力分数矩阵:n×n 的 attention map 及其 softmax 中间量,平方级——FlashAttention「从不物化完整 n×n 矩阵」正是针对它。
推理时:
- KV Cache(绝对大头):每层每 token 的 K/V 缓存,随上下文长度×并发线性增长——长上下文服务的显存瓶颈第一名。数量级感受:7B 模型 FP16 权重 14GB,而 32k 上下文×10 并发的 KV cache 可以轻松超过 14GB。GQA/MQA/PagedAttention 全是冲它来的;
- 模型权重:固定开销(FP16 2 字节/参数),量化(4bit)直接砍 75%。
一句话总结:
- 训练显存 ≈ 权重(2) + 梯度(2) + 优化器(12) + 激活 → 优化器状态是训练的 boss;
- 推理显存 ≈ 权重 + KV cache → KV cache 是长上下文推理的 boss。
排障经验:OOM 时先降 batch/序列长度(激活),再开 gradient checkpointing,再上 ZeRO/量化——按代价从小到大逐级动刀。