768p → 2× 超分方法对比

SwiftVR 5B 生成式 CDA-VSR 3.11M 判别式 各含官方配置 + 自研优化 20 条标准片源 × 4 组 = 80 次运行 RTX 5090 32G ↓ PyIQA 客观评测 ↓ ×2 GT Benchmark

统一任务:输入 768p,输出 2× 放大。20 条片源覆盖 5 种宽高比、每个比例 4 个不同的人、73–362 帧不等。 全部 80 次运行零失败。四组产出同一目标分辨率,可直接并排对比。

SwiftVR 优化版
304.5
20 条总耗时 · 最快
CDA-VSR 优化版
347.8
慢 1.14× · 但吃 ×4 劣势
显存差距
4.6×
22.11 vs 4.85 GiB 峰值
参数量差距
1600×
5B vs 3.11M

四组总览

配置20 条总耗时自身优化幅度显存峰值上限显存中位相对最快
SwiftVR 官方877.1 s基线 29.68 GiB29.002.88× 慢
SwiftVR 优化304.5 s2.88× 22.11 GiB19.72最快
CDA-VSR 官方881.6 s基线 5.16 GiB3.942.90× 慢
CDA-VSR 优化347.8 s2.53× 4.85 GiB3.701.14× 慢
这不是同一量级的对比。SwiftVR 是 5B 参数的生成式一步 DiT,CDA-VSR 是 3.11M 参数的判别式在线 VSR, 小 1600 倍。而且 CDA-VSR 是在架构劣势下比的 —— 它发布的重建头只有 ×4,为了产出 2× 必须先算到 3072p(16:9 时 5376×3072,16.5 Mpx)再降采样,多出来的算力全部计入它的耗时。

逐条耗时

SwiftVR 官方 SwiftVR 优化 CDA-VSR 官方 CDA-VSR 优化

横轴按帧数排序。片子越长四条线越收敛 —— 两边的固定 warmup 开销都被摊薄了。

显存

SwiftVR 官方 SwiftVR 优化 CDA-VSR 官方 CDA-VSR 优化
显存是这次对比里差距最大的一项:SwiftVR 优化版仍需 22.11 GiB,CDA-VSR 只要 4.85 GiB。 SwiftVR 在 32G 卡上只能单路常驻;CDA-VSR 一张卡可以并行跑 6 路。

视频对比

五条片源,每条给出输入(bicubic 2× 放到同一画布,仅作参照)和四组输出。四组产出分辨率完全相同。 网页版统一截取前 5 秒并重新编码,细节有损失;判画质请用机器上的原始输出。

客观代理指标

2× 任务没有 ground truth,所以算不了 PSNR/SSIM。下面两个是代理量, 只能横向比同一条片子的不同配置,不能当作画质分数 —— 锐度既会因真实细节上升、也会因振铃和过锐上升;闪烁里混着真实运动。

SwiftVR 优化 CDA-VSR 优化
锐度差距很大且系统性存在(20 条全部如此)。这符合两者的性质:SwiftVR 是生成式的,会「补」出 训练分布里的细节;CDA-VSR 是判别式的,只从压缩域先验和历史帧里「recover」,风格保守得多。 锐度高不等于更正确 —— 生成的细节可能并不存在于原始内容中。这一点必须靠人眼在上面的视频里判断。

真实 MiniMax 产出 · 无 GT 客观评测

上面那两个代理量(锐度 / 闪烁)只是自己写的启发式。这一节换成成熟实现的标准指标(PyIQA), 在同一批 20 条真实 MiniMax 产出上跑。没有 2K ground truth,所以做的是无参考画质加一项源一致性。 参评的六个方法里有两个是不花 GPU 的放大参照系,用来给「模型到底赚了多少」定一个地板。

绿色 = 该指标下四个模型之间的最优。灰色两行是参照系,不参与「最优」的评选 —— 它们在 Downsample LPIPS 上必然接近 0(把原片放大再原样缩回去本来就等于原片),列出来是当刻度尺用的。

共识排名

Heuristic ranking — not a calibrated quality score. 这只是各指标名次的算术平均。MUSIQ、CLIP-IQA、NIQE、Downsample LPIPS 量纲和含义都不同, 刻意没有把它们归一化成一个「综合 87.3 分」——那种分数看着好用,但没有任何校准依据。

配对逐条对比(paired per-video delta)

六个方法跑的是同一批 20 条片源,所以正确的比法是逐条相减再平均,而不是比两个独立均值 —— 后者会被片子之间的巨大方差淹没,而那部分方差在配对时会抵消。 CI 为 2000 次 bootstrap 重采样的 95% 区间(种子固定,可复现)。

W / T / L = A 在 20 条里赢 / 平 / 输的条数(按该指标自己的方向)。 粗体行表示 95% CI 不跨 0,即差异在这 20 条上稳定成立。

评测口径

×2 Ground-Truth Benchmark

上面那一节测的是「在真实 MiniMax 分布上,输出好不好看 / 改了多少」。这一节测的是另一回事: 有 ground truth 时,还原得准不准。两者结论并不一致,这正是必须两个都跑的原因。

