Nodes/ComfyUI-WeightFerry/Ultimate SD Upscale+ (tile skip, high-pass noise)
ComfyUI Node

Ultimate SD Upscale+ (tile skip, high-pass noise)

The tiled upscaler, bundled, with a float16 upscale step and flat-tile skipping

By nyanmi-1828·Created 10 days ago·Updated 7 days ago· 1
Ultimate SD Upscale+ (tile skip, high-pass noise)
  • image
  • model
  • positive
  • negative
  • vae
  • upscale_model
  • IMAGE
◄upscale_by2.00►
◄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►
◄batch_size1►
◄tile_skip_threshold0.0►
◄highpass_noise_strength0.00►

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) and tile_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 at None and fix seams with padding and mask_blur instead.
  • tile_skip_threshold (0 = off) and highpass_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.

CategoryWeightFerry/upscale

Inputs (28)

NameTypeDefaultDescription
imageIMAGEThe image to upscale.
modelMODELThe model to use for image-to-image.
positiveCONDITIONINGThe positive conditioning for each tile.
negativeCONDITIONINGThe negative conditioning for each tile.
vaeVAEThe VAE model to use for tiles.
upscale_byFLOAT2.000.05–4The factor to upscale the image by.
seedINT00–18446744073709550000The seed to use for image-to-image.
stepsINT201–10000The number of steps to use for each tile.
cfgFLOAT8.000–100The CFG scale to use for each tile.
sampler_nameCOMBOThe sampler to use for each tile.
schedulerCOMBOThe scheduler to use for each tile.
denoiseFLOAT0.200–1The denoising strength to use for each tile.
upscale_modelUPSCALE_MODELThe upscaler model for upscaling the image.
mode_typeCOMBOThe tiling order to use for the redraw step.
tile_widthINT51264–8192The width of each tile.
tile_heightINT51264–8192The height of each tile.
mask_blurINT80–64The blur radius for the mask.
tile_paddingINT320–8192The padding to apply between tiles.
seam_fix_modeCOMBOThe seam fix mode to use.
seam_fix_denoiseFLOAT1.000–1The denoising strength to use for the seam fix.
seam_fix_widthINT640–8192The width of the bands used for the Band Pass seam fix mode.
seam_fix_mask_blurINT80–64The blur radius for the seam fix mask.
seam_fix_paddingINT160–8192The padding to apply for the seam fix tiles.
force_uniform_tilesBOOLEANtrueForce 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_decodeBOOLEANfalseWhether to use tiled decoding when decoding tiles.
batch_sizeINT11–4096The 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_thresholdoptFLOAT0.00–50Skip 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_strengthoptFLOAT0.000–1Remove 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)

NameTypeDescription
IMAGEIMAGEThe final upscaled image.