MultiDiffusion Tiled Hires Fix
MultiDiffusion Tiled Hires Fix — seam-free tiled refining for any model, low VRAM
- image
- model
- positive
- negative
- vae
- image
The classic tiled upscale workflow - Ultimate SD Upscale or Tiled Diffusion with a tile ControlNet - works, but it's fiddly and tile seams are a constant battle. This vsLinx node takes a different, smarter route: instead of sampling each tile independently and praying the edges agree, it runs one sampling pass over the whole image and splits the latent into overlapping tiles at every denoising step, averaging the overlaps in latent space. Because the tiles are re-synced each step, they can't diverge - no seams, no double-exposure ghosting, at roughly tile-sized VRAM. And it's model-agnostic: SD, SDXL, Flux, Anima, anything. No extra node packs required.
What it is (and isn't)
It's a tiled hires-fix / refiner, not an upscaler. It won't make your image bigger - you upscale first (any pixel upscaler, or an upscale model), then feed the enlarged image in here with a low denoise (the tooltip suggests 0.3–0.5) to let the model refine detail at the bigger resolution. That's the intended two-step: more pixels, then a quality pass. The mechanism is the same "multidiffusion" core as the pack's Anima LLLite Tiled Sampler, minus the LLLite parts - which is exactly why it works on any model.
The inputs that matter
The sampler block (seed, steps, cfg, sampler_name, scheduler) is standard, but the ones to actually think about:
denoise- keep it low. This is a refiner; 0.3–0.5 is the sweet spot for adding detail without drifting from the original.rows/columns- how finely you tile. More tiles = smaller per-step memory, but more overlap averaging to compute.overlap(fraction of tile size),overlap_x/overlap_y(extra pixels) - overlap is what makes the seam-free trick work; too little and the tiles don't communicate.vae_decode_tiled+vae_decode_tile_size- the final VAE decode is one full-image pass regardless of how you tiled the sampling, and that single pass can spike VRAM (or, on Windows, crawl by spilling into slow shared system memory instead of failing cleanly). Enable this to decode in bounded tiles.
Wired in: image, model, positive, negative, vae. Output is a single image.
Upscale-VAE support, the subtle bit
If you load an upscale VAE through something like ComfyUI-VAE-Utils (the Wan2.1 upscale2x image VAE, for example), its decoder emits extra channels that need a pixel_shuffle-style reshape back into a k-times-larger image - stock VAE Decode just produces broken multi-channel garbage with those. This node auto-detects such a VAE and decodes it the way VAE-Utils' own decode node does. There was also a v1.15.1 fix for a CustomVAE attribute error after ComfyUI 0.27.0 added new base-VAE attributes - if you hit that, update the pack.
Install
Part of the vsLinx pack. ComfyUI Manager → search "ComfyUI vsLinx Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/vslinx/ComfyUI-vslinx-nodes.git comfyui-vslinx-nodes
Restart, find it under vsLinx/sampling. It also answers to search terms like "hires fix", "tiled diffusion", "multidiffusion" and "tiled upscale". No dependencies.
The honest take
This is arguably the most useful node in the pack - it's the "just works on anything" tiled refiner, and the seam-free property is a genuine upgrade over per-tile approaches on big hires jobs. The trade is that it holds the full latent plus tiles, so it uses a bit more VRAM than the absolute-floor per-tile methods; that's exactly what vae_decode_tiled exists to offset. Set denoise low, don't expect it to upscale on its own, and you've got a clean replacement for half the tiled-upscale graphs in the wild.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 7.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 0.500–1 | Denoise strength. For a tiled hires-fix on an already-upscaled image keep this low (e.g. 0.3-0.5). |
| rows | INT | 21–256 | — |
| columns | INT | 21–256 | — |
| overlap | FLOAT | 0.000–0.5 | Overlap between tiles as a fraction of tile size, added on top of overlap_x/overlap_y. |
| overlap_x | INT | 640–8192 | Extra horizontal overlap in pixels. |
| overlap_y | INT | 640–8192 | Extra vertical overlap in pixels. |
| vae_decode_tiled | BOOLEAN | false | Decode the final full-image latent in tiles instead of one pass, to avoid a single huge VAE decode that can spike VRAM (or, on Windows, spill into slow shared system memory). The decode is a single full-image pass independent of rows/columns, so adding tiles won't shrink it - enable this instead. |
| vae_decode_tile_size | INT | 51264–4096 | Tile size in pixels for the tiled VAE decode. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |