AI Infra · 第 4 章图解

加速器架构

把某个部件做快一倍,任务不一定快一倍:总时间由没被加速的那部分、在等的数据、在等的上一步结果共同决定。一段 100 μs 的计算里矩阵乘占 60 μs,矩阵单元提速 2 倍,总时间只降到 70 μs;若矩阵乘只占 10 μs,同样的改动只省 5 μs。

同样多的算力,收益相差悬殊

S = 1 / ((1−f) + f/s)

试一下书里的思考题:把提速从 2× 拉到 4×,和把“其余工作”从 40 μs 降到 25 μs,哪一种省得多?(答案:两者都省 15 μs,打平;这时就要看谁的面积代价小。)

需要多少?一次任务要多少计算、多少存储、多少传输。
为什么在等?计算单元是在等数据到达,还是在等前一步结果。
下一个瓶颈?某一部分加快以后,哪一部分会成为最慢的一项。
数据搬移 / 带宽 矩阵单元 向量·指数·其余工作 累加 / KV 状态 等待 / 补零 瓶颈 / 超限
贯穿算例:Qwen3-8B 的 Q 投影 Y = X·WQ,K = N = 4096,BF16 输入与权重、FP32 累加。页面中的计算按书中参数实时复算,带 ▶ 的图可以按时间播放。
4.1

从模型计算认识加速器

分析一个算子,先数两件事:做多少次运算,读写多少字节。Q 投影的输入 X 有 M 行(prefill 时 M = 请求数 × 新 token 数,decode 时 M = 请求数),权重 W 是 4096×4096。乘加按 2 FLOPs 计:

F = 2MKN = 33,554,432·M FLOPs  V = 2MK + 2KN + 2MN = 33,554,432 + 16,384·M bytes  I = F / V

权重只有一份,行数越多,每行分摊的权重读取越少:计算量随 M 线性增长,访问量却几乎不变,算术强度随之上升。

图 4-1 · 把 32 MiB 权重分摊到输入行

I(M) = 2KN / (2KN/M + 2(K+N))
滑块按 2 的幂取值:1、2、4 … 4096

M = 1 时约 1 FLOP/byte,M = 256 时约 228 FLOPs/byte;M 再大,每行的输入、输出读写仍然要付,强度最终趋近 2,048 FLOPs/byte,继续加 batch 的收益递减。

4.1.2 · 一次矩阵乘法在芯片里怎么走

主机(CPU)准备输入、提交命令;加速器(设备)执行。片外显存放大块的输入和权重,共享缓存被多组计算单元共用,局部缓冲给当前计算组暂存操作数,矩阵单元反复更新部分和,累加存储把部分和留到本块算完。向量与通用单元负责结果变换、地址计算和流程控制。

图 4-2 · 主机、显存与芯片内部(分步)

共同问题NVIDIA昇腾 DaVinciApple
计算组织流式多处理器 SM;kernel 由许多线程协作执行Scalar 控制 / Vector 向量 / Cube 矩阵 / MTE 搬移Metal 提交 GPU 工作,线程组共享局部存储并同步
矩阵乘加Tensor CoreCubeMetal GPU 矩阵运算(M5 起 GPU 内有 Neural Accelerator)
软件管理的片上缓冲共享内存(shared memory)L0 / L1 / 统一缓冲 UB线程组存储

计算单元有两种等待:数据还没到(加带宽能缩短),前一步还没算完(要改分块或执行顺序)。例如 Softmax 要等 QK 点积完成。

已有加速器容量、带宽、互联约束模型
模型与软件选择压缩、分块、并行
持续的执行瓶颈形成下一代硬件需求
新加速器重新比较模型结构,回到 ①

图 4-3 · 模型与硬件跨代协同。设计和制造需要时间,硬件回应的是已经观察到、预计会延续的需求。公开实例:DeepSeek V3 报告针对 H800 上的瓶颈,提出通信卸载(部分 SM 被通信占用)、跨互联的一致操作、低精度累加和量化支持。

4.1.3 · 面积、功耗与封装的预算

计算、存储、接口争同一块面积和同一份功耗。TPU v1 有 256×256 个 8-bit 乘加单元、24 MiB 统一缓冲、4 MiB 累加存储;芯片面积里缓冲约 37%,计算约 30%,控制约 2%。缓冲比计算还大,因为阵列需要反复使用输入、权重和部分和。缩小缓冲换乘加器,被提前挤出的数据要重新加载,可能把新增算力的收益吃掉。

图 4-4 · 搬移为什么耗电

Pdyn ≈ αCV²f

先进工艺下 C 主要来自连线,信号走得越远电容越大。LogicFolding 把电路折叠成上下两层:典型核心连线缩短 20%,部分关键路径缩短 70%,一个模块的时钟缓冲器从 43,600 个减到 19,000 个。智能手机典型负载中动态功耗约占九成。

论文里的两个手算

NPU 同性能(29 TOPS)比较:只看电压项 (0.55/0.85)² ≈ 0.42,再乘频率项 0.37 得 0.16,但论文实测总功耗比是 0.34。差距来自并行度:前代一大两小三个核,折叠后四个大核,每周期翻转的电容 αC 变大。翻转条件:只有面积比 ≥ 功耗比,功率密度才不上升。

图 4-5 · 每搬一个字节要多少能量

Qwen3-8B · BF16 · 单请求 8K decode 一步:权重 15.137 GB + KV 1.208 GB · 19.97 GFLOPs
权重读一次服务 B 个 token;KV 和计算按每 token 计。

数值来自四份资料(Horowitz ISSCC 2014 / Dally Hot Chips 2023 的 45 nm 数据、MICRO 2017 的 28 nm HBM2 模型、NVIDIA 2022 的 NVLink-C2C),工艺不同,只用于量级比较。HBM2 的 3.97 pJ/bit 大多花在 DRAM 内部:阵列到基底 die 的通路 2.24、行激活 1.21,经中介层到 GPU 的 I/O 只有 0.3 pJ/bit。带宽只决定一步多快,不改变一步耗多少焦耳。降能量只有两条路:从更近的层次取字节,或让同一份字节服务更多 token。

图 4-6 · 一颗芯片能接多少 HBM

Rstack = 1024·r / 8 · Cstack = 层数 × 每层容量

单颗 die 不能超过光罩一次曝光的面积:H100 die 814 mm²、A100 826 mm²,都贴近上限;Blackwell 两颗 die 各做到光罩上限,再用 10 TB/s 的 NV-HBI 连成一颗芯片。H100→H200 容量 +76%(每堆 16→24 GB、5→6 堆),带宽 +43%(多一堆、引脚 5.24→6.25 Gbit/s)。B200 的 8 堆按技术简报 192 GB、7.7 TB/s 推得;书中其余各节用 HGX B200 每 GPU 180 GB、8 TB/s。

图 4-7 · 功率封顶:峰值算力为什么不能持续

b = (TDP − Pmem) / Fpeak

默认是 H100 SXM:HBM 满带宽约 106 W,留给计算 594 W,预算 0.60 pJ/FLOP。45 nm 下一条标量 HFMA 做 2 FLOPs 就耗 1.5 pJ(0.75 pJ/FLOP,已超预算),取指译码取操作数另耗约 30 pJ,是运算的 20 倍;一条 HMMA 矩阵指令耗 110 pJ,同样的开销只占 22%。功率封顶时,衡量利用率要用持续算力作分母。

4.2

计算单元

大矩阵被拆成许多固定形状的小块交给矩阵单元。计算 m×n 输出块时,同一行输入参与 n 个输出,同一列权重参与 m 个输出:数据在相邻乘加单元间传递,部分和留在本地,一条指令描述整块工作,控制开销被大量运算分摊。

图 4-8 · 3×3 乘加阵列:输入沿行走,权重沿列走

周期 3 / 7

每个乘加单元保留自己的部分和,第 t 个周期单元 (i, j) 处理 k = t − i − j 的那一对输入。K = 3 时 7 个周期全部完成。16×16×16 的矩阵操作有 2×16³ = 8,192 次浮点操作,每个输入元素在块内参与 16 次乘法。

补零:小矩阵为什么喂不饱矩阵单元

ηshape = MNK / (⌈M/mt⌉mt · ⌈N/nt⌉nt · ⌈K/kt⌉kt)

形状利用率

最小块 mt×nt×kt

一行输入、行方向按 16 补齐:16 行里只有 1 行有效。把矩阵单元翻倍,会同时加快有效计算和补零计算;改用 GEMV 实现才能减少无用计算。

图 4-9 / 4-10 · MoE:512 次分派落到几个专家

64 token × top-8

一批 token 选中哪些专家,既决定读哪些权重,也决定每个专家处理多少行,从而决定矩阵单元有多少算力花在补零上。这就是库为不同形状准备多种 kernel 的原因。

4.2.2 · 向量与控制单元:归约要一轮轮等

Softmax 先求最大值,再算平移后的指数,最后求和归一化。指数可以并行算;求最大值和求和是归约,理想二叉归约要 log₂n 轮,每轮等上一轮结果。加单元能缩短每一轮,轮数不变。

二叉归约(n = 8 示意)

RoPE:把三角函数换成查表

Qwen3-8B 一层 32 个 Q 头 + 8 个 K 头,每头旋转 128 维:(32+8)×64 = 2,560 对分量,每对 4 乘 2 加减,每 token 15,360 FLOPs。各头同一位置用同一组系数,1,024 个位置各存 64 个 cos、64 个 sin,BF16 只要 256 KiB。

预计算把特殊函数求值换成表访问与向量运算,旋转本身仍按每个 token 执行。昇腾 950 的一个 AI 子系统 = 1 个 Cube Core + 2 个 Vector Core,向量部分以 SIMD 为主、SIMT 为辅。

4.2.3 · 注意力:三种资源轮流被卡住

工作NVIDIA GPU昇腾Apple GPU
QK、PV 矩阵乘Tensor Core;小矩阵可用通用单元矩阵核 Cube(AIC)Metal GPU 矩阵运算
指数、归约、缩放SM 的通用与特殊函数资源向量核 Vector(AIV)GPU 线程与相应库实现
中间状态寄存器、共享内存、累加存储L0、统一缓冲与交换通路GPU 缓冲与线程组存储

例 4-1 · B200 单个 SM 上的注意力流水

FlashAttention-4 · 矩阵 8,192 FLOPs/周期 · 指数 16 个/周期 · 共享内存 128 B/周期

稳态下相邻两块完成间隔 τ ≥ max(Tmatrix, Tsmem, Texp)。只翻倍矩阵:max(512, 768, 1024) = 1024,没变;再翻倍指数:768,共享内存成了瓶颈,吞吐提高 4/3;三项都翻倍才到 512。下方时间线把三项当作依次经过的流水阶段(阶段次序为示意)。128×256、256×128 的共享内存读取量按 Q、K、V 各读一次估算(示意口径)。

