# SeedVR2 部署与实测报告（2026-09-26）

> 目标：验证 [SeedVR2](https://github.com/IceClear/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 分钟内拿齐。

## 二、三个关键坑（都会导致"下了也用不了"）

### 坑 1：官方 `.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 type`
- numz `SeedVR2_comfyUI` 的 fp8 safetensors（3.39GB）：**缺** → 同样报错
- **Comfy-Org `SeedVR2` 的 `*_int8_convrot` / `*_nvfp4` / `*_fp16`：有**（1057 个键里含这两个）→ ✅ 可用

**教训**：ComfyUI 原生支持（PR #14424）只认 Comfy-Org 转换版；第三方封装（numz/AInVFX）的权重是给它们自己的节点用的。

### 坑 2：ComfyUI 官方模板是 **subgraph**，不能直接 POST
`utility_seedvr2_3b_int8_upscale_video.json` 是前端工作流格式（subgraph 封装）。要转成 `/prompt` API 格式必须处理：
- subgraph 内 link id 需要加 `"<subgraph_uuid>:"` 命名空间前缀，否则全部解析失败；
- 模板 `nodes[].inputs` **只列连线输入**，widget 值靠位置映射会整体偏移（实测把文件名塞进了 `weight_dtype`）→ 必须按 `/object_info` 的类型信息区分"widget 输入"与"纯连线输入"；
- KSampler 的 `latent_image` 原本指向 switch 节点，删除 switch 后需重指到 `VAEEncodeTiled`；
- 模板里 `SaveVideo` 实际未接上游（靠 subgraph 输出），需显式接 `CreateVideo`。

已写好脚本：`build_seedvr_api.py`（模板→API）+ `fix_seedvr_api.py`（绕开关、补参数、修引用）。

### 坑 3：16GB 显存只够 **2 倍档**
| 配置 | 结果 |
|---|---|
| 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**，正是为这点妥协的。

## 三、实测对比（同段 15s / 225 帧 / 同区域裁切）

| 方案 | 锐度↑ | 邻帧 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** |

**解读**：
- SeedVR2 在**同倍率**下细节恢复更强、画质最自然（见对比图右图：脸部结构合理、校服细节干净，没有 Real-ESRGAN 那种硬边/伪影感）；
- 但它**闪烁更明显**（邻帧 PSNR 低 3 dB）——扩散模型每帧独立采样带来的时间不一致，这与"一步式扩散"的机制一致；
- **整体分辨率上限受显存压制**：它只能 2x，放大到 720p 后锐度反而不如直接 3x 的 Real-ESRGAN。

## 四、结论与建议

| 用途 | 推荐 |
|---|---|
| **出 960×720 成品** | **继续用 Real-ESRGAN x4plus**（3x 直出，锐度更高、无显存问题） |
| **追求最自然的观感 / 240p 原尺寸修复** | **SeedVR2 2x**（细节最真实，适合作为"高质量 2 倍档"或局部重制） |
| 快速试看 | RTX VSR（44 fps） |

**SeedVR2 要真正超过 Real-ESRGAN 需要**：更大显存（≥24GB 跑 3~4 倍档）、或等官方 BlockSwap 进原生实现、或接受"分段 2x + 再插值"的两段式。当前 16GB 卡上它的定位是"2 倍档最自然"，而不是"更高分辨率的替代品"。

## 五、复现（GPU 机）

```bash
# 权重位置
# ~/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)}"
```

---

## 六、全片 2x 成品（2026-09-27 完成）

**成品（`成品/` 目录）**

| 文件 | 规格 | 体积 |
|---|---|---|
| **朋友法语版-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）：
1. ffmpeg 按 20 s 切块（H.264 CRF14，无声）；
2. 逐块提交 ComfyUI `/prompt`（SeedVR2 2x，nvfp4，fps=15，无音频）；
3. 收集 14 块 → concat 合并（3944 帧）；
4. 配回源音轨 → 15fps 版；
5. `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）：
- 左 = 原片插值（模糊、块效应）
- 中 = Real-ESRGAN 960×720 降到 480p（锐但有硬边/卡通感、人脸有伪影、色偏黄）
- 右 = **SeedVR2 2x**（石墙纹理清晰、色彩自然、伪影最少）

> 提示：如需更高分辨率（960×720），仍需用 Real-ESRGAN 版；SeedVR2 版的价值在"2 倍档最自然"。

