Nodes/sweet-tea-nodes/Ultimate SD Upscale (Pose Tiled ControlNet)
ComfyUI Node

Ultimate SD Upscale (Pose Tiled ControlNet)

The tiled upscaler you reach for when seams and ghosting are eating your prints

By tea-time-labs·Created 6 months ago·Updated 17 days ago· 0
Ultimate SD Upscale (Pose Tiled ControlNet)
  • image
  • model
  • positive
  • negative
  • vae
  • upscale_model
  • custom_sampler
  • custom_sigmas
  • IMAGE
upscale_by2.00
seed0
steps20
cfg8.00
sampler_name
scheduler
denoise0.20
mode_typeLinear
tile_width512
tile_height512
mask_blur8
tile_padding32
seam_fix_modeNone
seam_fix_denoise1.00
seam_fix_width64
seam_fix_mask_blur8
seam_fix_padding16
force_uniform_tilestrue
tiled_decodefalse
lock_paddingtrue
noise_mask_blur0
blend_modenormalized

If you've ever pushed a big print through the classic Ultimate SD Upscale, you know exactly why this node exists: tile seams, ghost offsets, and that weird "third-color" band where the original image bleeds through the feather overlap. The classic tiled upscaler is still the community default for "arbitrary output size on 6GB VRAM" - the knowledge base calls tiled diffusion plus ControlNet Tile one of the most reliable photorealistic upscaling workflows going - but it shows its age in exactly these spots. This node is a from-scratch rework of that whole idea, and its whole pitch is that it fixes the artifacts instead of papering over them.

It's called Ultimate SD Upscale (Pose Tiled ControlNet), and the "pose" in the name matters. It's built for upscaling while a ControlNet is in the loop - pose maps, depth, tile hints - and it keeps those hints aligned per tile. Unlike the stock node, there's no ControlNet input socket: your pose/ControlNet hints ride inside the positive conditioning you already have, and the node crops and resamples them to the exact UNet latent size for every tile. That per-tile realignment is what kills the classic "shifted smaller overlay" ghost-offset bug.

How it works

Under the hood it's a full tiled pipeline, not a wrapper: per tile it computes the crop bounding box from the hard mask before blurring, encodes the cropped region, runs a masked KSampler, decodes, and stitches back. Three things make it different from the stock node:

  • Lockable padding. lock_padding (on by default) attaches a latent noise mask so the sampler only re-denoises the tile core. The overlap/padding around it stays frozen instead of getting re-solved into a slightly different color. In Linear mode it also applies a row-major frontier lock, so already-sampled tiles are never touched again.
  • Normalized overlap blending. Instead of sequential alpha-compositing (which leaks the base image into feather bands), it accumulates premultiplied RGB and weight, then divides. In regions covered by only one tile the tile wins outright - no base bleed-through.
  • Seam-fix passes. After the grid pass, seam_fix_mode lets you run a second masked diffusion over thin bands along the seams (Band Pass, Half Tile, or Half Tile + Intersections) to repair whatever ghosting the grid left behind.

There's also a fast path: when the mask covers the whole canvas with no padding or blur, it just does a plain encode → sample → decode, so it behaves like a normal img2img pass instead of faking tiles.

Inputs and outputs that matter

You'll actually set a handful of these. upscale_by (2.0) and denoise (0.2) - keep denoise low; this is detail upscaling, not regeneration, and above ~0.5 you're changing the composition. tile_width/tile_height (512) and tile_padding (32) are your VRAM dials. mode_type is Linear (default), Chess, or None. Turn on tiled_decode for very large images to save VRAM. The optional blend_mode defaults to normalized - leave it. Output is a single IMAGE, wired to a Save or preview node like any other.

Install

Same pack as the rest of Sweet Tea Nodes. In ComfyUI Manager search for Sweet Tea Nodes, install, restart. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/tea-time-labs/sweet-tea-nodes.git

The only real dependency is tqdm - no model files to download. It runs on whatever checkpoint, VAE, and upscaler you already have.

Common issues

Honest caveat: this is a young node from a small pack, so there's no deep community track record yet. Treat it as early but well-engineered. Grounded gotchas: keep tile sizes 8-aligned, drop to 512 tiles if VRAM complains, and enable tiled_decode for 4K+ work. The code bakes in a retry for transient model-management errors (a known VRAM/offload hiccup in ComfyUI), so a one-off list index out of range mid-upscale often self-heals. If output looks soft, raise denoise or swap in a stronger upscaler; if it looks re-painted, you've gone too high. Seams persisting? Turn on seam_fix_mode and increase tile_padding. Start at the defaults with lock_padding on - the author clearly tuned for that.

Categoryimage/upscaling

Inputs (30)

NameTypeDefaultDescription
imageIMAGE
modelMODEL
positiveCONDITIONING
negativeCONDITIONING
vaeVAE
upscale_byFLOAT2.000.05–4
seedINT00–18446744073709550000
stepsINT201–10000
cfgFLOAT8.000–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.200–1
upscale_modelUPSCALE_MODEL
mode_typeCOMBOLinear3 options: Linear, Chess, None
tile_widthINT51264–8192
tile_heightINT51264–8192
mask_blurINT80–64
tile_paddingINT320–8192
seam_fix_modeCOMBONone4 options: None, Band Pass, Half Tile, Half Tile + Intersections
seam_fix_denoiseFLOAT1.000–1
seam_fix_widthINT640–8192
seam_fix_mask_blurINT80–64
seam_fix_paddingINT160–8192
force_uniform_tilesBOOLEANtrue
tiled_decodeBOOLEANfalse
custom_sampleroptSAMPLER
custom_sigmasoptSIGMAS
lock_paddingoptBOOLEANtrue
noise_mask_bluroptINT0-1–256
blend_modeoptCOMBOnormalized2 options: sequential, normalized

Outputs (1)

NameTypeDescription
IMAGEIMAGE