VAE Scale Wan Video
Scaling the 3D causal VAE that compressed open video
- vae
- VAE
The Wan VAE is a different beast from every image VAE in this pack. It's a 3D causal VAE - it compresses time as well as space, so a clip's frames get pooled into a lower-resolution video latent rather than each frame being encoded independently. That temporal compression is a big reason Wan 2.1 could put open video generation on consumer GPUs at all, and it's the architecture Qwen-Image later borrowed (frozen encoder and all). VAE Scale Wan Video is this pack's per-stage scaling node for it.
If you generate Wan video, this is one of those nodes you'll almost certainly never need. Wan's own VAE is baked into every normal workflow and it works. The tool exists for the same anatomy-class purposes as the other scale nodes - finding out which stage of the autoencoder owns which behavior - with the extra wrinkle that here you're probing a codec that also juggles frame timing, so the stakes are a little higher and the failure modes a little stranger.
What the widgets map to
The key table follows Wan's layout. You get top-level conv1. and conv2. (the latent I/O convs), then encoder.conv1., encoder.head., encoder.middle. with encoder.middle.0.–.2., and a run of encoder.downsamples.0.–.10. - mirrored on the decoder side with decoder.upsamples.0.–.14. and decoder.head.. All scales default to 1.0 over a 0.0–2.0 range; 1.0 leaves the stage untouched, 0.0 zeroes it, >1.0 amplifies. Because the node uses longest-prefix matching, decoder.upsamples.3. affects only that stage, not the whole decoder.
How it works
Standard pack engine: read the VAE state dict, multiply each tensor by its longest-matching scale, and rebuild a fresh VAE in memory. Output is a single VAE that feeds VAEDecode (or a VAE-save node if you want to keep the result - the node itself writes nothing). One practical note: because it's a full state-dict rebuild each run, and Wan's VAE is a chunky 3D model, it's not a free operation - fine for experiments, not something to churn in a loop.
The honest positioning
This is the niche-est node in a niche family. Scaling Wan's video VAE stage-by-stage won't fix a blurry or flickering render - that's a sampler/checkpoint problem, not a VAE-weight problem - and the cross-architecture rule from the rest of the pack applies harder here: Wan's VAE is video-specific and 16-channel, so don't feed it an image VAE and expect a blend. About the only genuinely interesting use is comparative research against the Qwen-Image VAE, since they share the architecture - probe one, probe the other, learn which stages are doing the work.
Installing it
From the easygoing0114/ComfyUI-easygoing-nodes pack. ComfyUI Manager → search Easygoing, or:
cd ComfyUI/custom_nodes
git clone https://github.com/easygoing0114/ComfyUI-easygoing-nodes.git
Restart. No model downloads, no extra pip dependencies; the pack is written against the V3 node API, so a current ComfyUI build is required. If the nodes don't register after a fresh install, update ComfyUI and restart.
Wan is frozen at 2.2 as the open video base, and its VAE isn't going anywhere. This node is the way to study it - if studying is your thing. Otherwise, leave the knobs at 1.0 and go make video.
Inputs (41)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| conv1. | FLOAT | 1.000–2 | — |
| conv2. | FLOAT | 1.000–2 | — |
| encoder.conv1. | FLOAT | 1.000–2 | — |
| encoder.head. | FLOAT | 1.000–2 | — |
| encoder.middle. | FLOAT | 1.000–2 | — |
| encoder.middle.0. | FLOAT | 1.000–2 | — |
| encoder.middle.1. | FLOAT | 1.000–2 | — |
| encoder.middle.2. | FLOAT | 1.000–2 | — |
| encoder.downsamples.0. | FLOAT | 1.000–2 | — |
| encoder.downsamples.1. | FLOAT | 1.000–2 | — |
| encoder.downsamples.2. | FLOAT | 1.000–2 | — |
| encoder.downsamples.3. | FLOAT | 1.000–2 | — |
| encoder.downsamples.4. | FLOAT | 1.000–2 | — |
| encoder.downsamples.5. | FLOAT | 1.000–2 | — |
| encoder.downsamples.6. | FLOAT | 1.000–2 | — |
| encoder.downsamples.7. | FLOAT | 1.000–2 | — |
| encoder.downsamples.8. | FLOAT | 1.000–2 | — |
| encoder.downsamples.9. | FLOAT | 1.000–2 | — |
| encoder.downsamples.10. | FLOAT | 1.000–2 | — |
| decoder.conv1. | FLOAT | 1.000–2 | — |
| decoder.head. | FLOAT | 1.000–2 | — |
| decoder.middle. | FLOAT | 1.000–2 | — |
| decoder.middle.0. | FLOAT | 1.000–2 | — |
| decoder.middle.1. | FLOAT | 1.000–2 | — |
| decoder.middle.2. | FLOAT | 1.000–2 | — |
| decoder.upsamples.0. | FLOAT | 1.000–2 | — |
| decoder.upsamples.1. | FLOAT | 1.000–2 | — |
| decoder.upsamples.2. | FLOAT | 1.000–2 | — |
| decoder.upsamples.3. | FLOAT | 1.000–2 | — |
| decoder.upsamples.4. | FLOAT | 1.000–2 | — |
| decoder.upsamples.5. | FLOAT | 1.000–2 | — |
| decoder.upsamples.6. | FLOAT | 1.000–2 | — |
| decoder.upsamples.7. | FLOAT | 1.000–2 | — |
| decoder.upsamples.8. | FLOAT | 1.000–2 | — |
| decoder.upsamples.9. | FLOAT | 1.000–2 | — |
| decoder.upsamples.10. | FLOAT | 1.000–2 | — |
| decoder.upsamples.11. | FLOAT | 1.000–2 | — |
| decoder.upsamples.12. | FLOAT | 1.000–2 | — |
| decoder.upsamples.13. | FLOAT | 1.000–2 | — |
| decoder.upsamples.14. | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VAE | VAE | — |