Nodes/LLS-node/LLS Upscale Switcher
ComfyUI Node

LLS Upscale Switcher

Pick your upscaler at runtime instead of rebuilding the graph

By Gin3601·Created 3 months ago·Updated 3 months ago· 0
LLS Upscale Switcher
  • image
  • image
  • upscale_info
modeinterpolation
scale2.0
interpolationbilinear
model_name
tile512
overlap32

Upscaling is really two different jobs wearing the same name: adding pixels (fast, safe, interpolation) and adding detail (slow, generative, model-based). LLS Upscale Switcher bundles both into one node with a mode dropdown, so you can flip between them without rebuilding your graph - and, more usefully, so one workflow can do a cheap pass at 2× and a model pass later without you swapping nodes.

The honest framing, though: this is a convenience wrapper around things ComfyUI already has. The "pytorch" mode is just torch.nn.functional.interpolate, and "upscale_model" mode is ComfyUI's spandrel-based model loading (the same machinery behind core's UpscaleModelLoader). What the node adds is the switch itself, the tiling for VRAM safety, and an upscale_info JSON that reports what actually ran - including the warning when what you asked for silently became a fallback.

How it works

mode is the whole story:

  • none - pass the image through untouched. Useful for A/B comparisons in a shared workflow.
  • interpolation / pytorch - the same thing under two names: nearest/bilinear/bicubic/area upscale via interpolation, at your scale. Instant, no VRAM concern, adds no detail. This is the "more pixels" job from the upscaling doc - right for an already-sharp source, wrong for a soft one.
  • upscale_model - loads an ESRGAN-family model (4x-UltraSharp, RealESRGAN, anime variants, anything in ComfyUI/models/upscale_models/) via spandrel and runs it with tiled inference. tile (default 512) and overlap (default 32) control chunk size - smaller tiles use less VRAM, at the cost of speed and slightly more visible seams on misaligned tiles.
  • tile_upscale - the same spandrel model path as upscale_model, labeled separately. Worth knowing that the two share the model loader; the "tile" distinction is really about the tiling that both use.
  • latent_upscale - the one genuine trap: on an IMAGE input it can't work (it needs a latent to operate on), so the node falls back to interpolation and records a warning in upscale_info rather than erroring. That's a design decision worth knowing: this node is pixel-space only, and the latent_upscale option is there for a mode it can't actually run with the inputs it accepts.

Inputs that matter

image (required) plus scale (default 2.0), interpolation (default bilinear), model_name, tile, overlap. scale and interpolation only matter in the interpolation modes; model_name, tile, and overlap only matter in upscale_model mode. The mode default is chosen smartly: it ships as upscale_model when real models are detected in your folder, and drops to interpolation when none are - so the node is never dead on arrival.

Outputs

image (upscaled), and upscale_info - a JSON string recording the mode that actually ran, the requested mode, scale, and any fallback warning. That output is the anti-surprise: when latent_upscale silently becomes bilinear, the warning lives here, so a workflow that reads it can tell you why your "AI upscale" looks suspiciously clean.

Wiring it in

Load Image → LLSUpscale Switcher → Preview / Save Image

or insert it before a sampler's image input if you're upscaling as a pre-step for a detail pass.

Installing

ComfyUI Manager → search "LLS-node", or:

cd ComfyUI/custom_nodes
git clone https://github.com/Gin3601/LLS-node

Restart, find it under LLS/Upscale. The pack has no requirements.txt; the model mode uses spandrel, which ships with ComfyUI core. Model files are not included - for real model upscaling, drop an .pth/.safetensors ESRGAN checkpoint (4x-UltraSharp is the community default) into models/upscale_models/.

Gotchas

  • No model, wrong default - on purpose. With an empty upscale models folder, upscale_model mode falls back to interpolation with a warning. That's graceful, but it means you can run for weeks thinking you're model-upscaling when you're actually bilinear-ing. Read upscale_info.
  • Picking latent_upscale on an IMAGE input always falls back. If you want true latent upscaling, you need the latent version of this pipeline, which the node doesn't provide - stay in pixel space with it.
  • Big upscale with small VRAM: lower tile to 256 and keep overlap at 32–64 to avoid OOM on 4× model upscales of large images.
CategoryLLS/Upscale

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
modeCOMBOinterpolation6 options: none, interpolation, upscale_model, latent_upscale, tile_upscale, pytorch
scaleFLOAT2.00.1–8
interpolationCOMBObilinear4 options: nearest, bilinear, bicubic, area
model_nameCOMBO1 options: (no upscale models found)
tileINT512128–2048
overlapINT320–256

Outputs (2)

NameTypeDescription
imageIMAGE
upscale_infoSTRING