Upscale using model adv (CRT)
Model upscaling with tiling, precision control, and exact output size
- image
- IMAGE
- width
- height
The stock "Upscale Image (using Model)" node gets the job done until it doesn't: big images blow past VRAM, you can't hit an exact target resolution, and every run redoes the same work. Upscale using model adv (CRT) is the CRT pack's version with the pain points addressed - tiling for big images, a multiplier or fixed-size mode, precision control, batch processing, model offloading, and a result cache so repeats are instant.
It's the "advanced" upscale node the KB's upscaling guide would approve of: it understands that there are two different jobs - "make this bigger without inventing detail" (an ESRGAN-style upscale model) versus "generate new detail" (tiled diffusion) - and this node is firmly in the first camp. Feed it a spandrel-loaded upscale model from your models/upscale_models folder and it upscales with real model inference, not interpolation.
The controls that matter
upscale_model_name- picks from whatever's inmodels/upscale_models(the pack uses ComfyUI's built-in spandrel-based upscale-model path, so your existing 4x models show up). Community favorites like 4x-UltraSharp or 4x_NMKD-Siax work unchanged.use_fixed_resolution+fixed_width/fixed_height- flip this on to upscale to an exact pixel size instead of by multiplier. This is the feature the stock node lacks, and it's the answer to "I need exactly 2048×2048 for this deliverable."output_multiplier- the multiplier path (1.0 = same as input, 2.0 = double, up to 8×).tile_count- "1" (no tiling), or 4/8/16 for a 4×4, 8×8, or 16×16 tile grid. This is the VRAM escape hatch: upscaling a 4K frame with one pass on a 12GB card is a coin flip; tiling keeps each pass small.precision-auto(fp16 on CUDA, fp32 on CPU), or force fp32/fp16/bf16.autois right 95% of the time.batch_size- process multiple images at once.offload_model- pushes the upscale model back to CPU after processing to free VRAM. On by default, leave it.disable_cache- the node caches results (keyed on a hash of the image + settings, capped at a few entries); turn this on only when testing or when you want fresh output.
Outputs are IMAGE, plus width and height ints - handy if the next node needs to know what size you ended up at.
Where it fits
End of pipeline, right before save or before a second generative pass. The typical production chain: render at base res → this node upscales with a sharp model to final size → optionally feed the result into a low-denoise refinement pass if you want generated detail (the KB's upscaling guide is explicit that a plain model upscale can't invent detail - that's a separate, diffusion-based step). If your output size is a hard requirement (print, spec, social platform), the fixed-resolution mode is the reason this node beats the stock one.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/PGCRT/CRT-Nodes.git
pip install -r requirements.txt
or ComfyUI Manager → search "CRT-Nodes". spandrel is in the requirements, so upscale-model support comes with the pack.
Gotchas
The tiling trade is real: tiles can show seams at aggressive sizes if the model isn't tile-aware - tile_count 4 is usually invisible, 16 starts to ask questions. The cache is a double-edged sword: it's keyed on a sample of the image plus settings, so genuinely different input images generally get different cache entries, but if you're comparing settings on the same image, remember disable_cache exists - otherwise your "changed" run returns the old result and you'll think nothing worked. And offload_model is great for VRAM but means the model reloads on the next run, which adds a beat of latency to batch work; turn it off if you're running many images in a row on a big card.
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 input (1.0=same as input, 2.0=double input size) |
| fixed_width | INT | 102464–8192 | Target width for the upscaled image |
| fixed_height | INT | 102464–8192 | Target height for the upscaled image |
| tile_count | COMBO | 1 | Number of tiles per side (1=no tiling, 4=4x4=16 tiles, 8=8x8=64 tiles, etc.) |
| precision | COMBO | auto | Processing precision (auto=fp16 on CUDA, fp32 on CPU) |
| batch_size | INT | 11–16 | Number of images to process simultaneously |
| offload_model | BOOLEAN | true | Offload model to CPU after processing to save VRAM |
| disable_cache | BOOLEAN | false | Disable caching to always reprocess images (useful for testing or varying results) |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| width | INT | — |
| height | INT | — |