Nodes/ComfyUI vsLinx Nodes/MultiDiffusion Tiled Hires Fix
ComfyUI Node

MultiDiffusion Tiled Hires Fix

MultiDiffusion Tiled Hires Fix — seam-free tiled refining for any model, low VRAM

By vslinx·Created about a year ago·Updated 26 days ago· 25
MultiDiffusion Tiled Hires Fix
  • image
  • model
  • positive
  • negative
  • vae
  • image
seed0
steps20
cfg7.0
sampler_name
scheduler
denoise0.50
rows2
columns2
overlap0.00
overlap_x64
overlap_y64
vae_decode_tiledfalse
vae_decode_tile_size512

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.

CategoryvsLinx/sampling

Inputs (18)

NameTypeDefaultDescription
imageIMAGE
modelMODEL
positiveCONDITIONING
negativeCONDITIONING
vaeVAE
seedINT00–18446744073709550000
stepsINT201–10000
cfgFLOAT7.00–100
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
denoiseFLOAT0.500–1Denoise strength. For a tiled hires-fix on an already-upscaled image keep this low (e.g. 0.3-0.5).
rowsINT21–256
columnsINT21–256
overlapFLOAT0.000–0.5Overlap between tiles as a fraction of tile size, added on top of overlap_x/overlap_y.
overlap_xINT640–8192Extra horizontal overlap in pixels.
overlap_yINT640–8192Extra vertical overlap in pixels.
vae_decode_tiledBOOLEANfalseDecode 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_sizeINT51264–4096Tile size in pixels for the tiled VAE decode.

Outputs (1)

NameTypeDescription
imageIMAGE