ComfyUI Node

TileSampler

Tiled diffusion that blends instead of showing you the seams

By lany42·Created 22 days ago·Updated 15 days ago· 0
TileSampler
  • model
  • positive
  • negative
  • latent_image
  • tile_plan
  • local_positive
  • latent
◄seed0►
◄steps20►
◄cfg8.0►
◄sampler_name▾►
◄scheduler▾►
◄denoise1.00►

TileSampler is a KSampler with four views. Same knobs in roughly the same order - seed, steps, cfg, sampler, scheduler, positive, negative, latent, denoise - plus a tile_plan, plus an optional local_positive. Output is an ordinary latent.

You reach for it for the reason tiled diffusion exists at all: the model has a native resolution ceiling. Push SDXL past 1024 and you start collecting twin torsos and duplicated anatomy, so the second pass is upscale-then-re-diffuse at moderate denoise. Tiled diffusion is that pass run on tiles instead of the whole image, and Mixture of Diffusers is the variant that blends them properly instead of stitching four independent images together and hoping.

How it actually samples

It doesn't loop a KSampler per tile. It clones your model, hooks two places in the native sampler, and lets one sampling trajectory run - same noise, same schedule, same solver state as a normal KSampler. On every denoiser evaluation it crops that single global latent four times, once per region, at the current sigma, calls the model on each crop with that tile's conditioning, then accumulates the four predictions into a full-canvas buffer weighted by an axis-separable Gaussian kernel, and divides by the summed weights. Normalized weights sum to one, so constants and prediction scale survive - that's the whole trick. Guidance is applied once, after fusion, on the fused branches - valid only because the scale is shared, and the docs say so plainly instead of overselling it.

Practical upshot: it costs roughly four denoiser passes per step, weighted by your tile size, and the maintainer measured around 10 ms of extra overhead per evaluation over 1 MP tiles on the SDXL path. Not free, not catastrophic.

The inputs that matter

  • tile_plan - from TilePlan, built from the same model and the same latent. Anything else is a stale plan and gets rejected by name.
  • denoise - 1.0 for a tiled generation pass from scratch; lower it for refinement of something you've already decoded and upscaled, where the usual 0.3–0.5 range for second-pass hires still applies. This is what the plan-refine-replan loop in the README is for.
  • steps / cfg / sampler_name / scheduler - checkpoint-appropriate. Both dropdowns read from your live ComfyUI registrations, so a saved workflow naming a sampler you've uninstalled errors instead of silently substituting. On a Turbo-style checkpoint, CFG 1 with ConditioningZeroOut is the expected pairing.
  • local_positive (optional) - four complete positives in TL/TR/BR/BL order, each of which replaces the entire global positive for its tile, including any ControlNet hints or Krea 2 references attached to it. TileKrea2Conditioning is the pack's producer for this. The author's warning is explicit: use a list producer, not ConditioningCombine.
  • negative - shared across all four views, never per-tile. At CFG 1 ComfyUI skips evaluating it unless a hook asks for it.

Output: latent. VAE Decode it, or upscale it and build a fresh plan for another pass.

Install

cd ComfyUI/custom_nodes
git clone https://git.colorized.life/tiled-diffusion-ng.git tiled-diffusion-ng
# restart ComfyUI

Manager: search Tiled Diffusion NG. No pip dependencies - the pack deliberately keeps dependencies = [] and lets ComfyUI own PyTorch, which also means it can't break your environment the way the usual requirements.txt-and-pray node pack does. You do need a recent ComfyUI (V3 node API) and Python 3.13+.

Where people get burned

  • It is not a VRAM magic trick. Four views instead of one sounds like a quarter of the memory, but a fixed tile count can't promise that on large canvases - tiles grow with the canvas, and full-canvas latents, accumulators and the weight denominator all stay resident.
  • Don't stack tiling systems. If the model already carries a tiling wrapper, or you've got a context_handler, a model_function_wrapper, or multi-GPU clones in the mix, the node refuses rather than producing something subtly wrong. Pick one tiling implementation per graph.
  • Describing the pack's reputation is hard, because there isn't one yet. Search the usual places for "Tiled Diffusion NG" and you get nothing - this is a September 2026 pack by one author, Lany Atwood, and its lineage is Mixture of Diffusers (the paper and reference implementation it credits) plus the long-settled idea that tiled Diffusion + Tile ControlNet is the reliable way to upscale realistically. "Mixture of diffusers" is what the community actually calls this family of fix, so that's the term to search if you go looking for settings advice. There is no crowd of users to copy from here; you're reading the source and the docs, which are honest about what's verified (SDXL visual validation, including Tile ControlNet) and what isn't.
  • Repeated application and re-entry are refused. Applying tiling twice, or reusing a plan across resolutions, fails loudly. Both of those error messages are the node being right.
CategoryTiled Diffusion NG

Inputs (12)

NameTypeDefaultDescription
modelMODEL—
seedINT00–18446744073709550000—
stepsINT201–10000—
cfgFLOAT8.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
positiveCONDITIONINGUsed for every view unless local_positive supplies four complete replacements.
negativeCONDITIONINGShared across all views. ConditioningZeroOut is supported and preserves reference metadata. ComfyUI skips negative evaluation at CFG 1 unless a hook requests it.
latent_imageLATENT—
denoiseFLOAT1.000–1—
tile_planTILE_PLAN—
local_positiveoptCONDITIONINGFour complete positives in TL/TR/BR/BL execution-list order. Each replaces the entire global positive, including Krea2 embeddings/references/method or SDXL controls. The supplied negative stays independent. Anima's MODEL LLLite patch remains active on evaluated branches. Use a list producer, not ConditioningCombine.

Outputs (1)

NameTypeDescription
latentLATENT—