Minimax H3 Latent Upscaler (3D)
Sharper MiniMax H3 video without paying for a VAE round-trip
- latent
- latent
MiniMax H3 latents are 24 channels of compressed video, and if you've ever tried to upscale an H3 render by decoding to pixels, running an ESRGAN, and re-encoding, you know it's slow, fuzzy, and sometimes just wrong. The Minimax H3 Latent Upscaler (3D) skips all that. It takes an H3 latent in, runs a small trained neural network on it, and hands you back a bigger latent that decodes cleanly. One VAE decode at the end, nothing in between. That's the whole pitch, and it's a good one.
The context matters. MiniMax H3 - the 33B open-weights video model that dropped in August 2026 - generates at up to 2K, but generating at full resolution is expensive in both time and VRAM. The two-stage trick the community keeps landing on: generate small, upscale, then let a short refinement pass add the detail back. This node is the "upscale" half of that. The README is blunt about the trade-off though: the learned upscale saves time, not VRAM. Any H3 refinement pass still runs the transformer at target resolution, so this node gets you there cheaper, not for free.
How it works
The model is a learned 24-channel upscaler built from the approach Ttl pioneered in ComfyUi_NNLatentUpscale, with architecture that draws on the LTX 2.3 spatial upscaler. It's a small ResNet-style stack - 12 in/out blocks, 512 base channels, dropout 0.1 - with temporal convolution layers every second block (kernel 5). Trained on ~80k paired samples, heavily weighted to video and 2×. Unlike a plain F.interpolate, it has weights that learned what upscaled H3 latents should look like, so textures and motion edges come out sharper and more stable.
What makes this the "3D" variant: it scales H×W spatially with trilinear interpolation but processes the whole temporal sequence in one pass, preserving your frame count. It does not silently split a long clip into independent chunks - which the author deliberately refuses to do, because chunking breaks the temporal convolution's normalization statistics. On a long clip that means one continuous forward pass, so watch your memory.
The inputs that matter
latent- your MiniMax H3 latent, straight from whatever generated it. Output goes to VAE Decode.mode- how the target size is computed.scale by multiplier(2.0 is the sweet spot the model was mostly trained on),target dimensions(1280×704 by default), ormegapixels(1.0 = roughly 1024²).align(default 32) - pixel-grid alignment. Don't fight this one: H3's VAE needs a 16× grid, so the node useslcm(align, 16)and lands both axes on it. If you set 24, you get 48-aligned output. Leave it at 32 unless you know why you're changing it.keep_proportion(default true) - locks aspect ratio while it searches for the nearest valid aligned size. Turn it off only if you actually want independent W/H.offload_after_upscale(default false) - moves the model back to CPU after running to free VRAM. It's off by default on purpose: on a 24GB card the reload latency just slows repeated runs. Flip it if you're on the edge.
You'll also see device (cuda/cpu) and precision (fp32/fp16/bf16, default fp16). fp16 is fine here; drop to fp32 only if you see odd artifacts.
Install
Clone into custom_nodes and restart:
cd ComfyUI/custom_nodes
git clone https://github.com/xmarre/Comfyui_Minimax_h3_latent_Upscaler.git
Or search "Minimax H3 Latent Upscaler" in ComfyUI Manager. The only Python dependency beyond what ComfyUI already ships is einops. The important step is the model: the repo has no weights, and the model_name dropdown stays empty until you drop the checkpoint into ComfyUI/models/latent_upscale_models/. Grab it from LBH-123-AI/Minimax_h3_latent_Upscaler on HuggingFace, restart, and it auto-detects the architecture.
Common issues
The model dropdown being empty is the top complaint, and it's always the missing download above. The other gotcha is expecting this to add detail it can't: a latent upscaler is interpolation, not generation - it won't invent eyelashes the way SeedVR2-style restorers will. It sharpens and enlarges what's already there. And one honest note about the ecosystem: H3's community license excludes the US, EU, UK, and South Korea, so depending where you live, running any H3 pipeline locally may not be legal for you - that's a model-license problem, not a node problem.
If you want the full two-stage path with the second H3 refinement pass built in, the pack ships a separate node for that. This one is the clean LATENT→LATENT upscaler: generate, upscale, decode, done.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | * | Input latent (image or video). | |
| model_name | COMBO | Minimax H3 upscale model. | |
| mode | COMBO | How the target size is computed. | |
| align | INT | 321–512 | Pixel-space alignment. Both output axes are placed on a grid compatible with this value and the H3 16x VAE grid. |
| keep_proportion | BOOLEAN | true | Preserve the source aspect ratio as closely as the requested alignment grid allows. |
| device | COMBO | cuda | 2 options: cuda, cpu |
| precision | COMBO | fp16 | 3 options: fp32, fp16, bf16 |
| offload_after_upscale | BOOLEAN | false | Move the cached learned upscaler to CPU after inference to free VRAM. Leave off for faster repeated runs when VRAM is available. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent | * | Upscaled latent. |