提高一种资源的处理能力,只能减少等待,直到另一种资源成为瓶颈。Rubin 把 FP32 指数吞吐提到 Blackwell 的 2 倍、BF16/FP16 指数提到 4 倍,正是回应这里暴露出的指数瓶颈。

4.2.4 · 低精度:省了字节,可能多了转换

VW = n·b/8 + (n/g)·s  (n 个值各 b bit,每 g 个值共用一个 s 字节的 scale)

图 4-12 · 同一份压缩权重的两条计算路径

4096 × 4096 权重

分组越细,scale 越贴合该组数值范围,但要存的 scale 越多(g = 16 时总量 9 MiB)。DeepSeek V4-Flash 的一种路由专家实现把 FP4 权重先转 FP8 再做 GEMM:读的是 FP4 字节,算的是 FP8。展开后的权重若能多次复用,一次转换可以分摊;每次调用都重新展开,转换就成了固定成本。

误差

Qwen3-VL-30B-A3B 的 2048×1536 专家矩阵、RTX PRO 6000、真实路由输入,门槛 2%:逐行激活缩放误差 2.3–3.5%;沿 K 维每 128 个元素分组缩放降到 1.5–1.9%。

时间

分组后每组 scale 不同,要先求 16 组整数部分和、各乘 scale 再相加:直接分组计算 2.81 ms,先展开为 BF16 再一次 GEMM 2.52 ms,展开更快。

显存

显存峰值正相反:直接计算 11.4 MiB,先展开 35.2 MiB,直接计算省约三分之二。改进方向是把组内计算、缩放与累加融合起来。

4.3

存储层次

存储要回答三个问题:放不放得下(容量),重复使用时从哪一级读(层次与复用),独立访问够不够多(并发能否撑起带宽)。

mKV = 36 层 × 2(K,V) × 8 头 × 128 维 × 2 B = 147,456 B = 144 KiB / token  Bmax = ⌊(C − W − Mws) / (S·mKV)⌋

图 4-13 · RTX 4090 的 24 GB 能接几条请求

Qwen3-8B BF16 权重 16.381 GB · 工作区 2 GiB

取整带来阶梯:只有剩余空间够放下一整条请求的 KV,才能多接一条。思考题:KV 每条从 1.21 GB 降 10%,第五条能否放下?把“KV 压缩”拖到 10% 看看。DeepSeek V4.1-Flash 的主 KV 记录 512 个值用 FP4、连 scale 共 288 B,局部窗口记录用 FP8、共 528 B,参与注意力前再反量化。

统一内存是组织方式,不是器件

HBM 靠堆叠 die 和宽接口提供带宽,GDDR 靠多颗芯片加高速接口;两者都是器件与接口。Apple 的 CPU 和 GPU 访问同一份物理内存,可以先后使用同一缓冲、少一份副本,代价是 CPU、GPU 和其他应用共同消耗这份容量与带宽。训练还要算梯度、优化器状态和反向用的激活,峰值取决于某一时刻仍需保存的全部张量。

容量与带宽各管什么

Qwen3-235B-A22B · 4-bit · 8 条 × 8K

驻留:权重与 scale 123.1 GB + 八条 KV 12.6 GB + 2 GiB 工作区 ≈ 137.9 GB。H100 80 GB 缺近 58 GB,H200 141 GB 余约 3.1 GB。每步读取由路由决定:专家复用减少 V,换更快的卡减少每字节时间,二者作用在 T = V/R 的不同位置。

4.3.2 · 片上存储:三个量要分开

一个 128×128×64 乘加块要多少片上空间

V100 每 SM 最多 96 KiB 共享内存

空间、请求、实际传输

四个输出块都读同一份 32 KiB 输入:逻辑请求共 128 KiB;第一次读后留在 L2、后三次命中,片外只提供 32 KiB,但 L2 仍要向各块送出全部 128 KiB。若同一计算组顺序处理四块并把输入留在局部缓冲,后续访问连 L2 都不经过。

算术强度随观察层次变化:用 L2 请求量算的强度配 L2 带宽,用 DRAM 流量算的强度配片外带宽。

SM120(RTX 5090 / PRO 6000)每 SM 一级缓存与共享内存合计 128 KB,最多 100 KB 作共享内存:每组 32 KiB 可驻留三组,扩到 64 KiB 只剩一组,一组等数据时就没人接着算。A100 每 SM 共享内存上限 164 KB,H100 228 KB。

4.3.3 · 容量、带宽、延迟:用 Little 定律连起来

Reffective ≤ min(Rinterface, No·s / L)  No ≥ ⌈Rtarget·L / s⌉

例 4-2 · 换更快的显卡,KV 读取会同比加快吗

读 1.125 GiB KV · 每事务 128 B
图 4-14:每个请求从发出到返回一直占着一个槽(4 个槽、每 125 ns 发一次为示意)

500 ns 取自 Mess 在 H100 上的测量:空载 363 ns,接近饱和时 699–1,433 ns。128 个事务只撑 32.8 GB/s,要 36.9 ms;4,096 个够 1,008 GB/s,1.20 ms。换 5090 带宽 +78%,4,096 个事务只撑 1.05 TB/s,只快约 4%。要用满 1,792 GB/s 需要 7,000 个事务,延迟升到 800 ns 时要 11,200 个。若下一地址依赖上一读取结果,队列再深也填不满。

先按容量判断能否驻留,再按复用算各级接口的流量,最后按并发和延迟判断接口能否持续传输。

4.4

数据搬移

前几节算出了数据多大、复用几次。搬移要安排的是时间:让下一块在被使用之前到达,同时把当前块保留到最后一次使用结束。

