Henry Jia

96GB 的卡贵一倍,只快了两成

约 7 分钟显影AI

目录 · 10 节
  1. 先把边界划清楚
  2. 一、我原本以为 96GB 是必需的
  3. 二、给它 32GB,它就用 31.8GB
  4. 三、拆开那 19%:两张卡的带宽是一样的
  5. 四、真实状态下,连这两成也没有
  6. 五、钱账
  7. 六、一件我没料到的:换机器等于换片
  8. 七、那什么时候才该选大卡
  9. 八、顺带记几个我量错的数
  10. 最后

我在 AutoDL 上同时租着两台机器,一台 RTX 5090,32GB 显存,¥2.78/时;一台 RTX PRO 6000 Blackwell,96GB 显存,¥5.98/时。上面跑的是同一批视频模型,MiniMax H3 和 LTX-2.5。

每天开工前都要决定一次:视频这条线今天跑哪台。所以干脆量一遍。

两句话的结论:贵一倍的卡,在我的活儿上只快 19%,而它贵 115%。它多出来的那 64GB 显存只值其中的 7 个百分点,剩下 11 个点只是因为它核心多了一成。


先把边界划清楚

只测一件事:同一条片,两台机器各要多久、各花多少钱。不比画质,那需要盲测和人判,是另一回事。

全部是官方模板参数,提示词、画布、时长、步数、seed 全部锁死,两边逐条配对。每台的热跑各测 3 条、每条换 seed。换 seed 不是为了随机性,是为了避开 ComfyUI 的节点缓存——同提示词同 seed 会直接复用上一次的结果,采样器根本不执行。这个坑我在第八节交代。

出片档统一是 1344×768 / 15 秒 / 361 帧。


一、我原本以为 96GB 是必需的

第一次跑 LTX-2.5 是在那台 96GB 上。当时量到的峰值显存是 51907 MiB,约 50.7GB,远超 32GB。

我据此在文档里写死了一条判据:

峰值超过 32GB,这条线就只能留在 6000,别浪费时间在 5090 上试。

这条判据是错的,而且错在一个很容易犯的地方:那 50.7GB 是有 96GB 可用时它会用多少,不是它最少需要多少。给一个宽裕的分配器 96GB,它当然会把三个模型全驻留进去,这不等于它非要这么多。


二、给它 32GB,它就用 31.8GB

把同一套权重装到 5090 上,一次跑通,没有 OOM。

峰值显存 31432–31992 MiB,占 96–98%。ComfyUI 走的是 DynamicVRAM 分阶段装载,日志里明写着 Model LTXAV prepared for dynamic VRAM loading. 20484MB Staged。

装不下是错的。正确的说法是换出之后要付多少代价,而那是可以量的。

顺带说一句,97–98% 的显存占用不是快撑不住的信号,是 DynamicVRAM 吃满可用显存的正常形态。我在 H3 那台上也见过同样的数,四个档位全在 97–98%。


三、拆开那 19%:两张卡的带宽是一样的

同口径对照,两边都不挂加速库、同版本、同参数,每边 3 条热跑:

LTX-2.5 · 1344×768 · 15 秒 纯执行 峰值显存
RTX 5090 · 32GB 117.31 秒(3 条极差 0.9%) 96–98%
RTX PRO 6000 · 96GB 98.93 秒 45%

6000 快 1.186 倍。那这 18.6% 是从哪来的?查 NVIDIA 官方规格:

RTX 5090 RTX PRO 6000 Blackwell
CUDA 核心 21,760 24,064
显存带宽 1792 GB/s 1792 GB/s
显存 32GB 96GB

带宽完全相同,核心数差 10.6%。

扩散模型是 memory-bound 的活儿,带宽一样,吞吐本来就该差不多。于是核心多一成该快 10.6%,实测快 18.6%,相除,能归给不用换出的只有约 7%。

横向柱状图:租金贵 115%,速度只快 18.6%,而这 18.6% 里大部分来自核心数多一成,只有一小段来自不用换出

多付的那一条,是多得的那一条的六倍长

多花 115% 的钱,买到 7% 的性能。那 64GB 显存对这条线来说,是我唯一不缺的东西。

这个拆解不算严谨,两卡的频率、功耗墙我没控。它成立的前提是带宽相同这一条,而那是官方数。


四、真实状态下,连这两成也没有

上面那组是实验室口径,两边都关掉了 SageAttention,一个把注意力计算量化重写的加速库,因为那台 6000 当时没装。

但 5090 上它是常挂的。挂上之后:

LTX-2.5 · 15 秒 · 各自的真实状态 纯执行
RTX 5090(挂 Sage) 98.36 秒
RTX PRO 6000(没装) 98.93 秒

两台一样快,差 0.6%。

后来我们把 Sage 也装到了 6000 上,它又快回去了,H3 上 1.65×、LTX 上 1.33×。但这里有个有意思的规律:

Sage 的收益与显存紧张程度正相关。同一个 H3,在顶到 97–98% 显存的 5090 上值 2.35×,在只用了一半显存的 6000 上只值 1.65×。

因为 5090 那 2.35 倍里,混着显存紧张导致的频繁换出被一并缓解的部分;6000 本来就不怎么换出,只拿到了注意力那一份纯收益。

加速比不是模型的属性,是模型乘显存压力的联合属性。 别拿一台机器的倍数去估另一台,我干过,数字错了 43%。


五、钱账

把租金乘进去,1344×768 / 15 秒一条,各自挂上 Sage:

RTX 5090 ¥2.78/时 RTX PRO 6000 ¥5.98/时 差
LTX-2.5 98.36 秒,¥0.076 75.1 秒,¥0.125 5090 省 39%
MiniMax H3 847.99 秒,¥0.655 707.03 秒,¥1.17 5090 省 44%

贵的那台确实更快,但每条片贵四成。要让 6000 划算,它得快过 2.15 倍;实测它快 1.19–1.33 倍,差得不是一点。


六、一件我没料到的:换机器等于换片

这条是顺手验出来的,但它比上面所有数字都更影响日常。

同一条提示词、同一块画布、同一个帧数、同一个 seed、都不挂 Sage、同一个 ComfyUI 版本,唯一的差别是机器。

硬切位置
RTX 5090 3.33 秒 · 10.46 秒
RTX PRO 6000 3.96 秒 · 10.83 秒

切点整整挪了 0.4–0.6 秒。两条片都在这儿,自己看:

RTX 5090 上出的那条,两刀切在 3.33 秒和 10.46 秒

同一个 seed、同一条提示词,换到 RTX PRO 6000,两刀挪到 3.96 秒和 10.83 秒

这不是像素级的噪声,是剪辑点变了。不同 GPU 的算子实现和归约顺序不同,浮点结果就有微小差异,而扩散过程会把它逐步放大,11 步之后,成了另一条片。

三个后果。便宜卡抽卡、贵卡定稿这条路不成立,你在一台上抽到满意的那条,换机器用同 seed 抽不回来。更该锁定一台常驻,混用两台等于放弃可复现性。还有画质判断不能跨机搬运——我此前所有想发的判断都是在 6000 上做的,所以我在 5090 上重新出了一条,重新判了一次。判词还是想发。


七、那什么时候才该选大卡

我的结论只对我这条线成立。要反过来选 96GB,我能想到三种情况。

模型压根装不下 32GB,这是唯一硬的理由,不是快慢问题,是能不能跑。

要跑更长的片。我测到 41 秒仍然跑得动,但真正的天花板不是显存,是主机内存:41 秒那条把容器内存顶到 77.4 / 90 GiB。装不下的权重全压在 CPU 内存上,那才是先撑不住的地方。

要同时跑多条。96GB 能让几套权重同时驻留,32GB 只能排队换进换出。

还有一条我没测:两个模型挤同一台 5090 时的相互影响。它们共用一个 ComfyUI,同一时刻只能跑一个。


八、顺带记几个我量错的数

这一天里我报出过好几个错数字,全都不报错、全都看起来很合理。

第一个是节点缓存让热跑报出假数。同提示词同 seed 重跑,ComfyUI 直接复用上一次的节点输出,采样器根本不执行。我第一次量到 30.62 秒,比小画布的 43.89 秒还快,而它像素多了 2.77 倍。

更大的画布反而更快,这就是数据在报警。查 /history 的 execution_cached 才看清:32 个节点吃的是缓存。照报出去,就会得出快 27 倍这种错得离谱的结论。

规矩因此是:凡热跑计时,必须换 seed,并回读 execution_cached 确认没吃到缓存。

第二个是我为此定的判据也错了。我按缓存节点数超过 N 就作废来判,热跑报 22 个缓存节点,看着像脏数据;逐个查下来全是加载器、文本编码、空 latent,两个采样器、上采样、解码、存片一个都没被缓存。判据应该是关键节点在不在缓存列表里,不是数个数。

第三个是把多个模型串在一个进程里测单模型基线。我一口气跑了五组,结果某个图片模型报出峰值显存比基线高 5.5GB,看着像大退化;重起进程单独跑,回到基线的 +2.9%。那 5.5GB 全是别的模型的残留。而且 nvidia-smi 读的是整卡占用,不是被测模型的占用,进程里还压着别人的权重时,这个数根本不归被测者。所以每一组基线之前都得重起服务。

第四个是跨机器折算加速比。我拿 5090 上的 2.35× 去估 6000 装 Sage 之后的表现,算出每条 ¥0.82,实测是 ¥1.17,乐观了 43%。结论方向侥幸对了,数字错了。

第五个不是量错,是为省钱手动干预反而更贵。中途我掐掉了一条冗余任务想省 ¥0.6,结果轮询脚本只判 completed,而被中断的任务是 error 加 completed=False,它死等了十几分钟,GPU 全程空转,把后面整批都堵住了。

冗余数据的成本是确定的,动手干预的风险是不确定的。这笔交换不划算。


最后

这篇里唯一值得带走的一句:看规格表的时候,先看带宽。

同一颗芯片、同样的带宽、核心数差一成,那两张卡在 memory-bound 的活儿上本来就该差不多。多出来的显存买的不是速度,是装得下和不用换出。

如果你本来就装得下,那 64GB 就是你唯一不缺的东西。