🔍 Upscaler Advanced
The tile-grid calculator that lets you upscale huge images on a small GPU
- image
- upscale_model
- latent
- image
- tiles
- upscale_by
- denoise
- tile_width
- tile_height
- mask_blur
- tile_padding
- overlap
- width
- height
- tile_cols
- tile_rows
- tile_count
- latent_w
- latent_h
- info
- warnings
- latent
- latent_tiles
- layout
Want to upscale a 1024px image to something print-sized on a 6GB card? The trick, as old as tiled upscaling itself, is to not do it all at once: cut the target into overlapping tiles, process each one, stitch them back with feathered seams. The hard part has always been the boring arithmetic - how many tiles, how much overlap, what shape, whether the latent matches the pixel grid. FiL Upscaler Advanced is a tile-grid calculator that does all of it, and if you connect an upscale model, it'll actually upscale the pixels too.
It's the anchor of the FiL Design ImageMind pack's upscale pipeline: plan the grid here, process the tiles, recombine with the pack's Tile Assembly node.
How it works
Give it an image (and optionally a latent to resize and tile 1:1 alongside it), set an upscale_factor, and it computes a tile-aligned target size, then lays out the grid. The geometry is real, not cosmetic: target dimensions are aligned to a 64px grid, the grid step is tile − overlap, overlap is clamped at half a tile so the tile count can't explode, and edge tiles shift inward to stay full-size instead of being zero-padded - so no black strips along the edges. If you feed a latent, it's resized with bislerp, which is the correct choice there - lanczos is an RGB-specific interpolation and doesn't belong in latent space.
The inputs that matter:
upscale_factor- 2.0 doubles the size. This is the master dial.tile_size/tile_overlap- the manual knobs. Bigger tiles = fewer seams but more VRAM per pass; more overlap = cleaner blends but more tiles.auto_overlapderives overlap from tile size (~12.5%) so it stays proportional when you changetile_size.auto_mode+auto_profile- the lazy path: pick Low VRAM, Balanced, High VRAM, Max Quality, or Ultra Quality, and it chooses tile size, overlap, and even adenoisehint for your downstream sampler.upscale_model- optional. Connect an ESRGAN-style model from yourupscale_modelsfolder and theimageoutput is actually upscaled through it. Leave it disconnected and the node becomes calculator-only -imagepasses through unchanged.
That last one is the key insight: the node is useful in both modes. With no model it's a planner that emits a full numeric plan for downstream nodes; with a model it's a real upscaler.
The outputs you'll actually wire
21 outputs sounds intimidating; you use about four. tiles is a batch of the actual cropped pieces - feed those (or latent_tiles) into per-tile processing, which is where the tiled-upscale magic happens. layout is the per-tile rectangle map, and it's the one you must feed into FiL Tile Assembly to recombine - that's what tells the assembler where the feathered seams go, so always use the same layout that produced the tiles. The numeric outputs (upscale_by, denoise, tile_width, tile_height, overlap, tile_count) exist so you can feed them into external tiled-sampler stacks - Ultimate SD Upscale-style downstream nodes read exactly this kind of plan. And warnings tells you when the grid left a thin edge tile, which is why auto_fix_thin_edges exists.
If you ever want to do this whole thing with a tile ControlNet keeping each tile faithful - the classic "tile diffusion" workflow - this planner is the grid half; your ControlNet does the faithful half.
Installing it
Ships in FiL Design ImageMind (MIT). ComfyUI Manager: search FiL_Design_ImageMind, or:
cd ComfyUI/custom_nodes
git clone https://github.com/FiL-Design-Ai/FiL_LLM FiL_Design_ImageMind
pip install -r FiL_Design_ImageMind/requirements.txt
Restart; it's under 🎨 FiL Design/Image. ComfyUI 0.3.60+, Python 3.10+, light dependencies. It doesn't ship upscale models - it reads your existing models/upscale_models folder - so grab a 4x ESRGAN (4x-UltraSharp or a Remacri-class model are the usual picks) if you want actual pixel upscaling.
Gotchas
The number-one confusion: "the tile count looks wrong." It's usually right - overlap grows the count by design, since step = tile − overlap. If you want a fixed count, pin manual_tile_cols and manual_tile_rows and the grid holds exactly that, growing the tile instead. Second: at least one of image or latent is required, or the node raises - source dimensions come from whichever you connected. And remember: no upscale_model, no actual upscaling. The most common "this node does nothing" report is really "I forgot to connect the model."
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| upscale_factor | FLOAT | 2.000.1–8 | Upscale multiplier. 2.0 = double the size. |
| tile_size | INT | 102464–2048 | Base tile size in pixels for tiled upscale. |
| tile_overlap | INT | 640–512 | Tile overlap in pixels. Higher = fewer seams, more VRAM. |
| auto_overlap | BOOLEAN | false | Ignore tile_overlap and derive it automatically from the tile size (~12.5%, min 32px) instead — keeps overlap proportional when you change tile_size. No effect when Full Auto is on (it already derives its own overlap). |
| auto_mode | BOOLEAN | false | Full Auto: automatically choose tile settings based on profile. |
| auto_profile | COMBO | Balanced | VRAM/quality profile for auto mode. |
| manual_tile_cols | INT | 00–64 | Force this many tile columns. 0 = compute from tile size. |
| manual_tile_rows | INT | 00–64 | Force this many tile rows. 0 = compute from tile size. |
| non_square_tiles | BOOLEAN | false | Enable non-square tiles with aspect-ratio awareness. |
| auto_fix_thin_edges | BOOLEAN | false | In Manual Tiles mode, shrink tile_size to the next standard size (1536/1024/768 → 512) instead of just warning when the grid would leave a thin edge tile. At 512 (smallest standard) it can't shrink further — the thin edge is then handled downstream by overlap/mask_blur. Does not affect an explicit manual column/row grid. |
| imageopt | IMAGE | Input image to analyze. Optional if latent is connected instead — at least one of image/latent is required; source dimensions come from whichever is connected. | |
| upscale_modelopt | UPSCALE_MODEL | Optional ESRGAN-style model. When connected, the image output is actually upscaled through it (then resized to the tile-aligned target). When left unconnected, image is passed through unchanged and this node is calculator-only. | |
| latentopt | LATENT | Optional latent to resize/tile alongside (or instead of) the image. When connected, the latent output is resized (bislerp) to the tile-aligned target and latent_tiles gets one crop per tile. Can stand in for image entirely — at least one of image/latent is required. |
Outputs (21)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Actually upscaled when upscale_model is connected, otherwise the input image passed through unchanged. Empty placeholder when no image is connected (latent-only mode). |
| tiles | IMAGE | Batch of the actual cropped tile pieces (edge tiles shifted inward to stay full-size, no black padding). Empty placeholder when no image is connected (latent-only mode). |
| upscale_by | FLOAT | Actual upscale ratio. |
| denoise | FLOAT | Denoise hint. |
| tile_width | INT | Tile width. |
| tile_height | INT | Tile height. |
| mask_blur | INT | Mask blur radius. |
| tile_padding | INT | Tile padding. |
| overlap | FLOAT | Effective tile overlap in pixels (after clamping/auto-profile) — the average of the per-axis overlap, which can be a fractional pixel when axes differ (non_square_tiles). |
| width | INT | Output width. |
| height | INT | Output height. |
| tile_cols | INT | Tile columns. |
| tile_rows | INT | Tile rows. |
| tile_count | INT | Total tile count. |
| latent_w | INT | Latent width. |
| latent_h | INT | Latent height. |
| info | STRING | Info string. |
| warnings | STRING | Warnings string. |
| latent | LATENT | Input latent resized to the tile-aligned target (bislerp). Empty placeholder when no latent is connected. |
| latent_tiles | LATENT | Batch of latent crops, one per image tile (same grid/order as `tiles`). Empty placeholder when no latent is connected. |
| layout | FIL_TILE_LAYOUT | Tile-grid layout (exact per-tile positions) — wire into FiL Tile Assembly to recombine processed tiles. Always the real computed grid, independent of image/latent connection. |