Free AI upscaling in ComfyUI with Ultimate SD Upscale and SD 1.5, even on 4 GB of VRAM

Upscale photos and renders 4× (or 16× by chaining) locally and for free: Ultimate SD Upscale with an SD 1.5 checkpoint and an upscale model from OpenModelDB, tiled at 512 px so it runs on a 4 GB GPU.

Anton TenitskyOctober 13, 20268 min readVideo version below
A white porcelain teapot shaped like a skull, upscaled 16 times to 8K with Ultimate SD Upscale

You don’t need a 24 GB card or an online service to upscale an image well. Ultimate SD Upscale feeds the GPU one small tile at a time, so a card with 4 GB of VRAM can produce 4K and 8K images locally, for free and without censorship. The quality is really good. Here I build the workflow from scratch, explain the settings that matter, and show where it works and where it fails.

In short

  • Nodes: Ultimate SD Upscale and rgthree (for the image comparer).
  • Models: an SD 1.5 checkpoint (epiCPhotoGasm) plus an upscale model from OpenModelDB.
  • Settings: 4×, 20–30 steps, dpmpp_2m_sde_gpu / karras, denoise 0.25, tiles 512 × 512, CFG 6–8.
  • Speed on 4 GB: 512 → 2048 px in 73 seconds; 1600 → 6400 px in about 11 minutes.
  • Bigger: chain two nodes for 16×.

New to ComfyUI? See ComfyUI node basics and installing the ComfyUI Manager.

The quick way: load the workflow

The finished workflow is free on my Patreon. You can also drag one of its output images into ComfyUI: the workflow is stored in the image’s metadata. Install any missing nodes from the Manager and restart.

The workflow remembers model names, not the files. If you don’t have the same upscale model or checkpoint in your folders, the field shows “undefined”; pick your own. Upload your image in Load Image and press Queue.

Build it from scratch

1. Install the nodes

In Manager → Custom Nodes Manager, install Ultimate SD Upscale and rgthree’s ComfyUI nodes (it has the compare node I use a lot). Restart.

2. The main node and its inputs

  1. Add Ultimate SD Upscale. It has a lot of parameters; more on them below.
  2. Add Load Checkpoint with an SD 1.5 model (I use epiCPhotoGasm) and connect its model and VAE.
  3. Add two CLIP Text Encode nodes for the positive and negative inputs, and leave them empty. Click the grey dot on each to collapse them, since there’s nothing to see.
  4. Add Load Upscale Model and connect it.
  5. Add Load Image with the image to upscale, a Save Image for the output, and an rgthree Image Comparer: the upscaled output into image_a, the original into image_b.
The Ultimate SD Upscale node with inputs for image, model, positive, negative, VAE and upscale model, and the upscale_by value being set to 4
Ultimate SD Upscale: image, checkpoint, empty prompts, VAE and an upscale model.

3. Get upscale models from OpenModelDB

OpenModelDB is a great place to find upscale models. Some are better for faces, others for objects, anime or cartoon styles. Each page shows before-and-after samples, similar models, and the licence, so check it if you plan commercial use. The files are small: megabytes, not gigabytes.

The ones I use:

Model What it’s good at
4x-UltraSharp Crisp detail; my default
4x-FaceUpSharpDAT Faces, sharper
4x-FaceUpDAT Faces, softer and smoother
4x-Nomos2-hq-drct-l Architecture; I use it for rocks
The 4x-FaceUpSharpDAT page on OpenModelDB with a sample face comparison and licence details
OpenModelDB shows samples, the licence and similar models for each upscaler.

Put the files in ComfyUI/models/upscale_models/, then Edit → Refresh Node Definitions so they appear in the list.

Tidier wires: in Settings (bottom-left) → LiteGraph, change the link render mode from spline to straight or linear.

The settings that matter

  • upscale_by: 4. The node goes up to 4× the original. You can chain nodes for 16×, 32× and beyond.
  • Steps: 20–30. 40–50 gives slightly better quality but takes a lot longer; there’s a point of diminishing returns.
  • Sampler: dpmpp_2m_sde_gpu, which is better for realistic images, with the karras scheduler. These are worth experimenting with.
  • Denoise: 0.25. This is very important. At 1.0 it makes a completely new image. At 0.2–0.25 it keeps most of the image and adds a little detail; it feels like 90% stays and 10% changes. I sometimes go to 0.35, which is about the maximum before the image starts to change.
  • Tile width and height: 512. SD 1.5 was trained on 512 × 512 images, so it works best on 512 tiles. The node breaks even a huge image into many tiles and processes each separately, which is why it runs on an underpowered card; it just takes longer. Many other upscaling methods simply crash when you run out of VRAM.
  • CFG: 6–8. Lower means more variation; very low gives noise. Very high creates artifacts like over-sharpening. 8 is fine.
Ultimate SD Upscale settings: sampler dpmpp_2m_sde_gpu, scheduler karras, denoise 0.25, mode Linear, tile width and height 512, mask blur 8
The settings I use: denoise 0.25 and 512 px tiles for SD 1.5.

With an SDXL checkpoint the tile would be 1024 × 1024. I tried it: slightly higher quality, but much slower. SD 1.5 at 512 runs much faster with very much the same quality.

Test on a photo you know well

Start with an image you know really well. I used a selfie from Angkor Wat in Cambodia, with patterns in the background and a logo on my shirt, and downscaled it to 512 × 512 on purpose to see how well it would recover.

The command window shows the canvas size, the tile count and the progress. 512 → 2048 at 4× is 16 tiles. At 4K or 8K the count climbs fast: 64, 128, 300, 400 tiles.

