MiniMax H3 Video VAE Decode
Tiled, overlap-smoothed, and Turing-shaped
- samples
- vae
- IMAGE
Every video VAE has a dirty secret: it was trained and evaluated at a specific resolution, and the moment you decode something bigger, quality falls apart - or the thing just OOMs. MiniMax H3's VAE is worse than most because its decoder is expensive. H3 Video VAE Decode is this pack's answer: a fixed tiling strategy that decodes in 256px windows with 64px overlap, stitches them back together properly, and does it in a way that plays nice with Turing cards.
The word "properly" is doing real work here. Naive tiled decoding gives you visible seams where tiles meet, because each tile's boundaries have different local conditions. This decoder instead runs a full-overlap shared-core decode - every window contributes everywhere - and stitches with a deterministic FP32 overlap epilogue plus global multiband stitching. Same-content pixels reconstruct exactly; seams don't appear. The pack's own docs call the decode path "the production path," which is the author telling you this is the one that's battle-tested.
How it works
Beyond the tiling, there are three things worth knowing:
- ComfyUI-managed block-level weight prefetch - the decoder's blocks stream in as needed instead of all squatting in VRAM, which is what makes a big H3 decode feasible on a 20-series card.
- W8A8 SwiGLU fusion - automatic quantized fusion inside the decoder for speed. The tooltip has a warning disguised as a note: "W8A8 refers to QK attention, not VAE weight quantization." Don't read it as "your VAE weights are 8-bit."
- A real speed/quality dial.
overlap_query_threshold(default 0) is experimental: at zero it preserves the stable full-overlap path; a positive value skips very-low-weight overlap memberships and renormalizes the survivors. The docs' example: for a common 864x480 decode, threshold 0.03 keeps about 80% of overlap queries in early blocks.
The inputs that matter
- samples - your
LATENT. - vae - the H3 VAE.
- attention -
sdpa(default),sage, orw8a8, for the decoder's transformer blocks. On Turing, sdpa stores BF16 inputs as FP16 to dodge PyTorch's slow BF16 math fallback. - overlap_query_threshold - 0 (default) is the quality path; small values like 0.03 are the experiment. This is paired with:
- final_full_overlap_blocks - default 36, which keeps every overlapping window in all 36 final decoder blocks. Lower it to let earlier blocks prune.
Output: IMAGE.
How to install
cd ComfyUI/custom_nodes
git clone https://github.com/wjie98/comfyui-svdint4
cd comfyui-svdint4
python -m pip install -v --no-build-isolation -e ./kernel
This is one of the nodes where the compiled kernel genuinely matters - the tiling and overlap machinery lives there. Build it, restart, and you're set. The H3 VAE weights come from the normal model folders; this node doesn't load them itself.
The honest take
Leave overlap_query_threshold at 0 until you have a reason not to. The "stable full-overlap path" exists because it's the one that doesn't produce seams or drift, and 0.03 is presented as an experimental starting point, not a recommendation. If you're hitting VRAM walls on decode, the fix is usually the block-level prefetch doing its job plus a smaller render, not cranking the pruning dial and hoping. Use this node with H3 video latents; for the encoder side of the loop, grab the pack's H3 Video VAE Encode.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | — | |
| vae | VAE | — | |
| attention | COMBO | sdpa | Decoder attention only. On Turing, BF16 SDPA inputs are consumed through containers and computed as FP16 to avoid the slow math fallback. W8A8 refers to QK attention, not VAE weight quantization. |
| overlap_query_thresholdopt | FLOAT | 0.000–0.5 | Experimental speed/quality control. Window-query memberships below this normalized cosine weight are skipped and the survivors are renormalized. Zero preserves the stable full-overlap path. |
| final_full_overlap_blocksopt | INT | 360–36 | Number of final decoder Transformer blocks that always keep every overlapping window contribution. Earlier blocks may prune low-weight overlap queries using overlap_query_threshold. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |