2797 字
约 9 分钟
8
S23-J15 · 架构演进与加速器选型

适用读者:要做设备选型、要解释"为什么预测 9.12 ms、实测 25.83 ms",或被问到"上 H100 还是 5090"的人。
前置:S23-J13、J14(算术强度、搬移与互联)。
覆盖旧文:A-4337 §4.6–§4.8(架构演进 + 专用架构 + 选型方法,503 点)→ 503 点。
扩展点:E-S23-043(Tensor Core 只对大 batch 有效)、E-S23-044(精度演进的读取预算:33.29 → 4.97 μs)、E-S23-045(用同一模型比较候选卡:读与算两条曲线)、E-S23-046(下界 vs 实测的 35.3% / 65% MBU 与固定开销)、E-S23-047(成本/能耗的不等式判据)。
上一篇:S23-J14 · 数据搬移与多芯封装互联
下一篇:S23-J16 · 算子的提交、搬移与分块。


1. 一句话结论

选卡不是"比峰值算力",而是"看你的负载落在读取下界还是矩阵时间上",再加三个不等式:容量、成本、能耗。 单请求 decode 的读取下界只占实测时间的 35.3%——剩下的 16.7 ms 是固定开销,换卡换不掉。

出处:AI Infra 教材 §4.6–§4.8,实测平台 RTX PRO 6000 Blackwell Workstation(id 4337)。

T_step ≈ max(T_read, T_matrix) + T_fixed
只优化 max 项,T_fixed 不变;而 batch 1 时 T_fixed 才是大头

2. 四条演进主线(§4.6)

主线 代表改动 解决了什么 没解决什么
矩阵单元 Volta Tensor Core → Hopper WGMMA → Blackwell TMEM 规则乘加吞吐 单行调用、非矩阵运算
精度 INT8/INT4 → BF16/TF32 → FP8 → MXFP8/MXFP4 存储量与读取预算 数值范围与缩放管理
数据路径 异步拷贝 → TMA → TMEM 搬移指令开销、寄存器占用 容量与带宽物理上限
封装互联 NV-HBI、NVLink、Unified Bus 跨 die/跨卡的数据距离 k<1 时的链路瓶颈(J14)

2.1 Tensor Core 只对大 batch 有效(E-S23-043)

同一块 V100 SXM2,FP32 峰值 15.7 TFLOP/s、Tensor Core FP16 输入 125 TFLOP/s、HBM2 900 GB/s,做 4096×4096 Q 投影:

行数 普通 FP32 路径 Tensor Core 路径 传输
M=4096 8.75 ms 1.10 ms(≈1/8) 96 MiB ≈ 0.112 ms
M=1 2.14 μs 0.268 μs 32 MiB ≈ 37.3 μs

判据:矩阵时间降到 1/8,但单行时它本来就只占 7%。 单行调用要加快的是权重读取,不是矩阵单元。

2.2 精度演进 = 读取预算缩 6.69 倍(E-S23-044)

格式 4096×4096 权重 + scale 读一次的时间
BF16(32 MiB) 32 MiB 4090(1,008 GB/s)33.29 μs
BF16 32 MiB 5090(1,792 GB/s)18.72 μs
MXFP8(16 + 0.5) 16.5 MiB —
MXFP4(8 + 0.5) 8.5 MiB 5090 4.97 μs
33.29 / 4.97 = 6.69×  = 1.78×(带宽)× 3.76×(位宽)

判据:读取预算的改善是"带宽 × 位宽"的乘积。 只换卡(1.78×)远不如"换卡 + 量化"(6.69×)。

2.3 BF16 vs FP16:范围换精度

项 BF16 FP16
指数位 8 5
最小正规数 ≈1.18×10⁻³⁸ ≈6.10×10⁻⁵
1 附近相邻间隔 2⁻⁷ 2⁻¹⁰

判据:1e-8 的梯度在 FP16 里直接下溢成 0,BF16 还能表示——这就是训练普遍用 BF16 + FP32 累加的原因。代价是有效数字少 3 位。


3. 专用架构:TPU / Groq / Graphcore / Cerebras(§4.7)

