概念
| 概念 | 定义 | 单位 |
|---|---|---|
| 参数 (Parameters) | 模型中的可学习权重与偏置(如 $W, b$),训练时通过梯度更新 | 个数,如 7B = 70 亿 |
| 显存 (VRAM) | GPU 上用于存模型、梯度、优化器、激活、KV cache 等的内存 | GB / TB |
关系:参数量决定模型「有多大」,显存决定「要多少卡、能否跑得动」。两者通过数据类型(fp16/fp32)和训练/推理阶段建立数量关系。
参数
概念
神经网络中的参数 = 线性层的权重矩阵 $W$、偏置 $b$,以及 LayerNorm 的 $\gamma, \beta$ 等。例如:
- 线性层 $y = xW + b$:$x \in \mathbb{R}^{d_{in}}$,$W \in \mathbb{R}^{d_{in} \times d_{out}}$($d_{in}$ 输入维度,$d_{out}$ 输出维度),$W$ 有 $d_{in} \cdot d_{out}$ 个参数,偏置 $b \in \mathbb{R}^{d_{out}}$ 有 $d_{out}$ 个
- LayerNorm:$\gamma$(scale)、$\beta$(shift)各 $h$ 维,共 $2h$ 个参数(详见下方推导)
▸推导:线性层与 LayerNorm 参数量
线性层:$y = xW + b$ 中,输入 $x \in \mathbb{R}^{d_{in}}$($d_{in}$ 为输入维度),$W \in \mathbb{R}^{d_{in} \times d_{out}}$($d_{out}$ 为输出维度)。矩阵 $W$ 有 $d_{in}$ 行 $d_{out}$ 列,共 $d_{in} \cdot d_{out}$ 个标量;偏置 $b \in \mathbb{R}^{d_{out}}$ 有 $d_{out}$ 个。合计 $d_{in} \cdot d_{out} + d_{out}$。
LayerNorm:对 $h$ 维输入向量逐维做标准化,再做可学习的缩放与平移。
步骤:设输入 $x \in \mathbb{R}^h$。
- 算均值 $\mu$、方差 $\sigma^2$(在 $h$ 个维度上)
- 标准化:$\hat{x}_i = (x_i - \mu) / \sqrt{\sigma^2 + \epsilon}$
- 缩放平移:$y_i = \gamma_i \hat{x}_i + \beta_i$
$\gamma$ 与 $\beta$:可学习参数。$\gamma$ :scale(缩放)。 $\beta$ :shift(平移)。
标准化会把分布拉到均值 0、方差 1,而网络可能需要保留或调整每个维度的尺度和偏移,因此用 $\gamma$ 放大、用 $\beta$ 平移,让模型自己学。
为什么各 $h$ 个:输入有 $h$ 个维度,每个维度需要自己的 scale 和 shift,故 $\gamma \in \mathbb{R}^h$、$\beta \in \mathbb{R}^h$,共 $2h$ 个参数。
大模型常说的「7B」「70B」:7B = 70 亿个标量参数。
Decoder-Only Transformer 参数量公式
以 LLaMA / GPT 这类 Decoder-Only 架构为准,记:
- $L$:层数
- $h$:隐藏维度 (hidden size)
- $V$:词表大小
- 注意力头数 $a$,单头维度 $d_k = h/a$(参数量与是否多头无关,只是拆分方式不同)
单层结构:
- 自注意力块:$W_Q, W_K, W_V, W_O$ 各 $h \times h$
- 参数量:$4 \cdot h^2$
- 偏置若存在:$+4h$
- MLP 块:通常 $h \to 4h \to h$
- 第一层:$W_1 \in \mathbb{R}^{h \times 4h}$,$4h^2$
- 第二层:$W_2 \in \mathbb{R}^{4h \times h}$,$4h^2$
- 共 $8h^2$(偏置相对可忽略)
- LayerNorm:注意力前、注意力后、MLP 前、MLP 后,共 4 个,各 $2h$
- 共 $8h$
单层总计(主导项):
$$P_{layer} \approx 4h^2 + 8h^2 + 8h = 12h^2 + 8h \approx 12h^2 \quad (h \gg 1)$$
▸推导:单层参数量一步步怎么来
自注意力 $4h^2$:$W_Q, W_K, W_V, W_O$ 各 $h \times h$。输入 $x \in \mathbb{R}^h$,每个矩阵把 $h$ 维映射到 $h$ 维,形状 $h \times h$,参数 $h^2$。四个矩阵:$4 \cdot h^2$。多头只是把 $h$ 拆成 $a$ 个头,总参数不变。偏置若存在:每矩阵一个 $h$ 维向量,共 $4h$。
MLP $8h^2$:MLP 做 $h \to 4h \to h$。第一层 $W_1 \in \mathbb{R}^{h \times 4h}$,参数 $h \cdot 4h = 4h^2$;第二层 $W_2 \in \mathbb{R}^{4h \times h}$,参数 $4h \cdot h = 4h^2$。合计 $8h^2$。偏置 $4h + h = 5h$ 相对 $h^2$ 可忽略。
LayerNorm $8h$:4 个 LN(注意力前/后、MLP 前/后),每个 $\gamma, \beta$ 各 $h$ 维,共 $2h$。$4 \times 2h = 8h$。
为什么 $12h^2 + 8h \approx 12h^2$:当 $h \gg 1$ 时,$h^2$ 远大于 $h$。例如 $h=4096$,$12h^2 \approx 2 \times 10^8$,$8h \approx 3 \times 10^4$,后者约为前者的万分之一,可忽略。
嵌入层:词嵌入 $V \times h$,位置编码若可学习则再加一项,通常 $Vh$ 量级。
总参数量:
$$\boxed{P \approx L \cdot 12h^2 + Vh \approx 12Lh^2}$$
▸推导:总参数量与 $Vh$ 可忽略的原因
$L$ 层 Transformer:每层约 $12h^2$,共 $L \cdot 12h^2$。
嵌入与输出层:词嵌入 $V \times h$($V$ 个 token 各 $h$ 维),输出层 $h \times V$,合计 $2Vh$。通常与 $Vh$ 同量级。
为什么 $Vh$ 可忽略:$V \approx 3 \times 10^4$,$h \approx 4 \times 10^3$,$Vh \approx 1.2 \times 10^8$;而 $12Lh^2$ 当 $L=32, h=4096$ 时约 $6.4 \times 10^9$。$Vh$ 约为 $12Lh^2$ 的 2%,工程上常写成 $P \approx 12Lh^2$。
当 $h$ 较大时,$Vh$ 相对 $12Lh^2$ 可忽略。
手算例题:LLaMA 7B
LLaMA 7B 配置(近似):$L=32$,$h=4096$,$V=32000$。
逐项计算:
| 模块 | 公式 | 计算 | 参数量 |
|---|---|---|---|
| 词嵌入 | $V \times h$ | $32000 \times 4096$ | $\approx 1.31 \times 10^8$ |
| 每层注意力 | $4h^2$ | $4 \times 4096^2$ | $\approx 6.71 \times 10^7$ |
| 每层 MLP | $8h^2$ | $8 \times 4096^2$ | $\approx 1.34 \times 10^8$ |
| 每层 LN 等 | $8h$ | $8 \times 4096$ | $\approx 3.3 \times 10^4$ |
| 单层小计 | $12h^2 + 8h$ | — | $\approx 2.01 \times 10^8$ |
| L 层 | $L \times P_{layer}$ | $32 \times 2.01 \times 10^8$ | $\approx 6.44 \times 10^9$ |
| 输出层 | $h \times V$ | $4096 \times 32000$ | $\approx 1.31 \times 10^8$ |
总计:$1.31\times 10^8 + 6.44\times 10^9 + 1.31\times 10^8 \approx 6.7 \times 10^9 \approx 6.7\text{B}$,与「7B」一致。
▸推导:LLaMA 7B 逐项计算
词嵌入:$V \times h = 32000 \times 4096 = 1.31 \times 10^8$。直接代入。
每层注意力:$4h^2 = 4 \times 4096^2 = 4 \times 1.68 \times 10^7 = 6.71 \times 10^7$。
每层 MLP:$8h^2 = 8 \times 4096^2 = 1.34 \times 10^8$。
每层 LN:$8h = 8 \times 4096 = 3.28 \times 10^4$,相对 $h^2$ 量级可忽略。
单层小计:$12h^2 + 8h \approx 12 \times 4096^2 = 2.01 \times 10^8$。
L 层:$32 \times 2.01 \times 10^8 = 6.44 \times 10^9$。
输出层:$h \times V = 4096 \times 32000 = 1.31 \times 10^8$(与词嵌入对称)。
总计:嵌入 $1.31 \times 10^8$ + 32 层 $6.44 \times 10^9$ + 输出 $1.31 \times 10^8$ $\approx 6.7 \times 10^9$,即约 6.7B,四舍五入称 7B。
▸面试速记
- 单层 $\approx 12h^2$,总 $P \approx 12Lh^2 = 6442450944 ≈ 6.4 \times 10^9 $ B
- 7B:$L=32,h=4096$ 量级;70B:$L=80,h=8192$ 量级
显存
训练显存组成
训练时显存主要来自:
| 组成部分 | 说明 | 与参数量的关系 |
|---|---|---|
| 模型参数 | 权重本身 | $2\Phi$(fp16)或 $4\Phi$(fp32)bytes |
| 梯度 | 每个参数一个梯度 | $2\Phi$(fp16)或 $4\Phi$(fp32)bytes |
| 优化器状态 | Adam:一阶动量 + 二阶动量 | $8\Phi$(fp32)bytes |
| 激活值 | 前向中间结果,用于反向 | 与 batch、seq_len、$L$、$h$ 相关 |
其中 $\Phi$ 为参数量(个数)。
▸概念:fp16 / fp32 中的 fp 是什么
fp = floating point(浮点数)。fp 后面的数字表示有效位数(bit 数),决定一个数占多少字节、能表示多大范围和精度。
| 类型 | 位数 | 字节 | 指数位 | 尾数位 | 特点 |
|---|---|---|---|---|---|
| fp32 | 32 bit | 4 bytes | 8 | 23 | 单精度,精度高,显存占 2 倍 |
| fp16 | 16 bit | 2 bytes | 5 | 10 | 半精度,显存省一半,易溢出/精度损失 |
区别:fp16 范围小、精度低,大数或小梯度易 underflow/overflow;fp32 更稳。
混合精度:前向/反向用 fp16 省显存,优化器状态用 fp32 保证更新精度。
▸推导:训练显存各组成部分
模型参数:每个参数 fp16 占 2 bytes,fp32 占 4 bytes。参数量 $\Phi$,故为 $2\Phi$ 或 $4\Phi$。
梯度:反向传播时每个参数对应一个梯度,形状与参数相同,同样 fp16/fp32,故 $2\Phi$ 或 $4\Phi$。
优化器状态(Adam):一阶动量 $m$(梯度均值)、二阶动量 $v$(梯度平方的均值)各与参数同形,通常用 fp32 存,各 $4\Phi$ bytes,共 $8\Phi$。
激活值:前向时中间层输出需保存供反向使用,与 batch、序列长度、层数、隐藏维度相关,无法用 $\Phi$ 直接表示,需按具体结构算。
训练显存公式(Adam + 混合精度)
混合精度:权重与梯度用 fp16,优化器用 fp32。每参数占用量:
| 项目 | 精度 | bytes/param |
|---|---|---|
| 模型参数 | fp16 | 2 |
| 梯度 | fp16 | 2 |
| 一阶动量 $m$(梯度均值) | fp32 | 4 |
| 二阶动量 $v$(梯度平方均值) | fp32 | 4 |
| 小计 | — | 12 |
▸概念:一阶/二阶动量、master weights
一阶动量 $m$:Adam 中对梯度的指数滑动平均,$m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t$。平滑梯度,减少噪声。
二阶动量 $v$:对梯度平方的指数滑动平均,$v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2$。估计每个参数梯度的方差,用于自适应学习率(梯小的方向多走、梯大的方向少走)。
master weights(fp32):混合精度下,前向/反向用 fp16 的权重省显存;但梯度更新 $\theta \leftarrow \theta - \text{lr} \cdot \text{grad}$ 若在 fp16 里做,小梯度易被截断丢失。因此部分实现额外维护一份 fp32 的权重副本(master weights),在 fp32 里做更新,再拷贝回 fp16 供下一轮前向。这份 fp32 副本占 $4\Phi$ bytes。
部分实现会把 master weights(fp32)也存一份用于更新,则再加 $4\Phi$,即 16 bytes/param。工程上常用经验值:
$$\boxed{\text{训练显存} \approx 16\sim 20 \times \Phi \text{ bytes} + \text{激活}}$$
▸推导:12 与 16 bytes/param 的由来
12 bytes/param:混合精度下,参数 fp16(2)+ 梯度 fp16(2)+ 一阶动量 fp32(4)+ 二阶动量 fp32(4)= 12。即每个参数在训练时至少要占 12 bytes。
16 bytes/param:部分实现额外维护一份 fp32 的 master weights 用于梯度更新(避免 fp16 精度损失),再加 4 bytes,共 16。
激活:与 batch $b$、序列长 $s$、层数 $L$、隐藏维 $h$ 成正比。是否用 gradient checkpoint 会显著影响;粗估约为参数显存的 2–4 倍。
激活与 $b \cdot s \cdot L \cdot h$ 相关,且依赖是否 checkpoint 等,粗略可按 2–4× 参数显存 估算。
推理显存公式
推理无梯度、无优化器,只需:
| 项目 | 说明 | 占用 |
|---|---|---|
| 模型参数 | 权重 | $2\Phi$(fp16)bytes |
| KV cache | 自回归生成时缓存 K、V | 见下 |
$$\boxed{\text{推理显存} \approx 2\Phi + \text{KV cache}}$$
▸推导:推理为何只需 $2\Phi$
推理无反向传播,无梯度、无优化器状态。只需加载模型权重本身,fp16 下每参数 2 bytes,故 $2\Phi$。再加上自回归生成时的 KV cache。
KV Cache 显存公式
(原理与实现详见 KV Cache 教程)
自回归生成时,每步把当前 token 的 K、V 追加到缓存,避免重复计算历史 token。每层有 K、V 两个张量,形状各为 $[B, \text{heads}, S, \text{head_dim}]$,其中 $B$ 为 batch size,$S$ 为当前序列长度,heads 为注意力头数,head_dim 为单头维度,满足 heads $\times$ head_dim $= h$。
单层:$2 \times batch \times seq_len \times h$ 个元素
总 KV cache(bytes):
$$\boxed{\text{KV cache} = 2 \times L \times h \times S \times B \times \text{bytes}}$$
- $L$:层数
- $h$:隐藏维度
- $S$:当前序列长度(含历史 + 新生成)
- $B$:batch size
- bytes:2(fp16)或 4(fp32)
单条序列、fp16:
$$\text{KV cache (bytes)} = 2 \times L \times h \times S \times 2 = 4 L h S$$
▸推导:KV cache 显存公式
单层两个张量-为什么有 K 和 V:注意力用 $Q \cdot K^\top$ 得权重,再乘 $V$。每个历史 token 的 K、V 要留着,下次生成直接复用。所以每层两个张量:K 缓存、V 缓存。
形状 $[B, \text{heads}, S, \text{head_dim}]$ 是什么:多头注意力把 $h$ 维拆成多个头,每头独立算 K、V。
- $B$:batch,几条序列
- heads:头数(如 32)
- $S$:序列长度,几个 token 就存几份
- head_dim:每头的 K/V 向量长度
- 关系:$h = \text{heads} \times \text{head_dim}$(例如 $h=4096$,32 头,则 head_dim=128)
元素数怎么算:形状 $[B, \text{heads}, S, \text{head_dim}]$ → 元素数 $= B \times \text{heads} \times S \times \text{head_dim} = B \times S \times (\text{heads} \times \text{head_dim}) = B \times S \times h$。K 一份、V 一份,共 $2 \times B \times S \times h$ 个元素。
例:$B=1$,$S=100$,$h=4096$,每层 K 形状 $[1, 32, 100, 128]$,元素数 $1 \times 32 \times 100 \times 128 = 409{,}600 = 1 \times 100 \times 4096$。K+V 共 $2 \times 409{,}600$。
总字节:$L$ 层,每元素 fp16 占 2 bytes,故 $2 \times L \times h \times S \times B \times 2 = 4 L h S B$ bytes。
单条 $B=1$、fp16:$4 L h S$。例如 $L=32, h=4096, S=2048$:$4 \times 32 \times 4096 \times 2048 \approx 1.07 \times 10^9$ bytes $\approx 1$ GB。
手算例题:7B 训练与推理显存
训练(参数 + 梯度 + Adam,忽略激活):
$$\Phi = 7 \times 10^9,\quad 16 \times 7 \times 10^9 = 112 \times 10^9 \text{ bytes} \approx 112 \text{ GB}$$
加激活后,7B 全量微调常需 80GB×1 或 40GB×2 以上。
推理(fp16,batch=1,seq=2048):
- 参数:$2 \times 7 \times 10^9 = 14 \text{ GB}$
- KV cache:$4 \times 32 \times 4096 \times 2048 = 1.07 \times 10^9$ bytes $\approx 1 \text{ GB}$
- 合计约 15–20 GB,单张 24GB 卡可跑。
▸推导:7B 训练与推理显存逐项
训练 112 GB:$\Phi = 7 \times 10^9$,按 16 bytes/param,$16 \times 7 \times 10^9 = 1.12 \times 10^{11}$ bytes = 112 GB。不含激活;加激活后约 120–160 GB,故需 80GB×1 或 40GB×2。
推理参数 14 GB:$2\Phi = 2 \times 7 \times 10^9 = 1.4 \times 10^{10}$ bytes = 14 GB。
推理 KV cache 1 GB:$4LhS = 4 \times 32 \times 4096 \times 2048 = 1.07 \times 10^9$ bytes $\approx 1$ GB。
合计:14 + 1 = 15 GB,留余量约 15–20 GB,24GB 卡可跑。
实践与估算
参数量快速估算
已知 $L, h$ 时:
$$P \approx 12 L h^2$$
显存快速估算
| 场景 | 经验公式 |
|---|---|
| 推理(fp16) | 约 $2\Phi$ bytes,即 2 × 参数量(bytes) |
| 训练(Adam + fp16) | 约 16–20 × Φ bytes |
| KV cache(fp16) | 约 $4 L h S$ bytes,$L,h,S$ 代入即可 |
常见模型参考
| 模型 | 参数量 | 推理显存 (fp16) | 训练显存 (粗估) |
|---|---|---|---|
| LLaMA 7B | 7B | ~14 GB | ~120 GB |
| LLaMA 13B | 13B | ~26 GB | ~220 GB |
| LLaMA 70B | 70B | ~140 GB | ~1.2 TB |
KV cache 随序列长度线性增加,长上下文(如 128K)会显著提高推理显存。
面试常考点
- 参数 vs 显存:参数是「模型有多少可学习量」,显存是「要占多少 GPU 内存」;通过 dtype 和训练/推理阶段建立数量关系。
- 参数量公式:$P \approx 12Lh^2$,来自注意力 4$h^2$ + MLP 8$h^2$。
- 训练显存:Adam + 混合精度约 16–20 bytes/param,再加激活。
- 推理显存:$2\Phi$ + KV cache;KV cache = $4LhS$(fp16,单 batch)。
- LoRA / 量化的作用:减少可训练参数或权重精度,从而降低显存与算力需求。
参考
- Transformer 参数量、显存占用、计算量分析 | XJX’Log
- LLaMA 论文与官方配置表
- KV cache、PagedAttention、FlashAttention 等推理优化技术


