CUDA · Hopper、Blackwell、Ada、Ampere · 一次租机横扫 · 对照 2× RX 7900 XT 来读

在一张卡上读出的内存控制器忙碌比例,给五种它从未拟合过的场景排对了序,
唯一一次被要求预测幅度,少算了一半

在一张卡上读作 mem_busy;拿 H200、B300、PRO 6000 和第二张 H100 检验,并对照一份在跑数据之前就写下的预测

Qwen3-8B 做一步解码,单卡内存控制器有 87 % 的时间处于忙碌;换成 gemma-4-26B-A4B,这个数字是 38 %。只要在一张卡上读出这个值,就能预测两者之中谁更能从更快的卡、第二张卡或更快的显存中获益,谁又会在更慢的显存上承受更大损失。这些预测成立的硬件,此前甚至从未做过实测。但它说不出差出多少。一份在数据之前写下的预测把这件事记录在案。

一张 H100、H200、B300 与 RTX PRO 6000 · TP=1,租用 2× H100 与 2× RTX PRO 6000 · TP=2,租用 对照 2× RX 7900 XT · gfx1100 vLLM 0.28.0 · CUDA 13.0 586 次阶梯测量 · 385 个集合通信格 · $29.94 实测 2026-09-03

摘要

本仓库此前的所有推算,都基于办公桌下的两张 Radeon 以及 Colab 提供的有限算力。这次租机为解码和预填充阶梯补充了六种机器配置(H100、H200、B300、RTX PRO 6000、两张 H100 和两张 PRO 6000),并在集合通信上补充了八种配置。整轮实测产出 586 次阶梯测量与 385 个集合通信格,0 个错误,并首次将上下文长度推进至 32 000 token 以上。测试首先设立了两个平台对照:在同一平台上租用的 A100 和 L4,复现 Colab 已入库数据行的偏差仅为 0.07 % 与 0.9 %,这让我们能够放心地将后续所有比值都视为显卡本身的差异。

结论是一个计数器。在 campaign-2026-09-02d 中,单卡上的内存控制器忙碌比例(mem_busy)决定了第二张 Radeon 能带来多少提升:在 bf16 8B 模型上该值为 90 %,加速比为 1.70×;在 w4a16 12B 上该值为 56 %,加速比为 1.20×。此前这只是单台机器上的五个格子。如今,这个计数器成功给五种场景的测试结果排出了相同次序:一种在这一对卡上,另外四种以单张 H100 为基线。这四种场景包括 H200、B300、PRO 6000(由于显存更慢,收益方向相反),以及通过 NVLink 连接的第二张 H100;对于读取显存最少的模型,其提升仅有 2.9 %。然而,它无法预测幅度。在运行 H200 测试前,我们预先提交了一份预测。实测结果表明两端的相对顺序完全正确,但实际跨度几乎是预测值的两倍。在受限于显存的一端,性能增益甚至超过了显存时钟频率之比本身,而这是所用模型公式无论如何也推算不出的。它能排序,不能定量,记录在案的结果正是如此。

互连线路并不是决定性的主轴,如今这一点已经得到了实测验证。在八种配置中,集合通信在带宽端的跨度高达 62×,而延迟端仅相差 3.2×。batch-1 解码每次仅归约单行数据,因此落在延迟端。NVLink 在双卡时能带来 20 % 的提升,在四卡时提升则达 171 %。测试还引出了另外三项发现:四张显卡在未指定任何启动参数的情况下自动选择了三种不同的 attention 后端;租金 $7.10/h 的 B300 在 MoE 模型上不敌 $3.95/h 的 H100,但在 8B 模型上却胜出 66 %;在上下文长度超过 32 000 token 后,真正使解码曲线趋于平缓的是有界的 attention 窗口而非循环状态,这推翻了运行前写入 runner 的预期。

1先做两个对照,再谈任何比值

下文涉及的所有比值,均以 Modal 上租用的显卡数据除以八月份在 Colab 上实测的 A100 或 L4。跨平台对比的前提是两个环境的表现保持一致。为了直接检验这一假设,我们在 Modal 上租用了同型号的两张卡,在相同的模型、上下文预算以及 Colab 采用的阶梯档位下重新运行。

图 1 · 同一张 A100,两个平台,三次会话 可由仓库重算
图 1. gemma-4-12B 在一张 A100-SXM4-80GB 上四个档位的解码:Colab 于 2026-08-29 与 2026-08-30, Modal 于 2026-09-03。Modal 这次在每一档都落在 Colab 第二次的 0.07 % 之内,比 Colab 自己两次会话 之间还要近。这个区间不是看了答案之后定的:那四行 Colab 数据从八月起就已入库。L4 对照在一张不进入任何结论的卡上说了 同样的话:32 000 处 25.29 tok/s,对 Colab 的 25.07 与 25.17。

2一个计数器给五种场景排序

指标 mem_busy_pct 记录的是采样中内存控制器处于忙碌状态的时间比例。每台机器上都由同一个采样器统一读取该指标(见 harness/telemetry.py:Radeon 上读取 amdgpu 的 mem_busy_percent,CUDA 卡上读取 NVML 的 utilization.memory)。它代表的是忙碌比例而非实际达到的有效带宽;测试套件 harness 将两个平台上的实际带宽均标记为缺失,并阐释了具体原因。在 2026-09-02 那天,仅凭在单张 Radeon 上测量两个模型的该指标,就成功推断出了第二张卡的价值。接下来的五种场景旨在对这一排序规律进行检验:每种场景保持模型固定,并对比计数器取值区间两端的表现:

图 2 · 五种场景,两个模型,一个次序 可由仓库重算
图 2. 每一行是一个模型在该场景下 500 档的解码速率,除以同一模型在基准机器上的值;百分数是基准机器同一档上的 mem_busy。这一对卡自己的场景是 2026-09-02d,它的两个模型是 bf16 的 8B 和 w4a16 的 12B —— 那场 campaign 跑的就是它们;四种租机场景比较的是 H100 自身区间的两端,87 % 的 Qwen3-8B 和 38 % 的 MoE。 在每一种场景里,吃显存重的那一端离 1.0 都比吃算力重的那一端更远,不论场景往哪个方向走 —— 包括显存更慢的 PRO 6000, 在那上面从更多带宽赚得最多的模型,也在更少带宽上亏得最多。最后一行读两遍:mem_busy 38 % 时, NVLink 上的第二张 H100 值 2.9 %。

3却一个都没算准大小

五种场景下的排序在真正做出有效预测之前,终究只是一种相关性。H200 提供了最纯粹的检验场景:它与 H100 拥有相同的计算能力、700 W 功耗上限以及 SM 时钟频率上限,区别仅仅在于显存更快。如果一步解码有比例为 f 的时间在等待显存,其余时间用于其他开销,那么将显存速度提升至 r 倍后的理论加速比即为 1 / ((1 − f) + f / r)。这里的 f 取单张 H100 基线上的 mem_busy。比值 r 则直接取自两张卡实测的最高显存时钟频率:2 619 对 3 201 MHz,计算得 1.222,而非采信本仓库未曾独立验证过的厂商标称带宽。这六项预测在实际运行之前均已提交入库。

图 3 · 预测,以及回来的结果 可由仓库重算
图 3. 用上面的公式预测的 H200/H100,对照实测比值 —— 取两台机器上两轮都吻合在 1 % 之内的最浅一档, 这条规则在看数字之前就定下了;gemma-4-31B 用 2 000,因为它在 H200 上 500 档的两轮相差 13 %。 两端的次序是对的,而且分得很开。跨度不对:实测 0.210 对预测的 0.114,而且 Qwen3-8B 的 1.254× 超过了 r 本身 —— 对任何 f ≤ 1,那个公式都给不出这个值, 所以错的是 f 而不是 r,而且不是差一个常数倍。这个计数器能排序,不能定量。一个独立的旁证说明机制是对的、只是算术不对:H200 上六个模型的 mem_busy 全都低于 H100,没有一个交叉 —— 更快的显存做同样的活,让控制器忙碌的时间更短,这正是模型说应该发生的事, 而它不是拟合出来的。

4为什么第二张卡的价值不在线路上

