速度、成本、画质的并排对照。每个数字都标了来源等级——这个项目最贵的几次错误都是把建模常数当成实测值读,所以哪些是量出来的、哪些是算出来的,写在数字旁边。
timings.inference 约 2.5 秒。我们用自己的 prompt 调他们的 API,他们自己的仪表返回的是 2.823–3.05 秒,均值 2.89 秒(n=8),比宣传慢 16%。这一节存在,是因为这份报告是在三次换框架之后长出来的:先把所有东西在 1 卡上测完,然后发现1 卡会系统性地错估每一个杠杆而改到 8 卡,再然后发现 sglang 0.5.18 把启动和单片都砍了一半。三种配置的数字曾经混在一页上、无法分辨来源。下表把每个结论钉回它的配置。
| 测的是什么 | GPU | sglang | 画布 | 有片段 | 结果 |
|---|---|---|---|---|---|
| 对 fal 的速度对照 | 8× B200 | 0.5.18 | 1344×768 | 是 | 2.87 s,对 fal 2.89 s |
| 低分辨率速度 | 8× B200 | 0.5.18 + 补丁 | 896×512 | 是 | 1.43 s,比 fal 快 2.02× |
| 步数 4 vs 8 | 8× B200 | 0.5.18 | 两种画布 | 否 | 768p 2.87 / 4.36 s |
| 版本 0.5.17 vs 0.5.18 | 8× B200 与 1× B200 | 两者 | 1344×768 | 部分 | 8 卡 1.66×,1 卡无效 |
| 冷启动 | 8× B200 | 两者 | — | 不适用 | 508.5 → 242.5 s |
| 分阶段拆解 | 1× B200 与 8× B200 | 两者 | 1344×768 | 不适用 | 解码在 8 卡 0.5.18 上分片了 |
| GPU 数对画面的影响 | 1× 与 8× B200 | 0.5.17 | 1344×768 | 是 | 编码大小差 0.07–2.1% |
| LoRA:现役 vs lightx2v | 1× B200 | 0.5.17 | 1344×768 | 是 | 仅画质轴,速度无关 |
| flow_shift 三档 | 1× B200 | 0.5.17 | 1344×768 | 是 | 仅画质轴 |
| ref2va 人物参考 | 1× B200 | 0.5.17 | 1344×768 | 是 | 355.7 → 25.7 s/片 |
| 首帧条件(fl2va) | 1× B200 | 0.5.17 | 1344×768 | 是 | 1.147×,n=1 |
| 时长 4s vs 15s | 1× B200 | 0.5.17 | 1344×768 | 否 | duration^1.59 |
| fal 对照臂 | fal 自有硬件 | 不适用 | 768p | 是 | 2.890 s,n=8 |
同一个 prompt、同一个种子、同一张首帧。每一行是一个场景,每一列是一条臂。ref2va 的对手不是 H3 Max —— 查 fal 自己的模型库 API 确认:minimax/h3/reference-to-video 存在,但 H3 Max 只有 text-to-video 和 image-to-video 两个端点。所以那一格要和 fal 的基座 H3 比,而那反而是这份报告里唯一一个双方模型完全相同的比较 —— 差的纯粹是工程。






