Nodes/Comfyui-MMH3-UltimateUpscale/LTX25 Ultimate Upscale
ComfyUI Node

LTX25 Ultimate Upscale

Re-sample long LTX2.5 video in one node — audio intact, VRAM in check

By bbaudio-2025·Created 6 days ago·Updated 2 days ago· 116
LTX25 Ultimate Upscale
  • model
  • conditioning
  • latent
  • noise
  • sampler
  • sigmas
  • negative
  • latent_upscale_param
  • temporal_split_param
  • spatial_split_param
  • reference_guides
  • latent
  • segments_info
  • tiles_info
cfg1.0
bypass_audiotrue

The pitch is simple: you've already denoised an LTX2.5 clip and you want to re-sample it - bigger, sharper, a second pass over the finished latent - and your GPU can't hold the whole thing. Standard ComfyUI upscale nodes don't understand LTX2.5's nested AV latent (video and audio bundled in one tensor), and a naive whole-clip resample OOMs the moment the clip is long or the resolution is high. LTX25 Ultimate Upscale wraps the entire pipeline - temporal split, latent upscale, spatial tiling, per-tile sampling, stitching - into a single node so you treat the re-sampler like a fancier KSampler.

This is the LTX2.5 sibling of the pack's MMH3 Ultimate Upscale, built on the same chunk-and-tile philosophy. It's also brand new - added 2026-08-25 and labeled "highly experimental" by the author, so temper your expectations. This is cutting-edge, not battle-tested.

How it works

One node, five stages, run automatically. The finished latent is cut into overlapping time chunks (outer loop). Each chunk optionally goes through a fixed 2x latent upscaler, then gets interpolated to your target width/height. Each chunk is then split into spatial tiles (inner loop), and only one tile is sampled at a time - that's the trick that keeps peak VRAM near a single tile regardless of clip length or output resolution. Finally the tiles are stitched spatially, the chunks cross-faded temporally, and the audio tensor is carried through as-is.

Why chunk instead of letting PyTorch offload? The README spells it out: diffusion runs dozens of sequential steps over the same cyclic weight order, and offloading over PCIe (~32 GB/s versus ~1000 GB/s on-GPU) is bandwidth-bound on every step. Chunked re-sampling stays compute-bound and pays only a small fixed redundancy in overlaps. The flip side is the trade in this node's inputs: bigger chunks and tiles mean fewer overlap taxes but more VRAM per piece.

Because an LTX2.5 latent is a nested tensor - video [B,128,T,H,W] plus audio [B,C,time,freq] - the node handles both. With bypass_audio on (the default), the input audio is frozen and carried through unchanged, never re-sampled. Turn it off and the model regenerates audio, which costs extra compute and, with tiling, takes the first tile's audio per time block. The author's own README says audio is buggy; keep the default on and you never touch it.

The inputs and outputs that matter

You feed it what you'd feed a KSampler: model, conditioning, latent, noise, sampler, sigmas. cfg only does anything when you connect negative - without one, a basic positive-only guider is built internally; with one, a CFGGuider at your cfg value.

The three optional param inputs are where the tuning lives:

  • temporal_split_param - chunk length, overlap, and seam-anchoring strategy
  • spatial_split_param - tile size, overlap, and seam blending
  • latent_upscale_param - target size and the 2x upscaler

Leave any of them unconnected to skip that stage: no upscale, single chunk, or whole-chunk sampling. There's also an optional reference_guides input from the pack's LTX25 Reference Params node, which pins identity across chunks by appending encoded reference stills as near-clean guide tokens - genuinely useful, since LTX's character consistency across shots is its weakest axis.

Outputs: latent (the stitched, re-sampled AV latent - decode it with the LTX2.5 VAE), plus segments_info and tiles_info, both marked DEBUG ONLY dicts of per-chunk/per-tile metadata. Ignore them until you're chasing a seam artifact.

Installing

