How to upscale images with SUPIR on a cloud GPU

Rent a GPU on Deploy, then open a terminal in JupyterLab or over SSH. Install SUPIR from the Fanghua-Yu/SUPIR README, set the checkpoint paths that file names, run test.py or gradio_demo.py, and copy the output folder off the instance before you destroy it. Destroying the instance deletes its disk.

Another upscaler on the same kind of instance: How to upscale images and video with Real-ESRGAN on a cloud GPU. Face restoration from a different repository, whose README prints no GB figure, is How to restore faces with CodeFormer on a cloud GPU. How published FLUX and SDXL weight sizes are read: How much VRAM do I need for FLUX and SDXL. The tunnel for the Gradio command is How to use SSH port forwarding on a cloud GPU. If the process runs out of memory: How to fix CUDA out of memory on a cloud GPU.

The README does not link a ComfyUI install. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named for this project. The upscale_models example README in that repository does not name SUPIR. Examples HEAD was f9431bb000ce792094ff345446e22cac1ea6cef3, committed 2025-11-26T20:33:58Z. This page does not add a ComfyUI install.

The GitHub license field on 2026-11-13 was NOASSERTION. The LICENSE file is titled “SUPIR Software License Agreement” and its copyright line is Copyright © 2024 by SupPixel Pty Ltd. The README ends with a “Non-Commercial Use Only Declaration”. Read that declaration and the LICENSE file before you redistribute the program or the weights.

The commands below are copied from the upstream files named in each step. They were not run on a CloudGPU instance for this page. Anything this page adds around them is marked.

What the README says about memory

The only GB figures in the README are in the comment on the third Gradio command: less VRAM & slower (12G for Diffusion, 16G for LLaVA). That command also passes --loading_half_params, --use_tile_vae, and --load_8bit_llava. The README does not print a GB figure for the default command. This page does not add the 12G figure and the 16G figure together.

test.py and gradio_demo.py set SUPIR_device to cuda:0 and LLaVA_device to cuda:1 when torch.cuda.device_count() is at least 2, and both to cuda:0 when the count is 1. They raise ValueError('Currently support CUDA only.') when the count is 0. The README examples set CUDA_VISIBLE_DEVICES=0,1. This page does not treat that prefix as a sentence that says one GPU is insufficient.

GET /v1/public/compute-capabilities does not list GPUs. It returns feature flags. The memory column is vram_gb from gpu-prices.json, updated_at 2026-11-13T02:10:27.641Z. GET /v1/public/gpu-catalog the same day (generated_at 2026-11-13T02:10:28.744Z) listed the same names and the same vram_gb values, plus Ascend 910B at 64, which is not in gpu-prices.json and is not listed here. The catalog response also includes an availability field. This page does not copy it. Every prices row has gpu_count 1. Rows whose vram_gb is at least 12 meet the 12G comment as a printed number. Rows whose vram_gb is at least 16 meet the 16G comment as a printed number. RTX 2080 is 8, RTX 3080 is 10, and RTX 2080 Ti is 11, which are below 12. RTX 3080 Ti is 12, which is below 16. This page did not run SUPIR and does not mark a row as enough. Which listing you can start is on Deploy.

The catalog template list had no SUPIR template.

Catalog name vram_gb
RTX 2080 8
RTX 3080 10
RTX 2080 Ti 11
RTX 3080 Ti 12
V100 16G 16
A30 24
RTX 3090 24
RTX 4090 24
RTX 4090D 24
RTX 4080 SUPER 32G 32
RTX 5090 32
RTX 5090D 32
V100 32G 32
A100 40G 40
A800 40G 40
A40 48
RTX 4090 48G 48
RTX 4090D 48G 48
RTX A6000 48
NVIDIA RTX PRO 5000 72G 72
RTX PRO 5000 72G 72
A100 80G 80
A800 80G 80
H800 80
RTX 6000D 83
H20 96G 96
RTX PRO 6000 96G 96
RTX PRO 6000 Max-Q 96
H20-3e 141G 141

Install

On Deploy, choose Raw GPU. The deploy page says “SSH access and root within a dedicated container”. The README install block is:

git clone https://github.com/Fanghua-Yu/SUPIR.git
cd SUPIR
conda create -n SUPIR python=3.8 -y
conda activate SUPIR
pip install --upgrade pip
pip install -r requirements.txt

