← 返回题目列表

如何估算大模型训练的算力和显存?6ND 法则是什么?

高频 困难 第 10 / 25 题 更新于 2026/09/25
训练算力FLOPs6ND显存估算显存构成
学习 AI 实战项目

简化版

密集 Transformer 训练可用 C≈6ND 做数量级估算:N 为参数量、D 为训练 Token;它把主导参数矩阵的前向约 2ND、反向约 4ND 相加。显存则拆成参数、梯度、优化器状态、激活和临时/通信缓冲。传统 FP16 参数 + FP16 梯度 + FP32 master weight + FP32 Adam m/v 的账本约 16 字节/参数,但 BF16 参数、无独立 master copy、低精度优化器或分片实现会改变这个数字。

详细版

算力估算:C ≈ 6ND

C(训练总 FLOPs) ≈ 6 × N(参数量) × D(训练 token 数)
  前向 ≈ 2ND
  反向 ≈ 4ND(反向约为前向的 2 倍)
  合计 ≈ 6ND
  • 例:训练 Llama-7B(N=7e9)用 2e12 token → C ≈ 6 × 7e9 × 2e12 ≈ 8.4e22 FLOPs。
  • 有了 C,可除以“卡数 × 对应精度峰值 × 实测 MFU”估理想主训练时间,再加入数据、保存、评测、故障与重算。

显存构成:四块

组成大小(混合精度 + Adam)说明
参数(FP16)2N 字节计算用的低精度权重
梯度(FP16)2N 字节与参数等大
优化器相关状态12N 字节此特定账本含 FP32 参数副本 4 + m 4 + v 4
模型状态小计≈ 16N 字节上面三项之和
激活依 Batch、序列、隐藏维、层数与 Attention 实现常见张量近似线性,朴素注意力矩阵含序列平方项
  • 模型状态 ≈ 16 字节/参数:7B 模型光这部分就约 112GB,远超单卡,必须靠 ZeRO/并行分摊。
  • 激活是另一大头,靠梯度检查点压缩。

MFU(模型算力利用率)

实际训练达不到设备理论峰值,MFU = 估算的有效模型 FLOPs / (设备数×对应精度峰值×时间)。它随模型 Shape、序列长度、并行、重计算与硬件而变,应使用目标配置实测值,不套固定区间。

完整版教学

一、为什么要会”估算”

面试和实际工程都常问:“训一个 X B 模型、Y T Token,要多少卡、多久、多少显存?”可先用算力尺 6ND 和传统 Adam 账本 16N + 激活/缓冲 做粗估,再主动说明它们各自的假设。估算的价值是缩小容量范围,而不是替代目标配置 Profile。

二、6ND 从哪来:每 token 每参数约 6 FLOPs

核心事实:Transformer 里主要计算是矩阵乘,一次「乘加」算 2 个浮点运算。对每个 token、每个参数:

  • 前向:每个参数参与一次乘加,约 2 FLOPs/参数/token,全程 ≈ 2ND。
  • 反向:要算「对输入的梯度」和「对权重的梯度」两部分,计算量约是前向的 2 倍,≈ 4ND。
  • 合计 ≈ 2ND + 4ND = 6ND。

所以主参数矩阵训练量常近似为 6ND。它会漏掉 Attention 的序列长度相关项、词表投影细节、激活重计算、MoE 路由以及逐元素算子;长上下文、小模型或稀疏模型下偏差可能明显。它适合早期数量级规划,正式容量和工期要用 profiler 或实测 Token 吞吐校准。

记忆钩子:前向 2、反向 4、合计 6——每 token 每参数约 6 FLOPs,训练算力 C≈6ND。

三、用 6ND 估训练时间

有了总算力 C,估时间只需再引入两个量:

训练时间 ≈ C / (卡数 × 单卡有效算力)
单卡有效算力 = 单卡理论峰值 FLOPS × MFU

MFU 是关键现实折扣:访存、通信、流水线空泡和 Shape 效率都会让有效模型 FLOPs 低于标称峰值。应使用同硬件、同精度和相近配置的实测 MFU,并说明激活重计算 FLOPs 是否计入分子。

举例:若规划设备在目标精度下可按每卡 1e15 FLOP/s 峰值做示意,并假设实测 MFU 为 40%,用 1024 卡执行 8.4e22 FLOPs:

有效总算力 ≈ 1024 × 1e15 × 0.4 ≈ 4.1e17 FLOPS
时间 ≈ 8.4e22 / 4.1e17 ≈ 2e5 秒 ≈ 2.4 天

数量级立现。这就是「多少卡训多久」的快速估法。

