Upscale Model Advanced (Muse)
One node for 'bigger, to an exact size, without dying on VRAM'
- image
- IMAGE
- width
- height
Upscale Model Advanced (Muse) is the node that bothers to finish the job. Stock ComfyUI runs a 2x ESRGAN model and hands you a 2x image - and then you still reach for a separate resize node because 2x isn't the size you actually wanted. This one fuses load-model, tiled upscale and exact resize into a single step, then throws in precision control, offloading and a result cache. It is workflow glue, not a new upscaler, and knowing that is half the review.
Before anything: this is the "more pixels" job, not the "invent detail" job. Point it at an ESRGAN-class .pth from models/upscale_models and you get bigger, period - no hallucination, no face-rewriting. If you're after SeedVR2/SUPIR-style added detail, this isn't that tool, and using it that way is a category error. Where it earns its keep is the tail of a multi-stage pipeline: after your hi-res fix and detail passes, land on a specific print or frame size in one clean node.
How it works
The clever bit is what it doesn't reimplement. The author built it entirely on ComfyUI's own core - the same UpscaleModelLoader and ImageUpscaleWithModel you'd wire by hand, plus comfy.utils.tiled_scale for tiling. The scale factor is read from the model's own .scale attribute (exactly what stock uses), with a filename guess only as a last-resort fallback. Then:
- It computes the target size from your multiplier or fixed dimensions.
- Runs the model tiled, with blended tile edges so there are no seam lines.
- If the model's native output doesn't match the target, it Lanczos-resizes to hit it exactly.
The standout behavior is OOM tolerance. ComfyUI's tiled upscale can throw on a big image; this node wraps the pass in a retry loop that halves the tile on a CUDA out-of-memory error and tries again, down to a floor of 128px. A run that would have died on a mid-range card instead slows down and succeeds. auto precision means fp16 on CUDA, bf16 elsewhere, and the model loads through ComfyUI's own memory manager so it coordinates with whatever else is resident instead of fighting it.
The inputs that matter
use_fixed_resolution+fixed_width/fixed_heightvsoutput_multiplier- the whole point of the node. Off (default),output_multipliersizes relative to the original input. On, you get exact dimensions. The trap: the multiplier is independent of the model's native scale. A 4x model at multiplier2.0gives you 2x total, not 8x. People burn real time on this one.tile_count(1/4/8/16) - starting tile grid per side;1is a single pass. Crank it on low VRAM; the auto-shrink covers you either way.precision,batch_size,offload_model,disable_cache- VRAM and reprocessing levers. Leave them alone until you hit a wall.
Outputs are IMAGE plus width and height ints, which are handy to wire into downstream resolution math or video pipelines. One real gotcha on fixed mode: it does not preserve aspect ratio - it Lanczos-stretches to exactly width×height. Feed it an image whose aspect matches, or you'll get a politely squashed result.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/muse-collective-26/Muse-Upscale-Advanced
Restart ComfyUI (or use Manager and search "Muse Upscale Advanced"). That's the whole install - the README is honest about having no third-party dependency, just ComfyUI core. The real requirement is the model: nothing is bundled, so put your own ESRGAN weights in ComfyUI/models/upscale_models (4x-UltraSharp, Remacri, RealESRGAN x4plus all work) or the dropdown comes up empty.
Troubleshooting
- Empty model dropdown - no
.pthinmodels/upscale_models. That's the whole story. - It seems to "run" every time even with identical inputs - the node reports itself always-changed (
IS_CHANGEDreturns NaN), so ComfyUI re-invokes it, but a small in-memory cache (about 5 results, keyed on your image plus every setting) short-circuits the actual model pass. Flipdisable_cachewhen you're tuning and genuinely want a reprocess. - Output squashed or stretched - fixed resolution hit an aspect mismatch. Use the multiplier mode or match dimensions yourself.
Honest verdict: this is a tidy, well-commented single-node pack from a publisher with essentially no community footprint yet (searching for it surfaces nothing), and there's no magic inside - if you only ever run a 2x model at 2x with stock nodes, you don't need it. You want it when the exact output dimension is the actual requirement and your card can't take a full-size pass. For that, it's genuinely nicer than chaining four stock nodes.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| upscale_model_name | COMBO | Select upscale model from models/upscale_models folder | |
| use_fixed_resolution | BOOLEAN | false | Enable to use fixed width/height instead of a multiplier |
| output_multiplier | FLOAT | 1.000.25–8 | Final output size multiplier relative to the ORIGINAL input (1.0=same as input, 2.0=double input size) — independent of the upscale model's own native scale factor. |
| fixed_width | INT | 102464–8192 | Target width for the upscaled image (used when use_fixed_resolution is on) |
| fixed_height | INT | 102464–8192 | Target height for the upscaled image (used when use_fixed_resolution is on) |
| tile_count | COMBO | 1 | Starting tile grid per side (1=single pass). Tiles are blended at their edges and automatically shrunk further on a CUDA out-of-memory error, rather than failing outright. |
| precision | COMBO | auto | Processing precision (auto=fp16 on CUDA, bf16 elsewhere) |
| batch_size | INT | 11–16 | Number of images processed together per pass (lower = less peak VRAM) |
| offload_model | BOOLEAN | true | Offload model to CPU after processing to save VRAM |
| disable_cache | BOOLEAN | false | Disable caching to always reprocess images |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| width | INT | — |
| height | INT | — |