架构 组织方式 优势 代价
TPU 大阵列 + 统一缓冲,编译器静态调度 固定形状吞吐极高 形状/权重固定,灵活性差
Groq 确定性数据流,无动态调度 时延可预测 容量小、编程受限
Graphcore 分布式片上 SRAM + 交换 权重可分放 生态与迁移成本
Cerebras 整片晶圆级阵列 超大 on-chip 容量 单机规模与成本

判据:专用架构的收益来自"形状固定",代价也来自"形状固定"。 模型结构频繁变化时,专用架构的适配成本会吃掉它的效率优势。


4. 选型方法:一个模型、两种阶段(E-S23-045)

固定算例:Qwen3-8B、BF16、单请求、8,192 上下文。

项 数值
权重常驻 16.381 GB
KV(8K) 1.208 GB
工作区 2 GiB
总预算 约 19.737 GB
每步读取(权重 + KV 载荷) 16.345 GB
每 token 线性运算:2 × 36 × W_layer ≈ 13.89 GFLOPs
8K decode 的 QK + PV:4 × 36 × 8192 × 4096 ≈ 4.832 GFLOPs
输出头:约 1.245 GFLOPs
合计:约 19.97 GFLOPs
4K prefill:约 61.85 TFLOPs

4.1 换卡的收益分解(原文结论)

换卡 单请求 decode 读取时间 4K prefill 矩阵时间
3090 → 4090 −7.1% −57.0%
A100 → H100 −39.1% −68.5%
H100 → H200 继续下降 基本不变
5090 vs RTX PRO 6000 相同 后者矩阵更强、容量更大

判据:先判断你的负载是哪一侧:

  • 长时间单请求生成 → 看带宽(5090、H200 的增量直接缩短每步读取);
  • 长文档问答、批量 prefill → 看矩阵吞吐(4090/H100 的增益先缩短 prefill)。

5. 预测 vs 实测:35.3% 与 65%(E-S23-046)

同一张 RTX PRO 6000(1,792 GB/s 峰值),8K 上下文、batch 1、纯 decode:

项 数值
每步载荷 16.345 GB
读取下界 9.12 ms(≈109.6 token/s)
实测(vLLM,eager,三轮中位数) 25.83 ms(≈38.7 token/s)
下界占比(MBU) 35.3%
多出 约 16.7 ms

诊断实验(原文):

条件 每步读取 读取下界 实测
8K,batch 1 16.345 GB 9.12 ms 25.83 ms
2K,batch 1 少 0.906 GB 8.61 ms 26.26 ms(没更快!)
2K,batch 64 34.46 GB 19.23 ms 29.63 ms(等效 1.16 TB/s,65%)

判据:batch 1 时每步时间由"与读取量无关的固定工作"决定(eager 逐 kernel 启动、向量运算、采样、同步)。所以:

  • 想加快单请求 → 减固定开销(kernel 融合、减少启动次数,第 5 章);
  • batch 变大后固定开销被摊薄,读取重新成为主项 → 这时带宽才值钱。

5.1 Q 投影实测:复用 vs 轮换地址

M M2 Max(复用/轮换) RTX PRO 6000(复用/轮换)
1 约 166 / 183 μs 约 42.9 / 51.9 μs
256 均约 1.835 ms 约 32.6 / 33.5 μs

判据:M2 Max 在 M=256 时反而更慢(1.835 ms vs 32.6 μs)——统一内存 + 缺少大 batch 矩阵路径;而 RTX 在 M=256 时几乎不受地址轮换影响(缓存/容量足够)。


6. 成本与能耗:两个不等式(E-S23-047)

6.1 每任务成本

K = c·t(按时间计费)
K_A < K_B  ⇔  c_A/c_B < t_B/t_A

判据:A 的速度是 B 的 2 倍时,A 的小时成本只要低于 B 的 2 倍,每任务就更便宜。 利用率也要算:每 token 成本 = c/(3600·u·q)——速度翻倍但利用率减半,单位成本不变。

6.2 每步能耗

卡 功耗上限 每步时间 每步能耗
RTX 4090 450 W 16.22 ms 7.30 J
RTX 5090 575 W 9.12 ms 5.24 J
功率 +28%,每步能耗 −28% —— 因为时间降得更多
E = ∫P(t)dt

判据:"功耗高的卡更费电"是错的,要看 P × t。这也是数据中心愿意用高功耗卡的原因。


7. 选型检查表(可直接拿去做评审)

# 问题 不通过就淘汰
1 权重 + KV(p95) + 工作区 ≤ 显存? 容量不足 → 换卡或量化
2 负载是 decode 主导还是 prefill 主导? → 决定看带宽还是矩阵吞吐
3 单请求下界占比(MBU)多少? <40% → 先治固定开销,别换卡
4 跨 die/跨卡 k 是否 ≥1? <1 → 计算贴权重放置
5 消息大小 vs V*=αR? 小于它 → 合并消息
6 每任务成本 c/t 与能耗 P·t 用不等式比较,不比峰值
7 软件适配成本(算子/布局/kernel) 专用架构要按部署周期摊

7.1 可复算(实测)

$ cd /root/博客运营官/blog-v2 && python3 tools/s23_book_calc.py | tail -11
V100 SXM2 Q 投影(15.7/125 TFLOP/s, 900 GB/s)
  M=4096 : F 137.4 GFLOPs;FP32 8.754 ms;TC 1.0995 ms;传输 0.1118 ms
  M=1    : F 33.6 MFLOPs;FP32 0.002 ms;TC 0.0003 ms;传输 0.0373 ms
  BF16 32 MiB @4090: 33.29 μs
  BF16 32 MiB @5090: 18.72 μs
  MXFP4 8.5 MiB @5090: 4.97 μs(比值 6.69×)

8K batch1: 载荷 16.345 GB,下界 9.12 ms(109.6 tok/s)
  实测 25.83 ms → MBU 35.3%,多出 16.7 ms
  4090: 450 W × 16.22 ms = 7.30 J/步
  5090: 575 W × 9.12 ms = 5.24 J/步

前 7 行是按规格复算;后 3 行里 实测 25.83 ms 与能耗数字来自教材实验与公开规格,本仓库只复算下界与换算。

8. 前提与边界

结论 成立条件 不成立时
读取下界 = 载荷/峰值带宽 无缓存命中、无重叠 缓存/前缀复用 → 实际流量更低
MBU 35.3% 是固定开销 eager 模式、逐 kernel 融合/图模式 → 比例上升
成本不等式 按时间计费、任务可迁移 包年/预留 → 用实际摊销
能耗 P·t 满载运行 空转占比高 → 加空闲成本

9. 常见误区

误区 纠正
"Tensor Core 让推理快 8 倍" 单行时矩阵只占 7%,快 8 倍也救不了 37.3 μs 传输
换 H200 就能加快 decode 带宽涨、矩阵几乎不变;先看你的瓶颈
功耗高的卡更费电 看 P×t:5090 每步能耗反而低 28%
预测 9.12 ms 就该实测 9.12 ms eager 固定开销 16.7 ms,占 65%
只看峰值算力选卡 容量、带宽、互联、软件适配都要过

10. 自测

  1. V100 上 4096 行与 1 行的 Q 投影,Tensor Core 各带来多少倍收益?为什么单行不行?
  2. BF16 32 MiB 权重在 5090 上读多久?换 MXFP4 后呢?倍数怎么拆?
  3. 8K batch1 decode 读取下界 9.12 ms、实测 25.83 ms,MBU 多少?该优化什么?
  4. 4090(450 W, 16.22 ms)与 5090(575 W, 9.12 ms),每步能耗各多少?
答案
  1. 4096 行 8.75 → 1.10 ms(≈8×);1 行 2.14 → 0.268 μs(≈8×),但传输 37.3 μs 占绝对主导,整体几乎不变。
  2. 18.72 μs;MXFP4 为 4.97 μs;6.69× = 1.78×(带宽)× 3.76×(位宽)。
  3. 9.12/25.83 = 35.3%;应减少 kernel 启动/同步等固定开销(融合、图模式)。
  4. 4090:450 W × 16.22 ms ≈ 7.30 J;5090:575 W × 9.12 ms ≈ 5.24 J。

11. 下一篇

S23-J16 · 算子的提交、搬移与分块 —— 进入第 5 章:一个算子如何被切成 tile、如何排流水、为什么"融合"能同时省带宽和启动开销。

S23-J15 · 架构演进与加速器选型
https://www.clxhxhhr.top/posts/5542/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。