图 4-16 · 子矩阵在内存里不连续

addr(i, j) = base + i·sr + j·sc

逐行读取只取有效区间;相邻线程访问相邻元素,请求还能合并成更少的事务。搬移单元只要“起点、行数、每行字节、行步长”这组描述符就能生成全部地址:Hopper 的 TMA、昇腾 950 的 NDDMA 都提供多维张量搬移,计算线程可以去干别的。

分块决定同一地址被请求几次

DeepSeek V4-Flash 共享专家的一次 w1 计算 [32, 4096] × [4096, 2048],FP8 输入只有 128 KiB。输出宽度切成 16 个 128 列的块,每块都要遍历完整输入,块级输入请求合计 16 × 128 KiB = 2 MiB;权重按列划分,各读各的,合计 8 MiB。重复请求能否命中片上,取决于这些块是否共享缓存、是否由同一计算组连续处理。

4.4.2 · 双缓冲:用空间换重叠

Tserial = n(tl + tc)  Tpipe = tl + tc + (n − 1)·max(tl, tc)

加载 2 μs、计算 1 μs、8 块

图 4-17 ~ 4-20 · 要几个输入槽,矩阵单元才不空等

QK:4 个 k=32 累加块 · 每块 16 KiB · tick = B200 SM 时钟周期

每块传输 64 tick(256 B/tick),再等 128 tick 才可用,计算 128 tick;一个槽从发起读取到该块算完一直被占用。目标 = 首块就绪 + 连续计算 = 192 + 4×128 = 704 tick。三个槽恰好够;第四个槽让最后一块更早到,但计算并不更早开始。矩阵速率翻倍后目标变成 448,三个槽只能到 512,要四个槽。

4.4.3 · 矩阵单元与向量单元之间的交接

注意力要把 QK 结果交给向量单元做 Softmax,再把概率送回矩阵单元做 PV。完整 128×128 FP32 分数矩阵占 64 KiB,写一次读一次就是 128 KiB 经过同一接口。逐行 Softmax 要等一整行分数,所以按查询行分组可以让向量单元提前开工。

图 4-21 · 分组、加槽、直连各省多少

矩阵 8,192 FLOPs/tick · 交接 128 B/tick · 32 行一组:QK/PV 各 128,Softmax 640 tick

每组缓冲(32 行 FP32 分数 + BF16 概率 = 24 KiB)从该组 QK 开始占用到 PV 结束才释放。QK 与 PV 共用矩阵单元,两个方向的交接共用同一接口。只改分组:向量从 1,536 提前到 384 tick 开始,总时间仍约 5,120(书中表为 5,118,取整口径差异);加第二个槽:3,200,少约 38%;改直接传递:3,008,再省约 6%;四个槽不再变化,向量单元已经连续工作。

4.5

多芯片封装与互联

一颗加速器不够时,把计算和存储分到更多芯片上。资源变多了,生成数据与使用数据的单元也离得更远。沿三种连接看:封装内的 die 之间、主机与加速器之间、加速器之间。

图 4-22 / 4-23 · 计算放在哪颗 die 上

两颗 die 各存 32 GiB 权重,本阶段全部读一遍

B200:每 die 90 GB、4 TB/s,NV-HBI 10 TB/s。910C:每 die 64 GB、1.6 TB/s,die 间每方向 270 GB/s。

本地与跨 die 两路走不同接口可以同时进行,阶段时间由较慢一路决定;跨 die 速率取对侧 HBM 与链路的较小者。B200 的技术简报没写 10 TB/s 是否双向合计,即使按每方向 5 TB/s 也高于每 die 的 4 TB/s。比值 = die 间链路 ÷ 本地 HBM:B200 为 2.5,两颗 die 可当一颗 GPU 用;910C 约 0.17,应让计算贴着权重。华为 CloudMatrix384(384 颗 910C)在 DeepSeek-R1 decode 中就以 die 为单位部署专家,每颗 die 恰好一个专家。

主机上传:复用多少次才划算

RTX 4090 · PCIe 4.0 x16 每方向 32 GB/s · 显存 1,008 GB/s

上传是一次显存读取的 31.5 倍,正是两条路径带宽之比;R ≥ 32 时每次分摊的上传不超过一次显存读取。复制引擎与计算单元独立,可以边算当前 batch 边传下一个(双缓冲在主机链路上的版本)。Apple 统一内存把交接从“复制后使用”变成“同步后使用”。

点对点传输:T = α + V/R

传 [M, 4096] BF16 激活 · α = 2 μs

思考题 · 四份 8 KiB 分别发,还是等齐了合并发

就绪于 0、1、2、3 μs · H100 NVLink 每方向 450 GB/s · 每次启动 2 μs

合并减少启动次数、更早全部送达,但第一份数据要等齐才发,响应变慢:传输粒度是吞吐与响应时间的取舍。跨服务器时固定开销更大:两台 HGX H100 共 16 卡做一次 16 字节 AllReduce 实测约 25 μs,100 次串行就是 2.5 ms,此时减少交换轮数比减少字节更有效。

小于转折点 V* = αR 时,启动开销主导,合并发送收益大;大于它时,减少字节或提高带宽收益大。链路越快,转折点越大。

4.6

模型需求如何推动架构演进

每次只改一个变量:保持同一份模型工作量,只换正在考察的硬件或数值表示,看它到底减少了什么工作。

图 4-26 · V100 上的 Tensor Core:大 batch 显著,单行没用

FP32 15.7 TFLOP/s · Tensor Core 125 TFLOP/s · HBM2 900 GB/s

