SeedVR2 Tiling Upscaler
SeedVR2 for images too big for your VRAM — tile it, don't OOM
- image
- dit
- vae
- IMAGE
By now you've probably heard the SeedVR2 story: ByteDance built it as a video restoration model and the community turned it into the best single-image upscaler in the ecosystem - detail added without the subject being reinterpreted, Apache 2.0, runnable on a 6GB 3060. The catch is that the stock node upscales the whole image in one go, and SeedVR2 has a well-earned reputation for OOMing when you push resolution. This node is the fix for exactly that: it chops your image into overlapping tiles, upscales each one with SeedVR2, then stitches them back together with actual blending algorithms instead of visible seams.
The author is upfront about one thing: it's not magic. "It will alter details and it might even change things you don't like," reads the README. But for refining Flux output, boosting skin and fabric detail for training datasets, or prepping for print, it beats every other detailer/upscaler pipeline the author tested. Nothing here calls an API and there's no key involved - it's a wrapper that drives the same SeedVR2 models you already know.
How it works
The mechanism is straightforward under the hood. The node reads your target new_resolution, computes an upscale factor against the longest side of the input, slices the image into overlapping tiles, and upscales each tile to tile_upscale_resolution using SeedVR2. Every tile then gets resized to its final target dimensions and stitched back. The interesting part is the stitching: a Laplacian-pyramid "multiband" method that blends frequency bands independently (best detail), a bilateral-filter option that preserves edges while killing artifacts, a structure-tensor "content aware" mode for complex images, plain linear alpha blending, and simple averaging. Chess tiling order spreads tiles so seams blend better; Linear is faster.
The inputs that matter
Most of the defaults are sane, so you mainly touch three groups:
ditandvae- the non-obvious part. These come from theSeedVR2 (Down)Load DiT ModelandSeedVR2 (Down)Load VAE Modelloader nodes in numz'sComfyUI-SeedVR2_VideoUpscalerpack, which this node requires. No loader, no node - you can't just wire in an image.new_resolution(default 1072) - target length of the longest side; aspect ratio is preserved. This is your "how big" dial.tile_width/tile_height/tile_padding/tile_upscale_resolution- the VRAM knobs. Smaller tiles and lowertile_upscale_resolutionmean less memory but more stitching work; the README's sweet spot is 1024 tiles, 32–64 padding, 1024–2048 upscale resolution.
Then there's blending_method (default auto), mask_blur, color_correction (default lab, which perceptually matches the upscaled output back to your input's colors - leave it), anti_aliasing_strength, and seed for reproducible runs. One IMAGE comes out the other end; wire it to Save Image.
Installing it
Install the numz SeedVR2 pack first - that's the hard dependency. Then grab this one via ComfyUI Manager (search "SeedVR2 Tiling Upscaler") or:
cd ComfyUI/custom_nodes/
git clone https://github.com/moonwhaler/comfyui-seedvr2-tilingupscaler.git
Then install its requirements into the same Python environment ComfyUI uses - the README hammers this because venv/conda mismatch is the classic "node loads but doesn't run" failure:
cd ComfyUI/custom_nodes/comfyui-seedvr2-tilingupscaler
pip install -r requirements.txt # in your ComfyUI venv
The requirements are light - torch, numpy, Pillow, scipy, opencv-python - and the models themselves download through the numz loader nodes. One trap: the README's install snippet tells you to cd UltimateResupscaler, which is a copy-paste artifact from another pack. The directory is whatever you cloned into.
Common issues
SeedVR2VideoUpscaler node not found- the numz pack isn't installed, or it's older than v2.5. The adapter looks that class up in ComfyUI's node registry at runtime, so it must be present.- OOMs - drop
tile_upscale_resolutionto 1024 or below, shrink the tiles, raisetile_padding... or jump to the nightly branch (git clone -b nightly ...). This is where the README's advanced memory features actually live: the stable branch ships without theextra_argsandblock_swap_configinputs that hook uppreserve_vram,tiled_vae, andSeedVR2 BlockSwap Config. People hit this constantly. - Visible seams - switch
blending_methodtomultibandorbilateral, pushtile_paddingto 64+, use Chess. - Progress bar shows "???" - known nuisance, not an error. It just doesn't report progress well.
Last thing: run FP16 if it fits. The community's hard-won finding is that GGUF damages skin texture and FP8 can leave tiling grids - the same quantization advice that applies to every SeedVR2 node applies here. You came here to avoid OOMs, not to trade them for lizard skin.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| dit | SEEDVR2_DIT | DiT model configuration from 'SeedVR2 (Down)Load DiT Model' node. | |
| vae | SEEDVR2_VAE | VAE model configuration from 'SeedVR2 (Down)Load VAE Model' node. | |
| seed | INT | 1000–4294967295 | Random seed for reproducible results. Same seed produces same output. |
| new_resolution | INT | 107216–16384 | Target resolution in pixels for the side selected by 'resolution_target' (longest or shortest). Aspect ratio is maintained. |
| tile_width | INT | 51264–8192 | Width of each tile in pixels. Smaller tiles use less VRAM but may show more seams. |
| tile_height | INT | 51264–8192 | Height of each tile in pixels. Smaller tiles use less VRAM but may show more seams. |
| mask_blur | INT | 00–64 | Tile edge blending. 0=multi-band frequency separation (best detail), 1-3=minimal blur, 4+=traditional blur. |
| tile_padding | INT | 320–8192 | Overlap between tiles in pixels. Higher values reduce seams but increase processing time. Recommended: 32-64. |
| tile_upscale_resolution | INT | 102464–8192 | Ceiling on the resolution used to AI-upscale each tile. Each tile is scaled by the same overall factor as the full image; this only kicks in to cap tiles that would otherwise exceed it. Higher=better quality but more VRAM. Try 1024-2048. |
| tiling_strategy | COMBO | Tile processing order. Chess=checkerboard pattern for better blending, Linear=row-by-row (faster). | |
| anti_aliasing_strength | FLOAT | 0.000–1 | Edge-aware smoothing strength. 0=disabled, 0.1-0.3=subtle smoothing. May soften details. |
| blending_method | COMBO | auto | Blending algorithm: auto (mask_blur based), multiband (Laplacian pyramid/frequency separation), bilateral (edge-preserving filter), content_aware (structure-adaptive), linear (alpha blend), simple (pixel averaging). |
| color_correction | COMBO | lab | Color correction method to match upscaled output to original input colors. lab=perceptual matching (recommended), wavelet=frequency-based, wavelet_adaptive=with saturation correction, hsv=hue-conditional, adain=style transfer, none=disabled. |
| resolution_target | COMBO | longest | Which side 'new_resolution' applies to. 'longest'=fit longest side (original behavior), 'shortest'=fit shortest side (larger output for the same value). Aspect ratio is maintained either way. |
| tile_batch_size | INT | 11–21 | Tiles sent to SeedVR2 per call. 1 = lowest VRAM (recommended). Higher is faster but VRAM scales with it. Values are snapped down to SeedVR2's required 4n+1 pattern (1, 5, 9, 13, 17, 21). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |