Transformer 参数与显存全景

本文把 Transformer 学习中最容易混淆的两组概念整理成一份"速查 + 记忆"手册:

读完之后,你应该能在脑子里画出这张关系图:

flowchart LR A[d_model] -->|平方放大| P[参数量] F[d_ff] -->|线性放大| P L[layers] -->|线性放大| P P --> W[权重显存] B[batch_size] --> ACT[Activation] S[seq_len] --> ACT A --> ACT S -->|线性增长| KV[KV Cache] L --> KV H[num_heads / kv_heads] --> KV W --> VRAM[总显存] ACT --> VRAM KV --> VRAM

0. 速查表(先记这一张)

0.1 五大参数一句话总结

参数 一句话定位 主要放大的东西 经验值
d_model 每个 token 的向量宽度 参数量(平方级)、激活值 1024 / 4096 / 8192
num_heads 注意力的"视角数" 注意力多样性,不直接增加参数 head_dim ≈ 64–128
seq_len 一次看多少 token 注意力计算量(平方)、KV Cache 4k / 32k / 128k
batch_size 一次塞多少条样本 激活值、KV Cache、吞吐量 训练求大、推理求平衡
d_ff FFN 中间层宽度(一般 4×d_model) 参数量(FFN 占 60–80%)、推理时间 4 × d_model

0.2 显存四大来源一句话总结

来源 何时出现 主要随什么增长 备注
权重 Weights 一直在 参数量 × 精度 7B-FP16 ≈ 14GB
Activation 训练时占大头 batch × seq × layers × d_model 推理时小很多
KV Cache 推理时占大头 batch × layers × seq × kv_heads × head_dim 长上下文杀手
临时 Tensor 算子内部 一般可忽略 FlashAttention 主要省的就是它

0.3 记忆口诀

d_model 决定脑容量(参数平方)
num_heads 决定视角数(不长参数)
seq_len 决定看多远(平方代价)
batch  决定吞吐量(线性放大)
d_ff   决定知识库(占大多数参数)

1. d_model:隐藏维度(embedding dim)

1.1 含义

每个 token 在模型内部表示为一个 d_model 维向量。例如 d_model = 4096 表示:

token -> 4096 维向量

1.2 它影响什么

(1) 模型表达能力(最核心)

d_model 越大,每个 token 能承载的信息越多,表达空间越丰富。这是大模型最本质的扩展方向之一。

32 维   -> 小脑袋
4096 维 -> 大脑袋

(2) 参数量(平方级放大)

$$ \text{params} \propto d_\text{model}2 $$

因为:

d_model 参数规模变化
1024 baseline
2048 ~4×
4096 ~16×

(3) 激活显存(线性放大)

$$ \text{activation} \propto \text{batch} \times \text{seq_len} \times d_\text{model} $$

所有中间 tensor 都随 d_model 线性变大。

(4) 训练稳定性

d_model 太大时更难训练,需要更大 batch、更小学习率和更好的 normalization。

1.3 记忆点

d_model 是模型"脑容量"。参数量按平方涨,显存按线性涨。


2. num_heads:注意力头数

2.1 含义

Multi-Head Attention 把 d_model 切成多个子空间并行计算:

$$ \text{head_dim} = \frac{d_\text{model}}{\text{num_heads}} $$

例:d_model = 4096num_heads = 32head_dim = 128

2.2 它影响什么

(1) 注意力模式多样性

不同 head 学不同关系:语法、长距离依赖、代码结构……类似"多个专家同时观察"。

(2) 并行子空间建模

每个 head 有独立 Q/K/V 投影,本质是"多视角表示"。

(3) head_dim 太小会退化

4096 / 128 head = 32 维/head -> 表达力不足

经验值:head_dim ≈ 64–128 最佳,所以 Llama 3 等模型几乎清一色 head_dim = 128

(4) 计算性能

理论 FLOPs 不变(num_heads 增 ≈ head_dim 减),但实际上:

→ heads 过多反而更慢。

2.3 记忆点

num_heads 改变"视角数",不改变总参数量;head_dim 别低于 64。


3. seq_len:序列长度

Transformer 中最昂贵的维度。

3.1 它影响什么

(1) 上下文长度

直接决定模型一次能看多少 token。

seq_len 能力
512 短文本
4k 普通对话
32k 长文档
128k+ 超长上下文

(2) Attention 计算量(平方级,致命)

$$ \text{Attention FLOPs} \propto \text{seq_len}2 $$

每个 token 都要和所有 token 算注意力:

seq_len attention matrix 大小
2k 4 M
8k 64 M
32k 1 B

(3) 显存爆炸

注意力矩阵就是 seq_len × seq_len,这是长上下文最大的瓶颈。

为此衍生出一堆优化:

(4) 长上下文 ≠ 真懂长上下文

输入 128k 不代表模型真的记得住,还涉及:

3.2 记忆点

seq_len 是"二次方代价"。能输入 ≠ 能理解。


4. batch_size:批大小

4.1 它影响什么

(1) 训练稳定性

更大 batch → 梯度更稳定、loss 更平滑、吞吐更高。

(2) 泛化能力

小 batch 噪声大 -> 泛化更好
大 batch 收敛快 -> 训练更稳

(3) GPU 利用率

H100/A100 等大卡需要较大 batch 才能吃满算力。

(4) 显存(最直接的放大器)

$$ \text{activation} \propto \text{batch} \times \text{seq_len} \times d_\text{model} $$

KV Cache 也随 batch 线性增长。

4.2 记忆点

batch 是显存与吞吐的总开关;训练求大,推理求平衡。


5. d_ff:FFN 隐层维度

Transformer 中:Attention 负责信息路由,FFN 负责知识存储

5.1 结构

$$ d_\text{model} \rightarrow d_\text{ff} \rightarrow d_\text{model} $$

经验设置:

d_ff = 4 * d_model
d_model d_ff
1024 4096
4096 16384
8192 28672(Llama 3 70B,SwiGLU 略小于 4×)

5.2 它影响什么

(1) 模型知识容量

FFN 通常占整个 Transformer 60% – 80% 的参数,是模型的"记忆体"。

(2) 非线性表达能力

Attention 本质偏线性组合,真正的复杂变换大多来自 FFN。

(3) 参数量

$$ \text{FFN params} = 2\,d_\text{model}\,d_\text{ff} $$

d_ff 增大 → 参数暴涨。

(4) 推理速度

FFN 是矩阵乘法大户。短上下文时,FFN 比 Attention 还耗时。

5.3 记忆点

FFN 是"知识库",吃掉大多数参数,也吃掉大多数推理时间。


6. 五个参数的总关系

你关心的东西 主要由谁决定
模型规模(参数量) d_modeld_fflayers
长上下文成本 seq_len²
显存 batch × seq × d_model + KV Cache
Attention 表达能力 num_headshead_dim
"知识密度" d_ff(FFN)

一种流行观点:

FFN 才是真正存知识的地方,Attention 只是检索路由。

典型大模型配置(Llama 3 70B 类)

参数 数值
d_model 8192
num_heads 64
head_dim 128
d_ff 28672
seq_len 8k – 128k
batch_size 动态

注意 head_dim 一直维持在 128 —— 这是目前公认的最佳平衡点。


7. 显存到底由什么组成

推理时显存:

$$ \text{VRAM} = \text{Weights} + \text{KV Cache} + \text{Activation} + \text{临时 Tensor} $$

训练时显存:

$$ \text{VRAM} = \text{Weights} + \text{Gradients} + \text{Optimizer States} + \text{Activation} $$

容易混淆的五个东西:

概念 是什么 何时大
模型大小 / 参数量 静态权重总量 总是占着
Activation(激活值) 前向产生的中间 tensor 训练时巨大
Activated Params(激活参数) MoE 概念:当前 token 实际用到的参数 仅 MoE 模型有意义
KV Cache 推理时缓存的 K/V 长上下文时爆炸
实际显存占用 以上的总和 + 框架开销

7.1 权重显存公式

$$ \text{VRAM}_\text{weights} = \text{params} \times \text{bytes_per_param} $$

精度 每参数字节 70B 模型大小
FP32 4 280 GB
FP16/BF16 2 140 GB
INT8 1 70 GB
INT4 0.5 35 GB

这就是为什么 量化后消费卡也能跑大模型

7.2 Activation vs Activated Params(别再混)

