这里的长篇记录出自一个实测仓库,所有测量均在 ROCm 与 vLLM 下的 2× RX 7900 XT(gfx1100,RDNA3)上完成。 每篇文章所用的图表,均取自仓库负责校验的同一份已入库数据,并在页面上直接注明哪些数字可以重算、哪些不能。
图表为每台机器上的每个模型各画一条线。每条线反映的都是该模型实测中最快的配置,而非统一的基线。Radeon 这边六条里 有四条出自同一场 campaign、同一套栈,彼此可以直接比;另外两条来自更晚的栈,因为在这两个模型上,那场 campaign 已经不再是这台机器能达到的最佳表现。A100 包含同样的五个模型,出自它自己单一下午跑完的单场 campaign。每条线都标明了自己运行的软件栈。Radeon 的候选是 ledger 里 2026-07-25 至 2026-08-29 的 TP=2 序列;这对卡九月的阶梯超过 32 000,属于图 3 与图 4。
图 1. 批量 1 的解码速率对上下文长度,横轴取对数。默认视图是 2× RX 7900 XT、 张量并行 2 上的所有模型;图上方的开关把问题掉个头,变成一个模型在每台机器上,颜色也跟着问题走: 一种视图里是模型,另一种里是卡。
--enforce-eager 给它换回 2.51 GiB 和一个 2 020 token 的池子。图 2. 同一个问题的另一半:图 1 是每台机器生成得多快,这张是它读提示词 读得多快。六个模型、五十二条线、十一台机器 —— 本仓库在 500 到 32 000 token 之间所有 chart-grade 的预填充阶梯。自七月起每场 campaign 都在 decode 旁边记了 prefill,却从没画过。颜色和线型沿用图 1。
T(S) = a + b·S + c·S² —— b 是算力,c 是 attention
随长度恶化得多快。悬停可看该条线拟合出的这一对系数。gemma-4-31B 和
Qwen3.8-27B 两条线最初测于 2026-08-29,当时两张卡中的一张训练在
PCIe 3.0 x8 而非 x16 —— 宿主机的开机日志记录了这个变化;客户机看不到,因为它的
sysfs 报的是卡内桥的链路。一次重启把宽度恢复了,两组在同一个容器、同样的 serve
参数下重新跑了一遍:31B 的 b 从 868.7 降到 722.6,Qwen3.8 从 846.2 降到
758.5。画出来的就是这两次。图 1 里这两个模型仍是 2026-08-29 的解码 —— 同一套配置,
而链路对解码最多只动 1%。其余五条 Radeon 线是 2026-08-24 的,在 x16 上。TRITON_ATTN 上 —— 本仓库直到 2026-08-30 都称之为「免费」——
在 32 K 处 decode 快 1.15×,prefill 却亏掉 1.45×。TILE_PREFILL 减半 —— 那正是本图所分解的二次项。所以它的 c 是这张
卡换了内核之后的结果,默认关着、也被排除在上面那组比值之外。它的 b 同样没被自己的
阶梯确定住:32 K 那一档来自第二台 VM,两台在那一档相差 4.61 %,换成由哪一台提供,
b 会动 29.9 %。这条曲线二次项主导的程度是这里独一份的 —— 32 K 处 224 s 对
97 s —— 所以线性项把不确定性全吸收了,就像 a 在每条线上那样。直到 2026-09-03,这台机器上的每条阶梯都停在 32 000 token。这看似是硬件极限,其实限制来自
campaign:每组都把 max_model_len 设成了 33 000,而它的 KV 池容量足有好几倍。下面两张图
把同样的两个问题延伸到了 128 000。主角是这一对卡,跑着当天专门为它裁出的一条阶梯;同一天租用的机器作为背景,
点一下就能叠上来。
图 3. 批量 1 的解码速率对上下文长度,500 到 128 000,横轴取对数。默认视图是
2× RX 7900 XT、张量并行 2,跑 2026-09-03 那条阶梯 —— 这台机器上第一批超过 32 000 的行 ——
其中 Qwen3.8-27B 按图 1 的规则来画:取它实测最快的那个配置,而不是那次 campaign 的栈。
图上方的开关换成一个模型在当天租用的每台机器上。控件和图 1 一样。
TRITON_ATTN 和 vLLM 0.27.1 上的表现,
所以它们是同一个配置相隔一周的两次坐席,一次在收窄的 PCIe 链路上、一次在恢复之后。
在共有的十一档上最差只差 1.78 % —— 当除了坐席之外什么都不变时,跨坐席对照
就该是这个样子。原先画在这里的那条 0.23.1 阶梯不在了。它没有被撤销:它在
campaign-2026-09-03 里,而它和这几条线之间的差,正是
保留率百分比是由什么构成的那篇的主题。
它离开这张图,是因为同一份权重在那里 500 档解码 12.33 tok/s,在这里是
50.52,而首页画前一个数,等于在告诉读者一件关于这台机器、但已经不成立的事。
那条阶梯在 0.27 上越过 32 000 会是什么样,现在测了,一直到 128 000,
两种注意力后端都测:深度成本跨过那个版本从 0.350 降到 0.233 微秒每上下文
token,再加 --attention-backend TRITON_ATTN 降到 0.111——画在这里的
就是后面那条。图 4. 预填充吞吐对提示词长度到 128 000,画的是与图 3 相同的那些线。
T(S) = a + b·S + c·S² 在这里是对整条阶梯拟合的;图下的注记写明在这一对卡的每条线上,
c·S² 从哪一点起超过 b·S,以及它在最深一档里占多少。
十三篇,按卡片上的日期从新到旧。这一日期是该文证据最后一次在本机实测、 向上游上报或重新核对的日子。每个标题下方是该文最初的导语。 其下则是它所确立的内容,措辞与综述篇给它分类时的原话一致,两处不会对同一发现有不同表述。
文章标注的日期是取得证据的日期,而非撰写的日期。十三篇中有三篇落在七月最后一周,八篇落在八月最后一周,两篇落在九月。 机器本身是在 7 月 25、26、28 日和 8 月 1 日跑的,此后三周未再运行。第二批测量大多是在第一批条件有误的情况下重新实测。 横跨两个日期的条形,表示该文证据来自两轮分开的测量,而非期间一直在跑。
每篇文章都是一份有日期的记录,而非长期有效的建议。本仓库中最大的两项结论,
在测完之后便已发生了变化。某个 Ubuntu 内核回归已在 7.0.0-30 中修复;
而最初测出的 3.9× 到 5.6× 加载提速,也在严格控制 page cache 后被撤回。
因此,每篇文章均以「此后发生的变化」一节收尾,该节只往后追加,不回头改写。
每张图表都带有来源标记。可由仓库重算 表示
verify_doc_figures.py
会将该数值对照源文件核对,两者若不一致便以非零状态退出;守着仓库自身文档的也是这同一套检查。原始输出未入库
则表示该数字抄自一次原始输出未入库的运行,无法重算。
这里的绝对速率是下限,而非这套硬件的跑分。测试环境为一台 VFIO 客户机,两张卡之间没有 P2P, 走的是跨 die 的 PCIe 3.0 路径,这是刻意挑选的最不利拓扑。曲线形态可以迁移,绝对数值则是最坏情况。
源码、原始数据,以及产生它们的运行脚本: github.com/cadamcat/dual-radeon-vllm。 各篇文章均给出了上游报告与补丁的链接。