Nodes/32GPU Video Upscale (up to 32 cards)/Upscale Image (Model + Start)
ComfyUI Node

Upscale Image (Model + Start)

Stock Upscale Image, pinned to one GPU

By WhyNotNN·Created 3 months ago·Updated 3 months ago· 1
Upscale Image (Model + Start)
  • Start
  • upscale_model
  • image
  • IMAGE

This is the node the whole pack is built around. It does the same job as stock Upscale Image (using Model) - run an ESRGAN-family upscaler over an image batch - but with one difference that matters: it takes a required Start input and pins execution to whichever GPU that Start came from. Put one of these in every parallel branch and your multi-card rig finally earns its keep.

Why you'd reach for it

ComfyUI executes your graph node-by-node, and by default the actual math happens on one GPU. That's fine for a single card, absurd on a box with four. This node is the pack's per-branch unit of parallelism: each GPU Init → Upscale Image (Model + Start) pair is one card doing one slice of the batch. The example video workflow chains it behind Split Image Batch - frames split into parts, each part upscaled on its own card, then Merge Image Batch stitches the result back in order.

How it works

The upscale mechanics are borrowed straight from ComfyUI's stock node: 512px tiles with 32px overlap, and the same OOM-safe tile-shrink loop if a card runs out of memory. What's different is the plumbing around it, and it's genuinely thoughtful:

  • It deep-copies the upscale model per call, so parallel branches never race a shared nn.Module.
  • The work runs off the main event loop in a worker thread, pinned to the target device.
  • The function is async, which is the real trick. ComfyUI can park the awaiting coroutine and start the next independent branch - so when you hit Queue, card 0's branch and card 1's branch actually overlap instead of waiting in line.

Results come back to CPU so workers can hand off safely to whatever gathers them.

Inputs and outputs

All three inputs are required, which is the point:

  • Start - the handle from GPU Init that selects the card. Feed it the Init for GPU 0, and this branch runs on GPU 0.
  • upscale_model - any UPSCALE_MODEL from the stock UpscaleModelLoader: ESRGAN, 4x-UltraSharp, RealESRGAN, whatever lives in models/upscale_models/.
  • image - an IMAGE batch: a single image, a pile of them, or video frames.

One output: IMAGE, the upscaled frames, ready for Save Image or Merge Image Batch.

The catch you should know about

This is a pixel upscaler, not a detail generator. Per the KB's upscaling taxonomy, that's the "more pixels" job: it adds resolution, can't invent content, and runs in milliseconds per tile. Applied frame-by-frame to video, a per-frame pixel upscaler can shimmer on fine repeating texture - that's a property of the model family, not a bug in this node. If you want a video upscaler that invents temporally-consistent detail, you want SeedVR2-class tooling, not this.

Install

# ComfyUI Manager → Install Custom Nodes → search "32GPU Video Upscale"
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/WhyNotNN/ComfyUI-32GPU-Video-Upscale.git
# restart ComfyUI

No extra pip packages - it relies on ComfyUI's torch/spandrel stack. You need a recent ComfyUI with async node support, and don't reset CUDA_VISIBLE_DEVICES / HIP_VISIBLE_DEVICES after startup.

Honest notes

With one GPU, this is stock upscale with extra steps - use the built-in node. It pays off only when you have two or more cards and a batch worth splitting. And fair warning: this is a brand-new pack, a single commit with a template README and zero community footprint at time of writing. The core idea is sound and the code mirrors stock ComfyUI closely, but don't expect battle-tested maturity.

Categorydistributed/upscale

Inputs (3)

NameTypeDefaultDescription
StartSTART—
upscale_modelUPSCALE_MODEL—
imageIMAGE—

Outputs (1)

NameTypeDescription
IMAGEIMAGE—