Full-reference(保真度,与 GT 比)

No-reference(观感,不看 GT)

配对逐条对比

×2 降质协议

我们的生产任务是 768p → 2×,不是论文里的 ×4,所以没有直接用数据集自带的 LQ (UDM10 自带的是 ×4 的 318×180,用它会答非所问)。统一从 GT 自己造 ×2 输入:

GT png  ──(居中裁到 32 的倍数)──▶  对齐后的 GT      ← 评分基准,无损 png
   │
   └──(bicubic 0.5×)──▶  LQ ──(libx264 crf23, GOP=25, 无 B 帧, refs=1)──▶  唯一共享的 LQ.mp4
                                                                              │
                    ┌─────────────────────────────┬───────────────────────────┤
                    ▼                             ▼                           ▼
              nearest/bicubic ×2            SwiftVR ×2              CDA-VSR 原生×4→area→×2
                    │                             │                           │
                    └──────────── 全部输出无损 png,分辨率 = GT ────────────────┘
顺带查出 SwiftVR 一个会静默丢行的 bug。它把 2× 目标高度上补到 32 的倍数再送进网络, 出来之后无条件裁掉补的那几行 —— 但那几行根本没出现在解码输出里, 于是 1080p 输出实际只有 1072 行,凭空少 8 行。官方 restore_video 和 单线程驱动都一样。MiniMax 那 20 条的输出边长全是 32 的倍数(1536/2688/1344/2048…), 所以从没触发过;YouHQ40 的 1080 一上来就撞上了。本页 benchmark 把 GT 对齐到 32 来绕开它, 但生产上只要输出高度不是 32 的倍数(1080p 首当其冲),就会中招。
另一处:SwiftVR 会吃掉片尾最多 3 帧。它把处理长度取整到 4k+1, 所以 32 帧的 UDM10 片子只输出 29 帧(10/10 全中),YouHQ40 的 33 帧刚好整除、只有那条 31 帧的中招。 评分一律只取公共前缀,差额记进 bench_issues.csv —— 没有补帧,没有静默对齐。

两套评测各自在回答什么

我做了哪些优化

SwiftVR — 2.91×,显存 −7.6 GiB

CDA-VSR — 2.29×

优化后 CDA-VSR 只有 52% 的时间在 GPU 上(230.2s / 443.3s),其余是 IO 和编码 —— 它的瓶颈已经不在模型,而在压缩域先验的数据量(20 条片子的先验共 18 GB)。这是它的架构代价。

画幅:每个宽高比实际在算什么

两个模型产出同一目标分辨率,但内部走的路完全不同。SwiftVR 先把输入双线性放大到目标分辨率、 再做 encode→DiT→decode;CDA-VSR 的重建头只有 ×4,必须先算到 4 倍边长再降回来。

宽高比片数输入 768p目标输出 2× 输出 MpxCDA-VSR 内部 ×4 中间画幅SwiftVR 峰值CDA-VSR 峰值

16:9 与 9:16 那两档,CDA-VSR 内部要算到 5376×3072 = 16.5 Mpx,是最终所需 4.13 Mpx 的 4 倍。 这部分额外算力全部计入了它的耗时。SwiftVR 的显存峰值严格随输出像素线性增长 (12.03 + 2.44×Mpx,20 条实测最大残差 0.006 GiB),其中 12.03 GiB 是 bf16 权重常驻。

瓶颈在 GPU 还是 CPU

这两个模型的瓶颈完全不在同一侧,直接决定了「加一张卡」还是「加 CPU/换 IO」才有用。

SwiftVR:GPU 主导(73–80% 在 GPU 上)

机器 / 片源输出总耗时GPU 计算 视频解码编码写出GPU 占比

解码几乎免费(0.2–0.7 秒,占比 1–2%),编码占 8–12%。加 CPU 对 SwiftVR 没意义 —— 换更快的卡才有效。

CDA-VSR:CPU / IO 主导(官方配置只有 38% 在 GPU 上)

配置机器总耗时GPU 净算GPU 占比其余(IO + 编解码)
CDA-VSR 官方5090881.6 s333.3 s 37.8%548.3 s
CDA-VSR 官方40901096.9 s418.9 s 38.2%678.1 s
CDA-VSR 优化5090347.8 s199.6 s 57.4%148.2 s
CDA-VSR 优化4090489.2 s284.9 s 58.2%204.2 s
CDA-VSR 要读压缩域先验:每帧 2.4–4.1 MB 的运动矢量,20 条片子的先验共 18 GB。 官方配置是逐帧同步 cv2.imread + np.load,再在 5376×3072 上做 CPU 端 resize, 所以近 2/3 的时间不在 GPU 上。我的优化把预取搬到后台线程、把降采样搬到 GPU, GPU 占比从 38% 提到 58% —— 但它依然是这条链路上最该继续优化的地方,而不是模型本身

硬件对比:RTX 5090 vs RTX 4090

同一套代码、同一份权重、同样的 20 条片源,两台机器采用完全相同的执行协议: 单配置顺序执行、4 分片跑在 GPU 0–3、全程无其他负载。