4,096 行:137.4 GFLOPs,FP32 8.75 ms → Tensor Core 1.10 ms,读写 96 MiB 只要 0.112 ms。1 行:两条计算路径 2.14 μs / 0.268 μs,都短于 37.3 μs 的权重传输。同一项改进,对大矩阵收益巨大,对单行调用帮助不大。

BF16 vs FP16:同样两字节,范围不同

BF16 八位指数,最小正规数约 1.18×10⁻³⁸;FP16 五位指数,最小正规数约 6.10×10⁻⁵,最小次正规数约 5.96×10⁻⁸。代价是有效位:1 附近 BF16 相邻数间隔 2⁻⁷,FP16 为 2⁻¹⁰。低精度输入配 FP32 累加,分别处理表示范围与长内积误差。

图 4-27 · 带宽 × 位宽两项相乘

4096×4096 · 每 32 值 1 字节 scale

精度路线:Turing 在 Tensor Core 加入 INT8、INT4;Ampere 加 BF16、TF32(保留 FP32 指数范围、缩短尾数)和 2:4 结构化稀疏;Hopper 的 Transformer Engine 把 FP8 矩阵指令和缩放管理结合;Blackwell 支持分块缩放与 FP4。

矩阵变快以后,开始削减它前后的准备与等待

Ampere

异步拷贝:全局内存 → 共享内存,不经寄存器中转
共享内存
矩阵单元
寄存器存累加结果

Hopper

TMA:接手多维地址生成与搬移
共享内存
矩阵单元(异步执行)
寄存器存累加结果

Blackwell SM100

TMA 搬移
共享内存
矩阵单元
TMEM:专用张量存储保存累加结果

图 4-28 · 三项改动分别改变搬移指令、通用寄存器占用和中间结果存放位置。4.3.2 的块需要 32 KiB 输入、64 KiB 累加:三组输入加一组结果共 160 KiB,TMEM 独立承担其中 64 KiB,寄存器腾给其他线程状态。Rubin 还允许 TMA 更新专家的地址与步长:MoE 切换专家时矩阵形状不变,只换权重位置。消费级/工作站 Blackwell 是 SM120,数据中心 B200 是 SM100,软件按目标架构选 kernel。

型号与产品线架构容量 GB带宽 GB/sBF16/FP32 稠密 TFLOP/s增量在哪
RTX 3090 · 消费级Ampere2493671.0支持双卡 NVLink
RTX 4090 · 消费级Ada241,008165.2矩阵 ×2.33,带宽只 +7.7%
RTX 5090 · 消费级Blackwell321,792209.5带宽 ×1.78,容量 32 GB,FP4 路径
RTX PRO 6000 · 工作站Blackwell961,792503.896 GB ECC、更高 FP32 累加吞吐、MIG
A100 80GB SXM · 数据中心Ampere802,039312.0NVLink 每方向 300 GB/s
H100 SXM · 数据中心Hopper803,350989.4矩阵 ×3.17、带宽 ×1.64,FP8、TMA;NVLink 每方向 450 GB/s
H200 SXM · 数据中心Hopper1414,800989.5算力不变,只加容量与带宽

64 MiB 的链路序列化时间:A100 约 224 μs,H100 约 149 μs。RTX 4090、5090 没有 NVLink。“计算与执行组织一起改”(A100→H100)和“保持算力、增强存储”(H100→H200)哪个更有用,要代入模型工作才知道,见 4.8。

4.6.2 · 昇腾:从卷积展开到矩阵—向量交接

图 4-29 · img2col 交给硬件省了什么

ResNet 式 3×3 卷积 · FP16 · 早期 910 HBM 1.2 TB/s

早期 910(910A)设计时,ResNet 等 CNN 占训练负载的大头。MTE 在片上搬移时组织卷积窗口,省掉 HBM 中九倍大小的中间副本。这个卷积在 Cube(每周期 8,192 FLOPs)上占 28,224 周期,输出 ReLU 只有 200,704 个元素、1,568 组 256 B 向量:矩阵与后处理工作量相差悬殊。

图 4-30 / 4-31 · 换成注意力:交接接口成了新瓶颈

128×128 块 · d = 128 · Cube 1,024 周期 ≈ 1.024 μs @ 1 GHz

910B 所在的 Atlas A2 把矩阵核 AIC 与向量核 AIV 分开控制;910C 双 die,每颗 24 个 AIC、48 个 AIV,结果经全局地址空间交换、走缓存层次。94 GB/s 是 DaVinci 论文中每核分到的末级缓存带宽。950 还把单个 Vector Core 的 FP16/FP32 吞吐翻倍、在 UB 与 ALU 之间加寄存器文件、优化 Softmax 与 GELU,并新增 NDDMA 与 BufferID 同步。950 同频 FP8 类矩阵速率是 FP16 的 2 倍,MXFP4 是 4 倍;但 FP32 交接字节不变,矩阵、向量和 CV 通路要一起演进,局部加速才变成整段注意力的收益。

4.6.3 · Apple:大容量统一内存怎么换算成运行能力

容量决定能不能跑,带宽决定跑多快

单请求 · 8K 上下文 · 给系统与其他应用预留 8 GB

M3 Ultra 256→512 GB,带宽仍 819 GB/s,同一执行的 V/R 完全不变;M1 Ultra→M3 Ultra 带宽 800→819,只快约 2.4%。235B MoE 全部权重决定容量(约 123.142 GB 常驻),每步只读选中的专家(约 13.697 GB),所以它既“需要大内存”又“每步读得相对少”:M3 Ultra 上 16.72 ms,而不是把全部权重读一遍的约 150 ms。八条请求时集中/分散路由每步 24.737 / 75.967 GB,对应约 265 / 86 token/s。基础 M4→M5 带宽 120→153 GB/s,32 MiB 权重读取 279.6→219.3 μs;M5 GPU AI 峰值超过 M4 四倍,但单行投影仍由带宽决定。

