概念

概念 定义 单位
参数 (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$。

  1. 算均值 $\mu$、方差 $\sigma^2$(在 $h$ 个维度上)
  2. 标准化:$\hat{x}_i = (x_i - \mu) / \sqrt{\sigma^2 + \epsilon}$
  3. 缩放平移:$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$(参数量与是否多头无关,只是拆分方式不同)

单层结构

  1. 自注意力块:$W_Q, W_K, W_V, W_O$ 各 $h \times h$
    • 参数量:$4 \cdot h^2$
    • 偏置若存在:$+4h$
  2. 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$(偏置相对可忽略)
  3. 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)会显著提高推理显存。


面试常考点

  1. 参数 vs 显存:参数是「模型有多少可学习量」,显存是「要占多少 GPU 内存」;通过 dtype 和训练/推理阶段建立数量关系。
  2. 参数量公式:$P \approx 12Lh^2$,来自注意力 4$h^2$ + MLP 8$h^2$。
  3. 训练显存:Adam + 混合精度约 16–20 bytes/param,再加激活。
  4. 推理显存:$2\Phi$ + KV cache;KV cache = $4LhS$(fp16,单 batch)。
  5. LoRA / 量化的作用:减少可训练参数或权重精度,从而降低显存与算力需求。

参考