配置5090 (32G)4090 (24G)4090 慢 5090 峰值4090 峰值
SwiftVR 优化304.50 s443.36 s 1.46×22.11 GiB22.11 GiB
CDA-VSR 官方881.57 s1096.94 s 1.24×5.16 GiB4.92 GiB
CDA-VSR 优化347.83 s489.17 s 1.41×4.85 GiB4.85 GiB
CDA-VSR 官方 · 仅 GPU 净算333.28 s418.85 s 1.26×
CDA-VSR 优化 · 仅 GPU 净算199.63 s284.94 s 1.43×
结论:4090 比 5090 慢约 1.4–1.46×(同配置、同显存峰值)。 CDA-VSR 官方那行的 1.24× 偏低,是因为它近 2/3 时间耗在 CPU 上、摊薄了 GPU 差距 —— 只看 GPU 净算就回到 1.26×,优化配置则是 1.43×。
SwiftVR 官方配置在 4090 上不构成有效对比,已从上表移除。 20 条片子全部被迫降 clip_len(1:1 从 24→20,4:3/3:4 从 24→12,16:9/9:16 从 20→8), 因为 4090 的分配峰值最高只到 22.32 GiB,而 5090 用到 29.68 GiB。 两边跑的已经不是同一个配置,速度比值没有意义 —— 它的总耗时看起来是 884.45 vs 877.12 秒(1.01×,形同打平), 但那是小 chunk 换来的假象
4090 跑 SwiftVR 属于「刚好能跑」。优化配置峰值 22.11 GiB 顶着 23.65 GiB 可用, 只剩约 1.5 GiB 给 CUDA context —— 8 条 4.13 Mpx 的片子全过了但零余量, 画幅再大一点、或同卡再起一个进程就会翻车。CDA-VSR 峰值仅 4.85 GiB,一张 4090 可并行 4 路。

已知的两处硬件口径瑕疵

其余全部对齐并逐项核验:仓库 rev 相同、checkpoint 字节数相同、跑分脚本与打过补丁的 runner.py md5 一致、CDA-VSR 的 LR 重编码码流逐字节相同、 两边 DCN 后端一一对应(官方都用 mmcv、优化都用 tv shim,max|diff| = 0.000e+00)。

一次方法论更正

本页 5090 的数字全部重测过。最初那版把 official(GPU 0–3)和 optimised(GPU 4–7) 同时启动了 8 个进程,而 official 是 CPU 重的配置,两者抢 CPU。 4090 那边只有 4 张卡可用、是顺序跑的,协议不一致。

线索是按输入像素归一化后的吞吐形状:4090 在五种分辨率上是平的(7.47–7.71), 5090 却浮动 1.85 倍、且在 768×768 那档绝对值反而低于 4090 —— 而 optimised 下 5090 每档都赢。 这不是硬件差异该有的形状。

配置(均为 5090)并发协议顺序协议差异
SwiftVR 官方892.85 s877.12 s−1.8%
SwiftVR 优化306.46 s304.50 s−0.6%
CDA-VSR 官方1015.73 s881.57 s−13.2%
CDA-VSR 优化443.27 s347.83 s−21.5%
这改变了模型之间的结论。按污染数据,SwiftVR 优化版比 CDA-VSR 优化版快 1.45×; 按干净数据只快 1.14×。原因正是上面那条 —— CDA-VSR 是 CPU 主导的,被并发惩罚得最重(−21.5%), 而 GPU 主导的 SwiftVR 几乎没受影响(−0.6%)。本页展示的是干净数据。

口径与已知问题

测试机 viggle_new_5090(8×RTX 5090 32G,驱动 580.159.03)· SwiftVR:conda swiftvr, torch 2.10.0+cu130,官方 H-oliday/SwiftVR 权重 bf16 未量化 · CDA-VSR:conda cdavsr, torch 2.10.0+cu128,mmcv 2.2.0 源码编译(sm_120),官方 best.pth,权重 0 missing / 0 unexpected · 片源为 MiniMax-H3 历史输出,20 条覆盖 5 种宽高比 · 2026-08-21

评测部分(2026-08-21)· 指标实现 PyIQA 0.1.16(MUSIQ / CLIP-IQA / MANIQA / NIQE / LPIPS-Alex / DISTS / PSNR / SSIM),DOVER 官方实现 VQAssessment/DOVER + DOVER.pth v0.1.0, torch 2.10.0,8×RTX 5090 分片并行 · MiniMax-20:图像 IQA 每条 24 帧均匀抽样(全方法同帧号),Downsample LPIPS 逐帧全跑 3724 帧 · ×2 GT Benchmark:UDM10(10 条 / 32 帧 / GT 1248×704)+ YouHQ40(40 条 / 33 帧 / GT 1920×1056), GT → bicubic 0.5× → libx264 crf23 GOP25 无 B 帧 → 六方法共用同一 LQ,输出与评分全程 PNG · ↑ 越高越好,↓ 越低越好 · 完整口径见 evaluation/README.md