第 4 章 硬件:算力、显存、带宽和它们之间的比例
第 3 章最后留了一句话:同一份账,在 A100、H100 和一张消费级显卡上算出来,结论可能完全不同。这一章就把这句话拆开。同样是 7B 模型,为什么在一张 L4 上每秒只能出二十来个字,在 H100 上能到两百多,在 B200 上能到五百多;为什么有的卡算力很强却跑不快;为什么八张卡装在一台机器里,比八张卡分散在八台机器里快得多。答案都在三个数字和它们的比例上。
先说明这一章不做什么:不讲怎么买卡,不讲哪个云便宜,也不列全部型号。这些会过期,而且和你的负载关系太大。这里只讲硬件的结构,以及结构如何决定第 1 章那条时间式子里的每一项。
显卡不是一块芯片
一张数据中心显卡上,最核心的部分是 GPU 芯片,芯片里有几十到一百多个流式多处理器(SM)。每个 SM 里有三类计算单元:CUDA 核心做标量运算,一次处理一个数;张量核心做矩阵乘加,一次处理一小块矩阵;特殊功能单元做 sin、cos、log 这类运算。
推理主要用张量核心。矩阵乘法是推理的主体,而张量核心就是为它设计的。所以看一张卡的算力,要看张量核心的指标,不要看 CUDA 核心的数量——后者在推理里占比很小。
算力的单位是 FLOPS,每秒浮点运算次数。厂商给数字时通常给两个版本:稠密和稀疏。稀疏版本利用了张量里一半元素是零这个假设,跳过乘以零的运算,数字翻倍。推理默认是稠密的,看规格表时要确认拿到的是哪个数。另一个容易看错的地方是精度:同一张卡,FP8 的算力通常是 FP16 的两倍,FP4 又是 FP8 的两倍。比较两张卡之前,先确认精度相同。
三个数字:算力、显存、带宽
一张卡对推理的约束可以归结为三个数。
算力决定预填充有多快。预填充是矩阵乘密集的,算力越高,同样长度的输入处理得越快。
显存容量决定模型装不装得下。容量不够,加载直接失败,报 OOM。
显存带宽决定逐字生成有多快。逐字生成每一步都要把全部权重从显存读进计算单元,读的速度就是带宽。这就是为什么小批量下 decode 一定是带宽受限。
三个数字之外还有一个容易被忽略的:显存要给缓存留余量。Inference Engineering 的建议是至少留百分之五十给 KV cache,长上下文、大并发、视频生成还要更多。原因是权重是固定的,缓存在运行时会一路涨;按权重刚好占满显存来选卡,服务跑起来几分钟就会因为缓存撑爆而崩。
显存不是一块
显存本身也分层,而且层与层之间的差距很大。
最靠近计算单元的是 SRAM,做在芯片上,容量只有几十 MB,速度极快。H100 的每个 SM 有 256 KB 的共享内存,全部 SM 加起来是几十 MB 量级。再往外是 L2 缓存,所有 SM 共享,H100 上是 50 MB。最外面是显存,也就是 HBM,几十到几百 GB,速度比 SRAM 慢一个数量级,但比主板内存快得多。
这个层级决定了算子怎么写。FlashAttention 之所以重要,是因为它把注意力计算切成小块,让中间结果留在 SRAM 里,避免反复读写显存。同样的数学运算,放在不同的存储层级上做,速度可以差好几倍。第 5 章讲 kernel 融合时会再回到这一点。
代际:从 Hopper 到 Rubin
NVIDIA 每一到两年换一代架构,名字取自科学家。字母代表代际,数字代表这一代里的档位。
| 架构 | 代表型号 | FP8 稠密算力 | 显存 | 带宽 |
|---|---|---|---|---|
| Hopper | H100 | 1979 TFLOPS | 80 GB | 3.35 TB/s |
| Hopper | H200 | 1979 TFLOPS | 141 GB | 4.8 TB/s |
| Ada | L4 | 242 TFLOPS | 24 GB | 300 GB/s |
| Ada | L40 | 362 TFLOPS | 48 GB | 864 GB/s |
| Blackwell | B200 | 约 5 PFLOPS | 192 GB | 8 TB/s |
| Blackwell | B300 | 约 5 PFLOPS | 288 GB | 8 TB/s |
从这张表能读出三件事。
第一,H200 和 H100 的算力完全相同,差别只在显存和带宽:141 GB 对 80 GB,4.8 TB/s 对 3.35 TB/s。这个差别对预填充没有意义,对逐字生成和长上下文意义很大。选型时如果负载是长输出、大并发,H200 的溢价是值得的;如果主要是短输入长批处理,H100 就够。
第二,L4 和 H100 的差距不是一倍两倍。算力差八倍,带宽差十一倍,显存差三倍多。用 L4 跑 7B 模型能跑,但并发和速度都受限于带宽,它适合的是小模型和低频任务。
第三,Blackwell 这一代把显存和带宽同时拉高了一个台阶,还把 FP4 做进了硬件。这意味着原来需要两张卡才能装下的模型,现在一张就够,跨卡通信的麻烦直接消失。硬件代际带来的收益,很多时候不是"快一点",而是"少一层复杂度"。
一台机器不是八张卡
单卡装不下时,标准单位是一个节点:八张 GPU,加两颗 CPU,加内存、硬盘和网卡。
节点内部的卡用 NVLink 连接,点对点带宽在 Hopper 上是 900 GB/s,Blackwell 上到 1800 GB/s。八张卡之间还要做全互通,靠 NVSwitch 在 NVLink 之上搭一层交换。节点之间用 InfiniBand,一张网卡 400 Gb/s,换算成字节是每秒 50 GB。
把这三个数放在一起:卡内显存 3.35 TB/s,卡间 900 GB/s,机器间 50 GB/s。每跨一层,带宽掉一个数量级,延迟涨一个数量级。这就是第 0 章说的"规模的三级"的具体数字,也是第 10 章并行策略的全部约束条件。
实例与切分
云上分配 GPU 的最小单位是实例。一个实例不只是卡,还包括 CPU、内存、硬盘、网络和互联。这些部件任何一个不够,都会成为瓶颈:CPU 太弱,数据预处理跟不上;网络太窄,多机通信等不起;硬盘太慢,模型加载要几分钟。看实例规格时只看显卡型号,是最常见的疏忽。
反过来,卡太大、模型太小时,可以把一张卡切成几份。多实例 GPU(MIG)是硬件级切分,A100、H100、H200、B200 都支持,最多切七份,每份拿到一部分算力、显存和网络。一张 H100 切三份,大约是七分之三的算力和最多 40 GB 显存。对一个 3B 的模型,两个 MIG 实例可能比一整张卡更划算,因为整张卡的算力它用不完,而切分之后可以同时服务两组请求。
别的加速器
NVIDIA 不是唯一的选择,但其他家的共同问题是软件栈。
AMD 的 MI 系列在规格上不落下风,难点在 ROCm 生态的成熟度。Google 的 TPU 是专用芯片,只在自己的云上,模型要按它的方式编译。Groq 的 LPU 用 SRAM 做权重存储,带宽极高,代价是容量小、模型要放得下。Cerebras 把整片晶圆做成一个芯片,带宽和容量都极致,价格也极致。
这些方案的共同取舍是:用生态换某一项指标。CUDA 的优势不是它最快,而是所有框架、所有引擎、所有算子库都先支持它。选非 NVIDIA 硬件,省下的钱往往要用来填软件适配的坑。
规格表上的数字,实际能用几成
规格表给的是峰值,真实程序用不满。
预填充跑矩阵乘,理论上能贴住峰值,实际用不满。衡量差距的指标叫 MFU,模型浮点利用率,等于实际达到的吞吐除以理论峰值,MLSysBook 在训练那一章给了定义。它没有通用数值:矩阵小、批小的时候低,矩阵大、批大的时候高,必须按你的配置实测。
差距来自几个地方:小矩阵的并行度不够,切分之后每个计算单元分到的活太少;kernel 之间有启动和同步开销;显存供数跟不上,计算单元偶尔空转。
逐字生成的访问模式更规整,顺序读一大块权重,带宽利用率通常比算力利用率高,但同样到不了满值,缓存未命中、页表查找、kernel 启动都要占时间。
所以前面那些时间都是下限。算出来 0.53 秒的预填充,实测可能 1 秒;算出来 6.9 毫秒的一步,实测可能 8 毫秒。做容量规划时按实测值留余量,不要按理论值卡着买。
这也解释了一个常见现象:换一张算力翻倍的卡,实际速度的提升明显小于一倍。因为瓶颈不只在算力上,而且新卡的 kernel 往往还没优化好,利用率反而更低。
选型:从瓶颈倒推
选卡不该从型号开始,该从负载形状开始。
预填充密集的负载,比如长文档摘要、批量 embedding,看算力和显存带宽的比例,算力优先。H100 和 B200 这类卡的优势在这里。
逐字生成密集的负载,比如长文写作、Agent 循环,看显存带宽,带宽优先。H200 相对 H100 的提升全部来自带宽,就是为这类负载准备的。
长上下文负载,先看显存容量,再看带宽。缓存随长度线性增长,容量不够就没有后面的事。
多卡负载,先看 NVLink。没有 NVLink 的卡(比如 L40)做张量并行会很痛苦,因为每一步的同步都要走 PCIe。
把负载和指标对上之后,再去看价格。反过来做——先看到一张便宜的卡,再想它能跑什么——通常会得到一个勉强能跑、但成本更高的方案。
同一模型,三种卡
用第 3 章的账算一遍。7B 模型,FP16,权重 14 GB,逐字生成每一步读一遍。
L4 的带宽是 300 GB/s,读 14 GB 需要 47 毫秒,理论出字速度约每秒 21 个。H100 是 3.35 TB/s,需要 4.2 毫秒,约每秒 240 个。B200 是 8 TB/s,需要 1.75 毫秒,约每秒 570 个。
这三个数正好按带宽比例排列:11 倍、2.4 倍。模型没变,算法没变,唯一变的是读权重有多快。这就是"逐字生成是带宽受限"这句话的具体含义。
再算预填充。8K 输入约 114 TFLOP。L4 的 FP8 算力 242 TFLOPS,但 FP16 只有一半左右,按 120 算需要 0.95 秒;H100 按 FP16 约 990 算,需要 0.12 秒。算力差八倍,时间也差八倍。
所以同一张卡在两个阶段的表现可以完全不同:L4 预填充慢八倍,逐字生成慢十一倍,两个阶段都吃亏,但吃亏的比例不一样。如果一个服务以长输入为主,L4 的劣势比看上去更大;如果以短输入长输出为主,瓶颈就在带宽那十一倍上。
硬件的边界
这一章的数字会过期,结构不会。
结构是:算力管预填充,带宽管逐字生成,容量管装不装得下,互联管跨卡之后还剩下多少性能。任何一张新卡出来,都可以用这四个维度去判断它适合什么,而不需要记住具体型号。
下一章进入软件层。硬件决定了上限,但同一个模型在同一张卡上,换个引擎、换个批处理策略,吞吐可以差好几倍。那部分差距不是买卡能解决的。