This node ships in bbaudio-2025/Comfyui-MMH3-UltimateUpscale. Easiest via ComfyUI Manager - search "Comfyui-MMH3-UltimateUpscale" in the Custom Nodes tab and install. Manual way:

cd ComfyUI/custom_nodes
git clone https://github.com/bbaudio-2025/Comfyui-MMH3-UltimateUpscale

Restart ComfyUI. There are no pip dependencies - the pyproject declares none, it's plain node code plus a small JS file. What you do need: a current ComfyUI (the nodes call comfy_extras.nodes_lt and comfy.nested_tensor, so an old build errors at load) and the LTX2.5 model itself. Nothing is force-downloaded.

Common issues

  • "expects an LTX2.5 AV latent" - you fed it a plain latent. It must come from an LTX2.5 generation that includes audio. It also wants batch 1 (a single video).
  • "Upscale width must be >= tile_width" - your target size is smaller than your tile. Shrink the tile or raise the target.
  • VRAM spikes on the first tile - watch ComfyUI's VRAM meter and size the largest chunk/tile that keeps peak just under capacity; the README's H3 tables don't transfer directly to LTX2.5's 32px grid, so measure your own.
  • General weirdness - it's a three-day-old, AI-vibe-coded node. When it misbehaves, the author's advice is literally "search with AI." Restart, update ComfyUI, and try again.
Categorymodel/latent/ltxv

Inputs (13)

NameTypeDefaultDescription
modelMODELThe LTX2.5 diffusion model used to re-sample every chunk/tile (guider is built internally).
conditioningCONDITIONINGConditioning used to generate this latent (LTXVConditioning with frame_rate). Passed through unchanged to every chunk/tile (T2V mode, no spatial keyframe cropping).
latentLATENTDenoised LTX2.5 AV latent to enhance (nested video+audio).
noiseNOISENoise source; one noise tensor is generated per piece.
samplerSAMPLERSampler used for every chunk/tile.
sigmasSIGMASSigma schedule used for every chunk/tile.
cfgFLOAT1.00–100CFG scale used when 'negative' is connected.
bypass_audioBOOLEANtrueAudio handling. True = the output audio is the INPUT audio carried unchanged (frozen, never re-sampled). False = the audio is RE-SAMPLED by the model; with spatial tiling the FIRST tile's audio is taken for each time block, and consecutive chunks are cross-faded. Re-sampling costs extra compute but lets the model regenerate audio for the enhanced video.
negativeoptCONDITIONINGNegative conditioning. When connected, a CFGGuider is used with the 'cfg' value; otherwise a basic guider (positive only).
latent_upscale_paramoptLTX_UPSCALE_PARAMOutput of 'LTX25 Latent Upscale Params'. Leave unconnected to skip upscaling.
temporal_split_paramoptLTX_TEMPORAL_PARAMOutput of 'LTX25 Temporal Split Params'. Leave unconnected to process the latent as a single chunk. When connected, the next chunk's overlap is anchored to the previous chunk (strategy selected by 'anchor_mode': full band / first frame only / temporal ramp) and joined by cross-fade.
spatial_split_paramoptLTX_SPATIAL_PARAMOutput of 'LTX25 Spatial Split Params'. Leave unconnected to sample each chunk whole (no tiling).
reference_guidesoptLTX25_REFERENCE_GUIDESOptional output of 'LTX25 Reference Params'. When connected, the encoded reference stills are appended to EVERY chunk as near-clean guide tokens (native LTXVAddGuide mechanism), pinning identity/scene consistency across independently sampled chunks. Leave unconnected for the previous behaviour.

Outputs (3)

NameTypeDescription
latentLATENTUpscaled, re-sampled, stitched LTX2.5 AV latent.
segments_infoDICTDEBUG ONLY. Per-chunk metadata: frame start/count, video token ranges, upscale applied.
tiles_infoDICTDEBUG ONLY. Per-chunk spatial grid metadata: offsets, tile extents, overlaps, stitching mode.