Transformer 参数与显存全景
本文把 Transformer 学习中最容易混淆的两组概念整理成一份"速查 + 记忆"手册:
- 架构五大参数:
d_model/num_heads/seq_len/batch_size/d_ff - 显存五大来源:模型权重 / 激活值 / KV Cache / 激活参数(MoE)/ 临时张量
读完之后,你应该能在脑子里画出这张关系图:
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 $$
因为:
- Attention 投影:$4 d_\text{model}2$(Q/K/V/O 四个矩阵)
- FFN:$2 d_\text{model} \cdot d_\text{ff}$,又因为通常 $d_\text{ff} = 4 d_\text{model}$,仍是 $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 = 4096、num_heads = 32 → head_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 减),但实际上:
- kernel launch 更多
- memory access 更碎片化
→ 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,这是长上下文最大的瓶颈。
为此衍生出一堆优化:
- FlashAttention:分块计算,不显式构造完整矩阵
- GQA / MQA:共享 K/V
- Sliding Window:只看附近
- Ring Attention:跨卡分块
(4) 长上下文 ≠ 真懂长上下文
输入 128k 不代表模型真的记得住,还涉及:
- position encoding(RoPE 外推)
- long-range training
- attention sink
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_model、d_ff、layers |
| 长上下文成本 | seq_len² |
| 显存 | batch × seq × d_model + KV Cache |
| Attention 表达能力 | num_heads、head_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 ...)
- 所有参数每个 token 都参与
- 推理 FLOPs 高、显存稳定
- KV Cache 巨大
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 | 大幅压缩 |
它把两件事叠加做到了极致:
- MoE:推理算力 ≈ 37B 而不是 671B。
- 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