大模型训练的“6倍法则”

程序员小x大约 6 分钟AI人工智能

大模型训练的“6倍法则”

很多人看大模型训练成本时,经常会看到一个公式:

训练 FLOPs ≈ 6 × 参数量 × Token 数

70B 模型、1T Token、几百张 GPU、训练几十天……这些数字背后,几乎都绕不开这条经验公式。

但很多人第一次看到时都会困惑:

  • 这个 6 到底从哪来?
  • 它是在算 显存,还是在算 训练速度
  • 为什么不是 2,也不是 4?

答案是:

这条公式估算的是 训练总计算量,也就是训练过程中总共要做多少次浮点运算。

一、先搞清楚:FLOPs 不是 GPU 速度

FLOPs 是什么?

FLOPs = Floating Point Operations = 浮点运算次数

它描述的是:

一共要做多少计算。

你可以把它理解成“总工作量”。

比如:

  • 一次乘法,可以粗略记作 1 次 FLOP
  • 一次加法,也可以粗略记作 1 次 FLOP

所以,FLOPs 回答的是这个问题:

这个模型训练,总共要算多少次?

FLOP/s 又是什么?

FLOP/s = 每秒浮点运算次数

它描述的是:

硬件每秒能完成多少计算。

如果用一个更生活化的比喻:

概念更容易理解的类比
FLOPs一共有多少砖要搬
FLOP/s每秒能搬多少砖

所以:

FLOPs 说的是工作量,FLOP/s 说的是速度。

训练时间大致可以写成:

训练时间 ≈ 总 FLOPs ÷ 实际 FLOP/s

也就是说,6 × 参数量 × Token 数 不是在说“跑得多快”,而是在说“活有多少”。

二、从一个最简单的 Linear 层开始

大模型里最耗算力的操作,本质上大多都是 矩阵乘法

先看一个最简单的线性层:

y = x @ W

假设:

  • x 的 shape 是 (B, D)
  • W 的 shape 是 (D, K)
  • y 的 shape 是 (B, K)

这里可以这样理解:

  • B:Token 数
  • D:输入维度
  • K:输出维度
  • W:模型参数

于是,参数量就是:

参数量 = D × K

三、为什么前向传播是 2 份?

前向传播只做一件大事:

算输出 y = x @ W

矩阵乘法里的每个输出元素,本质上都是一个点积。

也就是说,对于每个输出位置,都会发生:

  • 若干次乘法
  • 若干次加法

粗略估算时,我们通常把它近似写成:

一次乘法 + 一次加法 ≈ 2 FLOPs

因此,前向传播的计算量大约是:

forward FLOPs ≈ 2 × B × D × K

又因为:

  • B = Token 数
  • D × K = 参数量

所以可以写成:

forward FLOPs ≈ 2 × Token 数 × 参数量

这就是为什么大家常说:

前向传播占 2 份。

四、为什么反向传播是 4 份?

训练和推理最大的区别在于:

  • 推理只需要前向传播
  • 训练还需要反向传播

而反向传播里,通常要额外计算两类梯度。

1)参数梯度

第一件事,是计算参数的梯度:

W.grad = x.T @ y.grad

它的含义是:

loss 对参数 W 的梯度是多少?

这个矩阵乘法的计算量,和 forward 是同一个量级:

≈ 2 × Token 数 × 参数量

2)输入梯度

第二件事,是把梯度继续传回上一层:

x.grad = y.grad @ W.T

它的含义是:

loss 对输入 x 的梯度是多少?

为什么这一步也必须算?

因为大模型不是只有一层 Linear,而是一层接一层。如果不把梯度继续往前传,前面的层就没法更新。

这一步的计算量同样大约是:

≈ 2 × Token 数 × 参数量

所以,反向传播总共是:

  • 参数梯度:2 份
  • 输入梯度:2 份

合起来就是:

backward FLOPs ≈ 4 × Token 数 × 参数量

也就是:

反向传播占 4 份。

五、为什么最后会变成 6 倍?

把前向和反向加在一起:

阶段近似计算量
Forward2 × Token 数 × 参数量
Backward4 × Token 数 × 参数量
合计6 × Token 数 × 参数量

因此,训练总 FLOPs 通常可以近似写成:

训练 FLOPs ≈ 6 × 参数量 × Token 数

这个 6 不是玄学,也不是拍脑袋,而是从一个线性层的矩阵乘法 forward/backward 推出来的。

更直白一点:

forward 做 1 次大矩阵乘法,backward 做 2 次,所以总量约是 6 份。

六、一个具体例子:70B 模型到底有多贵?

假设一个模型有:

  • 参数量 = 70B
  • 训练数据 = 1T Tokens

那么训练计算量大约就是:

6 × 70B × 1T = 4.2 × 10^23 FLOPs

这意味着什么?

这不是一个“有点大”的数字,而是一个天文级数字。

也正因为如此,大模型训练才会:

  • 需要大量 GPU
  • 训练时间很长
  • 电力和机器成本都非常高

换句话说:

大模型训练不是简单“把数据喂一遍”,而是每个 Token 都要在巨大的参数矩阵上反复做乘加计算。

七、BF16 / FP16 会改变这个 6 倍吗?

很多人会继续问:

如果我用了 BF16、FP16、Tensor Core,这个 6 倍会不会变小?

一般来说:

不会。

原因很简单:

  • 6 × 参数量 × Token 数 描述的是 总工作量
  • BF16 / FP16 / Tensor Core 优化的是 完成这份工作量的速度

也就是说,低精度优化通常不会让“要干的活变少”,而是让 GPU:

  • 算得更快
  • 吞吐更高
  • 显存更省
  • 成本更低

所以你可以这样记:

6 倍公式:决定工作量
低精度优化:提升速度与效率

同样一堆砖,低精度不是让砖变少,而是让你搬得更快。

八、这个公式是不是精确到每一个算子?

也不是。

它是一个非常有用的 经验估算公式,适合帮助我们快速判断训练成本的数量级。

真实训练里,除了矩阵乘法,还会有很多其他开销,比如:

  • Attention score
  • Softmax
  • LayerNorm
  • 激活函数
  • Dropout
  • Embedding
  • 优化器更新
  • 通信开销
  • 显存读写

但在大模型里,矩阵乘法通常占据主要计算量,所以:

训练 FLOPs ≈ 6 × 参数量 × Token 数

依然是一个非常实用的近似公式。

它特别适合用来理解这些问题:

  • 模型为什么越大越贵?
  • Token 为什么越多越贵?
  • 训练为什么比推理贵很多?

九、最后总结

把整篇文章压缩成一句话:

大模型训练的“6倍法则”,本质上来自线性层矩阵乘法的 forward 和 backward。

你可以把它记成下面这张“账单”:

  • 前向传播:算输出,占 2 份
  • 反向传播:算参数梯度,占 2 份
  • 反向传播:算输入梯度,占 2 份

所以最终:

训练 FLOPs ≈ 6 × 参数量 × Token 数

理解了这个公式之后,你再去看大模型训练成本,就不会只停留在“参数很多”“GPU 很贵”这种模糊印象上。

你会更清楚地知道:

每一个 Token,都要穿过巨大的参数矩阵;
每一次训练,不仅要算答案,还要把误差反向传回去。
这,就是大模型训练真正烧钱的地方。

Loading...