requirements.txt pins gradio==4.16.0 and triton==2.1.0, and it sets torch>=2.1.0. The commits API for the default branch master listed bda91af2000042f8bedfec8897d92917e67c1d88, committed 2025-05-12T09:49:11Z. The commits API for README.md listed c194c63800f77076604d4f7b093c59c59d6865a3, committed 2025-05-12T09:48:39Z. This page did not install the environment.

Checkpoint paths

The README says that if you can connect to Hugging Face, set LLAVA_CLIP_PATH, SDXL_CLIP1_PATH, and SDXL_CLIP2_CKPT_PTH in CKPT_PTH.py to None, and that those CLIP models will be downloaded automatically. The later edit list names SDXL_CLIP2_CACHE_DIR. That name is not in CKPT_PTH.py. The names in the file, on commit f874d90c5cf88aebd0df78459d3e0f01f8d0a841 (2024-02-24T08:44:55Z), are:

LLAVA_CLIP_PATH = '/opt/data/private/AIGC_pretrain/LLaVA1.5/clip-vit-large-patch14-336'
LLAVA_MODEL_PATH = '/opt/data/private/AIGC_pretrain/LLaVA1.5/llava-v1.5-13b'
SDXL_CLIP1_PATH = '/opt/data/private/AIGC_pretrain/clip-vit-large-patch14'
SDXL_CLIP2_CKPT_PTH = '/opt/data/private/AIGC_pretrain/CLIP-ViT-bigG-14-laion2B-39B-b160k/open_clip_pytorch_model.bin'

Those four strings are paths on the machine that committed the file. This page did not create /opt/data/private.

Two README bullets, SDXL CLIP Encoder-1 and LLaVA CLIP, are links whose repository id is under a closed-model vendor namespace. Copy those two bullets from the README. This page does not print them. FrozenCLIPEmbedder in sgm/modules/encoders/modules.py passes its default version argument to from_pretrained when SDXL_CLIP1_PATH is None. Copy the version= line from that class. FrozenCLIPT5Encoder in the same file also sets default arguments this page does not copy. options/SUPIR_v0.yaml does not select FrozenCLIPT5Encoder. It selects FrozenCLIPEmbedder and FrozenOpenCLIPEmbedder2. The OpenCLIP params in that yaml set arch to ViT-bigG-14 and version to laion2b_s39b_b160k. When SDXL_CLIP2_CKPT_PTH is None, FrozenOpenCLIPEmbedder2 passes that version to open_clip.create_model_and_transforms. The class default laion2b_s32b_b79k is not the value that yaml passes.

The README dependent-model list also links these, which this page does copy:

  • SDXL CLIP Encoder-2: https://huggingface.co/laion/CLIP-ViT-bigG-14-laion2B-39B-b160k
  • SDXL base 1.0_0.9vae: https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/blob/main/sd_xl_base_1.0_0.9vae.safetensors
  • LLaVA v1.5 13B: https://huggingface.co/liuhaotian/llava-v1.5-13b

Optional replacements named in that list are https://huggingface.co/RunDiffusion/Juggernaut-XL-v9/blob/main/Juggernaut-XL_v9_RunDiffusionPhoto_v2.safetensors and https://huggingface.co/RunDiffusion/Juggernaut-XL-Lightning/blob/main/Juggernaut_RunDiffusionPhoto2_Lightning_4Steps.safetensors. The weights the project itself provides are SUPIR-v0Q and SUPIR-v0F, with Baidu Netdisk and Google Drive links in the README. This page does not repeat those share links.

options/SUPIR_v0.yaml sets:

SDXL_CKPT: /opt/data/private/AIGC_pretrain/SDXL_cache/sd_xl_base_1.0_0.9vae.safetensors
SUPIR_CKPT_F: /opt/data/private/AIGC_pretrain/SUPIR_cache/SUPIR-v0F.ckpt
SUPIR_CKPT_Q: /opt/data/private/AIGC_pretrain/SUPIR_cache/SUPIR-v0Q.ckpt
SUPIR_CKPT: ~

options/SUPIR_v0_Juggernautv9_lightning.yaml sets SDXL_CKPT to /opt/data/private/AIGC_pretrain/SDXL_lightning_cache/Juggernaut_RunDiffusionPhoto2_Lightning_4Steps.safetensors and keeps the same SUPIR_CKPT_F and SUPIR_CKPT_Q paths. The README edit list says to set SDXL_CKPT, SUPIR_CKPT_Q, and SUPIR_CKPT_F in options/SUPIR_v0.yaml.

