LLS Upscale Switcher
Pick your upscaler at runtime instead of rebuilding the graph
- image
- image
- upscale_info
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 viainterpolation, at yourscale. 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 inComfyUI/models/upscale_models/) via spandrel and runs it with tiled inference.tile(default 512) andoverlap(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 asupscale_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 anIMAGEinput it can't work (it needs a latent to operate on), so the node falls back to interpolation and records a warning inupscale_inforather than erroring. That's a design decision worth knowing: this node is pixel-space only, and thelatent_upscaleoption 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_modelmode 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. Readupscale_info. - Picking
latent_upscaleon anIMAGEinput 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
tileto 256 and keepoverlapat 32–64 to avoid OOM on 4× model upscales of large images.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mode | COMBO | interpolation | 6 options: none, interpolation, upscale_model, latent_upscale, tile_upscale, pytorch |
| scale | FLOAT | 2.00.1–8 | — |
| interpolation | COMBO | bilinear | 4 options: nearest, bilinear, bicubic, area |
| model_name | COMBO | 1 options: (no upscale models found) | |
| tile | INT | 512128–2048 | — |
| overlap | INT | 320–256 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| upscale_info | STRING | — |