๐ Smart Ultimate SD Upscale (No Upscale)
Ultimate SD Upscale in ComfyUI, but every tile can get its own prompt
- upscaled_image
- model
- conditionings
- negative
- vae
- IMAGE
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.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| upscaled_image | IMAGE | โ | |
| model | MODEL | โ | |
| conditionings | CONDITIONING_LIST | โ | |
| negative | CONDITIONING | โ | |
| vae | VAE | โ | |
| seed | INT | 00โ18446744073709550000 | โ |
| steps | INT | 201โ10000 | โ |
| cfg | FLOAT | 8.000โ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.200โ1 | โ |
| mode_type | COMBO | 3 options: Linear, Chess, None | |
| tile_width | INT | 51264โ8192 | โ |
| tile_height | INT | 51264โ8192 | โ |
| mask_blur | INT | 80โ64 | โ |
| tile_padding | INT | 320โ8192 | โ |
| seam_fix_mode | COMBO | 4 options: None, Band Pass, Half Tile, Half Tile + Intersections | |
| seam_fix_denoise | FLOAT | 1.000โ1 | โ |
| seam_fix_width | INT | 640โ8192 | โ |
| seam_fix_mask_blur | INT | 80โ64 | โ |
| seam_fix_padding | INT | 160โ8192 | โ |
| force_uniform_tiles | BOOLEAN | true | โ |
| tiled_decode | BOOLEAN | false | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | โ |