Nodes/ComfyUI-DonutNodes/Donut SeedVR2 Post Upscale
ComfyUI Node

Donut SeedVR2 Post Upscale

The pass you add *after* the upscale you already ran

By DonutsDelivery·Created about a year ago·Updated about 8 hours ago· 26
Donut SeedVR2 Post Upscale
  • image
  • image
seedvr2_upscale_factor2.0
resampling_methodlanczos
enabledtrue
seed0
seedvr2_model_nameseedvr2_3b_int8_convrot.safetensors
seedvr2_vae_nameseedvr2_ema_vae_fp16.safetensors
seedvr2_steps1
seedvr2_denoise1.00
seedvr2_color_correctionnone
seedvr2_vae_tile_size1024
seedvr2_vae_overlap128

What it actually is

SeedVR2 is ByteDance's one-step video restoration model that the community quietly turned into the best still-image upscaler we have. Apache 2.0, no non-commercial rider, a 3x on a 6GB card, and the thing it does that SUPIR doesn't is leave the picture alone - it adds detail without re-inventing the subject.

This node is the Donut pack's wrapper around ComfyUI's native SeedVR2 nodes, and the "Post" in the name is doing real work. It is not a replacement for your hires-fix or tiled upscale. If your output is flat, plasticky or missing texture at print size, this is the stage that fixes it - and if your source is genuinely damaged, it's the wrong tool (go SUPIR).

How it works

donut_seedvr2_post.py is a thin shell; the engine is donut_seedvr2.py, and it builds the same recipe as Comfy-Org's utility_seedvr2_3b_int8_upscale_image template:

resize → native preprocess → VAE encode → conditioning → KSampler → decode → native postprocess

Two consequences worth knowing before you set anything. It ignores your Krea2 LoRAs, reference conditioning, NAG and turbo scheduling entirely - SeedVR2 has its own diffusion model, its own VAE, and builds conditioning from the image itself. And a 4D IMAGE batch is processed one still at a time (seed + image index), because native preprocessing would otherwise read a batch as adjacent video frames. Dimensions are rounded to even numbers before preprocessing, and the loaded model + VAE are cached on the node keyed by file size and mtime.

The inputs that matter

  • seedvr2_upscale_factor - default 2.0, range 1–8. It's relative to the image arriving at this node, so a 2x here on top of an already-2x'd image is 4x the original. This is the single most common way people cook their output.
  • resampling_method - the filter for the pre-resize (lanczos by default; nearest maps to ComfyUI's nearest-exact). Lanczos is fine. Don't use nearest unless you're doing pixel art.
  • enabled - off passes the image through untouched. Handy for A/B-ing without rewiring.
  • seedvr2_model_name / seedvr2_vae_name - the native Comfy-Org int8 convrot weights, 3B by default. The 7B is heavier and slower for a modest gain; start at 3B.
  • seedvr2_steps / seedvr2_denoise - defaults of 1 and 1.0 are the native one-step recipe. You almost never change these; if you're tempted to raise steps, you've probably picked the wrong upscaler.
  • seedvr2_vae_tile_size / seedvr2_vae_overlap - 1024/128 are the high-resolution defaults. The tooltip is explicit and worth repeating: this is native VAE encode/decode tiling only, NOT diffusion tiling. The diffusion pass still runs the full output canvas, which is why nothing here promises OOM-free 4K.

One output: image, wire it to your save node.

Installing it

The pack goes in like any other - ComfyUI Manager, search DonutNodes - or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/DonutsDelivery/ComfyUI-DonutNodes.git donutnodes
cd donutnodes
python -m pip install -r requirements.txt

Run that pip line with the same interpreter that launches ComfyUI. The requirements are floors, not pins (opencv-python-headless, scipy, matplotlib, psutil, tqdm, requests) and the pack asks you not to downgrade NumPy globally - other packs share that interpreter. Keep one cv2 provider installed, not two.

Then the model files, which the node does not download for you:

ComfyUI/models/diffusion_models/seedvr2_3b_int8_convrot.safetensors   # or the 7B
ComfyUI/models/vae/seedvr2_ema_vae_fp16.safetensors

Both came from pinned Comfy-Org sources; inside the V5 workflow the Download missing button fetches the selected file, verifies size and SHA-256, and skips anything a muted node would have used.

Where people get burned

  • Old ComfyUI core. This leans on SeedVR2Preprocess, SeedVR2Conditioning and SeedVR2PostProcessing being present. Missing them raises a plain "update ComfyUI and restart, or select the Donut engine" error - no mystery.
  • A GGUF you already had. The int8 convrot files are what the native loaders want; a GGUF built for a third-party SeedVR2 node is not interchangeable and won't appear interchangeable.
  • Tile settings that fail validation. Tile is a multiple of 64 between 128 and 4096; overlap is a multiple of 32, at most 1024, and must be smaller than the tile.
  • Quantisation and skin. The most useful finding in the SeedVR2 corpus is that GGUF weights reportedly wreck skin texture and FP8 can introduce tiling grids; the supported int8 convrot path avoids both. If faces come out scaly, check the weights before you blame the settings.
  • Contrast lift. SeedVR2 raises contrast enough that some images read as more AI-generated than the input. seedvr2_color_correction (lab, wavelet, adain) exists to pull that back - try lab first if skin tones drift.
  • A soft source. Don't feed a mushy 2048px image and expect recovery; the community recipe is to downscale soft sources to roughly 0.35MP first and let SeedVR2 rebuild from a sharper-relative base.

Place it last in finishing, after every other upscale stage. The pack's beta notes flag that the tested path had the second upscale off, so if you stack two of these you're beyond what the author validated.

Categorydonut/upscale

Inputs (12)

NameTypeDefaultDescription
imageIMAGE
seedvr2_upscale_factorFLOAT2.01–8Output size relative to the incoming image; the native pipeline returns even dimensions.
resampling_methodCOMBOlanczos4 options: lanczos, nearest, bilinear, bicubic
enabledoptBOOLEANtrueOff passes the incoming image through unchanged.
seedoptINT00–18446744073709550000
seedvr2_model_nameoptCOMBOseedvr2_3b_int8_convrot.safetensors2 options: seedvr2_3b_int8_convrot.safetensors, seedvr2_7b_int8_convrot.safetensors
seedvr2_vae_nameoptCOMBOseedvr2_ema_vae_fp16.safetensors1 options: seedvr2_ema_vae_fp16.safetensors
seedvr2_stepsoptINT11–100
seedvr2_denoiseoptFLOAT1.000.01–1
seedvr2_color_correctionoptCOMBOnone4 options: none, lab, wavelet, adain
seedvr2_vae_tile_sizeoptINT1024128–4096Native VAE encode/decode tiling only, NOT diffusion tiling. 1024 is the quality-oriented high-resolution default; SeedVR2 diffusion still uses the full output canvas.
seedvr2_vae_overlapoptINT1280–1024VAE tile overlap in pixels. 128 is the upstream high-resolution recommendation for 1024-pixel tiles.

Outputs (1)

NameTypeDescription
imageIMAGE