在上节课里我说“每个参数参与 6 次浮点运算”,有同学会理解为“两个乘加”。这里必须先把单位掰清楚:
神经网络里的矩阵乘、卷积,本质上都是由 MAC 组成的。我们说的 6 FLOPs 其实是 3 MACs。
以线性层 y = xW 中的一个权重 W[i,j] 为例:
x[i] · W[i,j] 被累加到 y[j] → 1 MACdy[j] · W[i,j] 被累加到 dx[i] → 1 MACdy[j] · x[i] 被累加到 dW[i,j] → 1 MAC一个权重在训练的一步里被用了 3 次,每次 1 MAC,所以:
注意:attention 里的 QK^T、softmax、加权求和本身没有可训练权重(除了 Q/K/V 的投影矩阵已计入 N),所以它们的 FLOPs 要单独列出来,就是 12lhqt 那一项。
DeepSpeed 的 Flops Profiler 本质上是一个 hook-based profiler:
它输出的典型报告包含:
transformers 库没有一个官方统一的 FLOPs API。不同版本、不同示例代码里口径不一:
calflops、thop、ptflops 等 hook 工具。FlopCounterMode,通过捕获 ATen 算子来估算前向 FLOPs。estimate_tokens 或类似的辅助函数,用于训练碳排放 / 成本估算,但不是严格的 MFU 口径。FlopCounterMode 的原理:在 forward 执行时拦截 ATen 算子调用(如 aten::mm、aten::addmm、aten::convolution),按算子形状估算 MACs。它只覆盖被注册的常见算子,对自定义 CUDA kernel 无能为力。
没有。业界做法是“两套口径并用”:
| 方法 | 优点 | 缺点 | 用途 |
|---|---|---|---|
| 解析公式(6N + 12lhqt 等) | 快、可重复、与实现无关 | 忽略框架 overhead、融合算子、内存搬运、通信 | MFU 横向对比、论文复现 |
| 运行时 profiler(DeepSpeed / FlopCounterMode) | 反映真实执行、能定位热点 | 依赖具体实现、可能漏算自定义 op、backward 重计算口径混乱 | 优化热点、验证公式 |
所以更准确的说法是:
以输入 (B, C_in, H_in, W_in)、输出 (B, C_out, H, W) 的 Conv2d 为例:
推导:输出特征图每个位置有 C_out 个通道;每个通道的值是一次 C_in × K × K 的卷积;每次卷积是 C_in · K² 次 MAC;输出图大小是 H · W;1 MAC = 2 FLOPs。
主要是减 mean、除 std、乘 gamma、加 beta,约等于每个元素 ~1 MAC(或 2 FLOPs)的读写。很多 FLOPs 工具会忽略 BN,因为它占比通常很小。
ReLU 是逐元素的比较/置零,严格说不是浮点乘加,但部分工具按 1 FLOP 估算。
Max pooling 主要是比较,Avg pooling 是加法平均。不同工具统计方式差异较大。
输入维度 I,输出维度 O,标准矩阵乘。
ViT 把图像切成 n 个 patch,每个 patch 变成维度为 d 的 token,然后接 l 层 Transformer。
其中 P² · C 是每个 patch 的像素数,d 是 embedding 维度。也可以理解为一个卷积核为 P、步幅为 P 的卷积。
拆解:
n × d 乘 d × d → 3 × 2nd² = 6nd² FLOPs。W_O 输出投影再加 2nd²,所以投影部分共 8nd²。QK^T 和加权求和:各 2n²d,合计 4 · l · n² · d FLOPs,随 token 数二次增长。4lnd² + 2ln²d,乘以 2 才是 FLOPs。典型 expansion ratio 为 4:先 d → 4d 再 4d → d,两层线性变换合计 2 · n · d · 4d + 2 · n · 4d · d = 16nd²。某些资料按 MACs 口径简写为 8lnd²,注意上下文单位。
| 组件 | CNN(以 ResNet 为例) | ViT | LLM |
|---|---|---|---|
| 主要算子 | Conv、BN、ReLU、Pooling | Linear、Softmax、LayerNorm | Linear、Softmax、LayerNorm、RoPE/ALiBi |
| FLOPs 主导项 | 卷积层:2HWC_inK²C_out | MSA + FFN:~24lnd² + 4ln²d(FLOPs);常见 MACs 写法为 ~12lnd² + 2ln²d | 6N + 12lhqt(causal 减半) |
| 容易忽略的部分 | BN、ReLU、skip connection | Patch embed、CLS token、position embed | Causal mask、activation checkpointing、通信 |