适用读者:要做设备选型、要解释"为什么预测 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. 自测
- V100 上 4096 行与 1 行的 Q 投影,Tensor Core 各带来多少倍收益?为什么单行不行?
- BF16 32 MiB 权重在 5090 上读多久?换 MXFP4 后呢?倍数怎么拆?
- 8K batch1 decode 读取下界 9.12 ms、实测 25.83 ms,MBU 多少?该优化什么?
- 4090(450 W, 16.22 ms)与 5090(575 W, 9.12 ms),每步能耗各多少?
答案
- 4096 行 8.75 → 1.10 ms(≈8×);1 行 2.14 → 0.268 μs(≈8×),但传输 37.3 μs 占绝对主导,整体几乎不变。
- 18.72 μs;MXFP4 为 4.97 μs;
6.69× = 1.78×(带宽)× 3.76×(位宽)。 9.12/25.83 = 35.3%;应减少 kernel 启动/同步等固定开销(融合、图模式)。- 4090:
450 W × 16.22 ms ≈ 7.30 J;5090:575 W × 9.12 ms ≈ 5.24 J。
11. 下一篇
S23-J16 · 算子的提交、搬移与分块 —— 进入第 5 章:一个算子如何被切成 tile、如何排流水、为什么"融合"能同时省带宽和启动开销。