The documented test script and Gradio demo

The README usage line is python test.py and python gradio_demo.py. The test examples it prints are:

CUDA_VISIBLE_DEVICES=0,1 python test.py --img_dir '/opt/data/private/LV_Dataset/DiffGLV-Test-All/RealPhoto60/LQ' --save_dir ./results-Q --SUPIR_sign Q --upscale 2
CUDA_VISIBLE_DEVICES=0,1 python test.py --img_dir '/opt/data/private/LV_Dataset/DiffGLV-Test-All/RealPhoto60/LQ' --save_dir ./results-F --SUPIR_sign F --upscale 2

The --img_dir value is a path in the README. This page did not create that directory. test.py defaults include --upscale 1, --SUPIR_sign Q, --seed 1234, --min_size 1024, --edm_steps 50, --s_stage1 -1, --s_churn 5, --s_noise 1.01, --s_cfg 4.0, --s_stage2 1, --num_samples 1, --color_fix_type Wavelet, --ae_dtype bf16, and --diff_dtype fp16. Those match the defaults printed in the README usage block. --linear_CFG is store_true with default True. --linear_s_stage2 is store_true with default False. The default --a_prompt string includes the characters 32k. That is prompt text in the script. This page does not treat it as an output size.

The Gradio commands the README prints are:

CUDA_VISIBLE_DEVICES=0,1 python gradio_demo.py --ip 0.0.0.0 --port 6688 --use_image_slider --log_history
CUDA_VISIBLE_DEVICES=0,1 python gradio_demo.py --ip 0.0.0.0 --port 6688 --use_image_slider --log_history --opt options/SUPIR_v0_Juggernautv9_lightning.yaml
CUDA_VISIBLE_DEVICES=0,1 python gradio_demo.py --ip 0.0.0.0 --port 6688 --use_image_slider --log_history --loading_half_params --use_tile_vae --load_8bit_llava

gradio_demo.py defaults --ip to 127.0.0.1 and --port to 6688. The README command overrides --ip to 0.0.0.0 and passes --port 6688. block.launch uses server_name=server_ip and server_port=server_port. --encoder_tile_size defaults to 512 and --decoder_tile_size defaults to 64. The README command does not pass those two flags. A slider in gradio_demo.py sets s_noise value 1.003. The README usage default and the test.py default are both 1.01. This page does not collapse 1.003 and 1.01. This page did not start the demo.

From your own computer, the port in the README command is 6688. How to use SSH port forwarding on a cloud GPU is the tunnel.

Where the images are saved

test.py takes img_name from the file stem and saves {save_dir}/{img_name}_{index}.png. The README examples set --save_dir to ./results-Q and ./results-F. gradio_demo.py writes files only when --log_history is set. It sets event_id to str(time.time_ns()) and writes ./history/{event_id[:5]}/{event_id[5:]}/LQ.png, HQ_{i}.png, and logs.txt. The README Gradio command passes --log_history. Without that flag, the function returns the image arrays to the Gallery and does not run that save block. Copy the directory the command you ran actually wrote. This page did not run either script.

When it fails

CUDA out of memory. The documented low-VRAM command is the third Gradio line above, whose comment says 12G for Diffusion and 16G for LLaVA. The README does not print a GB figure for the default command. If the process raises that error, use how to fix CUDA out of memory on a cloud GPU.

“CUDA error: no kernel image is available for execution on the device” on an RTX 5090. requirements.txt sets torch>=2.1.0 and pins triton==2.1.0. It does not name compute capability 12.0. The RTX 5090 guide says that card is compute capability 12.0 (sm_120) and that PyTorch 2.7 and later, on a build for CUDA 12.8 or newer, is the line that announced support. This page did not install a torch wheel and did not re-test this package on an RTX 5090. Catalog RTX 5090 and RTX 5090D are 32. That is the catalog number only.

Save the images, then destroy

Copy ./results-Q, ./results-F, or the ./history directory the Gradio command wrote, before you destroy the instance. Save your work before you destroy a cloud GPU is the checklist. The terms say data on local instance storage is permanently deleted when the instance is destroyed.

The pricing page FAQ states the billing rule in these words:

Per-minute options have a 1-minute minimum; unused prepaid minutes are refunded when you destroy the instance. Some configurations use whole-hour billing with a 1-hour minimum; unused time within a charged hour is not refunded on voluntary stop. The billing period, minimum charge and initial prepayment are shown before confirmation. No subscription.

Prices are not copied here.

Frequently asked questions

How much VRAM does the SUPIR README print?

The only GB figures in the README are in the comment on the third Gradio command: 12G for Diffusion and 16G for LLaVA. That command also passes --loading_half_params, --use_tile_vae, and --load_8bit_llava. The README does not print a GB figure for the default command. This page does not add those two figures together and does not mark a catalog row as enough. Which listing you can start is on https://cloudgpu.app/deploy.

Which checkpoint lines should be copied from upstream instead of from this page?

The README lists SDXL CLIP Encoder-1 and LLaVA CLIP as links whose repository id is under a closed-model vendor namespace. Copy those two bullets from the README. FrozenCLIPEmbedder in sgm/modules/encoders/modules.py uses a default version argument of that same kind when SDXL_CLIP1_PATH is None. Copy the version= line from that class. This page does not print those ids. CKPT_PTH.py sets local paths, and options/SUPIR_v0.yaml sets SDXL_CKPT, SUPIR_CKPT_Q, and SUPIR_CKPT_F to paths under /opt/data/private/AIGC_pretrain/.

Where do the documented scripts save images?

The README examples pass --save_dir ./results-Q and --save_dir ./results-F. test.py saves a png under save_dir using the source stem, an underscore, and the sample index. gradio_demo.py writes under ./history/ only when --log_history is set. The README Gradio command passes --log_history, --ip 0.0.0.0, and --port 6688. The script default for --ip is 127.0.0.1 and the default for --port is 6688. This page did not run the scripts.

What usage terms does the repository print?

The README Non-Commercial Use Only Declaration says non-commercial means not primarily intended for or directed towards commercial advantage or monetary compensation. The LICENSE says commercial use requires written permission and that fees are negotiated in writing. That fees sentence is license text, not a CloudGPU price and not a storage allowance. The file prints no dollar amount.

Sources (read 2026-11-13, Asia/Shanghai)

  • Fanghua-Yu/SUPIR README (install, CKPT_PTH.py None sentence, dependent-model links, SUPIR-v0Q and SUPIR-v0F, test.py examples, Gradio commands, the 12G and 16G comment, the non-commercial declaration): https://github.com/Fanghua-Yu/SUPIR/blob/master/README.md commit c194c63800f77076604d4f7b093c59c59d6865a3. Repository HEAD bda91af2000042f8bedfec8897d92917e67c1d88
  • CKPT_PTH.py (the four local paths): commit f874d90c5cf88aebd0df78459d3e0f01f8d0a841
  • options/SUPIR_v0.yaml and gradio_demo.py (port 6688, device split, history paths, s_noise slider 1.003): commit 98558f9143d0122b6242fb0fac30527d5465a62b
  • options/SUPIR_v0_Juggernautv9_lightning.yaml (SDXL_CKPT ends in Juggernaut_RunDiffusionPhoto2_Lightning_4Steps.safetensors): that repository
  • test.py (save path, argparse defaults, device split): that repository
  • sgm/modules/encoders/modules.py (FrozenCLIPEmbedder default version when SDXL_CLIP1_PATH is None; FrozenOpenCLIPEmbedder2 uses the yaml version laion2b_s39b_b160k when SDXL_CLIP2_CKPT_PTH is None): that repository. The closed-model vendor ids in that file are not printed on this page
  • LICENSE (SUPIR Software License Agreement, Copyright © 2024 by SupPixel Pty Ltd). GitHub license field NOASSERTION
  • requirements.txt (torch>=2.1.0, triton==2.1.0, gradio==4.16.0): that repository
  • ComfyUI examples top-level directories and upscale_models/README.md (no SUPIR): https://github.com/comfyanonymous/ComfyUI_examples commit f9431bb000ce792094ff345446e22cac1ea6cef3
  • Public GPU memory: https://cloudgpu.app/gpu-prices.json (updated_at 2026-11-13T02:10:27.641Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at 2026-11-13T02:10:28.744Z). GET /v1/public/compute-capabilities returned feature flags and no GPU list.

Cards you can start are on the Deploy page. Prices are on https://cloudgpu.app/pricing and are not repeated here.

Last updated: 2026-11-13 (Asia/Shanghai).