Ultimate SD Upscale+ (tile skip, high-pass noise)
The tiled upscaler, bundled, with a float16 upscale step and flat-tile skipping
- image
- model
- positive
- negative
- vae
- upscale_model
- IMAGE
Ultimate SD Upscale, with two ideas bolted on
Ultimate SD Upscale has been the default answer to "I want a bigger image than my VRAM allows" since the A1111 days: split the canvas into overlapping tiles, img2img each one, blend the overlaps. It's still the pragmatic choice in ComfyUI for 4K+ outputs on a small card, and the pack bundles a copy of it - so you do not need to install ComfyUI_UltimateSDUpscale separately. If both are installed they run independently, which is fine but means you should know which one you're dropping into the canvas.
What's added on top: two optional inputs, both off at 0, and a different upscale step.
tile_skip_threshold - a tile whose source pixels are flat (low Laplacian variance, no sharp edge) isn't redrawn. Sky, plain walls, a flat background. That's where tiled upscaling wastes most of its time and where the model has least to add. 1.0–2.0 is the suggested range.
highpass_noise_strength - the colour-drift fix. Each tile's initial noise loses a fraction of its low frequencies via a Gaussian blur, which stops the tiles from settling on slightly different overall colour or brightness. If you've ever seen a mosaic of subtly different greys where a background used to be smooth, this is the dial. 0.6–0.8 suggested.
Taken together, the author's claim is that with little VRAM this is the faster upscale - 52s and 65s per image at a 4GB and 2GB limit, against 61s and 74s untiled, on a 4060. Modest, but in the right direction, and tiled is the only option at 2GB anyway.
How it works
It's the same tile loop as upstream: upscale the image with your ESRGAN model, then for each tile crop with padding, encode, denoise at denoise, decode, and mask-blend back into the canvas, with an optional seam-fix pass afterwards. The two additions hook specific points - the flatness test runs before a tile is queued, and the noise filter is applied to the seeded noise before sampling.
One deviation worth knowing before you compare against a picture you made last week: the upscale model runs in float16 by default. That's the 13.0 → 5.8 second difference the author measured with 4x-UltraSharp, and it moves the output slightly (LPIPS 0.012 - looks the same). With both additions at 0 and WEIGHTFERRY_USDU_UPSCALE_DTYPE=float32, the output is the original node's, byte for byte. If you need that, you need both.
The inputs that matter
There are 26 required inputs here, because it's a faithful copy of upstream. You don't tune most of them; these are the ones that decide the result:
image,model,positive,negative,vae,upscale_model- the usual six.upscale_by(2.0) - the factor. 2 is standard; going to 4 in one shot will chew through tiles and time.denoise(0.2) - how much each tile is repainted. This is the single most consequential field. Push it up and tiles invent detail; push it to 0 and you've built an expensive no-op.tile_width/tile_height(512) andtile_padding(32) /mask_blur(8) - the tiling geometry. Let the pack's USDU Tile Calculator set these from your aspect ratio instead of guessing.steps,cfg,sampler_name,scheduler,seed- per-tile sampling. Pair with the pack's Sampler Choice if you want one setting across all passes.mode_type(Linear / Chess / None),seam_fix_mode,force_uniform_tiles,tiled_decode,batch_size- the seam-fix block exists for a reason but most people leave it atNoneand fix seams with padding andmask_blurinstead.tile_skip_threshold(0 = off) andhighpass_noise_strength(0 = off) - the two additions, both optional sockets.
One output, IMAGE.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/nyanmi-1828/ComfyUI-WeightFerry
Manager → WeightFerry also works. Nothing extra to pip install for the basic path; the fused upscale kernels want NVIDIA + cuDNN and Triton. ComfyUI 0.38.0+.
Where it goes wrong
Turn both additions on and judge the node. They change the image by design, and so does the float16 upscale step. If your first run looks different from the community USDU you've used for months, that's three changes at once. Start at 0/0, compare, then add one.
Flat-tile skipping on detailed images. tile_skip_threshold at 1.0 on a busy photo does nothing, which is correct - but at 5.0 you'll start skipping tiles that needed redrawing, and the result is an image with patches of upscaled-but-not-diffused content. Anime with flat colour regions is the ideal case here; dense texture is not.
High-pass noise as a cure-all. It fixes inter-tile colour drift. It does not fix tile content divergence, which is what a missing ControlNet Tile or too-high denoise causes. If your seams look like different pictures rather than different tints, lower denoise.
Expecting it to be faster than untiled at every VRAM level. The tile loop has overhead. At 8GB where the whole-image redraw fits comfortably, untiled can win. The author's numbers are at 4GB and 2GB limits - that's the regime where this pays.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The image to upscale. | |
| model | MODEL | The model to use for image-to-image. | |
| positive | CONDITIONING | The positive conditioning for each tile. | |
| negative | CONDITIONING | The negative conditioning for each tile. | |
| vae | VAE | The VAE model to use for tiles. | |
| upscale_by | FLOAT | 2.000.05–4 | The factor to upscale the image by. |
| seed | INT | 00–18446744073709550000 | The seed to use for image-to-image. |
| steps | INT | 201–10000 | The number of steps to use for each tile. |
| cfg | FLOAT | 8.000–100 | The CFG scale to use for each tile. |
| sampler_name | COMBO | The sampler to use for each tile. | |
| scheduler | COMBO | The scheduler to use for each tile. | |
| denoise | FLOAT | 0.200–1 | The denoising strength to use for each tile. |
| upscale_model | UPSCALE_MODEL | The upscaler model for upscaling the image. | |
| mode_type | COMBO | The tiling order to use for the redraw step. | |
| tile_width | INT | 51264–8192 | The width of each tile. |
| tile_height | INT | 51264–8192 | The height of each tile. |
| mask_blur | INT | 80–64 | The blur radius for the mask. |
| tile_padding | INT | 320–8192 | The padding to apply between tiles. |
| seam_fix_mode | COMBO | The seam fix mode to use. | |
| seam_fix_denoise | FLOAT | 1.000–1 | The denoising strength to use for the seam fix. |
| seam_fix_width | INT | 640–8192 | The width of the bands used for the Band Pass seam fix mode. |
| seam_fix_mask_blur | INT | 80–64 | The blur radius for the seam fix mask. |
| seam_fix_padding | INT | 160–8192 | The padding to apply for the seam fix tiles. |
| force_uniform_tiles | BOOLEAN | true | Force all tiles to be the same as the set tile size, even when tiles could be smaller. This can help prevent the model from working with irregular tile sizes. |
| tiled_decode | BOOLEAN | false | Whether to use tiled decoding when decoding tiles. |
| batch_size | INT | 11–4096 | The number of tiles to process in a batch. Higher values can reduce processing time but use more VRAM. Yields different results than individual tiles. Only affects the main redraw step, not the seam fix step. |
| tile_skip_thresholdopt | FLOAT | 0.00–50 | Skip flat tiles: a tile whose Laplacian variance x 1e4 is below this (and has no sharp edge) is not redrawn. 1.0-2.0 suggested; 0 = off |
| highpass_noise_strengthopt | FLOAT | 0.000–1 | Remove this fraction of the low frequencies from each tile's initial noise, against colour / brightness drift between tiles. 0.6-0.8 suggested; 0 = off |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | The final upscaled image. |