只有这张表里的臂是可比的 —— 同 prompt、同种子、同输出规格(ffprobe 核实:两边都是 1344×768 / 24fps / 124 帧 / AAC 立体声 32kHz)。我们这边是 8×B200 · sglang 0.5.18,也就是速度表里那个 2.87 秒的配置。
| 场景 | fal-t2vfal H3 Max 文生视频 —— 他们的后训练模型、他们的硬件、1344×768 | win768-evals4★ 头条配置 · 文生视频:8×B200 · sglang 0.5.18 · 1344×768 · 4 次去噪 · 服务端 2.87s | fal-i2vfal H3 Max 图生视频 —— 与我们 fl2va 各臂同一张首帧 | win768-fl2va-evals4★ 头条配置 · 图生视频:同上,加首帧条件 —— 对齐 fal 的 i2v | win512-evals4★ 低分辨率:8×B200 · 0.5.18 + 短边补丁 · 896×512 · 4 次去噪 · 服务端 1.43s |
|---|---|---|---|---|---|
| ambiencea still frame where the SOUND carries the clip — H3's joint audio is the point | |||||
| cameraa sustained camera move — temporal coherence | |||||
| hosta recurring virtual presenter — identity consistency is what a hosted channel lives on | |||||
| motionfast multi-subject motion — reportedly the first thing few-step distillation smears |
两边都是 MiniMax 的开源基座权重(H3 Max 没有 reference-to-video 端点,查 fal 模型库 API 确认)。输出规格相同(1344×768 / 124 帧)。但采样档几乎肯定不同:我们跑 4 次去噪加 turbo LoRA,服务端 4.93 秒;fal 墙钟 140–194 秒,且其基座端点不返回 timings,所以只有墙钟可比。这不是纯工程对照,而是同一套权重下「4.93 秒」对「约 3 分钟」买到了什么。
| 场景 | fal-base-r2vfal 的<b>基座</b> H3 参考生视频(H3 Max 没有这个端点)。同样输出 1344×768/124帧,但墙钟 140–194 秒 —— 大概率跑的是官方完整采样档,不是我们的 4 次去噪 | win768-ref2va我们的人物参考:8×B200 · 0.5.18 · ref2v turbo LoRA · 4 次去噪 · 服务端 4.93s | ref2va人物参考 —— 同一角色进不同场景。对手是 fal 的<b>基座</b> H3 r2v,不是 H3 Max(Max 没有这个端点) |
|---|---|---|---|
| ambiencea still frame where the SOUND carries the clip — H3's joint audio is the point | 25.65s 端到端 | ||
| cameraa sustained camera move — temporal coherence | 25.66s 端到端 | ||
| hosta recurring virtual presenter — identity consistency is what a hosted channel lives on | 25.79s 端到端 | ||
| motionfast multi-subject motion — reportedly the first thing few-step distillation smears | 25.64s 端到端 |
这些臂只改一个变量,用来判断画质。不要拿它们的耗时和上表比 —— 配置不同。在 1 卡上判断画质是合理的:同请求在 1 卡和 8 卡之间画面只差 0.07–2.1%(浮点归约顺序)。
| 场景 | basewhat we ship: larryvrh v4_step600_ema, 8 denoiser evaluations, default flow shifts | evals4same, 4 evaluations — the speed knob | shift12-34 evaluations with SGLang's benchmark shifts (video 12.0 / audio 3.0) | shift6-34 evaluations with LightX2V's 4-step shifts (video 6.0 / audio 3.0) | lightx2v-t2vaa different distillation: 208 modules, no AdaLN coverage, 4 evaluations | fl2vafirst frame conditioned; the counterpart to fal's image-to-video | fl2va-evals4first frame conditioned at 4 evaluations | lightx2v-fl2vasame distillation, first frame conditioned | ref2va人物参考 —— 同一角色进不同场景。对手是 fal 的<b>基座</b> H3 r2v,不是 H3 Max(Max 没有这个端点) |
|---|---|---|---|---|---|---|---|---|---|
| ambiencea still frame where the SOUND carries the clip — H3's joint audio is the point | 8.09s 端到端 | 6.63s 端到端 | 15.59s 端到端 | 15.60s 端到端 | 17.82s 端到端 | 29.18s 端到端 | 17.10s 端到端 | 18.33s 端到端 | 25.65s 端到端 |
| cameraa sustained camera move — temporal coherence | 7.58s 端到端 | 5.62s 端到端 | 15.59s 端到端 | 15.60s 端到端 | 17.30s 端到端 | 29.19s 端到端 | 17.10s 端到端 | 18.33s 端到端 | 25.66s 端到端 |
| hosta recurring virtual presenter — identity consistency is what a hosted channel lives on | 68.28s 端到端 | 26.51s 端到端 | 15.58s 端到端 | 15.60s 端到端 | 45.22s 端到端 | 29.20s 端到端 | 17.10s 端到端 | 18.93s 端到端 | 25.79s 端到端 |
| motionfast multi-subject motion — reportedly the first thing few-step distillation smears | 7.60s 端到端 | 5.61s 端到端 | 15.59s 端到端 | 15.60s 端到端 | 17.31s 端到端 | 29.16s 端到端 | 17.10s 端到端 | 18.34s 端到端 | 25.64s 端到端 |
左边 1 卡、右边 8 卡,两者都是 sglang 0.5.17。用来检验「画面不随 GPU 数改变」这句断言。
| 场景 | basewhat we ship: larryvrh v4_step600_ema, 8 denoiser evaluations, default flow shifts | 8gpu-base与 base 完全相同的请求,只是渲染在 8×B200 上(sglang 0.5.17) | evals4same, 4 evaluations — the speed knob | 8gpu-evals4与 evals4 完全相同的请求,8×B200,sglang 0.5.17 |
|---|---|---|---|---|
| ambiencea still frame where the SOUND carries the clip — H3's joint audio is the point | 8.09s 端到端 | 6.63s 端到端 | ||
| cameraa sustained camera move — temporal coherence | 7.58s 端到端 | 5.62s 端到端 | ||
| hosta recurring virtual presenter — identity consistency is what a hosted channel lives on | 68.28s 端到端 | 26.51s 端到端 | ||
| motionfast multi-subject motion — reportedly the first thing few-step distillation smears | 7.60s 端到端 | 5.61s 端到端 |
同场景同 prompt 同种子。fal 的列是他们自己的仪表返回的 timings.inference;我们的列是围绕同一个请求的秒表。两者口径不同,所以分开列而不是硬凑成一个比值——fal 的端到端还要加上排队和传输,我们的还要减去 HTTP 轮询。
| 场景 | 臂 | 模式 | 去噪次数 | 耗时 | 口径 |
|---|---|---|---|---|---|
| ambience | base | t2va | 8 | 8.09s | measured 我们 1×B200 端到端 |
| ambience | evals4 | t2va | 4 | 6.63s | measured 我们 1×B200 端到端 |
| ambience | fl2va | fl2va | 8 | 29.18s | measured 我们 1×B200 端到端 |
| ambience | fl2va-evals4 | fl2va | 4 | 17.10s | measured 我们 1×B200 端到端 |
| ambience | shift12-3 | t2va | 4 | 15.59s | measured 我们 1×B200 端到端 |
| ambience | shift6-3 | t2va | 4 | 15.60s | measured 我们 1×B200 端到端 |
| ambience | lightx2v-t2va | t2va | 4 | 17.82s | measured 我们 1×B200 端到端 |
| ambience | lightx2v-fl2va | fl2va | 4 | 18.33s | measured 我们 1×B200 端到端 |
| ambience | ref2va | ref2va | 4 | 25.65s | measured 我们 1×B200 端到端 |
| camera | base | t2va | 8 | 7.58s | measured 我们 1×B200 端到端 |
| camera | evals4 | t2va | 4 | 5.62s | measured 我们 1×B200 端到端 |
| camera | fl2va | fl2va | 8 | 29.19s | measured 我们 1×B200 端到端 |
| camera | fl2va-evals4 | fl2va | 4 | 17.10s | measured 我们 1×B200 端到端 |
| camera | shift12-3 | t2va | 4 | 15.59s | measured 我们 1×B200 端到端 |
| camera | shift6-3 | t2va | 4 | 15.60s | measured 我们 1×B200 端到端 |
| camera | lightx2v-t2va | t2va | 4 | 17.30s | measured 我们 1×B200 端到端 |
| camera | lightx2v-fl2va | fl2va | 4 | 18.33s | measured 我们 1×B200 端到端 |
| camera | ref2va | ref2va | 4 | 25.66s | measured 我们 1×B200 端到端 |
| host | base | t2va | 8 | 68.28s | measured 我们 1×B200 端到端 |
| host | evals4 | t2va | 4 | 26.51s | measured 我们 1×B200 端到端 |
| host | fl2va | fl2va | 8 | 29.20s | measured 我们 1×B200 端到端 |
| host | fl2va-evals4 | fl2va | 4 | 17.10s | measured 我们 1×B200 端到端 |
| host | shift12-3 | t2va | 4 | 15.58s | measured 我们 1×B200 端到端 |
| host | shift6-3 | t2va | 4 | 15.60s | measured 我们 1×B200 端到端 |
| host | lightx2v-t2va | t2va | 4 | 45.22s | measured 我们 1×B200 端到端 |
| host | lightx2v-fl2va | fl2va | 4 | 18.93s | measured 我们 1×B200 端到端 |
| host | ref2va | ref2va | 4 | 25.79s | measured 我们 1×B200 端到端 |
| motion | base | t2va | 8 | 7.60s | measured 我们 1×B200 端到端 |
| motion | evals4 | t2va | 4 | 5.61s | measured 我们 1×B200 端到端 |
| motion | fl2va | fl2va | 8 | 29.16s | measured 我们 1×B200 端到端 |
| motion | fl2va-evals4 | fl2va | 4 | 17.10s | measured 我们 1×B200 端到端 |
| motion | shift12-3 | t2va | 4 | 15.59s | measured 我们 1×B200 端到端 |
| motion | shift6-3 | t2va | 4 | 15.60s | measured 我们 1×B200 端到端 |
| motion | lightx2v-t2va | t2va | 4 | 17.31s | measured 我们 1×B200 端到端 |
| motion | lightx2v-fl2va | fl2va | 4 | 18.34s | measured 我们 1×B200 端到端 |
| motion | ref2va | ref2va | 4 | 25.64s | measured 我们 1×B200 端到端 |
MiniMaxH3TextEncodingStage 全是缓存命中——实测新 prompt 要 4.64s,缓存命中只要 0.05s。表里多数格子是 15.6s 左右,而同配置新 prompt 的实测是 19.94s。直播每个片段的 prompt 都不同,所以成本要按后者算。这一条是我们自己第一版基准里的缺陷,发现后才补上的。把 pin 从 0.5.17 抬到 0.5.18,8 卡上快了 1.66 倍、冷启动快了 2.1 倍。但 1 卡上没有任何收益——而那个「没有收益」正是解释机制的对照组。
| 阶段 | 0.5.17 | 0.5.18 | 读法 |
|---|---|---|---|
| VAE 解码 · 1 卡 | 3.46s | 3.09s | 基本没变 — 1 卡没有东西可分 |
| VAE 解码 · 8 卡 | ~3.5s(推断) | 0.275s | 解码开始分片了 — 这就是全部收益的来源 |
| 整片服务端 · 1 卡 | 15.08s | 15.88s | 略慢,在噪声内 |
| 整片服务端 · 8 卡(768p,4 次) | 4.77s | 2.87s | 1.66× |
| 8 卡冷启动 | 508.5s | 242.5s | 2.1× |
这一节存在,是因为报告早期版本里有一句未经验证的断言:「画面不随 GPU 数改变,Ulysses 分的是同一份算术」。它被用来正当化「速度数字取自 8 卡、画面取自 1 卡」。Ulysses 的 all-to-all 改变了 attention 内部的浮点归约顺序,所以逐位相同本来就不该期待。下面是同请求、同种子、只改 GPU 数的实测。
| 片段 | 1 卡字节 | 8 卡字节 | 差 |
|---|---|---|---|
| base.host | 469,505 | 463,265 | -1.33% |
| base.motion | 1,190,287 | 1,178,260 | -1.01% |
| base.ambience | 459,804 | 452,238 | -1.65% |
| base.camera | 1,202,160 | 1,220,459 | +1.52% |
| evals4.host | 411,760 | 410,449 | -0.32% |
| evals4.motion | 1,107,803 | 1,095,019 | -1.15% |
| evals4.ambience | 356,517 | 349,028 | -2.10% |
| evals4.camera | 1,123,759 | 1,124,511 | +0.07% |
base 对 8gpu-base),由人眼判断,而不是由我替你断言。| 臂 | 1 卡 | 8 卡 | 加速 | 并行效率 |
|---|---|---|---|---|
| evals4(4 次去噪) | 15.59s | 5.83s | 2.67× | 33% |
| base(8 次去噪) | 26.64s | 7.76s | 3.43× | 43% |
H3 的镜头语法是 MiniMax 官方文档的,不是社区约定。base guide 4.2:“Do not add a timestamp to the first shot. Use sequential shot numbers for later shots, and begin each one with a strictly increasing cut time that falls within the video duration”,ref guide 5.1 把格式钉成 [Shot N] At MM:SS.mmm,。下面这个 prompt 用了四个镜头,切点 00:04.000 / 00:08.000 / 00:11.500,两个角色各自绑定自己的参考图,同一个 prompt 跑三个时长。ffprobe 核实全部是 1344×768 / 24fps / AAC 立体声 32kHz。
| 时长 | 片段 | 服务端 | 计算/视频秒 | $/视频秒 |
|---|---|---|---|---|
| 10s | 12.24s | 1.224 | $0.0170 | |
| 15s | 18.02s | 1.201 | $0.0167 | |
| 5s | 7.26s | 1.452 | $0.0202 |
duration^1.59,即长片段每秒更贵。在 8 卡 · 0.5.18 上:t2va 是 duration^1.207(长片段每秒贵 26%),而 ref2va 是 duration^0.828(长片段每秒便宜 17%)。原因:attention 对序列长度是二次的,而 Ulysses 切的正是序列维,二次项被摊掉;ref2va 还额外有编码参考图的固定成本,片段越长摊得越薄。所以有固定角色的频道应该用 15 秒多镜头长片段 —— 切镜在片段内免费,没有接缝,而且每秒更便宜。SGLang 默认只打印九个 pipeline 阶段里的两个,所以最初的 8 卡测量留下 3.5 秒「测到了但没归属」。把日志级别打开之后:
| 阶段 | 1× B200 | 8× B200 | 被 Ulysses 分片? | 来源 |
|---|---|---|---|---|
| 文本编码(新 prompt) | 4.64s | 部分折叠 | 部分 | measured |
| 文本编码(prompt 重复) | 0.05s | — | 缓存命中,不代表直播 | measured |
| 去噪 | 7.10s | 1.23s | 是,很好 | measured |
| VAE 解码 | 3.46s | ≈3.5s | 完全不能 | measured |
| 配置 | 5 秒 768p 耗时 | 实时倍数 | 来源 |
|---|---|---|---|
| 我们 1× B200,4 次去噪,新 prompt | 19.94s | 0.25× | measured |
| 我们 8× B200 Ulysses8,4 次去噪 | 4.77s | 1.06× | measured |
| 我们 8× B200,8 次去噪 | 6.19s | 0.81× | measured |
| fal H3 Max(他们的仪表) | 2.89s | 1.74× | vendor |
| fal 宣传值 | 2.50s | 2.02× | published |
| 配置 | GPU-秒/片 | $/片 | 比 fal 便宜 |
|---|---|---|---|
| 我们 1× B200(新 prompt) | 19.9 | $0.0346 | 11.6× |
| 我们 8× B200 | 38.2 | $0.0662 | 6.1× |
| fal H3 Max | — | $0.4032 | 1.0× |
上表只算 GPU 那一行。这几项核对过 Modal 的定价页,并用我们自己的账单账本交叉验证:
| 项 | 影响 | 说明 | 来源 |
|---|---|---|---|
| CPU + 内存 | +1.81% | GPU 之外单独计费。实测取自本月我们自己 B200 运行的账单行,区间 0.65%–3.19%。单片 $0.0346 → $0.0353,对 fal 的优势 11.65× → 11.44× | measured |
| 不存在 | 这一行是我们写错的,已实测更正。Modal 的 nonpreemptible=True 对 GPU 函数直接拒绝:Non-preemptible is not supported for GPU workloads。三路对照(仅 deploy,0 GPU-秒)确认:带 GPU 被拒、纯 CPU 接受并警告 3× 计费、纯 GPU 无该参数接受。所以 3× 只适用于 CPU 和内存,GPU 直播花再多钱也买不到不被抢占——只能靠架构冗余 | measured | |
| 指定区域 | ×1.5–1.75 | 与上一项不叠加时的另一档 | published |
| Volume 存储 | $0.09/GiB/月 | 1 TiB 免费额度以上。本工作区本月实付 $200.72 | published |
| 8 卡冷启动 | $7.03/次 | 8 × 506.2 秒 × 费率,约等于 17 个 fal 片段的钱 | derived |
直播的门槛不是延迟,是 RTF(real time factor)= 片长 ÷ 生成耗时。RTF 必须 > 1.0,否则缓冲会被慢慢耗干,一小时后就断流。本节的每个数字都是 ref2va + 两张人物参考图 + 15 秒片段,也就是要上线的那个形态。
| 卡数 | 512 / 15s | RTF | 512 / 5s | RTF | 768 / 15s | RTF |
|---|---|---|---|---|---|---|
| 2 | 26.4s | 0.57 | 13.6s | 0.37 | 63.9s | 0.235 |
| 4 | 18.1s | 0.83 | 10.3s | 0.485 | 36.3s | 0.413 |
| 8 | 9.26s | 1.62 | — | — | 18.51s | 0.81 |
同一台 4 卡机器、同一次测量、768p / 5 秒:
| 阶段 | t2va | ref2video | 倍数 |
|---|---|---|---|
| 文本编码 | 0.064s | 2.027s | 31.6× |
| 视觉编码 | 0.000s | 0.745s | 新增 |
| denoise | 2.293s | 6.047s | 2.64× |
| VAE decode | 0.815s | 0.887s | 1.09× |
| wall | 4.71s | 14.60s | 3.10× |
4 卡 · 512 · 15 秒,每档 3 次,每个 arm 只改一个变量:
| arm | 改动 | wall | RTF | vs baseline |
|---|---|---|---|---|
baseline | 2 张原图 + 439 词 | 16.11s | 0.93 ✗ | — |
one_ref | 只用 1 张参考图 | 11.58s | 1.295 ✓ | −28% |
small_refs | 2 张缩到短边 448 | 15.97s | 0.939 ✗ | −0.9% |
short_txt | prompt 缩到 ~80 词 | 16.00s | 0.937 ✗ | −0.7% |
MINIMAX_H3_REFERENCE_IMAGE_SHORT_EDGE = 2048:每张参考图都被强制上采样到 2048 短边,与目标画布无关、与原图大小无关。1024×576 和 796×448 都解析到同一张 3648×2048 画布,所以两个 arm 在跑同一件事。每张参考图进 DiT 两次——7,296 个 VAE latent row,加上 7,296 个 <|image_pad|> vision token 拼进 prompt,共 14,592 token。对照目标序列(896×512 / 15 秒 = 47,936 video row + 1,200 audio row),一张参考图就占序列的 22.7%。而我们喂的是 576 高的图,被上采样出来的像素原图里根本不存在。
| 阶段(4 卡 · 512 · 15s · 双角色) | 参考图短边 2048 | 参考图短边 576 | 变化 |
|---|---|---|---|
| 文本编码 | 1.692s | 0.106s | −94% |
| 视觉编码 | 0.724s | 0.057s | −92% |
| denoise | 8.129s | 3.841s | −53% |
| VAE decode | 1.452s | 1.406s | — |
| wall | 15.98s | 7.59s | −53% |
| RTF | 0.939 ✗ | 1.98 ✓ | 2.1× |
全部为 ref2video · 两个人物参考图 · 15 秒片段 · 896×512 画布 · 同一 DRAMA prompt。「工作成本」是产出一小时视频消耗的 GPU 秒折算;「常驻成本」是容器不间断运行一小时的账单——RTF 超过 1 的部分是空转,照样计费。
| 卡数 | 参考图短边 | 去噪步数 | AdaLN | 其他 | wall | RTF | GPU-s/视频秒 | 工作成本 $/hr | 常驻 $/hr | 备注 |
|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 2048 | 4 | — | — | 26.40s | 0.57 ✗ | 3.52 | $22.0 | $12.5 | stock |
| 2 | 576 | 4 | on | — | 16.20s | 0.93 ✗ | 2.16 | $13.5 | $12.5 | |
| 2 | 576 | 3 | on | — | 11.95s | 1.26 ✓ | 1.59 | $10.0 | $12.5 | |
| 2 | 576 | 3 | on | on | 11.28s | 1.33 ✓ | 1.50 | $9.4 | $12.5 | cache-dit 的 5.5% 未达显著 |
| 4 | 2048 | 4 | — | — | 15.98s | 0.94 ✗ | 4.26 | $26.6 | $25.0 | stock |
| 4 | 2048 | 4 | on | — | 15.40s | 0.97 ✗ | 4.11 | $25.7 | $25.0 | |
| 4 | 576 | 4 | — | — | 7.59s | 1.98 ✓ | 2.02 | $12.6 | $25.0 | |
| 8 | 2048 | 4 | — | — | 9.26s | 1.62 ✓ | 4.94 | $30.9 | $50.0 | stock |
| 2 | 576 | 4 | — | fp8 | 14.10s | 1.06 ✓ | 1.88 | $11.7 | $12.5 | fp8 量化,画质无可见损失 |
| 4 | 576 | 4 | — | fp8 | 7.38s | 2.03 ✓ | 1.97 | $12.3 | $25.0 | fp8,余量 103% |
| 配置(双角色 · 512 · 15s · 全优化) | wall | RTF | GPU-s / 视频秒 |
|---|---|---|---|
| 2 卡 · 优化前 | 26.4s | 0.57 ✗ | 3.51 |
| 2 卡 · 全优化 | 16.2s | 0.93 ✗ | 2.16 |
| 4 卡 · 全优化 | 7.59s | 1.98 ✓ | 2.02 |
| 8 卡 · 优化前 | 9.26s | 1.62 ✓ | 4.94 |
--minimax-h3-adaln-online · 参考图短边 576。 RTF 1.98,双角色,2.02 GPU-s/视频秒——比最初的 8 卡方案便宜 2.4 倍,而且余量足够一个容器跑两条流。2 卡差 7%,而 2×2 卡并不比 1×4 卡便宜,所以没有理由选它。同一 2 卡容器、同一 seed(20260830)、同一 prompt、同一画布,只有两个变量在动。左列是 sglang 原生的 2048 参考图,右列是 patch 后的 576;上排 4 步去噪,下排 3 步。右下角就是最便宜的那个配置——它比左上角快 2.5 倍、便宜一半,代价就在这四格的对比里。
| 参考图 2048(原生) | 参考图 576(patch) | |
|---|---|---|
| 4 步去噪 | baseline.refedge2048.512.15s.g2.e4.adaln.mp4 |
baseline.refedge576.512.15s.g4.e4.fp8.mp4 |
| 3 步去噪 · 超出蒸馏区间 | baseline.refedge2048.512.15s.g2.e3.adaln.mp4 |
baseline.refedge576.512.15s.g2.e3.adaln.mp4 ★ 候选配置 |
Live-action, cinematic, handheld documentary style,而参考图本身是扁平 2D 卡通插画——生成它的 prompt 里写了 photorealistic,拿回来的却是卡通。四条片子都只是落在这条冲突线上的不同位置,更卡通的 3 步反而更接近参考图。所以「越写实越好」是错的判据。要真正的写实输出,得先换写实的参考图——那是比这里任何一个轴都大的杠杆。负面结果和正面结果一样值钱,而且更容易被重复踩。
| 结论 | 依据 | 来源 |
|---|---|---|
| 并发买不到任何东西,开 batching 反而更糟 | sglang 串行服务 H3:K=1,2,4,8 的吞吐是 0.324 / 0.337 / 0.346 / 0.348 clips/s,持平。把 --batching-max-size 提到 4 之后吞吐掉 41%、K=1 延迟涨 87%、启动涨 64%——dynamic admission 每个请求加约 2.2 s,而且完全不与 mp4 muxing 重叠。 | measured |
| B200 没有编码引擎,NVENC 这条路物理上不存在 | ffmpeg 列出 h264_nvenc 且 libnvidia-encode.so.1 在,但真实编码失败:OpenEncodeSessionEx failed: unsupported device。和 A100 一样。 | measured |
| mp4 的尾巴不是编码器的问题,调 x264 preset 无效 | ultrafast+zerolatency 让尾巴慢 70%(zerolatency 是延迟调优,砍掉帧级并行),单独 ultrafast 也没有改善。瓶颈是 Python 逐帧喂管道,不是压缩。 | measured |
| torch.compile 直接超过 15 分钟启动超时 | TORCHINDUCTOR_CACHE_DIR 指向容器文件系统,每个冷容器从零编译 33B DiT。只有把这个缓存持久化到 Volume 之后才可能可用。 | measured |
| H3 → LTX-2.5 级联在 sglang 里做不出来 | 请求 schema 里没有 v2v / strength 参数,ModelTaskType 连 V2V 都没有;video_path 对 LTX 是死字段;LTX2RefinementStage 存在但从请求无法触达。而且我们下载的 Lightricks/LTX-2.5 是裸 safetensors,sglang 只认 -Diffusers 布局。 | measured |
| 缩小参考图文件没用,因为 H3 会把它强制放大 | MINIMAX_H3_REFERENCE_IMAGE_SHORT_EDGE = 2048,上采样、无面积上限。1024×576 和 796×448 解析到同一张 3648×2048 画布,所以两个 arm 在跑同一件事。真正的杠杆是改那个常量,不是改输入文件。 | measured |
| AdaLN 缓存和 Cache-DiT 在少步数下都测不出收益 | --minimax-h3-adaln-online:10.67 vs 10.74 s,五次重复,差 0.65%。Cache-DiT 测到 5.5%,但那是跨容器比较而容器波动约 11%,落在噪声里。两者的原理都是跨步复用,而我们只有 3–4 步可跳。 | measured |
| --direct-gpu-weight-loading 没有可测量的收益 | 131.4 s,对比同配置的 133.3 / 136.3 s。flag 确实生效(RunAI streamer 的日志消失),时间没动。 | measured |
| Modal 上买不到非抢占式 GPU | GPU function 不支持该选项,任何价格都不行。 | published |
都是这个仓库自己写下过、后来被实测证伪的。列出来是因为下游的成本模型还引用着它们。
| 原假设 | 断言值 | 实测值 | 影响 |
|---|---|---|---|
| 固定开销 | 2.65s | 3.844s | 来自 4×H200 分片运行;单卡不分片,所有 4 步预测偏乐观 |
| 首帧条件倍数 | 2.711× | 1.147× / fal 自己 1.034× | 决定 1× 实时要 4 张卡还是 14 张卡 |
| 时长成本线性 | 线性 | duration^1.59 | 「用长片段减少接缝」反而贵 38% |
一份只列出「发现了什么」的报告,读起来会比它实际的完整度更完整。这里是明确的空白。
| 缺口 | 影响 | 说明 |
|---|---|---|
| 风格判据的基准是坏的 | 估计 | 参考图本身是扁平 2D 卡通插画——生成它的 prompt 写了 photorealistic,拿回来的是卡通——而 DRAMA 的 prompt 写的是 Live-action。两者冲突,所有输出都落在这条冲突线上,所以「哪个更写实」不是有效判据。换写实参考图是比本报告任何一个轴都大的杠杆,且未做。 |
| 从未生成过一个真实的直播片段 | 估计 | 所有数字都来自对空闲服务器的单次请求。缓冲、推流、段间衔接、抢占恢复,一行都没写。web/ 的房间能构建、能服务端渲染、类型检查干净,但从未真正生成过一段视频。 |
| 画质只看了抽帧,没看动态 | 推导 | 身份一致性和量化伪影是按 t=2s / t=8s 两帧判断的,结论是身份在所有配置下保留、fp8 无可见损失。运动连贯性、音画同步、口型,两帧答不了。 |
| 冷启动的 78% 没有插桩 | 推导 | sglang 记录的模型加载只占启动的 22%,其余在第一条日志之前或最后一个标记之后。同配置启动实测 120–295 s,波动就住在这段里,所以任何 n=1 的 flag 对比都是在读噪声。 |
全部可复现,命令在仓库里:
modal run -m src.lab::bench8 --steps 5,9 --durations 5 — 8 卡延迟modal run -m src.lab::bench --steps 5 --log-level debug — 分阶段拆解modal run -m src.samples::fal_reference — fal 对照臂modal run -m src.samples::our_matrix --variant current — 画面矩阵
每条臂同 prompt 同种子(20260829)。步数字段数的是含末尾零的 sigma 网格点,所以字段 5 = 4 次去噪求值,字段 9 = 8 次——这一点由进度条 0/4 和 8/8 直接确认。