跳转到内容

硬件的基本量:算力、带宽、延迟、容量

上一章说"每层之间是数量级的落差",这一章给具体数字。

AI 系统的性能分析只需要四个物理量:算力、带宽、延迟、容量。它们决定了后面所有的分析——第四章要用算力与带宽之比,第六章要用带宽与延迟的组合,第十一章要用算力与容量的除法。

本章的目标是让你记住几个数量级,并理解为什么标称值总是拿不到。

FLOPS = 每秒浮点运算次数(FLoating-point Operations Per Second)。一次乘加算两次运算(一次乘、一次加)。

FLOPS=运算单元数×每周期每单元的运算数×时钟频率\text{FLOPS} = \text{运算单元数} \times \text{每周期每单元的运算数} \times \text{时钟频率}

现代加速器有两套运算单元:

  • 通用单元(CUDA Core 之类):做逐元素运算、归约、控制流,吞吐一般。
  • 矩阵单元(Tensor Core 之类):只做小矩阵的乘加,吞吐高出一个数量级。

深度学习之所以能跑这么快,就是因为它的主体运算恰好能映射到矩阵单元上。 一个算子如果不能用矩阵单元,实际算力可能只有标称值的十分之一。

同一块芯片,用不同数值格式,峰值算力差很多。粗略关系(同代硬件):

数值位宽相对吞吐
64 位(双精度)1/2 ×
32 位(单精度)1 ×
16 位(半精度)~16 ×
8 位~32 ×
4 位~64 ×

本章只用到一条规律:位宽减半,矩阵单元吞吐大致翻倍。 同样位宽下还有多种具体格式,各有取舍,第五章专讲。

这里只需记住:报算力必须报精度,否则数字没有意义。 一个"989 TFLOPS"的说法,不说清是几位数值,可以差出 64 倍。

一个必须避开的坑:稀疏标称值

Section titled “一个必须避开的坑:稀疏标称值”

厂商常标两个数字,例如"989 / 1979 TFLOPS"。后者需要权重满足 2:4 结构化稀疏(每四个数里至少两个是零,且位置规整)才能达到。绝大多数模型不满足这个条件。

做任何估算,永远用稠密峰值。 用稀疏值会让你的结论乐观一倍。

几代主流数据中心加速器(半精度稠密、近似值):

芯片年份半精度稠密算力显存显存带宽TDP
V1002017~125 TFLOPS32 GB~0.9 TB/s300 W
A100 80GB2020~312 TFLOPS80 GB~2.0 TB/s400 W
H100 SXM2022~989 TFLOPS80 GB~3.35 TB/s700 W
H2002024~989 TFLOPS141 GB~4.8 TB/s700 W
B2002025~2.25 PFLOPS192 GB~8 TB/s~1000 W

注意 H100 → H200:算力没变,带宽和容量变了。这是近年硬件演进的一个明显趋势——瓶颈从算力转向内存,厂商也跟着调整。

带宽是"每秒能搬多少字节"。系统里有很多级带宽,落差巨大。

以一块 H100 为参照(数量级,非精确值):

层级带宽相对显存
寄存器~100 TB/s 量级~30×
共享内存 / L1(片上)~20–30 TB/s~7×
L2 缓存~5–10 TB/s~2×
显存 HBM~3.35 TB/s1×(基准)
节点内卡间互连~0.9 TB/s(双向)~0.27×
主机内存~0.3 TB/s~0.09×
主机-设备总线~64 GB/s~0.02×
跨节点网络(单端口)~25–50 GB/s~0.01×
本地 NVMe~3–14 GB/s~0.003×
远端对象存储取决于并发~0.001× 或更低

最值得记住的三个比值:

  1. 片上 : 显存 ≈ 7 : 1 —— 所以要把数据留在片上复用(这是算子融合与分块的全部动机)。
  2. 显存 : 节点内互连 ≈ 4 : 1 —— 所以卡间通信比访问自己显存贵。
  3. 节点内 : 跨节点 ≈ 20 : 1 —— 所以并行策略的边界画在机器上。

实际能拿到的带宽取决于访问模式:

访问模式有效带宽
连续、对齐、大块80–90% 峰值
跨步(stride)访问30–60%
随机小粒度访问5–20%
极端随机(如稀疏查表)< 5%

这就是为什么"合并访存"(让同一批线程访问连续地址)是内核优化的第一课,也是为什么稀疏负载的有效带宽利用率天然很低——第八章讲这个。

延迟是"从发起到拿到第一个字节要多久"。它与带宽正交:一条高带宽高延迟的链路适合搬大块数据,不适合频繁的小请求。

操作延迟换算成 H100 的时钟周期
寄存器访问< 1 ns~1
共享内存 / L1~20 ns~30
L2 缓存~150 ns~200
显存(HBM)~350–450 ns~500
节点内卡间点对点~1.5–2 μs~2500
跨节点网络(同交换机)~2–3 μs~4000
跨节点(多跳)~5–10 μs~10000
本地 NVMe 读~100 μs~140000
远端对象存储~10–100 ms~10⁸

一个直观类比(把寄存器访问当作 1 秒):

  • 读显存 ≈ 8 分钟
  • 卡间通信 ≈ 一天半
  • 跨节点通信 ≈ 三天
  • 读本地盘 ≈ 三个月
  • 读对象存储 ≈ 三十年

这个类比解释了为什么系统设计的核心永远是减少远距离访问的次数,而不是让每次访问更快。

带宽可以靠并发填满——同时发很多请求,总吞吐就上去了。延迟不行:一个必须等结果才能继续的操作,等多久就是多久。

加速器隐藏延迟的方式是超额并发:同时运行远多于核心数的线程,某些线程等数据时切到别的线程。这要求有足够多的独立工作可做——批量太小、并行度不够时,延迟就藏不住了。

这也是小批量推理效率低的根本原因之一:没有足够的并发来掩盖访存延迟。

层级容量特点
寄存器(每核心组)~256 KB编译器分配,用超了会溢出到显存
共享内存(每核心组)~228 KB程序员显式管理,分块的关键资源
L250–126 MB硬件管理
显存80–192 GB最常见的硬约束
主机内存1–4 TB可作为卸载目标
本地 NVMe数 TB–数十 TB缓存与检查点暂存
集群存储PB–EB数据集与归档

显存容量是最常撞到的墙。 它决定了:

  • 模型能不能放得下(第十一章会算这个)
  • 批量能开多大(进而影响算力利用率)
  • 推理能同时服务多少请求(第九章)

容量与带宽经常需要一起看:容量决定"能不能做",带宽决定"做得多快"。

一块标称 989 TFLOPS 的卡,实际跑训练可能只发挥出 350 TFLOPS。差距来自五个层次,逐层剥开:

折损来源典型幅度说明
算子不适合矩阵单元大逐元素、归约类算子用不上矩阵单元
受限于带宽而非算力大运算太少、数据太多,详见下一章
张量形状不对齐中矩阵单元按固定尺寸工作,维度不整会浪费
功耗封顶与降频中持续高负载下时钟低于标称
通信、同步、数据等待大没被计算掩盖的部分

前三项属于单卡效率,后两项属于系统效率。第七章会把这些折损组织成一套可测量的指标。

如果只记住一组数字,记这个(以 2025 年前后的主流训练卡为参照):

量数量级
单卡稠密算力(半精度)~10³ TFLOPS
显存容量~10² GB
显存带宽~10⁰ TB/s
节点内卡间带宽~10⁰ TB/s(略低于显存)
跨节点带宽(单端口)~10¹ GB/s
显存延迟~10² ns
网络延迟~10⁰ μs
单卡功耗~10³ W

有了这八个数,你可以在餐巾纸上完成本书 90% 的估算。

  • 四个基本量:算力、带宽、延迟、容量。报算力必须报精度;永远用稠密峰值,不用稀疏标称值。
  • 带宽阶梯的三个关键比值:片上:显存 ≈ 7:1,显存:节点内互连 ≈ 4:1,节点内:跨节点 ≈ 20:1。
  • 有效带宽严重依赖访问模式,随机小粒度访问可能只有峰值的几个百分点。
  • 延迟与带宽正交,且难以隐藏;隐藏它靠超额并发,所以小批量效率低。
  • 显存容量是最常撞到的硬约束。
  • 标称算力拿不到的五个原因:算子不适配、带宽受限、形状不对齐、降频、通信与等待。