统一内存

权重、KV 与中间数据
CPU · GPU · 独立 Neural Engine 共用

决定整机能装下多大的模型。

M3 / M4 GPU

通用计算
Dynamic Caching:按需分配 GPU 局部内存

影响工作驻留与片上资源利用。

M5 GPU

通用计算 + 每核 Neural Accelerator
第二代 Dynamic Caching

Metal 4 Tensor API 调用,加速矩阵处理。

大矩阵推动专用乘加,Transformer 增加向量与交接需求,大型 MoE 扩大常驻容量需求:图 4-3 的反馈环在三家的代际里都能找到。

4.7

专用架构

如果负载里有些条件长期稳定,就可以把它们写进硬件:固定运算规则、固定通信次序,甚至固定权重。专用化减少某些工作,把资源集中到剩下的工作上。

TPU v1 · 256×256 阵列的权重复用

8-bit 权重块 64 KiB

权重经片上 FIFO(可容纳四块)进入阵列,输入从 Unified Buffer 送入,结果存独立累加存储再交激活单元。阵列启动要填充、结束要排空,连续计算的块越多,每块分摊越少,小任务更受这些固定步骤影响。TPU 8t / 8i 把训练与采样服务分开组织,配比随主要负载变化。

把 KV 也放进片上 SRAM 要几颗芯片

Groq TSP · 每芯片 220 MiB SRAM

三种局部性思路:Groq TSP 由编译器预先排定张量的生成、传输和使用时刻;Graphcore IPU 由许多带局部存储的 tile 通过计算、同步和交换协作;Cerebras WSE-3 把计算与存储铺到晶圆尺度,片上 SRAM 44 GB。难点在分布式容量各处需求不同:一处释放的空间别处不能直接用,路由不均的 MoE 会让少数单元更忙。

4.7.3 · 固定权重:把权重与 KV 分开计量

OpenTallas 研究把不可变权重放进掩模 ROM(制造时固定内容的只读存储),HBM 只读写 KV。同一组权重换不同输入就能做不同任务,所以硬件可以围绕共同的模型设计权重通路,再用可写存储保存每条请求的上下文。

SHBM = (W + BK) / BK = 1 + W/(BK)  tmemory ≥ max(W/βROM, BK/βHBM)

图 4-33 / 4-34 · 权重搬出 HBM 以后

Qwen3-8B · 每批权重 W ≈ 15.1 GB · 8K 时每请求 KV ≈ 1.21 GB

B = 1 时 HBM 读取从约 16.3 GB 降到 1.21 GB(约 1/13.5);B = 16 时从约 34.5 GB 降到 19.3 GB(约 1/1.8),batch 已把权重摊薄,省掉它的相对收益变小。容量也被释放:一堆 24 GB 八层 HBM3E 扣 2 GiB 工作区,按每条 1.125 GiB 可放 18 条 8K 请求,原来还要放完整 BF16 权重时只能放 4 条。目标单用户 10,000 token/s 时每 token 只有 100 μs,光 1.21 GB KV 就要约 12.1 TB/s 的 HBM 带宽。

同一个 100 μs 时限,要多少运算通道

历史执行记录:15,134,641,792 次张量操作 · 1 GHz · 每通道每周期 1 次 FMA

nlane ≥ ⌈ops / (2×10⁹ × t × u)⌉。256 条通道完成这些操作约 29.6 ms。只留 40 μs、利用率 60% 时要 315,306 条,是最初的约 4.2 倍:时间预算越紧,留给等待的余量越小,必须配置的算力与带宽越高。SambaNova 的数据流组织与 FPGA 的可重配置通路则靠更新连接与调度适应新模型。

4.8

根据架构分析性能、选择加速器

执行时间来自两种关系:同一硬件单元要依次做哪些操作(共享资源的时间相加),后一项工作要等哪些结果(依赖决定顺序)。独立资源可以并行,总时间至少等于最忙的那个:T ≥ maxr Tr,Tr = Σi wr,i/pr,i。

依赖让资源汇总低估了时间

阶段 1:矩阵 10 μs、内存 1 μs;阶段 2:矩阵 1 μs、内存 10 μs;阶段内可重叠,阶段 2 要等阶段 1 完整结束。实际 20 μs;只汇总资源会得到矩阵、内存各 11 μs,差出的 9 μs 来自依赖。

Roofline:算术强度与峰值、带宽

Pattainable ≤ min(P, R·I)  I* = P/R  M* = I*·d / (d − 2I*),d = 4096

Q 投影的 Roofline 与转折行数

输入与权重各读一次、输出写一次

RTX 4090(BF16 输入、FP32 累加 165.2 TFLOP/s,1.008 TB/s):I* ≈ 164 FLOPs/byte,M* ≈ 178.1,从 179 行起计算比读取慢。M = 1 时计算 0.20 μs、读取 33.3 μs(内存主导);M = 256 时 52 μs 对 37.4 μs(矩阵主导)。速率要选对精度:同一张卡 FP16 累加约 330 TFLOP/s,8.59 GFLOPs 只要约 26 μs,主导资源就变了。实测点都在折线之下:交点右侧用 MFU 衡量,左侧用 MBU 衡量。

4.8.2 · 用同一模型比较候选加速器

