如果你要办一场千人宴,最怕的不是菜谱复杂,而是不知道整个后厨到底要做多少次动作。备料、切菜、翻炒、装盘,每一步都会累积成一张“动作账单”。大模型的 FLOPs 就是这张账单。它不关心菜好不好吃,只统计每一个浮点数的“乘法 + 加法”发生了多少次。训练一个 70B 参数的大模型、吃下 2 万亿个 Token,就像包下一条美食街连续营业好几天。想算出这顿饭的工时、用人、设备成本,必须先看懂 FLOPs。好消息是,这张账单不需要打开模型源码逐行数,几个简单公式就能在纸巾上算出量级。
掌握 FLOPs 估算后,你就能用一台计算器算出训练成本、选对 GPU 规模、给团队一份靠谱的预算,这是大模型工程师与基础设施团队的核心沟通语言。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
FLOPs:算力账单的单位
想象你经营一家米其林后厨,为了控制成本,你让厨师每做一道菜就记录一次动作:备料几下、翻炒几下、摆盘几下。大模型训练不是做菜,但道理相同——我们想知道整个训练过程一共做了多少次“浮点运算”。这种动作总数,就是 FLOPs。它不关心模型产出有多智能,只像计数器一样统计每一条矩阵乘法里的乘法与加法。
为什么只数乘法和加法?因为 GPU 最擅长的基础动作就是“乘加融合”。Transformer 里的注意力、MLP、向量映射,本质上全是矩阵乘法;一次矩阵乘法包含大量乘法和加法。把每一个“乘一次、加一次”算成 2 个浮点动作,整张账单就能合并成一个数字。
单位从小到大,有 KFLOPs、MFLOPs、GFLOPs、TFLOPs、PFLOPs。大模型训练账单通常要用 T 和 P 才装得下。1 TFLOPs 等于一万亿次运算,1 PFLOPs 等于一千万亿次运算,相当于给地球上的每个人每秒做一万次计算。
记住这个单位换算,后面所有账单才能对得上。后厨动作太多时,用“千万亿”作单位,账本才不会写满零。
- 左边是单位\(\mathrm{1\ PFLOPs}\) 表示“1 千万亿次浮点运算”。
- P 是前缀P 代表 Peta,也就是 \(10^{15}\),中文叫“千万亿”。
- 右边是动作次数\(\mathrm{FLOPs}\) 是浮点运算的计件单位,数字本身代表次数。
前向传播:照着菜谱做一遍
模型的“前向传播”很像厨师按菜谱做一遍。食材就是参数,Token 是一道菜的原料组合;每读一个 Token,模型要把所有参数都用一遍,算出对下一个输出的预测。这一步确定菜品的味道,也确定最基本的算力成本。
在实际 Transformer 中,Token 先做 embedding,然后穿过多头注意力、FFN、LayerNorm。这些操作看起来眼花缭乱,但底层全是参数矩阵与输入向量相乘。所以一张账单可以简化成:前向处理一个 Token,约等于“2 × 参数量”次浮点运算。注意力中的 QKV 投影和 FFN 的两个线性层都算在里面;只要参数量相同,谁占比高并不影响约等式。
后厨里不管你是切丝还是雕花,只要备好的食材总量不变,基本动作量就不会跑偏。前向就是那套既定动作,2N 是它的计件公式。
- \(C_{\text{forward}}\) 是前向成本表示模型处理一个 Token 所需的浮点运算次数。
- \(N\) 是参数量模型里所有可学习的权重数量,单位通常是亿或十亿。
- 系数 2 是乘加动作每个参数参与一次矩阵运算,产生一次乘法、一次加法,合计 2 次。
反向传播:收拾厨房的隐藏账单
菜做出来还要让客人试味,若不合口,就要回头修改菜谱。反向传播就是这个“回头修改”的动作:根据损失函数算梯度,告诉每个参数该往哪个方向调,才能让下次预测更准。没有这一步,模型就永远学不会。
修改时需要两类信息:损失对权重矩阵的梯度,以及传给上一层的输入梯度。这两类信息都要再做一遍类似前向的矩阵运算,因此反向传播的动作量约为前向的两倍。就像收拾厨房时,不仅要洗锅,还要把每种食材的半成品状态逐一核对记录,工作量比做菜时更大。
激活值存储虽然会占用显存,但不直接写进 FLOPs 公式。就像记录半成品状态要占用冰箱,可冰箱体积并不计入“颠勺次数”。反向传播的账单大头,仍然是梯度矩阵运算。
- 反向是前向的两倍\(2 C_{\text{forward}}\) 表示反向传播需要大约两倍前向的动作量。
- 代入前向公式因为 \(C_{\text{forward}} \approx 2N\),两倍后得到 \(4N\)。
- 结果表示反向成本\(C_{\text{backward}} \approx 4N\) 是每个 Token 的反向传播约等于 4 倍的参数量。
参数量与 FLOPs 的黄金换算
把前向和反向合起来看,每个 Token 平均每个参数要承担约 6 次浮点运算。这张经验公式好用得惊人,几乎与模型的具体结构无关。无论你是注意力模块更多,还是 FFN 更宽,只要总参数量 N 相同,训练一个 Token 的算力量级就差不多。
设 N 是模型总参数量,D 是训练语料包含的总 Token 数。训练总账就是 6ND。70B 模型配 2T Token,把数字带进去就能估算出数量级,而不需要一行行数代码。这也是“算力账单”最实用的地方:不需要打开模型源码,只看参数量和数据处理量。
批量大小不会改变每个 Token 的成本,但会改变单次迭代处理的 Token 总数。所以最终账本仍然由 N 和 D 决定,就像做一万人的宴席,每道菜的动作单价不变,总动作量按份数线性累积。
- 常数 6 来自前向加反向每个参数在每个 Token 上要经过 2 次前向动作和 4 次反向动作。
- \(N\) 是模型参数量从几亿到几千亿不等,决定了单 Token 的基础动作量。
- \(D\) 是训练 Token 总量注意不是语料文件大小,而是模型实际吃过多少次数据。
- 相乘得到总账\(6 N D\) 就是训练全程的浮点运算次数。
训练总账估算:从参数和 Token 出发
有了黄金公式,一切就变成小学数学应用题。一个 70B 参数模型,在 2 万亿 Token 上训练,总账就是 \(6 \times 700 \text{亿} \times 2 \text{万亿} = 8.4 \times 10^{23}\) FLOPs。这个数字大得惊人,但正是大模型训练的真实体量。想验证也很简单,把开源模型公告中的参数量和数据集大小代入即可。
如果训练 2 个 epoch,D 就要翻倍,因为模型把同样的语料多看了两遍。数据重复等于多做一遍菜,成本会重复累计。如果只训练 1T Token,账目相应减半。训练时长、优化器选择都不会改变这个数学计数,最多只影响墙钟时间。
精度改造(例如低精度训练)能提高吞吐速度,但不改变这个 FLOPs 数学计数。算力账单算的是“动作次数”,而不是“动作时间”。时间账单要交给 GPU 天数换算部分处理。所以当你看到一篇论文说“训练成本约 \(8.4 \times 10^{23}\) FLOPs”时,第一反应应该是:它的 6ND 分别填了多少。
GPU 天数换算:把动作总量变成天数
知道了总动作次数,还要知道后厨出菜速度。GPU 的标称 FLOPs 就像厨师在理想状态下的最快颠勺速度;真正落地时会有空等、切配、通信损耗,所以要乘一个利用率 μ。训练场景中 μ 通常取 0.3~0.5,表示只有三四成峰值算力真正用于计算。
设集群有 G 张 GPU,单卡峰值算力为 \(F_{\text{GPU}}\),利用率为 μ,一天有 86400 秒。整个集群每天能完成的有效动作量是 \(F_{\text{GPU}} \times \mu \times 86400 \times G\)。用训练总账 C 一除,就能得到所需天数。这个换算把所有“标称值”翻译成了“作战时间”。
用刚才的 \(8.4 \times 10^{23}\) FLOPs 举例:1000 张 A100,单卡 312 TFLOPs,利用率 40%,算出来约 78 天。如果利用率提升到 50%,约 63 天;若加到 2000 张卡,约 39 天。GPU 天数换算就是一张“人力排班表”。
- \(F_{\text{GPU}} \times \mu\) 是单卡有效算力标称峰值打折扣才是真正干活的算力。
- 86400 是一天的秒数把每秒动作量放大到一天。
- 乘 \(G\) 得到集群每天算力G 张卡并行,动作总量按卡数放大。
- 总账除以每天算力得到天数\(C\) 除以日产能,就是需要的日历时间。
推理计算估算:只做菜不返工
训练结束后,模型正式“开店迎客”。推理阶段没有反向传播,只有前向:给一个输入 Token,沿着参数矩阵走一遍,生成一个输出 Token。你可以把它理解为,客人点什么菜,厨师就按菜谱现做一次,不再需要回头改菜谱。
所以每个输出 Token 的 FLOPs 约是 2N。模型越大,每生成一个字的账单越高;生成文本越长,总成本越大。如果同时服务 B 个用户,每个 Token 都要被 B 个请求各算一遍,总账还要乘上 B。在线服务场景中,这就是每次请求背后的真实算力消耗。
KV 缓存能把历史 Token 的键值存下来,避免重复计算,在工程上显著省时。但在量级估算里,权重矩阵的读取仍然对应 2N 这口饭,推理服务的成本绝不能按“免费续杯”来算。
- \(N\) 是模型参数量推理时每个参数都要被读取并参与计算。
- \(B\) 是批大小或并发请求数同时服务 B 个请求,同样的权重被 B 个请求复用。
- \(T_{\text{out}}\) 是生成 Token 总数一句话 50 个字,就是 50 次前向。
- 系数 2 表示前向乘加推理没有反向传播,所以只有 2N,而不是 6N。
AI 应用场景
场景一:训练预算的纸上推演
阶段:训练成本评估
解决的问题:传统方式只能等厂商报价或凭经验拍脑袋,容易高估或低估。用 6ND 公式,在写代码前就能算出训练总 FLOPs,再结合 GPU 单价评估预算。
具体案例:某团队计划训练一个 70B 模型,语料总量 2T Token。他们先用 6 × 70e9 × 2e12 = 8.4e23 算出总账,再代入 A100 集群规模,快速得到 78 天左右的训练周期,并据此申请预算。
场景二:GPU 集群采购的对比表
阶段:集群基础设施规划
解决的问题:面对 A100、H100 等不同硬件,单看标称 TFLOPs 会误判真实速度。通过 GPU 天数公式,把利用率、卡数、时间统一换算成成本,采购决策更科学。
具体案例:基础设施团队用公式分别计算 1000 张 A100(μ=0.4)与 800 张 H100(μ=0.45)完成同一训练账所需天数,再乘每卡采购价,得出性价比最高的方案。
场景三:推理服务的按量计费
阶段:模型部署与在线推理
解决的问题:传统 API 按“每千 Token”计费但缺少成本依据。用推理 FLOPs 公式,可以算出每次请求的大致 GPU 时间,从而合理定价。
具体案例:某 AI 客服产品用 7B 模型,平均每次请求生成 500 Token,批量并发 64。套用 \(2 N B T_{\text{out}}\) 得到单批推理总账,再除以单卡有效算力,得到每次请求的平均 GPU 耗时,用于成本分摊。
Python 演示
def estimate_training_flops(num_params, num_tokens, epochs=1): return 6.0 * num_params * num_tokens * epochs def estimate_inference_flops(num_params, output_tokens, batch_size=1): return 2.0 * num_params * output_tokens * batch_size def estimate_gpu_days(total_flops, gpu_tflops, gpu_count, utilization=0.4): gpu_flops = gpu_tflops * 1e12 flops_per_day = gpu_flops * utilization * 86400 return total_flops / (flops_per_day * gpu_count) def main(): params = 70e9 tokens = 2e12 train_flops = estimate_training_flops(params, tokens) print("Train FLOPs: %.3e" % train_flops) days = estimate_gpu_days(train_flops, gpu_tflops=312, gpu_count=1000) print("A100*1000 days: %.1f" % days) infer_flops = estimate_inference_flops(params, output_tokens=2048, batch_size=32) print("Infer FLOPs: %.3e" % infer_flops) if __name__ == "__main__": main()
def estimate_training_flops(num_params, num_tokens, epochs=1):把黄金公式 6ND 封装成可复用函数,epoch 乘到 D 上。return 6.0 * num_params * num_tokens * epochs对应 6ND,用浮点乘法避免整数溢出。flops_per_day = gpu_flops * utilization * 86400单卡一天的有效动作量,相当于后厨一天的有效出餐动作。days = estimate_gpu_days(train_flops, gpu_tflops=312, gpu_count=1000)模拟 1000 张 A100 的集群时间估算。print("Train FLOPs: %.3e" % train_flops)用科学计数法展示万亿级数字,避免满屏零。
常见误区
误区模型参数量越大,FLOPs 就等于参数量吧?70B 模型训练一轮就是 70B 次运算。
正解不对。参数量是“食材种类”,FLOPs 是“动作次数”。训练一个 Token 约是 6N 次浮点运算而不是 N;6 来自前向 2 和反向 4。要算总账还需乘 Token 数。
为何常见:两者都随模型规模增大,且公式里都有 N,容易误以为它们指代同一个东西。
误区反向传播就是把前向倒过来跑一遍,所以计算量应该差不多。
正解反向传播需要同时求权重梯度和输入激活梯度,约是前向的 2 倍。因此训练总账约 6N = 2N + 4N,而不是 2N + 很小的额外成本。
为何常见:直觉上“倒着跑一遍”似乎只多一点点开销,忽略了梯度计算的天然翻倍。
误区买一张 312TFLOPs 的 A100,就以为每一秒都能完成 312 万亿次运算。
正解标称值是理论峰值,真实训练还要扣掉通信、显存搬运、等待和调度损耗。公式里必须乘利用率 μ,通常取 0.3~0.5。
为何常见:硬件规格书和广告都强调峰值,容易让人忽略工程中的空闲与排队。
误区模型部署后就不用训练了,推理应该几乎免费。
正解每个生成 Token 仍要走一遍前向,读一遍全部参数,约 2N FLOPs。一次长对话生成上千 Token,成本会快速累积。
为何常见:以为算力成本只来自训练,忘记系统上线后每秒都在做前向推理。
误区语料量 D 已经很大了,训练多个 epoch 对 FLOPs 影响可以忽略不计。
正解6ND 里的 D 是模型“实际吃过的 Token 总量”。训练 2 个 epoch,D 就要把语料量乘以 2。重复训练会完整叠加算力成本。
为何常见:公式太简单,容易忽略 D 的定义是“处理过的 Token 总量”而不是“数据集大小”。
面试题
Q1. FLOPs 最准确的含义是?
- A.模型参数量的大小
- B.浮点运算次数的总和← 正确答案
- C.训练数据 Token 数
- D.显存容量的大小
答案:B。FLOPs 是 Floating Point Operations,即浮点运算次数。参数量只是影响它的变量之一,并不是 FLOPs 本身。就像厨房动作账单不是食材清单,而是所有切、炒、摆盘动作的总和。
Q2. 1 PFLOPs 等于多少 FLOPs?
- A.10 的 9 次方
- B.10 的 12 次方
- C.10 的 15 次方← 正确答案
- D.10 的 18 次方
答案:C。P 代表 Peta,即 \(10^{15}\),中文读作“千万亿”。T 才是 \(10^{12}\),E 是 \(10^{18}\)。大模型训练账单通常落在 PFLOPs 量级。
Q3. Transformer 前向传播中,每个 Token 每个参数大约产生多少 FLOPs?
- A.2 次操作← 正确答案
- B.4 次操作
- C.6 次操作
- D.8 次操作
答案:A。每个参数参与一次矩阵运算,包含一次乘法和一次加法,合计 2 次操作。6 是训练总账的系数,包含前向 2 和反向 4。
Q4. 训练阶段总 FLOPs 的常用近似公式是?
- A.2ND
- B.4ND
- C.6ND← 正确答案
- D.8ND
答案:C。前向约 2N,反向约 4N,所以每个 Token 每个参数约 6N,乘总 Token 数 D 得到 6ND。这是大模型训练成本估算的黄金公式。
Q5. 反向传播的计算量约为前向的多少倍?
- A.1 倍
- B.2 倍← 正确答案
- C.3 倍
- D.4 倍
答案:B。反向传播既要算权重梯度,又要算输入梯度,两套矩阵运算叠加,约是前向的 2 倍。所以训练总账是前向 2N + 反向 4N = 6N。
Q6. 70B 模型在 2T Token 上训练,总 FLOPs 约是多少?
- A.8.4×10^23← 正确答案
- B.2.8×10^23
- C.1.4×10^24
- D.4.2×10^23
答案:A。代入 6ND,\(6 \times 70 \times 10^9 \times 2 \times 10^{12} = 8.4 \times 10^{23}\)。这是 6ND 公式的直接应用,也解释了为什么训练大模型如此依赖大规模算力集群。
Q7. 1000 张 A100(单卡 312TFLOPs,利用率 0.4)训练总账 8.4×10^23 FLOPs,约需多少天?
- A.约 78 天← 正确答案
- B.约 156 天
- C.约 39 天
- D.约 315 天
答案:A。先算单卡一天有效算力:\(312 \times 10^{12} \times 0.4 \times 86400 \approx 1.08 \times 10^{19}\),再乘 1000 卡,最后用 \(8.4 \times 10^{23}\) 除以日产能,约 78 天。
Q8. 以下哪些因素会直接影响 GPU 训练天数估算?
- A.GPU 单卡峰值← 正确答案
- B.算力利用率← 正确答案
- C.集群 GPU 数量← 正确答案
- D.训练框架代码风格
答案:ABC。GPU 天数公式为 \(C / (F \times \mu \times 86400 \times G)\),单卡峰值、利用率、卡数都直接影响分母。代码风格可能影响工程效率,但不属于公式中的直接变量。
Q9. 关于推理阶段 FLOPs 的说法正确的是?
- A.没有反向传播← 正确答案
- B.每生成一个 Token 约 2N← 正确答案
- C.输出 Token 越多总成本越高← 正确答案
- D.推理成本与批大小完全无关
答案:ABC。推理只做前向,所以没有反向传播,每个生成 Token 约 2N,输出越长总账越高。同时服务多个用户时,总账要乘批大小,因此 D 错误。
Q10. 基于 6ND 公式,关于训练总 FLOPs 的说法正确的是?
- A.数据减半但训练 2 个 epoch,总账不变← 正确答案
- B.参数减半且 Token 数不变,总账减半← 正确答案
- C.训练 Token 总数翻倍,总账翻倍← 正确答案
- D.使用更大 Batch Size 会让系数 6 变成 12
答案:ABC。D 是模型总处理过的 Token 数,数据减半但跑 2 个 epoch 等于 D 不变,因此 A 对;参数减半或 Token 数翻倍都直接按比例改变总账。Batch Size 只改变单次迭代大小,不改变 6ND 的系数。