Remote Upscale
Run your upscale model on a second machine's GPU
- image
- IMAGE
Here's the situation this node solves: you're generating on a GPU that's already busy, or a laptop with 8GB of VRAM, and you have a second machine - an old desktop, a homelab box, whatever - sitting on the network with a spare card in it. Remote Upscale ships the image over HTTP to that second machine, has it do the upscale, and streams the result back. Your main GPU never touches it.
Worth being clear about what job this is: it's not a generative restorer like SUPIR or SeedVR2, it doesn't invent detail or reinterpret the image. Per the README it loads .pth, .pt, and .safetensors checkpoints - the same ESRGAN-family format already sitting in ComfyUI/models/upscale_models (4x-UltraSharp and friends). The math is the boring, fast, non-hallucinating kind. It's where it runs that's different, not what it does.
How it works
Under the hood there's a small FastAPI server (the server/ half of the repo) that you run on whichever machine has the GPU. It loads models via spandrel, the same library ComfyUI itself uses to read arbitrary upscale-model architectures, from a folder you point it at. The client node - this one, living in your ComfyUI graph - POSTs your image to that server's /upscale (or /upscale_stream if you want a live progress bar over SSE), the server tiles it, runs the model, and hands the result back as an image.
The inputs and outputs that matter
image- the image to upscale, same as any local upscaler.server_url- where the server lives. Defaults tohttp://localhost:8189, which only works if the server happens to be on the same box as ComfyUI. The whole point of this node is usually a different machine, so this is the field you'll actually change - point it at the LAN IP of your GPU box, e.g.http://192.168.1.100:8189.model_name- a dropdown populated from whatever the server reports it has loaded. If it just says(server unavailable), that's the literal placeholder value the node falls back to when it can't reach the server - see troubleshooting below.tile_size- 128 to 2048, default 512. Same trade-off as any tiled upscale: smaller tiles use less VRAM on the server's GPU but take longer.show_progress- toggles whether you get a real-time progress bar (via the streaming endpoint) or just wait for the result.
Output is a single IMAGE - wire it straight into a SaveImage, a second upscale pass, or wherever the rest of your pipeline expects an image.
How to install it
The repo is split into two halves, and only one goes into ComfyUI. On your ComfyUI machine:
cd ComfyUI/custom_nodes
git clone https://github.com/gen1nya/ComfyUI-Remote-Upscale
Restart and the node appears under image/upscaling. The client side is deliberately light - the README lists requests as its only dependency.
The real setup happens on the other machine, the one with the GPU:
- Copy the
server/folder from the repo over to it. pip install -r requirements.txt- pulls in FastAPI, uvicorn, spandrel, Pillow, and NumPy.- Install PyTorch yourself, matching your GPU (CUDA or ROCm) - it's not pinned in requirements, so a plain
pip install torchcan silently give you a CPU build. - Point it at a folder of upscale models and start it:
export UPSCALE_MODELS_PATH="/path/to/upscale_models" && python server.py. Listens on port8189by default - same as the node's default.
Common issues & troubleshooting
model_name shows "(server unavailable)" and won't change. That's not a bug, it's the literal fallback value when the node can't reach server_url - wrong IP, server not started yet, or a firewall blocking the port between the two machines. Fix the connection, then use the companion Refresh Remote Models node (or just re-add this one) to repopulate the dropdown.
Server crashes with ModuleNotFoundError: No module named 'spandrel'. A genuinely common one - people hit this exact error installing spandrel-dependent tools elsewhere too (A1111, other ComfyUI packs), and the usual cause is an old Python. Spandrel needs 3.8+.
Everything works but it's slower than local upscaling ever was. Check PyTorch on the server actually picked up your GPU - since torch isn't pinned in requirements.txt, it's easy to end up with a CPU-only install that "works" but crawls. python -c "import torch; print(torch.cuda.is_available())" tells you in one line.
CUDA out-of-memory on the server, not your local machine. tile_size governs VRAM on whichever GPU is doing the work - the remote one. If it OOMs, drop tile size before assuming the model itself is too big.
localhost by default is a trap. If you install this expecting it to "just work," remember the default server_url points at the ComfyUI machine itself. You have to change it to actually offload anything - that's the one setting this node exists for.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| server_url | STRING | http://localhost:8189 | — |
| model_name | COMBO | (server unavailable) | 1 options: (server unavailable) |
| tile_size | INT | 512128–2048 | — |
| show_progress | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |