Tiled Super Resolution
Upscale past your VRAM limit without a crash
- image
- upscale_model
- ui_widget
- image
- image_list
- stats
You have a great 2K render and you want it at 8K for print, but your GPU laughs at you the moment the whole image hits the upscale model. That's the exact job LF_TiledSuperRes exists for: it slices the image into overlapping tiles, runs your upscale model on each tile, blends them back together, and - the part people don't expect - it estimates VRAM first and quietly collapses to a single tile when the whole image would have fit anyway. It's the tiled upscaler from the lf-nodes image family, and it's a "more pixels" tool, not a "more detail" tool.
That last distinction matters. This node runs a spandrel upscale model (the same ones ComfyUI's core UpscaleModelLoader hands you - RealESRGAN, 4x-UltraSharp, Remacri and friends). Those are ESRGAN-family pixel upscalers: fast, deterministic, hallucinate nothing. If you want to invent detail that was never there, that's the generative world (SeedVR2, SUPIR) and this is the wrong node. If your source is already sharp and you just need it bigger without your VRAM tapping out, this is the right one - exactly the "more pixels vs more detail" fork the upscaling knowledge base keeps hammering.
How it works
It plans a tile grid (the tile_count input is an approximate number of tiles - it even rounds odd counts up so you get clean overlap), runs the model on each tile with a blend mask so the seams don't show, accumulates into a float32 canvas, and applies an optional unsharp pass at the end. Before it starts it computes a memory estimate: model size plus input tiles plus output plus a 64MB safety margin, and if it won't fit it frees VRAM first. If the whole image fits in memory, the plan collapses to one tile and you pay no tiling overhead at all. That's why the same node can feel instant on a small image and careful on a giant one.
The inputs that matter
- image (IMAGE) - the image or image list to upscale.
- upscale_model (UPSCALE_MODEL) - a preloaded spandrel model from ComfyUI's
UpscaleModelLoader. Required; without it the node raises immediately. - target_long_edge (INT, default 2048, 0–16384) - the longest edge you want after upscaling. Set 0 to use the model's native scale (e.g. 4x for a 4x model). If your target is smaller than the model's native output, the node scales up to whichever is larger.
- tile_count (INT, default 4, 1–32) - roughly how many tiles to work in. Fewer tiles = bigger tiles = faster but thirstier; more tiles = safer on low VRAM but more seam-blending work.
- sharpen (FLOAT, 0–1, default 0) - an unsharp amount applied after blending. A cheap way to compensate for the slight softness tiled upscaling can introduce.
Outputs are image, image_list, and a stats JSON with the process details - tile counts, timings, sizes - for the observant among us.
Install
Part of lf-nodes:
- ComfyUI Manager: search "LF Nodes", install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/lucafoscili/lf-nodes.git, restart.
No bundled model - you download the upscale model you want (4x-UltraSharp is the usual first stop) and load it with ComfyUI's UpscaleModelLoader.
Common issues
- "OOM anyway." Lower tile_count won't help - that increases tile size. You want more, smaller tiles, so raise tile_count. If it still dies, the node's free-memory call can't conjure VRAM that doesn't exist; drop target_long_edge or use a smaller model.
- "It looks soft / has seams." Turn on a little sharpen (0.2–0.4) to fix softness, and check tile_count isn't absurdly high - excessive tiling with too much overlap can soften edges. The node's built-in sharpen exists precisely for this.
- "Why didn't it go to 8K?" Because you set a target below the model's native output, or left
target_long_edgeat 2048. Remember it uses the larger of native scale and your target - if you want 8K, set the target accordingly. - Not the node for adding detail. If the source is soft and you want it rebuilt, reach for a generative upscaler instead. This node is honest about its job: more pixels.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image or image list to upscale. | |
| upscale_model | UPSCALE_MODEL | Preloaded spandrel upscaling model. | |
| target_long_edge | INT | 20480–16384 | Desired longest edge after upscaling. Set 0 to use the model's native scale. |
| tile_count | INT | 41–32 | Approximate number of tiles to process. Collapses to a single tile when the whole image fits in memory. |
| sharpen | FLOAT | 0.000–1 | Optional unsharp-mask amount applied after blending. |
| ui_widgetopt | LF_COMPARE | [object Object] | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Upscaled image tensor. |
| image_list | IMAGE | List of upscaled image tensors. |
| stats | JSON | Statistics about the upscaling process. |