SuperUltimate VACE Upscale
Upscale your VACE video without nuking your VRAM
- model
- positive
- negative
- vae
- input_video
- croparea_list
- reference_image
- control_video
- nag_params
- video
The problem this node exists for: you did an image-to-video with a Wan VACE model, got a nice 480p clip, and now you want it sharp at 1280x720. Most "upscalers" here just interpolate pixels - more pixels, no new detail. This one is the "more detail over time" kind: it re-runs VACE denoising on the video, tile by tile, so the output genuinely regenerates detail. That's also why it's slow and why it's interesting. If you've ever tried to run a 14B VACE model at full 720p in one shot and watched it OOM, you know exactly why it tiles.
How it works
Feed it a video plus the usual model (the tooltip is blunt: only VACE models are supported), positive/negative conditioning, and a vae. Two pairs of dimensions do the real work:
width_upscale/height_upscale- where you're going (e.g. 1280x720).width/height- the tile you actually denoise (default 832x480).
The node computes a grid of overlapping tiles that covers the target size, runs a full VACE pass on each tile, then feather-blends them back together with soft masks. The overlap is derived from those two dimension pairs, and the README warns about the math: if width_upscale % width (or the height pair) leaves a tiny remainder, the overlap gets too small and you'll see seam lines. Keep the ratio sane.
Then there's temporal tiling. If your input has more frames than length, the video gets split into chunks with crossfade_frame as the transition region, each chunk denoised separately and crossfaded back together. Two things to know up front: if the frame count exceeds length and crossfade_frame is 0, the node throws an error - it refuses to cut without a transition. And if your video is a seamless loop, set loopback_crossfade to a few frames and it will crossfade the end back into the start so the loop survives the upscale.
The inputs that actually matter
For a beginner, ignore most of the sampler knobs and set these:
width_upscale,height_upscale,width,height- the target and the tile. Your VRAM budget lives here.length- frames per temporal chunk, default 81.crossfade_framemust be > 0 if the clip is longer.reference_image- the pack's recommended setup is a high-res version of your video's first frame. Wire it in and the upscale gets a stable identity anchor instead of drifting.crop_refcrops the reference to match each tile;ref_as_init_framereplaces the first frame with it outright. This node is basically designed for "high-res i2v, then upscale the result."control_video- optional, same frame count as the input; a VACE control clip to keep motion in line while it regenerates detail.color_matchwithcolor_ref(input_video or reference_image) - corrects color drift across tiles; the one feature that needs the extracolor-matcherpip package.denoise- the regenerate-detail dial. 1.0 is a full redraw; lower values get more conservative.
Everything else (steps, cfg, sampler_name, scheduler, seed, noise_aug) works like a normal KSampler. There's also an optional nag_params socket for the bundled NAG sampler if you'd rather save time than run plain CFG (see the NAG Paramters Setting article). Output is a single video IMAGE batch - wire it to a VHS-style save or a preview node.
Install
From ComfyUI Manager, search "SuperUltimateVaceTools". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/bbaudio-2025/ComfyUI-SuperUltimateVaceTools
Restart ComfyUI. The only extra dependency is color-matcher (pip install color-matcher, or let the pack's requirements install it) and it's only used when color_match is on. You still need the Wan VACE model weights themselves in ComfyUI's model folders - this pack doesn't ship any.
Troubleshooting
- "放大尺寸应该大于生成尺寸 / dimension_upscale should be large than dimension" - target dims must actually be bigger than the tile dims. Obvious when you think about it, less obvious at 2am.
- "视频帧数大于length / frame count larger than length" - set
crossfade_frameto enable temporal tiling. - Color-match errors - you skipped
color-matcher. - After updating the pack, if a node looks stale or the workflow stalls with no output, right-click the node and Fix node (recreate) - that's the author's own fix from the release thread, and it's saved me once.
One honest warning: this is a marathon, not a sprint. Every tile is a full VACE generation, so a 720p upscale of an 81-frame clip is many minutes even on a 4090. Budget it like a long render, not like an upscaler. The payoff is a real detail regeneration that SeedVR2-class frame interpolation can't give you.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | Only VACE models are supported | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| input_video | IMAGE | — | |
| width_upscale | INT | 128016–16384 | — |
| height_upscale | INT | 72016–16384 | — |
| width | INT | 83216–16384 | — |
| height | INT | 48016–16384 | — |
| length | INT | 811–16384 | — |
| pad_mask_limit | INT | 328–512 | — |
| crossfade_frame | INT | 00–10000 | — |
| loopback_crossfade | INT | 00–10000 | — |
| crop_ref | BOOLEAN | false | — |
| ref_as_init_frame | BOOLEAN | false | — |
| color_match | BOOLEAN | false | — |
| color_ref | COMBO | input_video | 2 options: input_video, reference_image |
| noise_aug | FLOAT | 0.0000–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| denoise | FLOAT | 1.000–1 | — |
| croparea_listopt | LIST | — | |
| reference_imageopt | IMAGE | — | |
| control_videoopt | IMAGE | — | |
| nag_paramsopt | NAGParamtersSetting | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | IMAGE | Upscaled Video |