SwiftVR 2× 视频超分 · RTX 5090 实测

官方权重 H-oliday/SwiftVR bf16 未量化 viggle_new_5090 · 8×RTX 5090 32G 2026-08-20

一步式生成式视频修复模型(Wan2.2-TI2V-5B 骨干)。本页全部数字来自 60+ 次实跑, 覆盖 5 种宽高比、10 种分辨率、6 档 clip_len。速度与显存估算器基于实测点拟合, 拟合公式和原始测量点都在下面列出,可自行核对。

1080p 稳态吞吐
29.2 fps
官方宣称 26 fps · 对得上
768p 16:9 → 2688×1536
13.4
5 秒视频 · 常驻单请求
显存峰值
22.1 GiB
32G 卡余量 9.3 GiB
相对官方默认配置
3.36×
5 秒片 44.96→13.37 s · 15 秒片 2.43×

速度与显存估算器

选输入分辨率和时长,给出常驻 worker 稳态下单请求耗时与显存峰值。 模型拟合自实测点(见下方「拟合依据」),对 0.9–4.2 Mpx 输出范围内的插值误差 < 1%。

输出分辨率
2688×1536
4.13 Mpx
处理帧数
121
截断到 4k+1
单请求耗时
13.4
实时倍率 0.37×
显存峰值
22.1 GiB
32G 卡余量 9.3 GiB
单卡 32G 可跑,余量充足。
8 卡吞吐
35.9 条/分
全部 8 卡各跑一路
首次请求(含编译)
+34
每进程只付一次

拟合依据(clip_len=4,常驻,稳态取第 2–4 次请求均值)

宽高比输入输出 2×Mpx 单线程 秒多线程 秒单线程 GiB多线程 GiB

耗时 = 1.246 + 0.7314×Mpx + 帧数 × Mpx ÷ 54.9 秒(单线程,最大残差 0.3%); 多线程 = 0.473 + 1.2551×Mpx + 帧数 × Mpx ÷ 48.9 秒(最大残差 10.8%, 线程调度抖动大,只作参考)。
显存 = 12.034 + 2.4418×Mpx GiB(单线程)/ 12.022 + 3.4083×Mpx GiB(多线程), 两条的最大残差都 < 0.01 GiB —— 显存是严格线性的,截距 12.03 GiB 就是 bf16 权重常驻部分,与分辨率无关。

以上为最小二乘拟合,4 个实测点 3 个参数。实测覆盖 2.36–4.13 Mpx,超出即为外推。

耗时与显存随输出像素的变化

两条线是同一批视频、同一份权重,只有驱动循环不同:官方 restore_video 的四线程流水线 vs 单线程顺序驱动(官方 Space 的 app.py 用的就是后者)。单线程又快又省

单线程 + compile 官方多线程 restore_video
单线程峰值 多线程峰值 bf16 权重常驻 12.03 GiB

clip_len 越小越快 —— 与官方 UI 的说明相反

官方 Space 滑块写的是「Larger = more context, slower」,容易让人以为大 chunk 质量更好。 实测四种宽高比全部是 clip_len 越小越快、越省显存,而且质量指标不降反升。 16:9 和 9:16 在 clip_len=24 直接 OOM。

1:1 1536×1536 4:3 2048×1536 16:9 2688×1536 9:16 1536×2688

纵轴是稳态 GPU 吞吐(剔除每条视频前两个 chunk 的固定开销)。测于官方多线程驱动、未开 compile。

质量并没有因为 chunk 变小而变差(16:9,取前 24 帧)

clip_len时间闪烁 ↓锐度(拉普拉斯方差)↑与 clip20 的平均差 /255
20(参考)5.309119.9
165.321121.81.42
125.304120.21.60
85.234121.41.89
44.947126.42.43

clip_len=4 闪烁最低、锐度最高。与 clip20 的差异约 1%(2.43/255),肉眼对比无可辨差别。

效果对比

1344×768 → 2688×1536,同一帧同一区域。左半 bicubic 放大,右半 SwiftVR。拖动分隔条。

SwiftVR 2× 放大结果(右半)
bicubic 2× 放大结果(左半)
BICUBIC 2×
SwiftVR 2×

眼睫毛、发丝、毛衣针织纹理、衬衫格纹差异最明显。未见振铃或结构幻觉。

视频对比:官方默认配置 vs 优化配置

同一条输入、同一份官方权重,只有运行配置不同。三路播放同步,可切换宽高比。 左边是输入 bicubic 放大到相同画布(不是模型输出,只作参照)。 素材为 FL2VA 生产产物。网页上这几条统一截取前 5 秒并重新编码(控制传输体积,细节略有损失)—— 实际跑的是完整时长,1:1 / 4:3 / 9:16 均为 10 秒 241 帧,16:9 另有 15 秒版本, 完整长度的三联对比包见页尾。

4× 放大:640×360 → 2560×1440

2× 之外 4× 也能跑。输出 3.69 Mpx,显存峰值 29.6 GiB,稳态 13.3 fps。 更极端的 854×480 → 3392×1920(6.51 Mpx)也跑通了,需把 clip_len 降到 8。

