Nodes/ComfyUI-SUPIR/SUPIR Upscale (Legacy)
ComfyUI Node Runs on cloud

SUPIR Upscale (Legacy)

The one-node restore-and-upscale button

By kijai·Created 2 years ago·Updated 3 months ago· 2,303
SUPIR Upscale (Legacy)
  • image
  • upscaled_image
supir_model
sdxl_model
seed123
resize_methodlanczos
scale_by1.00
steps45
restoration_scale-1
cfg_scale4.00
a_prompthigh quality, detailed
n_promptbad quality, blurry, messy
s_churn5
s_noise1.003
control_scale1.00
cfg_scale_start4.00
control_scale_start0.00
color_fix_typeWavelet
keep_model_loadedtrue
use_tiled_vaetrue
encoder_tile_size_pixels512
decoder_tile_size_latent64
captions
diffusion_dtypeauto
encoder_dtypeauto
batch_size1
use_tiled_samplingfalse
sampler_tile_size1024
sampler_tile_stride512
fp8_unetfalse
fp8_vaefalse
samplerRestoreEDMSampler

This is the "just fix my photo" node. Plug in an image, pick your two checkpoints, hit run, get back something bigger and cleaner. Everything else in the pack - the loaders, the conditioner, the sampler, the VAE nodes - is what kijai split this single node into once the workflow matured. If you've ever seen a SUPIR workflow screenshot online with one giant box in the middle, this is almost always that box.

One thing to know going in, because it changes how much time you should spend here: the author has marked the whole pack final. SUPIR landed natively in ComfyUI core, and beyond breaking-bug fixes this repo is done getting updates. That doesn't mean it stops working - it means if you're starting a workflow from scratch today, it's worth a quick check of whether core's built-in SUPIR support covers what you need before reaching for this wrapper. This node is very much still usable; it's just not where new development is happening.

What it actually does

Under the hood SUPIR is an SDXL img2img pipeline with a custom ControlNet-style conditioner bolted on. The distinctive part is what happens before sampling: a "first stage" pass through SUPIR's own denoise-encoder VAE, which cleans up compression artifacts and blur - and yes, it often blurs the image in the process. That's expected, not a bug; it's restoration, not sharpening. This node runs that whole chain - encode, denoise, condition, sample, decode, color-fix - in one call.

That convenience has a real cost: because this node loads your SDXL checkpoint internally by filename rather than accepting an already-built model, you can't slot a LoRA loader in front of it. That's the entire reason the split loader nodes exist elsewhere in this pack.

Inputs and outputs that matter

The two you can't skip: supir_model and sdxl_model, both checkpoint pickers from your models/checkpoints folder - you need both a SUPIR checkpoint (SUPIR-v0Q for general use, SUPIR-v0F if your source has only light degradation) and a normal SDXL checkpoint. Beyond that:

  • image, seed, scale_by - the resize factor applied before generation; leave it at 1.0 and pre-size with another node if you want an exact pixel target.
  • steps, cfg_scale, restoration_scale, control_scale - the core sampler knobs; the defaults are sane starting points.
  • a_prompt / n_prompt - quality descriptors appended to positive/negative conditioning (default "high quality, detailed" / "bad quality, blurry, messy").
  • color_fix_type - Wavelet (default), AdaIn, or None. Wavelet corrects the color drift SDXL tends to introduce; leave it on unless you have a reason not to.
  • use_tiled_vae plus encoder_tile_size_pixels / decoder_tile_size_latent - memory controls for big images.
  • Optional extras: captions, diffusion_dtype, encoder_dtype, batch_size, use_tiled_sampling with its tile size/stride, fp8_unet, fp8_vae, and sampler (RestoreDPMPP2MSampler or RestoreEDMSampler).

Output is a single upscaled_image.

How to install it

Easiest path: ComfyUI Manager, search "SUPIR", install, restart. Manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-SUPIR
pip install -r ComfyUI-SUPIR/requirements.txt

Portable build: run the pip install with python_embeded\python.exe -m pip install -r ... from the portable root. You'll want a reasonably current PyTorch; xformers is optional and auto-detected if present.

Then grab the models. The SUPIR checkpoint (pruned safetensors versions live on Kijai's HuggingFace, Kijai/SUPIR_pruned) and a standard SDXL checkpoint both go in ComfyUI/models/checkpoints.

Common issues

VRAM tracks your input resolution, not the output size - scale_by just scales after that memory decision is already made. The author reports 512→1024 fitting on a 10GB 3080, and up to 3072×3072 on 24GB. System RAM matters too; expect trouble under 32GB, 64GB was the tested baseline. fp8_unet is a legitimate VRAM saver with only a small quality hit, but don't do the same for the VAE - fp8 causes visible artifacts there, use use_tiled_vae instead.

The bigger trap is faces: SUPIR doesn't preserve identity, it invents a plausible one from what it read off the image. Great for a stranger in a degraded photo, bad if the subject is someone you actually know - keep faces out of the pass or handle them separately. And the model weights carry a non-commercial license requiring written permission for commercial use, which matters if this output is going anywhere near a paying product.

CategorySUPIR

Inputs (31)

NameTypeDefaultDescription
supir_modelCOMBO0 options:
sdxl_modelCOMBO0 options:
imageIMAGE
seedINT1230–18446744073709550000
resize_methodCOMBOlanczos5 options: nearest-exact, bilinear, area, bicubic, lanczos
scale_byFLOAT1.000.01–20
stepsINT453–4096
restoration_scaleFLOAT-1-1–6
cfg_scaleFLOAT4.000–100
a_promptSTRINGhigh quality, detailed
n_promptSTRINGbad quality, blurry, messy
s_churnINT50–40
s_noiseFLOAT1.0031–1.1
control_scaleFLOAT1.000–10
cfg_scale_startFLOAT4.000–100
control_scale_startFLOAT0.000–1
color_fix_typeCOMBOWavelet3 options: None, AdaIn, Wavelet
keep_model_loadedBOOLEANtrue
use_tiled_vaeBOOLEANtrue
encoder_tile_size_pixelsINT51264–8192
decoder_tile_size_latentINT6432–8192
captionsoptSTRING
diffusion_dtypeoptCOMBOauto4 options: fp16, bf16, fp32, auto
encoder_dtypeoptCOMBOauto3 options: bf16, fp32, auto
batch_sizeoptINT11–128
use_tiled_samplingoptBOOLEANfalse
sampler_tile_sizeoptINT102464–4096
sampler_tile_strideoptINT51232–2048
fp8_unetoptBOOLEANfalse
fp8_vaeoptBOOLEANfalse
sampleroptCOMBORestoreEDMSampler2 options: RestoreDPMPP2MSampler, RestoreEDMSampler

Outputs (1)

NameTypeDescription
upscaled_imageIMAGE