关于 a100 的那篇文章在第 9 节中曾断言,第二张 Radeon 的带宽开销主要耗费在互连上。但在 allreduce-2026-09-02 这一 campaign 中,通过在这一对卡上的直接测量推翻了该结论。在 CUDA Graph 回放机制下,每次集合通信仅需 16.6–21.5 µs,大约相当于单步解码的十分之一耗时。第二张卡把一个模型提到 1.70×,另一个只有 1.20×,两者付出的通信开销完全一样。在七种 NVIDIA 配置上开展的同等横扫,为推翻此前结论提供了扎实的机制解释。

图 4 · 一次 all-reduce,两端,八种配置 可由仓库重算
图 4. hidden 4 096(Qwen3-8B 的一行)处的 t_graph_us:一个 token,即一步解码; 以及 16 384 个 token,即一次预填充。所有 NVIDIA 运行都是 NCCL 2.29.7,Radeon 上是 RCCL 2.27.7,同一个脚本。 八种配置上带宽端跨 62×,延迟端跨 3.2×;只看双卡,延迟端跨 1.5×,对面仍是同样的 62×。batch-1 解码归约的是一行,落在延迟端 —— 在那里一对 B300 只比这一对 Radeon 快 1.2×,而在另一端快 62×。这就是第二张卡的价值跟着内存控制器走、而不跟着互连走的原因:互连的 区间是真实的,推理从来不曾进入它。NVLink 是为第四张卡准备的。加上第三、第四张卡,H100 一步解码变成 ×1.22、带宽端 ×1.30;PCIe 上没有 NVLink 的 PRO 6000 是 ×2.71 与 ×2.99。没有 NVLink 的两张卡比有的贵 20 %;四张卡贵 171 %。而四张 H200 与四张 H100 在两端都吻合在 1 % 之内,所以第 3 节里 H200 阶梯上的优势 没有一分是从线路上来的。

5四张卡,三种 attention 后端,谁也没要过

同样的 vLLM 版本,同样的命令行,整轮横扫中未传入任何指定后端的参数。runner 直接从每份 serve 日志中解析实际启用的后端,而不是轻信静态配置表,这也是各后端分歧得以暴露的唯一原因。由于 vLLM 0.28 并未提供显式指定解码器后端的参数(检查安装包可知,attention_backend 仅存在于 config/speculative.py 中),因此无法构建对照组来将显卡硬件与 GPU 内核的影响隔离开来。

图 5 · 每张卡上每个模型拿到的后端 从每份 serve 日志读出
图 5. 每个(模型,卡)的解码器 attention 后端,取自各组自己的 serve 日志,以及每个 checkpoint 落到的 W4A16 内核。 两张 Hopper 全部走 FlashAttention;B300 走 FlashInfer;PRO 6000 把 gemma-4 送到 Triton、把 Qwen 和 Muse 的 checkpoint 送到 FlashAttention。因此本文里每一个跨机器比较都带着一项后端因素。在 PRO 6000 内部这个分裂很干净,同一张卡、 同一场会话:三组 Triton 配置在 500 到 128 000 token 之间丢掉 39–52 % 的解码速率,两组 FlashAttention 配置丢 13–28 %。后端和模型混在一起,所以这不是归因 —— 但它是一张卡上的一场会话,而跨机器的版本不是。

6最新的卡不是最快的卡

图 6 · 一张 B300 对一张 H100,以及一美元买到什么 价格是价目表,不是测量
图 6. 500 档的解码,各一张卡。$7.10/h 的 B300 在 Qwen3-8B 上比 $3.95/h 的 H100 快 66 %,在 gemma-4-12B 上快 4 %,在 gemma-4-26B-A4B 上输了 —— 次序与计数器的一样,因为 B300 的优势是带宽,而 MoE 读得最少。按美元算它三个都输。B300 还换了 attention 后端, 所以它那一列里机器和后端一起在动;价格是 Modal 在 2026-09-03 的价目表,是本页上仅有的手打数字。

7过了 32 000:什么让曲线变平

在此轮横扫之前,本仓库的所有测量阶梯均止步于 32 000 token;此次测试中,H100 将五个模型成功推进到了 128 000。运行之前,已将一份预测写入 runner 中。参测模型采用了三种截然不同的 attention 设计:gemma-4 读取的 KV cache 随长度无界增长;Qwen3.8-27B 维护的循环状态则完全不随长度增长;而 Muse-Glimmer-30B 借助 2 048 token 的滑动窗口计算 attention,开销先随长度增长随后固定。据此,先前的预测认为 Muse-Glimmer 的表现将介于两者之间。

图 7 · 一张 H100 上五个模型到 128 000 token 可由仓库重算
图 7. H100 上解码速率对上下文,十六档,每格两轮,两轴都取对数 —— 同样比例的衰减就是同样的斜率,而下面说的正是保留率。它落在了两者之下。Muse-Glimmer-30B 在 128 000 处只丢掉 500 token 速率的 4.8 %;hybrid SSM 丢掉 21.8 %, 和稠密 31B 的 22.0 % 一样远。带循环状态的模型不是平的那个。让曲线变平的是有界的 attention 窗口,不是固定大小的状态 —— SSM 仍然带着开销随深度增长的 attention 层。同样的次序出现在一个独立的量上:32 000 处从 A100 换到这张 H100, 对 Muse-Glimmer 值 1.36×,对 SSM 值 1.45×,对三个 gemma 模型值 1.90–2.16×。一个混淆因素, 而且它反着结论走:Muse-Glimmer 是唯一一个 W4A16 内核随机器变化的模型 —— Hopper 上是 Machete,别处是 Marlin —— 而 Machete 在 Hopper 上是两者中更快的那个。

8尚未确立的

计数器的幅度

局限性在第 3 节中显而易见。公式 1 / ((1 − f) + f / r) 以单卡测得的 f 代入,将实际跨度低估了一半,且完全无法推算出受限于显存的一端。这背后存在两种可能:要么有效带宽比高于显存时钟比(厂商标称数字给出 1.43,若以此代入,该公式又会全面高估每一行);要么 H200 与 H100 之间存在此前预测时忽略的其他硬件差异。当前测试无法对这两种因素做出解耦。

后端对照

图 6 中的 B300 数据列以及所有 gemma-4 的对比,均混杂了显卡硬件与后端实现的双重影响。由于 vLLM 0.28 无法固定解码器后端,这项对照未做实测。

两种配置

gemma-4-26B-A4B 无法在 TP=4 下运行,报错为:CompressedTensors WNA16 MoE with static group scales requires the MoE intermediate size per tensor-parallel partition to be divisible by group_size (32)。这是 checkpoint 本身的结构约束,并非重试不足所致。其余四个模型在 TP=4 下的测试,以及 Muse-Glimmer 在租用的这一对卡上的 TP=2 测试,则受限于预算未予采购。

实际达到的带宽,以及两个厂商上的同一个计数器

mem_busy 反映的是忙碌时间占比:某一速率下的 87 % 与另一速率下的 87 % 绝不能划等号,且两个平台上均缺少实际达到的带宽数据。计数器可以在机器间迁移,但其分母基数却无法随之带走。此外,它本质上横跨了两个不同的驱动指标:Radeon 上的 amdgpu mem_busy_percent 与 CUDA 上的 NVML utilization.memory。同一个采样器读取出的同一对模型,在两端分别测得 90/56 与 87/53,这只能说明两个计数器的度量特性相近,但绝非严谨的证明。

五种场景里有四种共用一条基线

H200、B300、PRO 6000 以及第二张 H100 的数据行,除以的都是单次 H100 会话的测量值,因此该会话若存在任何系统偏差,会导致这四行数据发生同向偏移。平台对照将该会话与 Colab 的差异严格限定在 0.07 % 之内,而这一对卡则是在另一套物理机器上完成测试。因此,这五种场景整体上构成了对这一对卡实测发现的一次独立检验,而非五次。

被丢弃的预填充档位在哪里

租用卡上有二十三个预填充格子未通过可重复性筛选,全部集中在 500 至 2 000 token 之间,对应冷启动阶段的头几次请求。解码也有两个格子没过,都在 H200 上:gemma-4-26B-A4B 的 1 000 档与 gemma-4-31B 的 500 档。上文的所有结论均不依赖这些格子。

全部材料。各 campaign 目录、runner、serve 日志以及集合通信扫描均开源在 benchmarks/cuda-modal/。预测与追加的裁决见 cuda-h200/campaign-2026-09-03/PREDICTION.md。除已注明的两项价目表价格外,文中的每一个数字均由 verify_doc_figures.py 从已入库的数据行中重新计算得出。

该计数器本身,以及在这一对卡上促成此项测试的五个格子,详见 另一篇文章的第 9 节。