输入 bicubic 4× · 参照,非模型输出
SwiftVR 4× · clip_len=12 · 29.6 GiB

视频越长,优化幅度越小

提速倍数不是一个常数。每条视频有一笔固定的 warmup 开销(前两个 chunk), 官方默认配置的这笔开销更大;视频越长它被摊得越薄,官方一方吃的亏也就越小。 同一条 16:9 素材,5 秒和 15 秒的差别:

时长帧数官方默认优化后提速 官方 每帧 ms优化 每帧 ms
5 秒12144.96 s 13.37 s3.36× 371.6110.5
15 秒35777.00 s 31.67 s2.43× 215.788.7

两边的每帧成本都随时长下降,但官方那一列降得更多(371.6 → 215.7 ms,−42%), 优化后本来就没多少固定开销可摊(110.5 → 88.7 ms,−20%),所以倍数收窄。 15 秒这一档只跑了 2 次请求(5 秒那档是 4 次),置信度低一些; 同档的多线程 clip4+compile 是 29.98 s,与单线程的 31.67 s 落在噪声范围内没分出胜负 —— 单线程稳定领先的结论来自 5 秒那组 4 次请求的数据。

估算器的样本外验证

上面的估算公式是用 121 / 241 帧的实测点拟合的。15 秒这条 357 帧完全在拟合集之外, 正好拿来验证外推:

公式预测
31.1
1.246 + 0.7314×4.13 + 357×4.13÷54.9
实测
31.7
单线程 · clip_len=4 · compile
误差
−1.7%
3 倍时长外推仍然成立

分辨率与比例自适应

一个常驻实例连续吞 8 条视频、5 种宽高比、分辨率 640×360 → 768×1344,零配置改动全部成功。 内部自动 pad 到 32 的倍数再裁回。开 compile 时新形状不会每次重编译:第 3 个新形状起就和不编译一样快。

送入顺序输入输出 2×compile 开(秒)compile 关(秒)
1640×360 16:91280×72041.35 ← 首次编译7.57
2854×480 16:91696×96015.888.72
3960×544 16:91920×108810.2510.03
4768×768 1:11536×153614.2414.71
5768×1344 9:161536×268824.6826.00
6992×416 21:91984×8328.439.66
7640×360 重复1280×7206.867.42
8768×768 重复1536×153613.5815.16

第 4 行起 compile 列全部 ≤ 不编译列 —— 混合分辨率的生产队列大约两条视频后进入稳态。

还有多少优化空间

没有到极限。下面按「已验证 / 待验证」分开列,每条都标了实测量级。

✅ 已验证可拿的收益 —— 逐级分解(16:9 768p → 2688×1536,121 帧,常驻稳态)

配置耗时本级收益显存峰值代价
官方默认:restore_video 多线程 · clip_len=20 · 无 compile 44.96 s基线29.68 GiB 默认的 clip_len=24 在这一档 OOM
+ clip_len 20 → 4 16.27 s2.76×26.10 GiB 无代价,质量指标反而更好
+ 换单线程驱动 14.49 s−11%22.12 GiB 自己写约 40 行驱动循环;官方 Space 就是这么做的
+ torch.compile 13.37 s−7.7%22.12 GiB 首个进程 +34~90 秒编译,常驻只付一次
合计13.37 s 3.36×−7.56 GiB 质量指标未下降

每一级都是独立实测的常驻稳态数(第 2–4 次请求均值),不是估算叠乘。 贡献最大的是 clip_len —— 一个滑块,2.76×。

这三条已经全部叠加在推荐配置里。与「官方默认 restore_video 多线程 + clip_len=24 + 无 compile」对比(两边都是常驻稳态口径,取第 2–4 次请求均值):

宽高比官方默认 秒优化后 秒提速 官方 GiB优化 GiB省显存

16:9 与 9:16 的「官方默认」实际跑的是 clip_len=20 —— 默认的 24 在这两档直接 OOM, 所以那两行的对比其实已经对官方一方有利

🔍 还没吃到的空间

不建议的方向:clip_len 已经是最小合法值(必须是 4 的倍数); 多卡切分单条视频会撞上因果流式的跨 chunk 状态,接缝风险高。

部署须知

完整时长的三联对比包(输入 / 官方默认 / 优化配置,等分三联,顶部条幅标注各自配置与耗时): viggle_new_5090:~/swiftvr_deploy/swiftvr_compare.tar(201 MB,含 5 个宽高比 / 时长组合与 README)。 未经二次编码的模型原始输出在 ~/swiftvr_deploy/out/ —— 判画质请用后者, 三联包为并排观看重编码过。

测试机 viggle_new_5090(8×RTX 5090 32G,驱动 580.159.03)· 环境 conda swiftvr: Python 3.10 + torch 2.10.0+cu130 + diffusers 0.36.0 · 权重 H-oliday/SwiftVR(fp32 19 GB,bf16 加载 12.03 GiB)· 测试素材为 FL2VA 生产产物 · 2026-08-20