The ComfyUI console showing canvas size 2048 by 2048, tile size 512, 16 tiles in a 4 by 4 grid, then a 6400 by 4800 canvas with 130 tiles
The console shows the canvas size, the tile grid and the seconds per tile.

On my 4 GB laptop it took 73 seconds. Dragging the comparer slider: the logo stays sharp and unchanged, the carvings on the temple ceiling are retained, and the glasses look exactly like they do in real life. It did add a pimple to my nose that I don’t remember having.

A selfie split by the image comparer slider, showing the 512 pixel original and the 4x upscale side by side
Before and after, split by the comparer. The glasses and the carved wall hold up at close range.

Switching to 4x-FaceUpDAT gave a more flattering, softer look. It denoised the skin more and did a great job on the glasses and the eyes, maybe better than UltraSharp. But my beard became much silkier than it really is, and in extreme close-up the back walls picked up hair-like strokes.

An extreme close-up of the upscaled beard and lips
FaceUpDAT at extreme zoom: smooth skin, a beard silkier than in reality.

Going bigger, and when it stops helping

For an 8K image, the easiest way is to load the 2K output back into Load Image and run again.

I took a 400 × 300 photo of Donald Trump from Encyclopaedia Britannica. The first pass gave about 1600 px wide. The second pass, 1600 × 1200 → 6400 × 4800, needed 130 tiles at roughly 4–5 seconds each and took 683 seconds. Faster computers can do a second per tile or less. The node shows the current tile, so you can check how long is left and go have a coffee.

The result was a lot smoother, and not necessarily in a good way. In an ultra zoom it looked better, but at a mid shot I don’t think it improved much; the skin lost quality to the extra denoising. For a second pass it can make sense to change models, for example UltraSharp to stop the face over-smoothing.

Comparing the original and the final

The comparer only updates when the graph runs, so to compare the tiny original and the 6K result without re-upscaling: select the upscale nodes and press Ctrl+B to bypass them, add two Load Image nodes (the final image and the original), connect them to the comparer, and queue. It runs in a few seconds.

16×: chain two upscale nodes

  1. Select the Ultimate SD Upscale node, Ctrl+C, then Ctrl+Shift+V to paste it with all its connections.
  2. Connect the first node’s image output to the second node’s image input.
  3. Connect the second node’s output to Save Image and to the comparer’s image_a (the original stays on image_b).
  4. Both nodes share the checkpoint, the empty prompts and the upscale model. For different upscale models per pass, copy the Load Upscale Model node too.

You can type into the prompts and it does affect the result, but it didn’t work well for me, so I leave them empty.

Two Ultimate SD Upscale nodes chained one after the other, feeding Save Image and an Image Comparer showing a skull-shaped teapot
Two upscale nodes in a row: 512 px to 8K in one run.

On the laptop this can take 30 minutes. It’s not a trivial task for a low-VRAM computer; many upscalers I studied couldn’t do it at all, and others add too much noise.

Results: where it shines and where it fails

My skull teapot, from the image-to-image merging guide, went from 512 px to 8K with UltraSharp, with super high detail even in an ultra zoom. I’d print it and put it on the wall.

A white skull-shaped porcelain teapot, upscaled from 512 pixels to 8K
512 px to 8K with UltraSharp, chained twice.

I originally got into AI upscaling for my own work. On a perfume bottle I designed in 3D-Coat, voxel cuts leave rough edges; going from 1500 to about 3000 px smoothed them out beautifully.

An extreme close-up of a gold perfume bottle cap with diagonal ridges, split by the comparer slider
A 3D-Coat render: the rough voxel edges come out smooth.

On a robot design, UltraSharp sharpened the jagged polygon edges from 3D-Coat instead. 4x-FaceUpDAT gave much smoother lines, the ones I wanted. Some tiny details on the face got squished and changed, a minor cost for a great, quick upscale of a final render.

A dark armoured robot design with smooth panel lines after upscaling
FaceUpDAT smoothed the jagged edges that UltraSharp had sharpened.

Where it failed: a GoPro photo of underwater corals, 2500 px wide, taken to 10–12K. The model clearly hadn’t been trained much on corals. Cropping a 300 px piece to give it more room to invent detail didn’t help either. For underwater images I’d need a completely different upscale model.

An underwater coral photo split by the comparer, with the upscaled side full of streaky, smeared texture
A failure: corals the models weren't trained on.

On an old rock render whose scene file I’d lost, the intermediate 2000–3000 px result was really nice. At 8–10K it got too smooth and over-denoised; still far better than the tiny original, but not a look I liked.

If you know other upscaling techniques that work better, leave a comment on the video. This is just my workflow.

Watch the video version (22:11)

Everything above is in the video too, if you'd rather follow along on screen.

FAQ

Can I upscale images with only 4 GB of VRAM?

Yes. Ultimate SD Upscale splits the image into 512 × 512 tiles and processes them one at a time. On a 4 GB laptop, a 512 px image went to 2048 px in 73 seconds; a 6400 × 4800 output took 130 tiles at about 4–5 seconds each.

What denoise should I use for upscaling?

0.25 keeps most of the image and adds a little detail. 0.35 is about the maximum before the image starts to change. At 1.0 you get a completely new image.

Which upscale model is best?

It depends on the image. 4x-UltraSharp keeps details crisp; 4x-FaceUpDAT is softer and smoother, good for faces and for hiding jagged edges; Nomos2 suits architecture and rocks. None of them did well on an underwater coral photo.

How do I upscale more than 4×?

Run the output through the node again, or chain two Ultimate SD Upscale nodes for 16×. Expect very long render times, and watch for over-smoothing at 8K and above.

Anton Tenitsky is a 3D artist with 15+ years in computer graphics, working with Nickelodeon, Gameloft, Marvel Rivals and many other clients. More about me

Related guides