四、显存为什么是 16 字节/参数

训练显存的「模型状态」部分(不含激活)在混合精度 + Adam 下,逐参数账本是:

FP16 参数        2 字节   (前向反向计算用)
FP16 梯度        2 字节   (与参数等大)
FP32 参数副本    4 字节   (master weights,保证更新精度)
Adam 一阶动量 m  4 字节   (FP32)
Adam 二阶动量 v  4 字节   (FP32)
------------------------------------
合计            16 字节 / 参数

所以在这一特定账本下,7B 模型的模型状态约 7e9 × 16 ≈ 112GB,尚未计激活和缓冲。这直接解释了两件事:

  • 为什么需要 ZeRO/FSDP 或模型并行:把不同状态分片到多卡;实际每卡份额还受分片阶段、复制组和通信缓冲影响,并非一概精确为全局卡数分之一。
  • 为什么优化器相关状态常先分片:在此账本中 m/v 与 FP32 master 合计 12/16,复制开销很大;具体 master weight 归属和 ZeRO 实现以框架为准。

五、别忘了激活:另一大头

模型状态账主要随参数量变化,而激活随 Batch、序列长度、隐藏维、层数和算子实现变化。许多保存张量近似随序列长度线性增长;朴素 Attention 若保存完整分数/概率矩阵还包含 O(S²) 项,FlashAttention 等实现会显著改变常数和内存复杂度。在大 Batch、长上下文时,激活可能超过模型状态。

应对手段(对应前面几道题):

  • 梯度检查点:少存激活、反向重算,把激活显存降到约 O(√层数)。
  • 序列/上下文并行:把长序列切到多卡。
  • 减小 micro-batch:直接降激活量。

完整的显存账 = 模型状态(16N,靠 ZeRO 分片)+ 激活(靠梯度检查点压缩)+ 一些临时缓冲。会拆这三块,就能定位「显存爆在哪、该开哪个优化」。

六、给 7B 模型做两本账

7B 模型用混合精度 Adam 训练时,若按参数、梯度、FP32 主权重和两份优化器状态粗算 16 字节/参数,仅模型状态约 7e9×16=112GB,尚未包含激活和临时缓冲。训练 300B token 的计算量按 6ND 粗估约为 1.26e22 FLOPs。

model_states ≈ 7e9 * 16 bytes = 112 GB
training_flops ≈ 6 * 7e9 * 3e11 = 1.26e22 FLOPs
账本决定什么常见遗漏
模型状态单步能否装下优化器、主权重
激活序列与 batch 上限重算与临时张量
FLOPs理想总工时有效利用率与故障

显存账决定能否放下单步,FLOPs 账决定总训练时间,两者不能互相替代。真实容量还要加激活、通信 bucket、碎片和 checkpoint 临时峰值;真实工期则要用有效吞吐而非 GPU 峰值,并计入故障、评测和保存开销。

七、常见误区与追问

  • 误区:训练算力就是前向的量。 反向约是前向 2 倍,合计 6ND,不是 2ND。
  • 误区:显存主要由低精度参数决定。 在传统 16B/参数账本里,master weight 与 Adam 状态更大;但具体字节数随实现变化,激活和临时缓冲也可能主导。
  • 追问:6ND 里 6 怎么来的? 前向 2 + 反向 4(反向算输入梯度和权重梯度,约 2 倍前向)。
  • 追问:为什么估时间要用 MFU? 它把访存、通信、空泡和 Shape 效率折算进有效模型吞吐;应取目标配置实测值。
  • 追问:16 字节/参数怎么拆? FP16 参数 2 + FP16 梯度 2 + FP32 副本 4 + Adam m 4 + v 4。
  • 追问:BF16 参数、不存独立 FP32 副本能省吗? 可以,但优化器状态/更新精度和框架支持会变化,必须以收敛与实际内存回归决定。
  • 追问:激活为什么随序列长度增长? 每层每个 Token 都产生中间值;朴素注意力还可能保存 S×S 张量,具体增长由 kernel 和重计算策略决定。

八、加强记忆

先用两本账:计算账以 6ND 估密集模型主矩阵 FLOPs,再用目标精度峰值与实测 MFU 换时间;显存账把参数、梯度、优化器、激活和临时缓冲逐项列出。16N 只对应“FP16 参数/梯度 + FP32 master + FP32 Adam m/v”这一传统实现,不是 BF16、低精度优化器或所有框架的常数。6ND 同样会漏长上下文 Attention、重计算和 MoE 细节。先给数量级,再主动说明假设并用 profiler、分片拓扑和实际 Token/s 校准,才是可用于容量规划的答案。