概念 是 tensor 还是 weight 谁的概念
Activation 中间 tensor(hidden states) 所有网络
Activated Params 真正被用的权重子集 仅 MoE

8. 模型架构对显存的影响

8.1 Dense Transformer(Llama 3、GPT-4 推测、Qwen 2.5 ...)

8.2 MoE(DeepSeek-V3、Mixtral ...)

每层只激活少数 expert,例如 256 个 expert 选 8 个。

总参数 激活参数
671B 37B(DeepSeek-V3)
好处 代价
总参数巨大、知识容量极大 显存仍要装下全部参数
推理算力接近小模型 路由 / 通信成本高、训练更复杂

MoE 降低 FLOPs,但不一定降低显存。

8.3 其它常见架构对比

架构 关键特点 显存影响
Dense Transformer 全参数激活 KV Cache 大
MoE 部分参数激活 总权重不减,FLOPs 降
GQA K/V head 共享 KV Cache 显著缩小
MLA(DeepSeek) 压缩 K/V KV Cache 进一步压缩
Mamba 系列 无 attention 无 KV Cache

9. KV Cache 与 GQA / MQA / MLA

9.1 KV Cache 本质

自回归生成下一个 token 时,旧 token 的 K、V 不重新算,直接缓存:

$$ \text{KV Cache} \propto \text{batch} \times \text{layers} \times \text{seq_len} \times \text{kv_heads} \times \text{head_dim} \times 2 $$

(×2 是因为 K 和 V 两份)

9.2 为什么长上下文爆显存

70B 模型示例:

context KV Cache 估算
4k 几 GB
32k 十几 GB
128k 数十 GB

很多场景下 KV Cache 比模型权重本身还大

9.3 GQA / MQA / MLA

方案 思路 KV Cache 缩减 代表模型
MHA 每个 Q head 独立 K/V 1×(基线) 原始 Transformer
GQA 一组 Q head 共享一份 K/V 数倍 Llama 3、Gemma 2、Qwen 2.5
MQA 所有 Q head 共享一份 K/V 极大 Falcon 等
MLA 把 K/V 压缩到低秩潜空间 数倍且不掉点 DeepSeek 系列

例如 64 query heads + 8 kv heads 的 GQA,KV Cache 缩小 8 倍 —— 这是现代模型的事实标配。


10. 训练 vs 推理 显存差异

阶段 主导显存来源 原因
训练 Activation 最大 反向传播要保留前向中间结果
推理 KV Cache 最大 不需要反传,但需要缓存历史 K/V

公式上:

$$ \text{Activation} \propto \text{batch} \times \text{seq} \times \text{layers} \times d_\text{model} $$

所以训练最怕三件事:大 batch、长 context、深层数


11. 综合关系总览

维度 主要影响
参数量 最低显存门槛
seq_len KV Cache 大小、attention 平方代价
batch_size Activation + KV Cache 增长速度
模型架构 参数利用率、KV Cache 压缩能力、推理效率
MoE 降低 FLOPs,不一定降低显存

12. 案例:为什么 DeepSeek-V3 这么"省"

数值
总参数 671B
激活参数 37B
架构 MoE
Attention MLA
KV Cache 大幅压缩

它把两件事叠加做到了极致:

  1. MoE:推理算力 ≈ 37B 而不是 671B。
  2. MLA:KV Cache 压缩 → 长上下文成本大幅下降。

效果就是:

总参数顶级、推理成本可控。 这是当前大模型的核心方向。


13. 一页带走

五大参数:
  d_model  -> 脑容量(平方放大参数)
  num_heads -> 视角数(head_dim 别低于 64)
  seq_len   -> 看多远(平方代价,长文本杀手)
  batch     -> 吞吐 / 显存的总开关
  d_ff      -> 知识库(FFN 占大多数参数)

显存四件套:
  Weights        = params × precision      (量化主要省它)
  Activation     ∝ batch × seq × d_model    (训练大头)
  KV Cache       ∝ batch × seq × kv_heads   (推理大头,GQA/MLA 主要省它)
  Activated Params 是 MoE 专属概念,跟 Activation 完全不同

记住一句话:
  d_model 决定"模型有多大",
  seq_len 决定"显存有多炸",
  架构(GQA/MLA/MoE) 决定"同样规模下能跑多省"。

Page Source