Ultimate SD Upscale (FLS Accelerated)
Tiled upscaling with a foveated detail sampler swapped in
- image
- model
- positive
- negative
- vae
- upscale_model
- IMAGE
The stock Ultimate SD Upscale node has been ComfyUI's default answer to "how do I upscale to 4K without running out of VRAM" for years now: split the image into overlapping tiles, run the diffusion sampler on each one, stitch them back together with a seam-fix pass. This fork keeps that whole pipeline intact and swaps out exactly one thing - the sampler that denoises each tile. Instead of a plain KSampler call, it drops in FLSampler ("Foveated Latent Sampler," from a small side-pack by BlackSnowSkill), which is built to add texture where the image is already doing something interesting - skin, fabric, foliage - instead of sanding everything down uniformly. Reach for this node when you're already sold on tiled upscaling and want more of that fine texture out of the same pipeline, without switching your whole tiling engine.
Worth being straight about scale here: this is a niche fork of a fork, low install base, no big community thread to lean on if something looks off. If you just want the reliable, well-trodden path, plain Ultimate SD Upscale (ssitu's ComfyUI port of Coyote-A's original A1111 script) is still the safe default. This node is for once you've already got that working and want to try the detail-injection angle on top.
How it works
Tiling mechanics are identical to any Ultimate SD Upscale node: mode_type (Linear, Chess, or None) decides tile order, tile_width/tile_height and tile_padding set how the image gets cut up, and the seam_fix_* group runs a lighter second pass over tile boundaries if you see patchwork lines. What's different is per-tile denoising. Instead of one clean pass, FLSampler runs "differential latent analysis" to find high-activity regions of the latent, then layers unsharp masking for edge definition and stochastic noise injection for fine texture (pores, weave, grain) on top of that. Three knobs steer it: fovea_strength controls how much texture gets injected, sharpness controls edge definition, and mask_inertia smooths how the "in-focus" region moves between denoising steps so it doesn't jump around tile to tile. The upstream sampler's own docs recommend roughly 3–8 for fovea_strength and 0.3–1.0 for sharpness - the node's defaults (5 and 1) sit right in that band, so starting there is a reasonable call.
The inputs and outputs that matter
You feed it what you'd feed any img2img upscale: image, model, positive/negative conditioning, vae, and an upscale_model - an ESRGAN-family model, 4x-UltraSharp is the usual community pick. upscale_by sets the target multiplier (default 2x), and denoise (default 0.2) controls how much the tile pass is allowed to change the source - keep it on the low side, since tiled upscales are meant to add detail, not repaint the image. The three FLS knobs above are the actual reason to pick this node over the plain one. Everything else - seed, steps, cfg, sampler_name, scheduler, and the tiling/seam-fix group - behaves exactly like stock Ultimate SD Upscale. It outputs a single IMAGE.
How to install it
Through ComfyUI Manager, search "ComfyUI Ultimate SD Upscale FLS LLLite" and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Lebensignal/ComfyUI-UltimateSDUpscale-FLS-LLLite.git
Restart ComfyUI. One thing to know before your first run: on first import, the node creates a repositories/ultimate_sd_upscale folder and pulls the original Coyote-A A1111 script into it automatically if it isn't already there - which means your very first launch needs network access. If you're on an offline or firewalled box, grab Coyote-A/ultimate-upscale-for-automatic1111 yourself and drop its contents into ComfyUI/custom_nodes/ComfyUI-UltimateSDUpscale-FLS-LLLite/repositories/ultimate_sd_upscale before you disconnect.
Common issues & troubleshooting
Node fails to load or errors on first use. Almost always the auto-download step above - no network on first import, or GitHub is blocked. Vendor the Coyote-A script manually at the path above and restart.
Output looks over-sharpened or noisy. You're probably running fovea_strength or sharpness too hot. Pull fovea_strength toward the low end of its 3–8 sweet spot and sharpness toward 0.3–0.5 before touching anything else - the whole point of this node is texture that reads as real, not crunchy.
Tiles don't line up / visible seams. That's what seam_fix_mode is for, and it isn't doing anything at "None." Switch it to "Band Pass" or "Half Tile" and bump seam_fix_width/seam_fix_mask_blur if the seam is still visible.
Detail flickers between tiles. Raise mask_inertia toward its top end (0.9–0.99) so the "in-focus" region transitions more smoothly across denoising steps instead of jumping around between neighboring tiles.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| upscale_by | FLOAT | 2.000.05–4 | — |
| 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 | — |
| fovea_strength | FLOAT | 5.00–10 | — |
| sharpness | FLOAT | 1.000–3 | — |
| mask_inertia | FLOAT | 0.850–0.99 | — |
| upscale_model | UPSCALE_MODEL | — | |
| 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 | — |