multiGPU_upscaler: Multi-GPU Batch Parallel
Two GPUs, one idle while the other upscales? This node splits the batch and uses both
- upscale_model
- image
- IMAGE
Here's the situation this node exists for: you generate a batch of eight SDXL images, hit the upscale step, and one card is suddenly doing all the work while the other sits idle. ComfyUI keeps the whole pipeline on one GPU by default, so your second card is only a spectator during the slow part. multiGPU_upscaler: Multi-GPU Batch Parallel is the main act of the multiGPU Upscaler pack, and its whole job is to take that upscale pass and spread it across two - or up to ten - NVIDIA GPUs.
Let's be clear about which job it's doing. This is the "more pixels" kind of upscaling, not the "more detail" kind. It's the ESRGAN-family path - RealESRGAN_4xplus, 4x-UltraSharp, Remacri - fast, deterministic, incapable of hallucinating detail that wasn't there. What it adds on top of the stock Upscale Image (using Model) node is parallelism: when your batch is big enough, your upscale runs on multiple cards at once and the results come back in the same order.
How it works
On execution the node picks its GPUs, splits the batch, and fires a worker thread per card. Each worker instantiates its own copy of the upscale model on its GPU and runs ComfyUI's own tiled_scale with OOM-safe tiling - if a card runs out of VRAM mid-run, the tile size halves automatically and it retries, down to the floor you set.
- Device selection.
device_listdefaults to"auto", which sorts your cards by free VRAM and takes the topauto_max_devices(default 2). Or pin it explicitly with"cuda:0,cuda:1"or"0,1,2". - Batch split. The first (best) GPU gets roughly
primary_shareof the images (default 0.5); the rest are shared across the remaining cards. - Merge. Outputs are concatenated back in the original batch order.
It's honest about when it can't help: batch smaller than 2, no CUDA, or a single selected GPU all silently fall back to the single-GPU tiled path. You're not going to break anything by feeding it one image - it just won't parallelize.
The inputs that matter
upscale_model- an UPSCALE_MODEL from the pack's own loader or ComfyUI's standardLoad Upscale Model. Both work; they output the same type.image- your batched image tensor.device_list/auto_max_devices- leave on auto unless you have a reason to pin specific cards.primary_share- if one card is stronger or has more free VRAM, nudge this up toward 0.7–0.8 so it pulls its weight.tile_size(512),min_tile_size(128),overlap(32) - the tuning knobs you only touch when you OOM: droptile_sizeto 256 first.
Output: a single IMAGE tensor, batch order preserved, wired straight into Preview, Save, or whatever you have after the upscale.
The honest verdict
The author's own numbers on dual RTX 3060s - SDXL generation + 4x RealESRGAN to 4096px, batch of 8 - show about 10–14% wall-clock speedup over single-GPU. Real, but modest. This pays off only if you routinely upscale batches of four or more on a multi-GPU box. If you've got the hardware and do that, it's free speed and a no-brainer. If you're on one GPU, skip it and use the pack's Single GPU Tiled node instead.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/alludus/ComfyUI-multiGPU-upscaler
Then restart ComfyUI. Or install via ComfyUI Manager by searching multiGPU Upscaler. No requirements.txt in the repo - the only real deps are spandrel and typing-extensions, and spandrel already ships with ComfyUI, so there's usually nothing extra to install. Models are not bundled: drop a RealESRGAN .pth into ComfyUI/models/upscale_models.
Gotchas
NVIDIA only - this leans on CUDA for device management, so AMD users get the single-GPU fallback at best. And note the failure mode: if any worker thread errors or OOMs even at the minimum tile, the whole thing falls back to re-running the full upscale on one card. That can cost more than multi-GPU ever saved. If upscales feel slower than they should, watch the ComfyUI console for [multiGPU] lines - the node logs which path it actually took.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| upscale_model | UPSCALE_MODEL | — | |
| image | IMAGE | — | |
| device_list | STRING | auto | — |
| auto_max_devices | INT | 21–10 | — |
| primary_share | FLOAT | 0.500.1–0.9 | — |
| tile_size | INT | 51264–2048 | — |
| min_tile_size | INT | 12832–1024 | — |
| overlap | INT | 320–256 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |