⬡ Polyhedron H3 Latent Upscale
Hi-res fix for MiniMax H3 video
- latent
- positive
- latent
- info
- positive
Sampling a 15-second clip at 1344×768 when you only needed to preview it at 832×480 is how you turn a six-minute render into forty. ⬡ Polyhedron H3 Latent Upscale is the video equivalent of hi-res fix: sample small, lift the finished latent with a learned 3D upscaler, then run a short second pass at the target size with a low denoise.
That's the same two-pass logic people have used for stills since the SD 1.5 days - generate at native resolution, upscale the latent, second pass at 0.3–0.5 denoise to add coherent detail - except here the intermediate guess is a trained network rather than a bicubic resize.
Why not just resize the latent?
Because a plain latent resize is a blur in latent space, and the second pass then either commits the blur or hallucinates on top of it. You get ghosting on edges and that soft, resampled look. A learned 3D upscaler predicts plausible latent content, so the second pass is refining instead of apologising. It also avoids a VAE round trip: the latent stays a latent between passes, which is faster and doesn't drag decode artifacts into the second sample.
How it behaves
Wire the first pass's AV latent in. The node splits the picture stream from the audio stream, lifts only the picture, and passes audio through untouched - H3 generates picture and sound jointly, and there is no reason to reinvent the soundtrack during an upscale.
It refuses anything that isn't an H3 latent: not 24 channels, not going through. It runs in fp32 deliberately - bf16 GroupNorm can collapse the whole thing into a brown frame - and if the result comes back NaN or inf it errors rather than passing that along to a second sampler.
Size comes from size_mode:
scale- a factor, 1.0 to 4.0 (scale, default 2)width x height- explicit pixelsmegapixels- target area, aspect preserved
align (32 by default) is the pixel grid the target snaps to, and you should leave it at 32 because that's the H3 canvas. The node reports the latent arithmetic in info, e.g. 832x480 px -> 1344x768.
Two switches that matter on consumer cards: temporal_chunking lifts long clips in 32-frame chunks with blended overlaps (less VRAM, and no flicker at the clip's end), and free_vram_first unloads models and empties the CUDA cache before the lift - the first-pass sampler is done by then, and an fp32 upscaler wants the room.
The second pass
Out come latent and info, plus positive - which is the input positive with keyframes stripped. That's on purpose: a first/last frame was pinned at the first pass's size and is already baked into the latent, so at the new size it wouldn't fit. References survive. Wire the second sampler's conditioning to that output, not the original.
The author's own recipe, straight from the node's info string: 3 steps, beta, denoise 0.2, same model, same LoRAs, same prompt. A second pass at 0.2 barely moves the picture - that's the point. You're sharpening a decision the first pass already made.
H3 AV latent (832×480) → H3 Latent Upscale → Sampler (3 steps, beta, 0.2) → VAE Decode
Install
Manager, search "Polyhedron Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/PolyhedronAI/ComfyUI-PolyhedronLoRAStack.git
# restart ComfyUI
No Python dependencies - requirements.txt is a comment block saying exactly that. What you do need is the weight file: LBH-123-AI/Minimax_h3_latent_Upscaler on Hugging Face (MIT), dropped into models/latent_upscale_models. The dropdown lists H3 files first but shares the folder with other model families' upscalers, so read the names.
Where people get burned
Empty upscaler slot. With no file the node raises rather than silently skipping - the message tells you the folder and to press R. The combo entry (put an H3 latent upscaler into models/latent_upscale_models) is a placeholder, not a model.
Passing it a non-H3 latent. SDXL latents have four channels, video latents sixteen-odd; this wants H3's 24-channel AV packing. It says so by name.
Second pass at a high denoise. At 0.2 you get a sharper version of the first pass. At 0.6 you get a new clip with a resemblance to the old one, sans audio continuity. If you want to change the picture, go back to pass one.
H3 itself. Before you spend a night on this pipeline: MiniMax H3's community licence excludes the EU, UK, Korea and the US from its applicable territory. Worth knowing what you're licensed to run before you tune denoise.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | The H3 AV latent of the FIRST pass (sampled small). Its audio passes through untouched. | |
| upscaler | COMBO | The learned H3 latent upscaler (3D), from models/latent_upscale_models -- e.g. LBH-123-AI/Minimax_h3_latent_Upscaler on Hugging Face. H3 files are listed first; the folder is shared with other models' upscalers. | |
| size_mode | COMBO | scale | How the new size is given: a factor, a width x height in pixels, or megapixels (the aspect stays). |
| scale | FLOAT | 2.001–4 | size_mode = scale: the factor (1.0 - 4.0). |
| width | INT | 134464–8192 | size_mode = width x height: the target width in pixels. |
| height | INT | 76864–8192 | size_mode = width x height: the target height in pixels. |
| megapixels | FLOAT | 1.000.1–16 | size_mode = megapixels: the target size; the aspect stays. |
| align | INT | 3216–256 | The pixel grid the size snaps to. 32 = the H3 canvas -- keep it. |
| temporal_chunking | BOOLEAN | true | Lift long clips in 32-step chunks with blended overlaps (less VRAM, no flicker at the clip's end). Off: one pass over the whole clip (short clips). |
| free_vram_first | BOOLEAN | true | Unload the models and empty the CUDA cache BEFORE the lift (the sampler of the first pass is done) -- the upscaler runs in fp32. |
| positiveopt | CONDITIONING | The first pass's positive -- it comes out at `positive` WITHOUT keyframes (a first/last frame was pinned at the first pass's size and is in the latent already; at the new size it would not fit). References stay. Wire the second pass's sampler to that output. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| info | STRING | — |
| positive | CONDITIONING | — |