H3Kit 3D 潜空间放大
Upscale H3 video as latent math, not pixels
- source_latent
- upscaled_latent
MiniMax H3 is a 33B omni-modal model that can technically do 2K. Practically, nobody samples a long H3 clip at 2K on a consumer card. The standard move - same one stills have used since hi-res fix - is generate at a resolution that fits, then finish at a resolution you like. For stills the middle step is a latent upscale plus a low-denoise second pass. H3Kit 3D 潜空间放大 is that middle step for H3 video: it takes an H3 latent and returns a larger one, using a trained resize network rather than interpolation.
The distinction matters. A "latent upscale" without trained weights is just resizing a compressed image - blurrier detail, no new detail. This node loads real weights and runs a 3D network over the latent, so the thing you hand to a short high-res sampling pass is already structurally informed. It's the same machinery that powers the lift stage inside H3Kit's SelfLift sampler; this node exposes it standalone for when you're doing your own two-pass setup.
What's actually happening
The network is built for H3 specifically: a 3D conv/attention stack with the H3 VAE's 24-channel latent normalization statistics baked in as per-channel mean and std. That's the tell that this was trained against the H3 latent space and not adapted from an image model - throw a different video model's latent at it and the statistics are simply wrong.
You specify the target size in pixels, even though it eats latents. Under the hood it multiplies your latent's grid by the VAE's 16× spatial factor, applies your target, then snaps the result back onto the latent grid - which is why pixel_alignment exists.
The inputs you'll actually touch
source_latent takes a single image or video latent. upscale_weights is a dropdown fed from ComfyUI/models/latent_upscale_models/ (subfolders and ComfyUI extra model paths work, .pth and .safetensors). If the dropdown shows a (place models in: ...) entry, that's the pack saying the folder is empty, and selecting it raises an error rather than doing something clever. Nothing is auto-downloaded.
resize_settings is a dynamic combo with three modes: scale by multiplier (1.0–4.0, default 2.0), target dimensions (width/height in pixels), and megapixels. Pick one, fill the sub-fields it reveals. Keep pixel_alignment at 32 - the tooltip is unusually firm ("32 is strictly recommended"), and it's the value that keeps the VAE's 16-pixel spatial grid happy.
Then the three switches that decide whether it runs on your card. temporal_chunks (default on) walks the video in chunks so long clips don't blow VRAM, and it also fixes end-frame flicker - leave it on. spatial_tiles (default off) tiles in space and fuses the result in CPU RAM, auto-shrinking tiles when you run out of VRAM; slower, and the output can differ slightly from the untiled path. release_weights (default on) parks the weights back on CPU when inference finishes so the next node gets the VRAM - the tradeoff being that the model is not cached across runs, so every execution re-loads it. If you're iterating on the same clip with VRAM to spare, turning it off saves you a load each time.
compute_backend is cuda, rocm or cpu (the ROCm option errors out if your PyTorch isn't a HIP build), and compute_precision is fp32/fp16/bf16, default fp16.
Output, and what to do with it
One output: upscaled_latent. Wire it into a sampler for a couple of low-denoise steps at the new resolution, then decode. Decoding it straight is legal but rarely what you want - you've enlarged the latent, and it still needs the sampling pass to put detail in. That's the second pass, and it's the whole reason the upscaler exists.
Install
ComfyUI Manager → search ComfyUI-H3-upgrade-kit → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/flywhale-666/ComfyUI-H3-upgrade-kit.git
No extra Python packages; the repo's requirements.txt is empty and pyproject.toml declares no dependencies. The pack also registers the latent_upscale_models folder for you, so you only need to drop weights in:
ComfyUI/models/latent_upscale_models/your-h3-upscaler.safetensors
The H3 base model, text encoder, audio/video VAE and any acceleration LoRA are yours to source - the pack ships nodes, not checkpoints.
Traps
A composite audio+video latent can't go through here. The README is explicit: split the video stream out, upscale it, then re-join the audio afterwards - otherwise you're running a video resize network over a nested AV tensor. If the result looks like an upscaled JPEG, you skipped the second sampling pass. And on anything longer than a handful of seconds, temporal_chunks off is how you meet your OOM.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| source_latent | LATENT | Input latent (image or video). | |
| upscale_weights | COMBO | Minimax H3 upscale model. | |
| resize_settings | COMBO | How the target size is computed. | |
| pixel_alignment | INT | 321–512 | Pixel-space alignment. 32 is strictly recommended. |
| temporal_chunks | BOOLEAN | true | Enable temporal chunking to save VRAM for long videos and fix end-frame flickering. |
| release_weights | BOOLEAN | true | 推理结束后先将权重移回 CPU,释放显存给后续节点;模型不跨执行缓存。 |
| compute_backend | COMBO | cuda | 3 options: cuda, rocm, cpu |
| compute_precision | COMBO | fp16 | 3 options: fp32, fp16, bf16 |
| spatial_tilesopt | BOOLEAN | false | 按空间分块放大,在 CPU 内存中融合结果,降低显存峰值;显存不足时自动缩小分块。可与时间分块同时开启。速度会降低,画质可能有差异;仅影响本放大节点。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| upscaled_latent | LATENT | Upscaled latent. |