VOSR 2.0 Upscale
One-step super-resolution that keeps text and fine structure legible
- model
- image
- IMAGE
If you've been upscaling for a while you know the drill: pick your poison between detail-preserving restorers like SeedVR2, repair-everything monsters like SUPIR, and instant pixel-only ESRGAN models. VOSR 2.0 is a newer entrant that mostly plays in the SeedVR2 lane - it's a generative, detail-adding upscaler rather than a pure interpolator - but its pitch is different: one single step instead of a diffusion chain, trained hard on keeping fine structures and small text readable. The demo shots that sell it are building facades and tiny English and Chinese text surviving a 4x blow-up without turning to mush.
The mechanism is worth understanding because it explains the settings. The node takes your image, bicubic-resizes it to the target size, encodes it through the Qwen-Image 2D VAE, and extracts features from a DINOv2-L vision encoder run on the low-res input. Those features condition a LightningDiT that takes exactly one Euler flow-matching step (t=1 down to t=0) to predict the clean high-res latent. Then it decodes, and a color_alignment pass - wavelet by default - stitches the bicubic input's low frequencies to the model's high frequencies so colors stay anchored to your source instead of drifting. "One-step" isn't marketing; it's what makes a 1.4B generative upscaler fast enough to sit in a normal workflow.
The inputs that actually matter:
model- theVOSR2_MODELfrom VOSR 2.0 Model Loader. Non-negotiable.image- a single image or a whole batch. Batches are first-class: item i runs withseed + i, so a batch matches running each image separately.upscale- exact integer multiplier, 1–4. This is an exact output scale, not a "quality" knob.seed- latent-noise seed, default 42. VOSR 2.0 is generative-ish; the seed controls the noise it denoises from.tile_size/tile_overlap- DiT tiling.vae_tile_size/vae_tile_overlap- VAE tiling.
Here's the trap that burns most people, and the tooltip is unusually blunt about it: VOSR 2.0 was trained natively at up to 512 px, so tiling is not optional once the upscaled output exceeds 512×512. The defaults keep tiling off (0), which is only correct when your result stays at or below 512 px on a side. Run a 4x upscale on any moderately sized source with defaults and quality degrades - and the node will warn you in the console. It also can't save you from the VAE: if vae_tile_size is 0, the decode happens in one full-image pass regardless of tile_size, which is the classic source of CUDA OOM past about 1024 px.
A solid general-purpose starting point from the README:
| Parameter | Value |
|---|---|
| upscale | 4 |
| seed | 42 |
| color_alignment | wavelet |
| tile_size / tile_overlap | 512 / 64 |
| vae_tile_size / vae_tile_overlap | 1024 / 128 |
Tweak the VAE tile down if you still OOM. There's no measured VRAM/tile table yet from the authors, so treat these as starting points, not guarantees. color_alignment is the fun knob: wavelet (default) merges low-freq from the bicubic target with high-freq from the model, adain matches channel statistics to the target, and none leaves the raw output - run the same job a few ways if you care about color fidelity. One known open issue, straight from the pack author's own testing notes: closely-inspected enlarged faces can show faint grid-like artifacts. Real faces deserve their own pass, same as with SeedVR2.
Install via the same steps as its sibling loader - clone https://github.com/ylchen333/ComfyUI-VOSR2 into custom_nodes/ and restart (it's not on the registry yet, so Manager search won't list it). The node warns (rather than errors) when you exceed native resolution with tiling off, and rejects overlap settings that are ≥ their tile size, so the validation is friendlier than most. You'll need the loader's model wired in, and the output is a plain IMAGE - pipe it to a SaveImage or preview and you're done.
Honest positioning: this is new and barely talked about yet, so you're not getting a decade of community consensus with it. But if your pain point is small text and fine structure dying under other upscalers, a one-step model trained for exactly that is worth the experiment.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | VOSR2_MODEL | Loaded VOSR 2.0 bundle. | |
| image | IMAGE | — | |
| upscale | INT | 41–9223372036854776000 | Exact output multiplier. VOSR 2.0 was trained on degradations up to 16x, so higher factors are supported, but there's no general quality guarantee above ~4x -- results depend on the specific image and starting/target resolution, not just the factor. Uncapped so you can experiment; use tiling for large outputs. |
| seed | INT | 420–9223372036854776000 | Initial latent-noise seed. |
| color_alignment | COMBO | wavelet | 3 options: wavelet, adain, none |
| tile_size | INT | 00–4096 | DiT pixel tile size; 0 disables tiling. VOSR 2.0 was trained natively at up to 512px, so tiling is required (e.g. 512) whenever the upscaled output exceeds 512x512 -- otherwise quality degrades. |
| tile_overlap | INT | 320–512 | — |
| vae_tile_size | INT | 00–8192 | VAE pixel tile size; 0 disables VAE tiling and decodes the full image in one pass regardless of tile_size -- a common source of CUDA OOM once the upscaled output goes much past 1024px. Set a nonzero value (e.g. 1024) for large outputs. |
| vae_tile_overlap | INT | 320–512 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |