SeedVR2 Loader (V100 fp16-safe)
SeedVR2 on a V100 doesn't crash, it just hands you a black video. This node is why it stops.
- MODEL
SeedVR2 on a Tesla V100 doesn't crash. The graph runs, the sampler finishes, nothing is red, and out comes a completely black clip - every frame, YAVG sitting at 16. It isn't your prompt or your checkpoint. It's fp16 arithmetic overflowing inside the transformer, and this loader is the drop-in replacement that fixes it.
Why you'd be on a V100 in the first place
SeedVR2 is the incumbent answer to "more detail": ByteDance's one-step restoration model that preserves what's in the frame instead of reinventing the subject, which is why it quietly took over restoration work on real faces. Most people only run it on single images, because video is a datacenter workload - 12 minutes for 720p to 4K on a rented L40S.
Which is exactly why you'd be on a 32GB V100: it's the cheap way to rent VRAM by the hour. And a V100 is Volta, sm_70 - no fp8 compute path, and an fp16 ceiling of 65,504. A ceiling SeedVR2's forward pass walks straight through.
How the fix works
The author traced it layer by layer. The txt residual register exceeds fp16 max somewhere around block 3, the fused rms_adaln kernel turns the resulting INF into NaN at blocks.4.ada.txt, and the NaN rides every later block into the VAE, which clamps it to black. Attention, VAE encode and VAE decode are all clean. One register, one overflow, whole clip gone.
Rather than forcing the entire model to fp32, the node patches NaMMSRTransformerBlock.forward so the txt residual is carried in fp32 across the block and, just before each RMSNorm, scaled down by a power of two until its largest value sits under 30,000. RMSNorm is scale-invariant - norm(x·s) = norm(x) - so the math is untouched while every fp16 value stays finite. The patch is scoped to that one class, so it's a no-op for fp32 models and can't disturb other architectures. Validated against a full-fp32 run: zero NaN, cosine similarity 0.999.
Both loaders in the pack also pin SeedVR2's VAE causal caches to the GPU instead of shuttling them to host RAM, worth about 6% on decode.
The one input, the one output
There is nothing to configure. One required field, unet_name - a dropdown of files in models/diffusion_models whose names contain seedvr. No dtype switch, no patching checkbox; the safe behaviour is the node's entire identity. It returns MODEL, which goes into the sampler slot where UNETLoader used to be. Delete the old loader and any FP16Safe wrapper you were chaining behind it, and you're done.
Everything else stays put. The upscale factor lives in the Resize node before SeedVR2 - ×2 is the model's design sweet spot, and ~×2.2 gets 480×864 up to 1080×1920. Clips under ~4 seconds at 0.4 MP need no chunking; longer ones want the TemporalChunk/Merge switches.
Install
Manager, search "SeedVR2 V100". Or:
cd ~/ComfyUI/custom_nodes
git clone https://github.com/duckyman-ai/ComfyUI-SeedVR2-V100.git
# restart ComfyUI
No requirements.txt, no install.py - it's a 136-line __init__.py on top of torch and comfy.sd, so it can't drag your dependency tree around. You supply the checkpoint: seedvr2_7b_fp8_e4m3fn.safetensors in models/diffusion_models, ~15.7 GB of fp16 weights, fits a 32GB card with room for activations. Skip int8_convrot, which OOMs on Volta. Your ComfyUI also needs native SeedVR2 support, since the patch imports comfy.ldm.seedvr at execution time; validated on 0.39.0 with torch 2.9.1+cu126.
For reference, on a V100-SXM2-32GB at 480×864 ×192f up to 960×1728: stock loader 14 minutes to a black video, this one 9:15 to a correct one, fp32 fallback 18:31.
Where people get burned
Still black. Check the loader you actually replaced. A bypassed UNETLoader upstream will happily feed the black path while the new node sits there looking correct.
The dropdown lies. The file list is filtered on "seedvr" in the filename, inside models/diffusion_models only. Put the checkpoint in models/checkpoints and it won't appear at all. Worse, when nothing matches, the node falls back to offering one placeholder name that may not exist on disk - so you get a load error for a file the UI implied you had.
Don't "fix" it with --disable-nan-check. That flag skips the check, it doesn't fix the NaN, and the model keeps producing NaN, which decodes to black - the KB is blunt about this. --no-half on the whole install works too, and costs you fp16 everywhere else. This node is that, surgically.
Small footnote: the patch stays installed for the life of the ComfyUI process, so other native SeedVR2 graphs in that session get it too. Equivalent math, so harmless.
The wider lesson is that Volta plus fp16 is a bad pairing, not a SeedVR2 quirk - the same author fixed the same class of bug for MiniMax-H3. If a model goes black on your V100 while everyone else's works, suspect overflow first.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| unet_name | COMBO | 1 options: seedvr2_7b_fp8_e4m3fn.safetensors |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |