显卡的算力数字:单位、计算方式 简介
1 显卡的算力数字:单位、计算方式、和“这张卡适合干什么”
1.1 算力 FLOPS 是什么
算力的单位是 FLOPS,即每秒能做多少次浮点运算。FLOP 指一次浮点数的加法或乘法,末尾的 S 是 per second。TFLOPS 是每秒 1e12 次(一万亿),PFLOPS 是每秒 1e15 次(一千万亿)。
- “一次浮点数的加法或乘法”:虽然对人类来说,乘法比加法难多了,但是对硬件来说,两者成本几乎一样:一次“乘加”(a×b+c)在芯片里是合在同一个电路里完成的,所以业界惯例把一次乘加算作 2 次浮点运算。
- 大模型跑起来,本质上是一连串矩阵乘法,每个输出元素都是一行乘一列再累加求和。一个对所需算力的估算规则:模型每处理 1 个 token,需要的浮点运算次数约等于 2 × 激活参数量(激活参数量:考虑到 MoE 模型 forward 一次仅激活少量 expert),具体的,每个参数做一次乘、一次加。
关于浮点数精度:
- 同一张卡,如果处理的是不同精度的浮点数,算力完全不同。
- 不同精度的浮点数:FP32 是 32 位单精度浮点,TF32 是英伟达在 A100 上引入的 19 位混合格式(内部用 10 位尾数计算,对外表现为 FP32),BF16 是 16 位脑浮点(Brain Floating Point,谷歌提出的 16 位格式),FP8 是 8 位浮点。
- 具体的,位数越少,每个数占的空间越小,同样的芯片面积能塞下更多计算单元,算力就越高。然而位数变少的代价是精度下降,所以业界做法通常是:训练用 BF16,因为精度不够梯度会出问题;推理用 FP8,因为只做前向传播,容错更高。
我们用 H200 稠密算力(“稠密”详见下一节的解释)举例,给出使用不同精度的浮点数,显卡算力(FLOPS)的变化:
| 精度 | 每个数占几位 | H200 稠密算力 | 相对 FP32 |
|---|---|---|---|
| FP32(单精度) | 32 位 | 67 TFLOPS | 1× |
| TF32 | 19 位有效 | 495 TFLOPS | 7× |
| BF16(训练常用) | 16 位 | 990 TFLOPS | 15× |
| FP8(推理常用) | 8 位 | 1979 TFLOPS | 30× |
1.2 稠密算力 vs 稀疏算力
厂商宣传页上的算力与我们实际使用的算力,存在一个计算方式的差别,具体差一倍。
从 Ampere 那代起,张量核心支持一种叫“2:4 结构化稀疏”的硬件加速:如果权重矩阵里每连续 4 个数至少有 2 个是 0,满足这个格式,硬件就能跳过 0 不算,吞吐翻倍。稠密算力是不做任何假设的实际值,稀疏算力是假设权重已剪成 2:4 格式,数值等于稠密算力 × 2。
厂商几乎都报稀疏算力,只在角标写一行小字 "with sparsity"。比如 H100 的 FP8 算力常写成 3958 TFLOPS,实际的稠密算力则是 1979 TFLOPS。要得到这 2 倍算力提升,得先把模型剪枝成"每 4 个权重至少 2 个为 0",这对大语言模型是破坏性改造,所以真实场景应该按照稠密算力计算。
ps:这里的稀疏和 MoE 模型的"稀疏",两者同名但无关:2:4 稀疏讲的是权重矩阵里有多少个 0;MoE 的"稀疏激活"讲的是每个 token 只激活一部分专家网络,是更 high-level 的模型结构。
所以,在比较两张卡的算力之前,需要对齐三个事情:什么浮点数精度(FP32 还是 FP8)、什么计算方式(稠密还是稀疏)、理论峰值还是实测(实测通常只有峰值的七到八成)。
- 点赞
- 收藏
- 关注作者
评论(0)