SeedVR2 Tile Splitter
Make SeedVR2 eat a 12K image on an 8GB card
- image
- tiles
- tile_metadata
- resolution
SeedVR2 is the best generative upscaler most of us will run this year - the ByteDance one-step model that took over the "add detail" rung from SUPIR, Apache-2.0, gloriously fast on a 3060. And then you feed it a big image and it dies. Not because the model is bad, but because the node people use (numz/ComfyUI-SeedVR2_VideoUpscaler) only tiles the VAE encode and decode. The image stays one full latent during the upscale itself, so past roughly 3500×3500 you're OOM-ing regardless of what you set those tile boxes to - the pack author's own 8GB experience, and probably yours too.
SeedVR2TileSplitter is the fix. It's the front half of BacoHubo's SeedVR2 Tiler pack: it carves your image into a batch of overlapping tiles small enough for SeedVR2 to chew on one at a time, so "any size" becomes "your VRAM's size." No API, no key, no model files - the heavy lifting still happens in the SeedVR2 node; this just stops you from asking it to hold the whole image at once.
How it works
The node does a bit more thinking than most splitters, and it's the good kind of thinking. You give it tile_size_mp, and it computes the smallest N×M grid where every tile fits under that megapixel budget - picking the most square grid it can so tiles match the image's aspect ratio instead of getting stretched. It then pads the image to an exact canvas using edge replication rather than resizing, which is the v1.2.0 change and worth knowing: your original pixels stay pixel-identical, nothing gets re-scaled or blurred before SeedVR2 sees it. Adjacent tiles overlap by overlap_percent on each edge, which is what lets the stitcher blend seams away.
If the image fits in a single tile, it passes straight through untouched - output is identical to running SeedVR2 directly. That's a real behavior, not a bug.
The inputs that matter
tile_size_mp- max tile size in megapixels. 0.5–1.0 is the sweet spot for 8GB. Lower it when you OOM, raise it when you're on a 24GB card and want fewer passes.tile_upscale_mp- the resolution each tile should reach after SeedVR2. Roughly 2× yourtile_size_mpis the default and it's a sane start. This feeds theresolutionhint.overlap_percent- 10% default. If you see seams, the tooltip's own advice is 15–20%.feather_blend- 1.0 = smooth feather blend, 0.0 = hard cut. Leave it at 1.0 unless you're chasing a specific look.
Everything else is optional or plumbing. Three outputs: tiles (the IMAGE batch), tile_metadata (the internal recipe the stitcher needs), and resolution (an INT hint).
Wiring it
Load Image → SeedVR2TileSplitter → tiles ──────────→ SeedVR2 (image input)
→ tile_metadata ───→ SeedVR2TileStitcher
→ resolution ──────→ SeedVR2 (resolution input)
One gotcha straight from the author: on the SeedVR2 node, set max_resolution to 0 to disable its longest-edge cap. The original workflow shipped with it misconfigured and the README calls it out.
Install
ComfyUI Manager: search SeedVR2 Tiler. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/BacoHubo/ComfyUI_SeedVR2_Tiler
That's it - no requirements beyond what ComfyUI already ships (pure PyTorch, torch.nn.functional for resizing). You do need the numz SeedVR2 node installed separately, and SeedVR2's own weights. Run FP16 if it fits; FP8 adds tiling grids and GGUF does unpleasant things to skin, and the community has tested both so you don't have to.
If something looks off
- Output is resized when you expected passthrough - update to v1.2.0, that's the single-tile fix.
- Seams - bump
overlap_percent, then check you're running FP16. - Still OOM - drop
tile_size_mpto 0.5. For really big targets, run the pipeline again feeding its own output back in; the pack explicitly supports multi-pass. - Don't want it blurrier than the input - the stitcher crops the replicated padding, so nothing extra should survive. If a weird border shows up, that's the giveaway your pack version predates the padding fix.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| tile_size_mp | FLOAT | 1.00.1–16 | Maximum size of each tile in megapixels. The grid is chosen so every tile is AT MOST this size. Lower = less VRAM per SeedVR2 pass. |
| tile_upscale_mp | FLOAT | 2.00.1–64 | Desired output size of each upscaled tile in megapixels. Used to compute the resolution hint for SeedVR2. Typically 2x your tile_size_mp. |
| overlap_percent | FLOAT | 100–40 | Overlap between adjacent tiles as a % of tile size. 10% is a safe default. Increase to 15-20% if seams appear. |
| feather_blend | FLOAT | 1.000–1 | Fraction of the overlap zone used for blending during stitch. 1.0 = smooth linear feather. 0.0 = hard cut. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| tiles | IMAGE | — |
| tile_metadata | TILE_METADATA | — |
| resolution | INT | — |