Nodes/ComfyUI-ArchAi3d-Qwen/๐Ÿš€ Smart Ultimate SD Upscale (No Upscale)
ComfyUI Node

๐Ÿš€ Smart Ultimate SD Upscale (No Upscale)

Ultimate SD Upscale in ComfyUI, but every tile can get its own prompt

By amir84ferdosยทCreated 11 months agoยทUpdated 5 months agoยท 70
๐Ÿš€ Smart Ultimate SD Upscale (No Upscale)
  • upscaled_image
  • model
  • conditionings
  • negative
  • vae
  • IMAGE
โ—„seed0โ–บ
โ—„steps20โ–บ
โ—„cfg8.00โ–บ
โ—„sampler_nameโ–พโ–บ
โ—„schedulerโ–พโ–บ
โ—„denoise0.20โ–บ
โ—„mode_typeโ–พโ–บ
โ—„tile_width512โ–บ
โ—„tile_height512โ–บ
โ—„mask_blur8โ–บ
โ—„tile_padding32โ–บ
โ—„seam_fix_modeโ–พโ–บ
โ—„seam_fix_denoise1.00โ–บ
โ—„seam_fix_width64โ–บ
โ—„seam_fix_mask_blur8โ–บ
โ—„seam_fix_padding16โ–บ
โ—„force_uniform_tilestrueโ–บ
โ—„tiled_decodefalseโ–บ

Ultimate SD Upscale is the old reliable of tiled upscaling: split the image into overlapping tiles, run img2img on each, blend them back with feathered masks. It's how people push 4K+ prints on cards that can't hold the whole canvas at once. This node is a direct port of that A1111 script - the pack literally vendors the original ultimate_upscale.py - with one genuinely smart twist: it accepts a list of conditionings, one per tile. That's the "Smart" in the name, and it's the reason you'd reach for this over a generic USDU port.

The "(No Upscale)" suffix means this variant does not do the pixel upscale step itself. You hand it an already-upscaled image (upscaled_image) - the natural upstream is the pack's Smart Tile Solver V6.2, which computes the grid and hands you tile_width, tile_height, and overlap. If you'd rather the node handle the upscale internally, use the plain ArchAi3D_Smart_Ultimate_SD_Upscale instead.

How it works

Tiles are laid out row-major (left to right, top to bottom) and each is sampled at tile_width/tile_height plus tile_padding extra pixels of context, then blended with mask_blur feathering. mode_type picks the pass pattern: Linear (rows), Chess (checkerboard, halves the seam pressure), or None. seam_fix_mode adds a second targeted pass on the seams - Band Pass, Half Tile, or Half Tile + Intersections - which is where you go if you see visible tile boundaries. Everything before the sampler runs in image space, so the node VAE-encodes each tile right before sampling and decodes right after; that's inherited from USDU and it's normal.

The conditionings input is a CONDITIONING_LIST, and this is the whole point. If you're upscaling a 2ร—2 grid, you can feed four different positive prompts - one tile gets "textured stone wall detail," the next "polished concrete floor," and so on. The order is row-major, matching the tile processing order. If your list is shorter than the tile count it reuses the last entry, which is a graceful fallback but also a silent footgun if you miscounted.

The settings that matter

  • denoise (default 0.2) - the big lever. 0.15โ€“0.25 preserves the image; pushing past ~0.4 starts rewriting it. Go too low and you get no added detail.
  • tile_padding (default 32) - extra context per tile. 32โ€“64 is the sane zone; more context means better blending but more VRAM per pass.
  • seam_fix_mode + seam_fix_denoise (default 1.0) - turn this on when you see seams, and it's the first thing to disable when a tile pass is slow.
  • tiled_decode - set true if VAE decode itself OOMs on the final canvas.

Installing it

It's one of 100+ nodes in ComfyUI-ArchAi3d-Qwen (Amir Ferdos / ArchAi3d). ComfyUI Manager โ†’ search "ArchAi3d Qwen" โ†’ install โ†’ restart, or:

cd ComfyUI/custom_nodes
git clone https://github.com/amir84ferdos/ComfyUI-ArchAi3d-Qwen.git
cd ComfyUI-ArchAi3d-Qwen
pip install -r requirements.txt

The USDU family only needs torch/numpy/Pillow, which ComfyUI already provides. Note the dual license: free for personal and non-commercial work, paid license required if you're charging clients.

Common gotchas

Because the input is called upscaled_image, people assume any image works - it does, but if you skip the solver and feed a raw source, you're silently running at 1.0 scale, so keep upscale_by in mind (this variant fixes it at 1.0). Conditioning count โ‰  tile count is the classic silent failure; count your tiles before wiring a long conditioning list. And if the whole thing looks painterly, your denoise is too high for the sampler - USDU wants low denoise plus a good ESRGAN-model upscale upstream, not a mid-range one trying to do both jobs.

CategoryArchAi3d/Upscaling/USDU

Inputs (23)

NameTypeDefaultDescription
upscaled_imageIMAGEโ€”
modelMODELโ€”
conditioningsCONDITIONING_LISTโ€”
negativeCONDITIONINGโ€”
vaeVAEโ€”
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โ€”
mode_typeCOMBO3 options: Linear, Chess, None
tile_widthINT51264โ€“8192โ€”
tile_heightINT51264โ€“8192โ€”
mask_blurINT80โ€“64โ€”
tile_paddingINT320โ€“8192โ€”
seam_fix_modeCOMBO4 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โ€”

Outputs (1)

NameTypeDescription
IMAGEIMAGEโ€”