Qwen3-8B 每层矩阵参数 Wlayer = 2×4096² + 2×4096×1024 + 3×4096×12288;每 token 线性运算 2×36×Wlayer ≈ 13.89 GFLOPs,8K decode 的 QK/PV 另加 4.832,输出头 1.245,共约 19.97 GFLOPs。4K prefill 的矩阵工作约 61.85 TFLOPs。每步 decode 的主要读取是权重 15.137 GB + 每请求 KV 1.208 GB(8K)。

选加速器计算器

读取下界 = 每步字节 ÷ 带宽 · prefill 下界 = FLOPs ÷ BF16 稠密峰值

每步能耗按“功耗上限 × 读取下界”估算,只对书中给出 TGP/TDP 的卡计算。Apple 整机扣 8 GB 给系统与其他应用。8B 稠密模型用不上 Ultra 的大内存,5090 的带宽直接变成更高的生成预算;235B MoE 只有 Ultra 和 H200 这类大容量设备能单机驻留,H200 每步约 2.85 ms,约为 M3 Ultra 的六分之一。多卡切分与专家 dispatch 见第 6 章。

4.8.3 · 预测与实测为什么有差距

RTX PRO 6000 · vLLM · 8K · batch 1

实验 8-1 · eager 模式

三轮 26.43 / 16.18 / 25.83 ms,取中位数 25.83 ms,约 38.7 token/s。2K 上下文每步少读 0.906 GB,实测 26.26 ms 并不更短;batch 64(2K)每步读 34.46 GB、下界 19.23 ms、实测 29.63 ms,等效 1.16 TB/s。batch 1 时每步主要是一段和读取量无关的固定工作:kernel 逐个启动、向量运算、采样与同步。提高带宽利用率几乎不能加快单请求生成,先要减少固定工作(第 5 章的融合与减少启动)。

图 4-37 / 4-38 · Q 投影:复用 vs 轮换权重地址

每条件 11 轮 × 16 次调用,取中位数

单行轮换比复用慢约 21%,但两者 DRAM 读取都约 32 MiB:差别不来自少读权重,要沿提交、执行、等待继续找。256 行复用时 DRAM 只读 256 B,轮换约 32.1 MiB,计时却都在 33 μs 左右;两者都有约 147 MiB 的 L2 请求。库把单行投影交给一个 GEMV kernel,256 行用 GEMM + split-K 归约两个 kernel。按峰值估的下界为 18.7 / 21.1 μs。M2 Max:单行 166 / 183 μs,256 行均约 1.835 ms。

“忙了多久” × “忙时多快”

Sr/T = (Sr/Ar) × (Ar/T)

两个任务都是 40%:A = 40 μs 时单元忙时满速、其余 60 μs 在等,应提前准备数据、增加独立工作(像 4.4 节两槽到三槽);A = 80 μs 时等待只有 20 μs、忙时只有一半速率,应改善执行粒度、指令与局部访问(像 4.2 节的补零与分组)。

4.8.4 · 容量、速度、功耗与成本

KA < KB ⇔ cA/cB < tB/tA  每 token 成本 = c / (3600·u·q)  E = ∫P(t)dt  V* = F0/Δc

Mac 何时更省电

RTX PRO 6000 按 600 W 上限:单行一次最多约 25.8 mJ,256 行约 19.6 mJ。Mac/RTX 时间比 3.9 和 56,Mac 平均功率低于约 155 W(单行)或 10.7 W(256 行)才更省。

功率高也可能更省

8K 单请求 decode,以功耗上限运行、每步等于读取下界:4090 450 W × 16.22 ms ≈ 7.30 J;5090 575 W × 9.12 ms ≈ 5.24 J。功率 +28%,每步能耗 −28%。

利用率与速度

每小时产出 3600·u·q:生成速度翻倍而利用率减半,单位成本不变。能耗分账(每 token 0.534 J)不含控制、时钟、漏电与空闲,用总耗电 ÷ 有效产出得到的值会更高。

例 4-3 · 专用化能否在模型寿命内回本

固定投入 2,000 万美元 · 每百万合格 token 省 0.50 美元

回本量 2×10⁷ / (0.5/10⁶) = 4×10¹³ token(40 万亿);100 台一年 100 × 10,000 × 0.5 × 31,536,000 ≈ 1.58×10¹³,只到 39%,一年省约 788 万美元,回本要约 2.54 年。至少 254 台才能一年回本;寿命减半或利用率降到 25%,都要 508 台。

常见误区

五个容易下错的结论

把矩阵单元做快一倍,任务就快一倍

60 + 40 μs 的任务,矩阵 2× 只到 1.43×,上限 2.5×。注意力里只翻倍矩阵,指数仍是 1,024 周期,完成间隔一点没变。

带宽越高,一步越省电

HBM 带宽翻倍,一步 decode 时间减半,0.534 J 不变。省能量只能让字节来自更近的层次,或让同一份字节服务更多 token(B = 32 时每 token 约 0.068 J)。

换上带宽更高的卡,读取就同比加快

4,096 个在途事务、500 ns 延迟只撑 1.05 TB/s:4090 → 5090 接口快 78%,KV 读取只快约 4%。还要有足够多的独立请求。

多 die 封装都能当一颗芯片用

B200 的 die 间链路是本地 HBM 的 2.5 倍,放哪都一样;910C 只有约 0.17,计算全放 die 0 要 127 ms,就地计算只要 21.5 ms。

读取下界就是实际速度

RTX PRO 6000 单请求 8K decode 下界 9.12 ms,实测 25.83 ms,MBU 只有 35.3%;batch 64 时才回到 65%。固定的启动、同步与向量工作要先去掉。

容量翻倍,模型就跑得更快

M3 Ultra 256 → 512 GB,带宽仍 819 GB/s,同一执行的 V/R 完全相同。容量决定能放下什么,带宽才改变同一批数据的读取时间。

本章小结

三笔账:容量、时间、能耗

一、从工作量出发

用状态大小筛容量,用流量与带宽算读取时间,用矩阵形状、精度与指令速率算计算时间,再沿依赖安排执行;最忙的资源和最长的依赖链决定下界。

二、瓶颈会转移

矩阵变快,指数和共享内存露出来;计算变快,原来的缓冲槽来不及准备数据;链路变快,固定开销占比更高。每次改动后都要重新找最慢的一项。

三、时间与能耗是两本账

带宽决定一步多快,每字节能耗与复用次数决定一步耗多少焦耳,功率上限又反过来压低可持续的频率。三家架构的演进,都在按模型需求调整这几项的配比。

访问计数、kernel 记录与计时把这些预算落实为运行速度和任务成本。第 5 章继续研究布局、融合与调度,说明软件如何用好这些硬件资源。

习题与配套实验

动手验证

思考 · 继续加矩阵算力,还是加速其余工作

60 + 40 μs 的任务:矩阵从 2× 提到 4× 省 15 μs(70 → 55),其余工作 40 → 25 μs 也省 15 μs。两者打平,选面积代价小的那个。(页首的计算器可以直接验证。)

实验 4-1〔核心〕· 注意力分块如何改变运算量与共享内存读取量

把矩形块改成 128×256 和 256×128,分别算矩阵、指数、共享内存所需周期;逐项提高三种吞吐,找出每次改动后最长的一项,解释块形状如何改变数据复用。再选一种硬件,把三类工作与存储位置标在执行图上。(例 4-1 的演示可以切换块形状和三种 ×2。)

实验 4-2 · 量化权重何时展开

列出“先展开再算”与“直接分组计算”各需保存的数据(权重、scale、展开副本、部分和、输出),比较加载时展开一次、每次调用展开、直接分组计算三种策略重复 R 次后的总时间,并用实验记录比较误差与显存峰值。

思考 · KV 压缩 10% 后能否接第五条请求

每条 1.21 GB × 0.9 ≈ 1.09 GB,五条约 5.44 GB,小于剩余约 5.47 GB,刚好能放下。(图 4-13 的演示把压缩拖到 10% 即可看到。)

实验 4-3 · 扩容与提带宽分别改善哪些 decode 瓶颈

用 Qwen3-8B 与 Qwen3-235B-A22B 的存储结果,分别只加容量、只加带宽,再改变 batch 与专家分布:先求最大可驻留请求数,再算每步读取时间,最后求维持目标带宽所需在途事务数,判断每种方案先受哪一项限制。

思考 · 额外等待翻倍,三个槽够不够

等待 128 → 256 tick 时,每块发起后 320 tick 才就绪。三个槽下第四块在 448 发起、768 就绪,但计划 704 就要开始算,出现空闲,完成时间推迟到 896。(图 4-17 的演示选“256 tick”即可。)

实验 4-4〔核心〕· 维持连续计算需要多少片上缓冲

画出 1–4 个输入槽的时间线,确定无间隙计算所需的最少槽数,再把矩阵速率翻倍解释变化;画出各行组经过 QK、Softmax、PV 的时间线,区分分组、加槽、直接传递各自省下的时间;最后在固定片上容量下分析每组缓冲大小如何限制可驻留的组数。

思考 · 合并发送如何改变完成时间与首份响应

分别发送:四次各 2.018 μs 串行,全部约 8.07 μs 送达,第一份 2.02 μs 可用。等齐合并:3 μs 开始发 32 KiB,约 5.07 μs 全部送达,第一份也要等到 5.07 μs。(4.5 节的时间线可以播放。)

实验 4-5〔核心〕· batch 如何改变不同架构的性能瓶颈

推导并画出 Q 投影 1–256 行的算术强度,分别把矩阵吞吐、内存带宽提高两倍,求计算与读取时间相等的行数;把注意力与专家矩阵加进资源表,解释上下文长度与专家行数分布如何改变瓶颈;再选两种加速器估算同一任务。(Roofline 演示可勾选 ×2。)

实验 4-6 · 用 Mac 与 RTX 实测检验执行时间预测

根据两平台的投影实测,提出两个能解释耗时差异的原因,读 DRAM、L2 与 kernel 记录,为每个解释列出预期与实际现象;画出 256 行调用的矩阵、部分结果与归约路径,指出需要哪些阶段时间才能区分“忙时效率”与“等待”。

实验 4-7 · 负载改变后,芯片资源改动是否仍有收益

选一种架构和一种负载,提出一次资源改动,用工作量、流量和依赖推导时间变化;改变 batch 或上下文,求改动不再省时的临界值;若有固定投入,再按每任务节省、利用率和模型寿命求最低服务量。(例 4-3 的计算器可直接用。)

实验 4-8 · 从能耗分账到功率封顶

(a)batch 取 8、32、128,算每 token 的权重、KV 与计算能耗,求权重项低于计算项的最小 batch;(b)上下文改为 32K,求 KV 项等于权重项的 batch;(c)选一张卡求 b,设 e = 1.5b,求两种情况下的持续频率比,再用 batch 32 一步的能量除以持续频率下的步时,比较平均功率与 TDP。(图 4-5、图 4-7 的演示可直接拖动。)