目标:验证 SeedVR2(ICLR 2026,字节跳动,Apache-2.0,视频原生一步式扩散修复)能否超过现役逐帧方案 Real-ESRGAN,用于
BV1Ss411o7p3(320×240 / 15fps)的高清修复。 结论:能,但有很大限制 —— SeedVR2 在同等 2 倍档下锐度更高(518.5 vs 429.8),画面最自然;但本机 16GB 显存只跑得动 2 倍档,3 倍档 OOM,且速度只有 Real-ESRGAN 的 1/2.6。
| 文件 | 大小 | 用途 |
|---|---|---|
seedvr2_3b_nvfp4.safetensors | 1.90 GB | 实际使用(Comfy-Org 官方量化档,最省显存) |
seedvr2_3b_int8_convrot.safetensors | 3.46 GB | 官方模板默认档,16GB 卡加载即 OOM |
ema_vae_fp16.safetensors | 0.50 GB | VAE(Comfy-Org 与 numz 两版 sha256 完全相同) |
seedvr2_ema_3b.pth(13.6GB) | — | ❌ 下到一半发现不能用:官方 .pth 不含 ComfyUI 原生加载器必需的键,已删除 |
seedvr2_ema_3b_fp8_e4m3fn.safetensors(3.39GB) | — | ❌ 同上(numz 版为第三方封装准备),已删除 |
迅雷实测速度:起步 2.7 MB/s,峰值约 30 MB/s(远快于 GPU 机直连 hf-mirror 的 ~0.4 MB/s)。三个必需文件(共 5.9GB)约 15 分钟内拿齐。
.pth / numz fp8 不被 ComfyUI 原生加载器接受ComfyUI 的 SeedVR2 检测要求模型含 positive_conditioning + negative_conditioning 两个键(comfy/supported_models.py 的 required_keys):
ByteDance-Seed/SeedVR2-3B 的 .pth(13.6GB):缺 → Could not detect model typeSeedVR2_comfyUI 的 fp8 safetensors(3.39GB):缺 → 同样报错SeedVR2 的 *_int8_convrot / *_nvfp4 / *_fp16:有(1057 个键里含这两个)→ ✅ 可用教训:ComfyUI 原生支持(PR #14424)只认 Comfy-Org 转换版;第三方封装(numz/AInVFX)的权重是给它们自己的节点用的。
utility_seedvr2_3b_int8_upscale_video.json 是前端工作流格式(subgraph 封装)。要转成 /prompt API 格式必须处理:
"<subgraph_uuid>:" 命名空间前缀,否则全部解析失败;nodes[].inputs 只列连线输入,widget 值靠位置映射会整体偏移(实测把文件名塞进了 weight_dtype)→ 必须按 /object_info 的类型信息区分"widget 输入"与"纯连线输入";latent_image 原本指向 switch 节点,删除 switch 后需重指到 VAEEncodeTiled;SaveVideo 实际未接上游(靠 subgraph 输出),需显式接 CreateVideo。已写好脚本:build_seedvr_api.py(模板→API)+ fix_seedvr_api.py(绕开关、补参数、修引用)。
| 配置 | 结果 |
|---|---|
| int8_convrot (3.46GB) + 3x | ❌ 加载阶段 OOM(峰值 14884/16311 MiB) |
| nvfp4 (1.90GB) + 3x | ❌ OOM:已分配 14.10 GiB + 需 778 MiB > 15.49 GiB 上限 |
| nvfp4 (1.90GB) + 2x | ✅ 成功,显存 9910 MiB,225 帧 105.66 s |
官方文档本身也写明"3B 版本至少需要 18GB 显存"——与实测吻合。官方模板的默认值就是 scale_multiplier=2,正是为这点妥协的。
| 方案 | 锐度↑ | 邻帧 PSNR↑ | 速度 | 输出尺寸 |
|---|---|---|---|---|
| 源 240p → 640×480(Lanczos) | 88.4* | 30.19 | — | — |
| Real-ESRGAN x4plus → 640×480 | 429.8 | 26.59 | 5.53 fps | 2x |
| SeedVR2 3B nvfp4 → 640×480 | 518.5 | 23.52 | 2.13 fps | 2x |
(*源行来自加黑边输入的那次测试,仅作量级参考)
归一化到 960×720 后(SeedVR2 只能 2x 上采样再放大,Real-ESRGAN 原生 3x 输出):
| 方案 | 锐度 | 邻帧 PSNR |
|---|---|---|
| Real-ESRGAN → 960×720 | 325.9 | 22.56 |
| SeedVR2 → 960×720 | 254.4 | 23.19 |
解读:
| 用途 | 推荐 |
|---|---|
| 出 960×720 成品 | 继续用 Real-ESRGAN x4plus(3x 直出,锐度更高、无显存问题) |
| 追求最自然的观感 / 240p 原尺寸修复 | SeedVR2 2x(细节最真实,适合作为"高质量 2 倍档"或局部重制) |
| 快速试看 | RTX VSR(44 fps) |
SeedVR2 要真正超过 Real-ESRGAN 需要:更大显存(≥24GB 跑 3~4 倍档)、或等官方 BlockSwap 进原生实现、或接受"分段 2x + 再插值"的两段式。当前 16GB 卡上它的定位是"2 倍档最自然",而不是"更高分辨率的替代品"。
# 权重位置
# ~/ComfyUI/models/diffusion_models/seedvr2_3b_nvfp4.safetensors
# ~/ComfyUI/models/vae/ema_vae_fp16.safetensors
# 模板 → API → 修正 → 提交
python3 /tmp/build_seedvr_api.py <官方模板.json> /tmp/seedvr_api.json \
--unet seedvr2_3b_nvfp4.safetensors --vae ema_vae_fp16.safetensors
python3 /tmp/fix_seedvr_api.py /tmp/seedvr_api.json /tmp/seedvr_run.json \
--video 输入.mp4 --scale 2 --prefix video/seedvr2_out
# 再把 UNETLoader.unet_name 改成 seedvr2_3b_nvfp4.safetensors(或改用 int8,前提显存≥18GB)
curl -s -X POST http://127.0.0.1:8189/prompt -H 'Content-Type: application/json' \
-d "{\"prompt\": $(cat /tmp/seedvr_run.json)}"
成品(成品/ 目录)
| 文件 | 规格 | 体积 |
|---|---|---|
| 朋友法语版-SeedVR2-2x-640x480-30fps.mp4 | 640×480 / 30fps / 7885 帧 / 1.39 Mbps | 45.5 MB |
| 朋友法语版-SeedVR2-2x-640x480-15fps.mp4 | 640×480 / 15fps / 3944 帧 / 0.89 Mbps | 29.4 MB |
时长 263.08 s(与原片一致),音轨用源音轨重编 AAC 192k。
单块帧数越多显存越高(一次 forward 处理整块):
| 单块时长 | 帧数 | 结果 |
|---|---|---|
| 15 s | 225 | ✅ 峰值 9910 MiB |
| 20 s | 300 | ✅ 峰值 7990 MiB |
| 53 s | 795 | ❌ OOM(已分配 14.44 GiB + 需 1.14 GiB > 15.49 GiB) |
→ 采用 20 秒/块 × 14 块,每块约 150 秒,全片约 35 分钟。
seedvr2_fullrun.py(自动切块→上传→提交→轮询→收集)+ post_seedvr2.sh(合并→配回音轨→插帧 30fps):
/prompt(SeedVR2 2x,nvfp4,fps=15,无音频);minterpolate 15→30fps → 30fps 版(7885 帧)。20 秒切 14 块、逐块独立推理,理论上接缝会跳变。实测接缝两侧 PSNR 17.3–34.7 dB,与普通相邻帧(16.4–26.1 dB)同一量级 → 无接缝跳变,观感连续。
对比图-全片-原片vsRealESRGAN-vs-SeedVR2.png(同帧 t=120s,均归一化到 640×480):
提示:如需更高分辨率(960×720),仍需用 Real-ESRGAN 版;SeedVR2 版的价值在"2 倍档最自然"。