先感谢论坛里各位的配置和踩坑帖,也感谢 Terry 的 YouTube 频道。跟着折腾了一阵子,终于把自己这台双 7900 XTX 从能跑弄到了能稳定跑完一整套测试。
我原本最担心的是外接卡:一张 7900 XTX 通过 M.2 转 OCuLink,链路是 PCIe 4.0 ×4;另一张插主板槽,目前是 PCIe 4.0 ×8。两卡还开不了 P2P。实际跑完以后,OCuLink 这张卡比我预想中好不少。双卡也有提升,主要体现在长 prompt 的 prefill 和专家缓存;生成速度则和单卡比较接近。
机器配置
- 整机:Lenovo Legion T7 34IAS10
- CPU:Intel Core Ultra 7 265K,20 核 20 线程
- 主板:Lenovo 3784 / Z890
- 内存:64GB DDR5-6000 CL36
- 系统:Ubuntu 24.04.4 LTS
- GPU:2 × Radeon RX 7900 XTX 24GB(gfx1100)
- GPU0:开源宇宙 M70 OCuLink 显卡坞,M.2 的 CPU 直连 PCIe 4.0 ×4
- GPU1:主板全长槽,当前协商为 PCIe 4.0 ×8
- Strata H2D probe:GPU0 约 6.2 GB/s,GPU1 约 13.4 GB/s
- 两卡无可用 P2P
主板这里还有个问题没解决:这是 PCIe 5.0 ×16 的物理槽,但插 7900 XTX 后目前协商到 PCIe 4.0 ×8。7900 XTX 本身支持 ×16,我猜可能和 BIOS、lane 分配或 bifurcation 有关,还在慢慢排查。如果有遇到同款机器或类似情况的朋友,也请指点一下。
怎么测的
模型是 Swift-Qwen3.8-Flash-Next IQ3_XXS,131,072 context、int8 KV。正式版用 Strata v0.1.38(commit 99f3dbd),HIP/ROCm 工具链显示 HIP 7.2,gfx1100 stock hipBLASLt tuning。参数保持 expert-cache auto、prefill auto、spec 4、spec-min-p 0.5。
测试部分按 4K、16K、32K、64K、128K 五档各跑三次,表里取中位数。另有一组严格固定为 4,096 / 32,768 / 128,000 token、固定输出 256 token,每项两次;两次样本的中位数也就是两者平均。
每次都是新 prompt,前缀复用为 0。不过专家缓存已经经过前面的测试预热,所以这里不是“冷专家缓存”成绩。decode 还会受生成内容和 MTP 接受率影响,波动比 prefill 大。
五档 speed:OCuLink、主板 ×8 和双卡
下面都是 prefill / decode,单位 token/s;每格为三次中位数。
| 上下文档位 | OCuLink GPU0 ×4 | 主板 GPU1 ×8 | 双卡 auto |
|---|---|---|---|
| 4K | 769 / 61 | 1,107 / 69 | 1,007 / 62 |
| 16K | 1,101 / 85 | 1,277 / 83 | 1,500 / 61 |
| 32K | 1,176 / 71 | 1,317 / 82 | 1,806 / 65 |
| 64K | 1,152 / 77 | 1,293 / 81 | 2,043 / 61 |
| 128K | 1,135 / 69 | 1,236 / 70 | 2,106 / 66 |
OCuLink 这张卡在 16K 到 128K 基本都能维持 1,100 t/s 左右的 prefill,decode 大致也是六七十。拿来聊天、写代码、读长文档,我自己的使用感受已经挺顺了。
这组数据并不是严格的 PCIe 控制变量测试。两张卡虽然同型号,但 GPU0 是 303W,GPU1 是 339W,实际频率、散热和显卡体质也可能不同,所以两卡的差距不一定都来自 ×4 和 ×8。这里主要是把 M70 外接卡在我当前配置下的实际表现分享出来。
固定 token 再对一次
这一组 prompt 长度完全相同,比较起来更直观。仍是 prefill / decode,单位 token/s。
| 配置 | 4,096 token | 32,768 token | 128,000 token |
|---|---|---|---|
| OCuLink GPU0 ×4 | 756 / 62 | 1,199 / 66 | 1,136 / 59 |
| 主板 GPU1 ×8 | 1,086 / 61 | 1,327 / 61 | 1,242 / 64 |
| 双卡 auto | 1,000 / 57 | 1,838 / 58 | 2,129 / 57 |
短 prompt 的差距最明显:4K 时 OCuLink GPU0 比 GPU1 慢不少。到了 128K,GPU0 是 1,136,GPU1 是 1,242,差距缩到约 9%。对应的 128,000 token 客户端 TTFT 是:GPU0 约 112.8 秒、GPU1 约 103.2 秒、双卡约 60.3 秒。
这也是我觉得 OCuLink 表现不错的主要原因:实测 H2D 带宽大约是主板卡的一半,但读入 128K prompt 时只多等约十秒,比我开始测试前的预期好一些。
双卡的提升在哪
Strata 的双卡不是 tensor parallel,也不做每层 all-reduce。自动切分这次把 48 层分为 GPU0 的 0–24 层和 GPU1 的 25–47 层。每个 verify window 在两段之间做一次 handoff;没有 P2P 时经过 pinned host memory,不走 RCCL/all-reduce。
从结果看,这台没有 P2P 的 AMD 双卡可以正常跑。decode 和单卡比较接近,提升主要出现在较长的 prefill:
- 4K prefill:双卡 1,000,略低于 GPU1 的 1,086。
- 32K prefill:双卡 1,838,对比 GPU1 的 1,327,约快 38%。
- 128K prefill:双卡 2,129,对比 GPU1 的 1,242,约快 71%。
- decode:双卡大致 57–66 t/s,和单卡同一档,有时还略慢。
专家缓存方面,单卡是 10,087 slots / 16,740 MiB,双卡是 22,375 slots / 36,840 MiB。双卡启动后系统内存使用约 50 GiB,除了 48GB 显存,主机内存也需要留出一定余量。
这里也说明一下测试范围:双卡只测了 GPU0,GPU1 + auto split,也就是 OCuLink 卡在前。这次还没跑反向顺序、手动 24/24 或其他不对称切法,因此表里的结果只是当前配置,并不代表这台机器能达到的最高成绩。
WMMA 也跑了
我还拿 RDNA3 WMMA PR #313 跑了同一套测试。下面只列 prefill,格式为 stable v0.1.38 / WMMA PR:
| 配置 | 4K | 16K | 32K | 64K | 128K |
|---|---|---|---|---|---|
| OCuLink GPU0 ×4 | 769 / 767 | 1,101 / 1,112 | 1,176 / 1,192 | 1,152 / 1,186 | 1,135 / 1,141 |
| 主板 GPU1 ×8 | 1,107 / 1,062 | 1,277 / 1,275 | 1,317 / 1,320 | 1,293 / 1,313 | 1,236 / 1,258 |
| 双卡 auto | 1,007 / 910 | 1,500 / 1,485 | 1,806 / 1,844 | 2,043 / 2,086 | 2,106 / 2,147 |
在我这台机器上,两边大部分差距只有几个百分点,WMMA 暂时没有表现出稳定优势;decode 也差不多。4K 这一档里,GPU1 和双卡的 WMMA 成绩还稍低一些。
这也不是严格的同版本 A/B:WMMA 分支基于 Strata 0.1.31,而正式版是 0.1.38,中间已经有其他改动。查了 Git 历史和 GitHub,RDNA3 WMMA 的 PR #313 目前仍是 Open,尚未合并进 v0.1.38。main 里现在能看到的是另一套面向 gfx12/RDNA4 的 WMMA 开关,并非这次 gfx1100 的 PR。
暂时先折腾到这里。现在日常我会用 GPU1 单卡,塞大仓库或长文档时再开双卡。OCuLink 这张卡比我原来预想的好用不少。至于主板那个 PCIe 5.0 ×16 槽为什么最后只协商到 4.0 ×8,我还在查 BIOS;如果有碰到过类似情况的坛友,也请指点一下。