MiniMaxH3 Enhanced Upscale
Tiles, refines, and leaves your audio alone
- model
- conditioning
- latent
- director_guide
- vae
- start_image
- negative
- sampler
- noise
- continuity_context
- latent
- plan
Video upscaling is the awkward third job in this space. More pixels is easy, more invented detail is a known recipe, but "bigger over time" is where every per-frame upscaler quietly falls apart - fine wallpaper starts shimmering because frame 40 and frame 41 disagreed about the pattern. MiniMax H3 makes that worse in one specific way: its native latent carries video and stereo audio packed together, so a naive upscale has to either drop the sound or resample it.
MiniMaxH3 Enhanced Upscale (DaSiWaH3TiledUpscale) is the one-node answer to that. It upscales a finished H3 latent, optionally refines it with a short H3 diffusion pass, plans its own tiles so it doesn't OOM, and hands the audio back exactly as it arrived. (One caveat that has nothing to do with this node: H3's community licence excludes the US, EU, UK and Korea, so plenty of people shouldn't be running the weights at all.)
What it actually does
The node expects the native packed H3 latent - the nested video [1,24,T,H/16,W/16] plus audio [1,32,2,A] that H3's sampler emits. Feed it anything else and it stops with a clear error instead of guessing.
From here it works in three stages. First it plans: it estimates a diffusion budget from your device memory (or from memory_budget_mb if you set one), splits the target canvas into spatial tiles capped around 2.1 MP each, then slices the timeline into windows of up to 30 latent tokens. Second, it upscales in latent space - interpolation for pure pixel-count work, or a learned safetensors model from models/latent_upscale_models/. Third, with denoise above 0 it runs a very short diffusion pass on the same H3 model using tile-local coordinates so neighbouring tiles agree. Defaults are 1 step at denoise 0.2 with CFG 1 - a light polish, not a second generation. The audio tensors never leave the packed latent, so there's no re-synthesis drift to argue with.
The controls that matter
latent- the completed sampler output. With Continuity, feed the Append & Stagecumulative_latent, not the fresh sampler window: assemble first, upscale once.scale- factor only, default 2.0. Target size is source × factor, snapped to the 32-pixel grid. There's no width/height pair to fiddle with.upscale_model-interpolationor a checkpoint filename frommodels/latent_upscale_models/. No automatic pick and no fallback; if you want the learned path you install the file yourself. Interpolation ignoresupscale_precisionentirely.denoise- 0.2 by default, and0skips refinement altogether, which is the fastest setting that still changes anything.spatial_tiling/temporal_chunking- both on by default. Leave them on. A single full-canvas tile falls back to native sampling anyway, so "on" isn't a penalty, it's a permission.enforce_memory_budget- on by default. Turning it off lets the planner attempt plans beyond its own conservative estimate; it does not disable tiling, ComfyUI's memory manager, or the host-RAM checks, and it does not make OOM go away.spike_guard- off by default, and it should stay off unless you're chasing a specific burn artifact. The author calls it experimental, calibrated on one upscaler, and says it may remove real detail.
Two outputs: latent, a native packed video/audio latent you wire straight into your existing AV decode path, and plan, a plain STRING report of what the planner actually chose. plan is diagnostic - hook it to a note node when a run surprises you, otherwise leave it dangling.
Install
Grab the pack through ComfyUI Manager (search DaSiWa-Nodes), or do it manually:
cd ComfyUI/custom_nodes
git clone https://github.com/darksidewalker/ComfyUI-DaSiWa-Nodes
cd ComfyUI-DaSiWa-Nodes && pip install -r requirements.txt
Restart ComfyUI afterwards. The pack needs an NVIDIA RTX GPU with drivers 530+, and requirements.txt pulls a wide set of dependencies - transformers, av, llama-cpp-python, nvidia-vfx - because you're installing the whole collection, not just this node. Installed version shows up in Settings → About.
For the learned path, drop the upscaler safetensors into ComfyUI/models/latent_upscale_models/. The inference code is adapted from LBH-123-AI's H3 latent upscaler, and it hides ltx-named files from the dropdown - if your checkpoint isn't listed, check the filename first.
Where people get burned
The most common wall is the input type. This node wants the packed H3 AV latent; a decoded IMAGE batch, a video-only latent, or an inpaint source latent with a noise mask all get rejected on purpose. Finish the inpaint pass first. The second is the model: if your H3 MODEL is already wrapped by bbaudio's Tiled Diffusion, this node refuses it, because it installs its own wrapper and won't stack. Having the bbaudio pack installed is fine; just hand over the unwrapped model.
And don't ignore the RAM message. Before allocating, the node checks host memory against a conservative budget for the full output plus noise staging, and raises MemoryError rather than letting the machine thrash. That means shorten the clip or lower the scale - not that the node is broken. Worth knowing too that automatic plan changes can shift seeded results between versions, and that newer inputs are appended to the widget list so your existing workflow values keep their slots.
Inputs (30)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| conditioning | CONDITIONING | — | |
| latent | LATENT | — | |
| scale | FLOAT | 2.01–8 | — |
| upscale_model | COMBO | 1 options: interpolation | |
| steps | INT | 11–100 | — |
| denoise | FLOAT | 0.200–1 | — |
| seed | INT | 00–18446744073709550000 | — |
| director_guideopt | MINIMAX_H3_DIRECTOR_GUIDE | — | |
| vaeopt | VAE | — | |
| start_imageopt | IMAGE | — | |
| negativeopt | CONDITIONING | — | |
| cfgopt | FLOAT | 1.00–20 | — |
| sampler_nameopt | COMBO | euler | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduleropt | COMBO | simple | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| memory_budget_mbopt | INT | 00–131072 | 0: automatic device-memory estimate. Nonzero caps the planning budget; not a hard allocator limit. |
| sampleropt | SAMPLER | — | |
| noiseopt | NOISE | — | |
| continuity_contextopt | DF_H3_CONTINUITY_CONTEXT | — | |
| upscale_precisionopt | COMBO | auto | Learned latent-upscaler compute precision only. Auto uses ComfyUI device/backend policy. Does not change the incoming diffusion model or VAE. Interpolation does not use this setting. |
| continuity_soft_refineopt | BOOLEAN | false | Active Continuity only: smoothly introduce video refinement over the source-tail overlap. Not RGB color matching. |
| continuity_mask_strengthopt | FLOAT | 1.000–1 | 0: original hard mask. 1: full smoothstep ramp over the existing Continuity overlap. Ignored unless soft refine is enabled and Continuity is active. |
| spatial_tilingopt | BOOLEAN | true | Allow automatic spatial tiling for diffusion. A single full-canvas tile uses native sampling without a tiled wrapper. Off always uses the full canvas. Independent of memory-budget enforcement. |
| temporal_chunkingopt | BOOLEAN | true | Allow automatic temporal windows for learned upscale and diffusion, up to 30 latent tokens per planned window. Short videos may use one window. Off processes the complete video. Independent of memory-budget enforcement. |
| spike_guardopt | BOOLEAN | false | Optional correction for unusually strong local latent deviations introduced by learned upscaling, which may appear as blown-out or discolored patches after decoding. Compares the upscaled result with the source and gently corrects detected regions before diffusion refinement. Experimental and default off: may suppress real detail. Evaluated signature is specific to 3d_conv_v1; other checkpoints are not validated. Ignored for interpolation. |
| guard_sensitivityopt | FLOAT | 4.31.5–12 | Detection threshold, not correction strength. Lower values detect more regions and increase the risk of correcting real detail; higher values target only stronger outliers. Default 4.3. Ignored when Spike Guard is off, interpolation is selected, or strength is 0. |
| guard_strengthopt | FLOAT | 1.000–1 | How strongly detected regions are corrected toward the source-consistent low-resolution signal, with soft edges. 0 leaves the latent unchanged and skips guard allocations; 1 applies the full correction. Does not control the detection threshold. Ignored when Spike Guard is off or interpolation is selected. |
| guard_modeopt | COMBO | burn_direction | burn_direction (default): detect outliers matching one known 24-channel latent artifact pattern. Direction means the sign of that channel pattern, not a direction in the image or a brightness threshold. both: also detect the opposite sign of the same pattern, not all artifact types; broader detection can correct legitimate detail. Ignored when Spike Guard is off, interpolation is selected, or strength is 0. |
| enforce_memory_budgetopt | BOOLEAN | true | On: enforce the estimated diffusion budget with the selected memory reserve. Off: skip estimated budget rejection; you are responsible for actual OOM risk. Spatial/temporal planning, ComfyUI memory management and host RAM/spike guard checks remain active. |
| memory_reserve_pctopt | FLOAT | 50–100 | Workspace reserve after device and model reservations. Default 5% is aggressive, not a VRAM guarantee. 0% still enforces explicit estimated costs; 100% leaves no refinement budget. Ignored when Memory Planning is off. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| plan | STRING | — |