
1. 从一个被问烂了的问题说起FLOPS 和 FLOPs 到底是不是一回事如果你在算力圈、AI 基础设施圈或者高性能计算圈待过一段时间一定见过这样的场景有人在群里发了一张显卡规格表上面写着“FP16 算力 312 TFLOPS”底下立刻有人回一句“这个 FLOPs 是理论峰值还是实测”——然后讨论就彻底跑偏了因为提问的人和回答的人说的很可能根本不是同一个东西。这个大小写之差看起来像是排版事故实际上背后牵扯的是两个层面完全不同的概念。FLOPS全大写是衡量计算设备性能的指标单位是“每秒浮点运算次数”FLOPss 小写是衡量一个模型或一段算法工作量的指标指的是“浮点运算的总次数”。一个是速度一个是总量。把它们混为一谈就像把“汽车的最高时速”和“从北京到上海的总里程”当成同一个数字来讨论逻辑上根本不成立。我之所以想专门写这一篇是因为在过去几年里我见过太多因为这两个词混淆而导致的真实误判有人拿模型的 FLOPs 去除以硬件的 FLOPS 来估算训练时间结果差了三个数量级有人在选型报告里把“TFLOPS”和“TFLOPs”当成同一个单位写进 PPT被评审专家当场指出还有人看到某个模型“只有 5 GFLOPs”就断言它一定比“50 GFLOPs”的模型快完全忽略了内存带宽和算子效率的影响。这篇内容适合三类人看一是刚进入 AI 系统或算力相关领域、被这两个词绕晕的新人二是需要写技术方案、做硬件选型、估算训练成本的工程师三是任何需要在文档、汇报、论文里准确使用这两个术语的人。我会从定义、单位体系、计算方式、实际应用场景、常见误区和实操估算方法几个角度把这件事彻底讲透。读完之后你至少能做到看到任何一个带 FLOPS/FLOPs 的数字能立刻判断它说的是什么、能不能直接比较、该怎么用。2. 定义拆解一个字母的大小写隔开的是两个世界2.1 FLOPS硬件性能的“最高时速表”FLOPS 是FLoating-pointOperationsPerSecond 的缩写注意最后一个 S 是 Second所以它天然就是一个“速率”单位——每秒能完成多少次浮点运算。它描述的是硬件的能力上限比如 CPU、GPU、TPU、NPU 这些计算芯片。这个指标的本质是在理想条件下芯片在单位时间内理论上能完成的浮点运算次数。计算公式可以粗略理解为FLOPS 核心数量 × 每核心每周期可执行的浮点运算次数 × 运行频率举个例子一块 GPU 有 10000 个流处理器每个流处理器每个时钟周期能完成 2 次单精度浮点运算一次乘加算 2 次运算运行频率是 1.5 GHz那么它的理论单精度峰值就是10000 × 2 × 1.5e9 3e13 FLOPS 30 TFLOPS这里的 TFLOPS 就是 Tera FLOPS10 的 12 次方。这个数字是硬件规格书里最常出现的那个也是厂商最喜欢拿来宣传的那个。但你要清楚这是理论峰值是“实验室理想状态下的最高时速”实际跑出来的有效算力往往只有它的 30% 到 70%具体取决于你的任务能不能把硬件喂饱。2.2 FLOPs模型工作量的“总里程数”FLOPs 是FLoating-pointOperations 的缩写注意这里没有“per second”所以它是一个总量概念——完成一次前向传播或一次完整的训练迭代总共需要进行多少次浮点运算。它描述的是模型或算法的计算复杂度和硬件无关。同一个模型不管你跑在什么芯片上它的 FLOPs 基本是固定的在输入尺寸固定的前提下。这也是为什么论文里报模型复杂度时用的都是 FLOPs因为它是一个客观的、可复现的工作量度量。对于最常见的卷积层FLOPs 的估算公式是FLOPs 2 × K_h × K_w × C_in × C_out × H_out × W_out其中 K 是卷积核尺寸C 是通道数H/W 是输出特征图的空间尺寸。前面的 2 是因为一次乘加运算算作 2 次浮点运算一次乘法加一次加法。全连接层的公式类似是2 × 输入维度 × 输出维度。2.3 一张表把两者的差异钉死维度FLOPSFLOPs全称Floating-point Operations Per SecondFloating-point Operations中文每秒浮点运算次数浮点运算次数性质速率、性能指标总量、工作量指标描述对象硬件芯片、加速卡模型、算法、算子是否随硬件变化是不同硬件不同否同一模型基本固定典型单位TFLOPS、PFLOPSMFLOPs、GFLOPs、TFLOPs常见出处显卡规格书、超算排名论文、模型卡片、编译器报告能否直接比较同类硬件之间可比同类模型之间可比混用的后果估算训练时间差几个数量级选型结论完全错误这张表建议你截图存下来。我在实际工作中发现90% 的混淆都源于没有意识到“per second”这个后缀的存在与否决定了这个数字是“能力”还是“任务”。能力可以比较谁强谁弱任务可以比较谁轻谁重但拿能力和任务直接做除法只有在特定条件下才有意义后面我会专门讲这个条件。3. 单位体系与数量级为什么 TFLOPS 和 TFLOPs 看起来一样却不能用错3.1 从 K 到 E一套必须记牢的数量级阶梯浮点运算的数量级跨度极大从一个小模型的几百万次到超大模型的几十亿亿次所以单位体系必须熟练掌握。这套前缀是国际单位制SI的标准两个概念共用KKilo10 的 3 次方千MMega10 的 6 次方百万GGiga10 的 9 次方十亿TTera10 的 12 次方万亿PPeta10 的 15 次方千万亿EExa10 的 18 次方百亿亿所以 1 TFLOPS 1000 GFLOPS 10 的 12 次方 FLOPS1 TFLOPs 1000 GFLOPs 10 的 12 次方 FLOPs。数字上确实一样但含义完全不同前者是“每秒一万亿次”后者是“总共一万亿次”。这里有个特别容易踩的坑很多非正式文档里会把 FLOPs 写成 FLOPS或者把 TFLOPS 写成 TFLOPs读者如果不看上下文根本判断不出说的是性能还是工作量。我的建议是在自己的文档里永远严格区分大小写并且在第一次出现时用括号注明含义比如“模型复杂度 4.2 GFLOPs浮点运算总次数”和“峰值算力 312 TFLOPS每秒浮点运算次数”。多写几个字能省掉后面无数轮扯皮。3.2 精度前缀FP64、FP32、FP16、FP8 不是一回事光有数量级还不够浮点运算还分精度。同一个硬件在不同精度下的 FLOPS 可能差几十倍。常见的精度标识有FP64双精度64 位浮点科学计算常用FP32单精度32 位浮点传统深度学习的默认精度FP16 / BF16半精度16 位浮点现代 AI 训练和推理的主力FP88 位浮点新一代加速卡支持用于极致推理优化INT8 / INT4整数精度严格说不算浮点运算但常被拿来对比一块高端 GPU 的典型规格可能是FP64 算力 30 TFLOPSFP32 算力 60 TFLOPSFP16 算力 240 TFLOPSFP8 算力 480 TFLOPS。如果你拿 FP16 的峰值去估算一个 FP32 训练任务的时间结果会乐观得离谱。这是我在做训练成本估算时见过的最高频错误之一。同样模型的 FLOPs 也要看是在什么精度下统计的。有些论文报的 FLOPs 是按乘加次数算的有些是按实际运算次数算的还有的只统计了卷积层忽略了其他层。比较两个模型的 FLOPs 时一定要确认统计口径一致否则就是在比苹果和橘子。3.3 一个真实的数量级对照为了让你对这两个概念的量级有个直观感受我列一组真实场景下的数字场景典型 FLOPs工作量典型 FLOPS硬件能力手写数字识别小模型约 0.1 MFLOPs手机 CPU 约 10 GFLOPSResNet-50 单张推理约 4 GFLOPs主流 GPU 约 100 TFLOPSGPT-3 单次前向约 3.1e14 FLOPs高端加速卡约 1000 TFLOPSGPT-3 完整训练约 3.1e23 FLOPs千卡集群约 1e18 FLOPS看最后两行训练 GPT-3 需要约 3.1e23 次浮点运算而一个千卡集群的峰值算力约 1e18 FLOPS。两者相除得到约 3.1e5 秒也就是大约 86 小时。这个估算虽然粗糙忽略了并行效率、通信开销、内存瓶颈但数量级是对的实际训练时间通常在几周到几个月之间差异就来自那些被忽略的因素。这就是这两个概念唯一正确的“联用方式”用总工作量除以有效算力估算理论最短时间。4. 实操怎么算一个模型的 FLOPs又怎么查硬件的 FLOPS4.1 模型 FLOPs 的三种获取方式第一种手算。适合结构简单、层数少的模型。你只需要把每一层的 FLOPs 算出来再求和。卷积层用前面给的公式全连接层用2 × in × out注意力层稍微复杂一点大致是2 × seq_len² × d_model的量级。手算的好处是你能真正理解每一层对总复杂度的贡献坏处是稍微大一点的模型就容易算错。第二种用工具自动统计。这是最推荐的方式。PyTorch 生态里有几个成熟的工具# 使用 thop 统计 FLOPs import torch from thop import profile model MyModel() input_tensor torch.randn(1, 3, 224, 224) flops, params profile(model, inputs(input_tensor,)) print(fFLOPs: {flops / 1e9:.2f} GFLOPs) print(fParams: {params / 1e6:.2f} M)类似的工具还有fvcore、ptflops、torchinfo等。它们通过 hook 机制遍历计算图逐层累加运算量。注意不同工具对“一次乘加算几次运算”的定义可能不同有的算 1 次有的算 2 次所以跨工具比较时要统一口径。第三种从论文或模型卡片里直接读。大多数公开模型都会在论文里报告 FLOPs比如 ResNet-50 约 4.1 GFLOPsMobileNetV2 约 0.3 GFLOPsViT-Base 约 17.6 GFLOPs。直接引用最省事但要留意论文的统计口径和输入尺寸很多数字是特定输入分辨率下的结果。4.2 硬件 FLOPS 的查询与换算硬件的峰值 FLOPS 通常可以在厂商规格书、技术白皮书或者权威的算力榜单上查到。查询时要注意三件事第一确认精度。规格书上往往同时列出 FP64、FP32、FP16、FP8 多个数字你要根据自己任务的精度去取对应的值。做科学计算看 FP64做传统训练看 FP32做混合精度训练看 FP16/BF16做推理优化看 FP16 或 INT8。第二区分稠密和稀疏。有些加速卡会标注“稀疏算力是稠密算力的 2 倍”这个稀疏算力只有在模型本身具有结构化稀疏性时才能达到普通模型用不上。选型时以稠密算力为准稀疏算力只能作为上限参考。第三注意是单卡还是整机。有些宣传数字是整机 8 卡的合计算力有些是单卡算力差 8 倍。看规格书时一定要找到“per GPU”或“per card”的字样。换算示例如果一块卡标称 FP16 算力 312 TFLOPS你要训练一个总计算量 1e20 FLOPs 的模型理论最短时间是1e20 / 312e12 3.2e5 秒 ≈ 89 小时但实际有效算力可能只有峰值的 40%所以真实时间大约是 89 / 0.4 ≈ 222 小时接近 9 天。这个“有效算力折扣系数”是估算训练成本时最关键的参数也是最有经验含量的部分。4.3 有效算力折扣为什么理论值永远跑不满理论峰值跑不满的原因有很多我按影响从大到小列一下内存带宽瓶颈算力再高数据喂不进来也是白搭。很多算子实际是 memory-bound 而非 compute-bound。通信开销多卡训练时梯度同步、参数广播都要走网络这部分时间不产生有效计算。算子效率不是所有算子都能达到峰值尤其是小算子、不规则算子、动态形状算子。流水线气泡数据加载、预处理、kernel 启动都有延迟形成气泡。精度转换混合精度训练中的类型转换也有开销。根据我的经验大规模训练任务的有效算力通常在峰值的 35% 到 55% 之间优化得特别好的能到 60% 以上优化差的可能只有 20%。所以做估算时用一个保守的 40% 作为默认折扣系数是比较稳妥的做法。5. 那些年我踩过的坑五个高频误用场景5.1 拿 FLOPs 除以 FLOPS 直接当训练时间这是最经典的错误。有人看到模型 FLOPs 是 1e20硬件 FLOPS 是 1e14直接相除得到 1e6 秒然后宣布“训练需要 11 天”。问题在于他用的 FLOPS 是 FP16 峰值而模型实际是 FP32 训练他也没考虑有效算力折扣更没考虑多卡并行时的通信开销。三个因素叠加误差可以轻松超过一个数量级。正确的做法是先确认训练精度取对应精度的峰值再乘以一个合理的有效算力系数0.35 到 0.55如果是多卡还要考虑并行效率卡越多效率越低通常 8 卡能到 85%64 卡可能只有 70%。这样算出来的数字才有参考价值。5.2 用 FLOPs 直接判断模型快慢“这个模型只有 5 GFLOPs那个有 50 GFLOPs所以前者一定快 10 倍。”——这个推理在理论上成立在现实中经常翻车。因为实际推理延迟还取决于内存访问模式、算子融合程度、批处理大小、硬件特性等。一个 FLOPs 低但访存密集的模型可能比 FLOPs 高但计算密集的模型还慢。我实测过一个案例两个模型 FLOPs 相差 3 倍但在同一块卡上FLOPs 高的那个反而快了 20%因为它的算子被编译器融合得更好内存访问更连续。FLOPs 只能作为复杂度的参考不能作为性能的结论。5.3 把 FLOPS 和 FLOPS 之外的单位混用除了 FLOPs还有几个容易混淆的指标OPSOperations Per Second不限定浮点整数运算也算TOPSTera OPS常用于整数推理算力MACsMultiply-Accumulate operations一次乘加算 1 次 MAC但算 2 次 FLOPsParams参数量和计算量没有直接关系有人把 TOPS 当成 TFLOPS 用有人把 MACs 当成 FLOPs 用结果数字差 2 倍甚至更多。在跨文档比较时先确认单位定义再谈数字大小。5.4 忽略输入尺寸对 FLOPs 的影响同一个模型输入 224×224 和输入 512×512FLOPs 可能差 5 倍以上。因为卷积层的 FLOPs 和输出特征图面积成正比而输出面积和输入面积成正比。所以论文里报的 FLOPs 一定要看它对应的输入尺寸脱离输入尺寸谈 FLOPs 是没有意义的。5.5 在文档里大小写乱写这个看起来是小事但在正式的技术方案、论文、专利里大小写错误会显得非常不专业。我审过一份方案全文把 FLOPs 写成 FLOPS把 TFLOPS 写成 TFLOPs评审专家第一页就批注“术语使用不规范建议全文核查”。术语的准确性是技术文档可信度的一部分。6. 一套可以直接抄的估算流程6.1 训练时间估算的标准步骤假设你要估算一个模型的训练时间按这个流程走确定模型 FLOPs用工具统计或从论文读取记下输入尺寸和统计口径。确定训练总计算量单次前向 FLOPs × 3前向反向约等于前向的 3 倍× 训练步数 × 批大小。确定硬件精度和峰值根据训练精度FP32/FP16/BF16查对应峰值 FLOPS。确定有效算力系数单卡取 0.4 到 0.5多卡再乘以并行效率。计算理论时间总计算量 ÷峰值 FLOPS × 有效系数。加上数据加载和检查点开销通常再加 10% 到 20%。用公式表示训练时间 ≈ (3 × 单样本FLOPs × 样本数) / (峰值FLOPS × 有效系数 × 并行效率)6.2 推理延迟估算的注意事项推理估算比训练简单因为只有前向。但要注意推理常用 FP16 或 INT8峰值算力比 FP32 高很多批处理能提高吞吐但会增加单次延迟首 token 延迟和后续 token 延迟在生成式模型里差别很大KV Cache 会显著改变内存访问模式推理场景下FLOPs 的参考价值比训练场景更低因为推理往往受限于内存带宽而非算力。我的建议是推理性能一定要实测估算只能用来做初步筛选。6.3 一个完整的估算实例假设你要训练一个 1.3B 参数的模型训练数据 300B token用 64 卡 FP16 峰值 312 TFLOPS 的集群。单 token 前向 FLOPs 约等于 2 × 参数量 2.6e9 FLOPs。训练总算量约等于 6 × 参数量 × token 数 6 × 1.3e9 × 3e11 2.34e21 FLOPs。集群峰值 64 × 312e12 2e16 FLOPS。取有效系数 0.4并行效率 0.7有效算力 2e16 × 0.4 × 0.7 5.6e15 FLOPS。训练时间 2.34e21 / 5.6e15 4.18e5 秒 ≈ 116 小时 ≈ 4.8 天。这个数字和实际训练时间通常在同一个数量级可以作为预算和排期的依据。记住估算的价值在于数量级正确而不是精确到小时。7. 写在最后几个我反复强调的习惯关于 FLOPS 和 FLOPs我最后再分享几个自己在工作中养成的习惯都是踩坑之后总结出来的。第一个习惯看到任何算力数字先问三个问题什么精度单卡还是整机稠密还是稀疏这三个问题的答案决定了这个数字能不能用、怎么用。我见过太多人拿着稀疏算力去估算稠密任务结果乐观了三倍。第二个习惯在自己的文档里永远写全称或加注释。第一次出现 FLOPS 时写“FLOPS每秒浮点运算次数”第一次出现 FLOPs 时写“FLOPs浮点运算总次数”。多花十秒钟省掉后面无数轮沟通成本。第三个习惯估算训练成本时永远用保守系数。宁可把时间估长一点也不要把排期排得太紧。有效算力系数我一般取 0.35 作为下限0.5 作为乐观值实际排期按 0.35 算。这样即使遇到意外也有缓冲空间。第四个习惯推理性能一定实测不靠估算。FLOPs 在推理场景的参考价值有限内存带宽、算子融合、批处理策略的影响太大。我现在的做法是候选模型先跑一个 benchmark拿到真实延迟数据再做决策。这四个习惯看起来简单但真正坚持下来能帮你避开这个领域里大部分因为术语混淆而导致的判断失误。FLOPS 和 FLOPs 的区别说到底就是“能力”和“任务”的区别把这个想清楚了剩下的都是细节。