🔍 H3 Relay · Latent Upscale
Upscale H3 in latent space, leave the time axis alone
- latent
- latent
- report
The other seven nodes are all about time - where one segment ends and the next starts. This one is about resolution, and it's the only node in the pack whose name doesn't start with 🔗. It takes the packed H3 AV latent, unpacks it, runs the temporal blocks through a learned 3D upscaler, and repacks. Zero denoising, no frames added or removed, audio carried through untouched. It is a pure geometry operation on the latent.
Two reasons to reach for it. First, the obvious one: you're rendering at H3's native resolution and want more pixels without a full second sampling pass. Second - and this is the interesting case - it's the intermediate step in the standard production route: sample at native → upscale the latent → sample again at high resolution, which is the video equivalent of a hi-res fix. The upscaling essay covers why that second low-denoise pass is what adds coherent detail rather than just pixels; this node is the step that gets you there cheaply.
The pack takes no credit for the upscaler itself. The learned model comes from a separate community package, Comfyui_Minimax_h3_latent_Upscaler by LBH-123-AI, which you install alongside. This node won't work without it - and the error it throws names the repo and the weights URL, which is better than most cross-pack dependencies manage.
The input that will bite you
Most of the schema is polite: mode picks how you specify the target (a scale multiplier, an explicit width/height, or a megapixels budget), and only the matching parameter is read. align must stay 32 - that's a hard requirement of the H3 latent upscaler, not a preference. precision (bf16 default) and device are exactly what they look like; force_unload pushes the upscaler back to CPU when it's done, which is worth turning on if a sampler follows, and worth leaving off when you're chunking because it'll thrash.
Then there's chunks, and this is the one to understand before you touch it. chunks: 1 runs the whole segment in one pass - fastest, hungriest, and the only setting that matches the upstream model's inference exactly. Raising it splits the segment along the time axis to fit in VRAM, and it changes the picture: the upscaler's attention is volumetric in 3D, so splitting it severs the cross-chunk temporal context. overlap (default 5, matching the model's temporal kernel) blends the borders and softens the break - it does not cancel it. Measured per-frame MAE is around 5.62/255, which is visible. The author's own framing is that the unit tests lock down the splicing maths, not "different chunk count, same picture". So: leave chunks at 1, raise it only when you're out of VRAM, and re-inspect your seams after you do. The maximum legal chunk count is bounded by the overlap constraint and printed in the report - exceeding it errors rather than quietly adjusting.
Output: latent, plus report with the real numbers.
The relay-specific rule
If you're using this mid-film, keep the continuation contract in the native domain. That means: Latent Save taps the first pass, before the upscale; the Copy Bridge's conditioning output is connected only on the native-resolution sampling pass, because minimax_keyframes rows are computed against the target grid and a resolution change makes the anchor row count not match - you get a shape mismatch from inside the model. The latent-side pin (prefix copy + noise mask) is grid-agnostic and still works on the second pass, so you're only giving up the framing half of the pin. Also: upscale once per chain. If your sampler already contains a built-in upscale step, this node is doing the same job a second time, on the same latent.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ZenHG/ComfyUI-H3-Latent-Relay.git
# only needed for the upscale node:
git clone https://github.com/LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler.git
Then download the weights from https://huggingface.co/LBH-123-AI/Minimax_h3_latent_upscaler into ComfyUI/models/latent_upscale_models/ and restart the backend. These are H3-specific 24-channel latent upscaler weights, not an ESRGAN-family pixel model. Dropping an ESRGAN checkpoint in there won't work and won't tell you why. ComfyUI Manager → search h3-latent-relay for the main pack; the other seven nodes run fine without any of this.
Where it goes wrong
Nothing shows in the model_name dropdown means the weights aren't in latent_upscale_models/, or you didn't restart after putting them there. A scale below 1 errors from upstream - this node only enlarges. And if your seam was already teetering, chunking is a good way to find out: re-check the joins after any chunks > 1 run, because you've changed the picture, not just the speed.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | 【接法】接本段采样器的 latent 输出。 ⚠ 存给下一段的那份要取放大前的,否则下一段会再放大一次。 | |
| model_name | COMBO | 【填什么】H3 潜空间放大权重。 放在 models/latent_upscale_models/ 下,重启后可选。 下载:https://huggingface.co/LBH-123-AI/Minimax_h3_latent_upscaler ⚠ 普通 ESRGAN 放大模型不能用。 | |
| mode | COMBO | 【怎么选】三种定尺寸方式,只生效选中的那一种: · scale by multiplier = 给倍数(最常用); · target dimensions = 直填宽 × 高; · megapixels = 按像素预算。 | |
| scale | FLOAT | 2.001–4 | 【倍数模式】放大系数。1.0 = 不变,2.0 = 边长翻倍。 ⚠ 只放大不缩小,小于 1 会报错。 |
| width | INT | 128064–8192 | 【目标尺寸模式】目标宽(像素),会自动对齐到 align 的倍数。 |
| height | INT | 70464–8192 | 【目标尺寸模式】目标高(像素),会自动对齐到 align 的倍数。 |
| megapixels | FLOAT | 1.000.06–16 | 【兆像素模式】目标总像素。1.0 约 720p 量级;12 GB 显存建议 ≤1.5。 |
| chunks | INT | 11–64 | 【显存·切时间】沿时间轴分几块跑。1 = 整段一次过(最快、最吃显存)。 ⚠ 切了会改画面 ⇒ 切完必须重看缝。上限由重叠决定,超了报错。 |
| overlap | INT | 50–16 | 【块间重叠】分块时两侧各留几帧做渐变混合。默认 5。 只在 chunks 大于 1 时起作用;0 = 硬切不混合。 |
| align | INT | 321–512 | 【对齐网格】输出宽高取这个数的倍数。32 是放大模型的硬要求,别改小。 |
| precision | COMBO | bf16 | 【精度】bf16 / fp16 省显存;fp32 最稳但最慢。与权重自身精度一致最保险。 |
| device | COMBO | cuda | 【算在哪】cuda / rocm 正常跑;cpu 只用于排查,实际慢得多。 |
| force_unload | BOOLEAN | false | 【跑完卸载】开 = 把放大模型退回内存腾显存;关(默认)= 留在显存。 ⚠ 分块时每块都要装卸一次,明显更慢。 |
| spatial_tiles | INT | 11–16 | 【显存·切空间】沿长边切几块。1 = 不切(默认)。 小显存:8G 跑 2MP 先试 2 块;不够再 3~4,通常到 4 就够。 每块时间轴完整 ⇒ 比切时间(chunks)伤得轻;但切了会改画面,切完重看缝。 |
| spatial_overlap | INT | 81–64 | 【空间重叠】相邻两条的重叠宽度(latent 格,1 格约 16 像素)。默认 8。 重叠只当上下文用,核心区独占 ⇒ 不会重影。 它换算力:长边 80 格、重叠 8 时 3 块多算约 40%。至少要装得下接缝羽化。 |
| seam_feather | INT | 40–16 | 【接缝羽化】过渡带宽度(latent 格)。默认 4;0 = 硬过渡。 成片出现淡色差线时调到 8~12,并同步调大空间重叠。 |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| report | STRING | — |