HD Ultimate SD Upscale
ComfyUI Node Guide
- image
- model
- positive
- negative
- vae
- upscale_model
- IMAGE
The name is doing a lot of work here, and it's worth reading carefully. This node has the exact parameter list of the Ultimate SD Upscale everyone already has installed - the Coyote-A/ssitu tiled-diffusion classic that's been the go-to for arbitrary-size upscaling on limited VRAM since the A1111 days. Same tile width, same seam-fix modes, same everything. But this isn't that node wearing a new name. The pack's own README says plainly what changed: this fork only upscales the top half of the image, to save time. That's not a bug you'll hit later - it's the entire point of the node, and if you don't know it going in, you'll spend a while wondering why the bottom of your output looks untouched.
What it's for. Ultimate SD Upscale, in general, is tiled diffusion upscaling: split the image into overlapping tiles, run a real sampling pass on each one at proper resolution, blend the seams, stitch it back together. It's how you get a 4K+ output without a 48GB card - the community still reaches for it (or Tiled Diffusion) specifically for print-size and high-res jobs on modest VRAM, even now that generative upscalers like SeedVR2 have taken over the "add convincing detail" job everywhere else. This HD variant takes that same machinery and narrows it to half the frame, which only makes sense if you already know your subject lives in the top half - a portrait or headshot pipeline, basically, where re-diffusing background and legs at high cost buys you nothing.
Inputs that matter. Under the hood it's a KSampler bolted to a tiler, so most of the required inputs are exactly what you'd wire into any sampling node: image, model, positive, negative, vae, plus seed, steps, cfg, sampler_name, scheduler, and denoise. Keep denoise low - it defaults to 0.2, which is sane for a detail pass; push it toward 0.5+ and you're not upscaling anymore, you're regenerating, and the composition will drift. upscale_by sets the target multiplier, and upscale_model is a separate ESRGAN-style model that does the raw pixel resize the sampling pass then adds detail on top of. The tiling mechanics - tile_width, tile_height, tile_padding, mask_blur, mode_type (Linear/Chess/None, which is just the order tiles get processed in) - are your VRAM/quality dial: smaller tiles, less memory, more visible seams if you're not careful. That's what the seam_fix_* cluster (seam_fix_mode, _denoise, _width, _mask_blur, _padding) exists to clean up - turn on Band Pass or Half Tile if you're seeing a grid pattern in the output. force_uniform_tiles and tiled_decode are memory-side toggles worth leaving on their defaults unless you're actively fighting an OOM. One IMAGE comes out the other end.
Installing it. Search "hd-nodes-comfyui" (the repo's actual title) or "HD Nodes" in ComfyUI Manager, or do it manually: cd ComfyUI/custom_nodes && git clone https://github.com/xiaoxiaodesha/hd_node, then restart. One heads-up that applies to every node in this pack, not just this one: the README's install note says you need insightface in the same Python environment, full stop, no node named. ComfyUI extensions typically register every node from one file at load time, so if that import fails, you can lose the whole pack from the node search - not just the node that actually needed it. Install insightface before you go hunting for any HD node that's gone missing (the HD-FaceIndex article in this series has the gory details on why that dependency is such a pain).
Where people get tripped up. The obvious one: expecting a full-frame result and getting a half-processed image. That's by design, not breakage - if you want ordinary, whole-image Ultimate SD Upscale, the standard Coyote-A node most people already have is the one to reach for; save this fork for the specific portrait pipeline it was built for. Beyond that, the failure modes are the same as any tiled upscaler: visible seams mean turn on seam fix, an overly "regenerated" look means your denoise crept too high, and running out of VRAM means shrink the tile size before you shrink the upscale factor.
Inputs (25)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| upscale_by | FLOAT | 2.000.05–4 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.000–100 | — |
| sampler_name | COMBO | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 | |
| scheduler | COMBO | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 | |
| denoise | FLOAT | 0.200–1 | — |
| upscale_model | UPSCALE_MODEL | — | |
| mode_type | COMBO | 3 options: Linear, Chess, None | |
| tile_width | INT | 51264–16384 | — |
| tile_height | INT | 51264–16384 | — |
| mask_blur | INT | 80–64 | — |
| tile_padding | INT | 320–16384 | — |
| seam_fix_mode | COMBO | 4 options: None, Band Pass, Half Tile, Half Tile + Intersections | |
| seam_fix_denoise | FLOAT | 1.000–1 | — |
| seam_fix_width | INT | 640–16384 | — |
| seam_fix_mask_blur | INT | 80–64 | — |
| seam_fix_padding | INT | 160–16384 | — |
| force_uniform_tiles | BOOLEAN | true | — |
| tiled_decode | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |