Nodes/Spectrum LTX/Spectrum Apply LTX
ComfyUI Node

Spectrum Apply LTX

Skip a third of your LTX-2.5 steps and get away with it

By Gavr728·Created 22 days ago·Updated 21 days ago· 3
Spectrum Apply LTX
  • model
  • MODEL
◄enabledtrue►
◄presetbalanced►
◄warmup_steps5►
◄tail_actual_steps2►
◄degree3►
◄ridge_lambda0.10►
◄blend_weight0.50►
◄max_history8►
◄forecast_spaceauto►
◄history_storagesystem_ram►
◄validatefalse►
◄debugfalse►

A 22B video DiT on a 20–30 step base schedule is a lot of transformer calls, and you picked LTX specifically because it's fast. Spectrum Apply LTX buys a bit more of that back: it predicts roughly a third of the model evaluations instead of running them. Not faster per pass, fewer passes - text encoding, VAE decode and your 3-step refinement stage are untouched.

It's a port of a real method: Adaptive Spectral Feature Forecasting for Diffusion Sampling Acceleration (Han et al., CVPR 2026), with Gavr728 adapting xmarre's ComfyUI-Spectrum-MiniMax-H3 - xmarre being the person behind the faithful FLUX/SDXL/WAN Spectrum ports. Which brings us to the honest part.

What you're actually trading

Spectrum is training-free approximation. Forecast steps are not the same as real steps, and the README says so in bold, which is refreshing. On quality most people can't see the difference; push to fast and you will, first on fast motion and on-screen text - detail the model was still refining. Community opinion on Spectrum splits exactly there: negligible loss for a big time saving on one side, "not worth it" on the other.

How it works

The node clones your MODEL, stashes its config in transformer_options, and hangs wrappers on ComfyUI's patcher-extension hook points - the README names three, the shipped code installs four. Nothing is counted from timers or a pass multiplier: it reads the real sigma schedule and the sampler object.

During warmup it measures whether your sampler injects fresh noise between steps. Deterministic samplers (Euler, res_multistep, SEEDS-2 at eta=0) get forecast in feature space - the final transformer block's hidden state is cached, forecast, then pushed back through LTX's own output head at the current timestep, which is the paper's method. Noise-injecting samplers (ancestral, SDE, LCM, SEEDS-2 with eta>0) are forecast in denoised space instead, rebuilding velocity from the current noisy latent so injected noise isn't skipped over. Audio always uses denoised space, because audio features don't extrapolate as smoothly. The fit is a Chebyshev polynomial blended with a two-point linear (Taylor) extrapolation.

It also strips redundant trailing zero-sigma steps: a schedule ending ..., 0.0, 0.0 wastes a model call and makes Euler divide by zero.

Measured in model evaluations at ~20 steps: quality 13 real evals to 6–7 forecast, ~1.54×; balanced (default) 12 to 7–8, ~1.67×; fast 10 to 9–10, ~2.0×. At 30 steps fast reaches about 2.3×. Longer schedules win more, because warmup and tail are fixed costs.

The inputs worth touching

Wire MODEL in, MODEL out to your guider (the README's stack is LTX dev transformer → this node → LTXVDualCFGGuider, 15–25 steps).

preset is the one you'll actually think about - quality forces a real step after every forecast, balanced allows two in a row in the later half, fast is 2 early / 3 late. warmup_steps (5) is the initial real-model window, and it doubles as the window the sampler-noise detector uses; don't drop it below ~3. tail_actual_steps (2) protects the final refinement steps, where a wrong prediction costs microdetail rather than structure. validate (false) is worth turning on once per new preset or demanding prompt: it runs the real model alongside the forecast and logs relative error, video and audio separately - no speedup while it's on, and you're aiming under about 0.05.

The rest - degree, ridge_lambda, blend_weight, max_history, forecast_space, history_storage - are defaults you leave alone; forecast_space=auto picks correctly per sampler, and history_storage=vram only if you have headroom to spend. enabled lets you bypass the node without rewiring. debug logs ACTUAL/FORECAST per step.

Install

Via ComfyUI Manager, search Spectrum LTX. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Gavr728/ComfyUI-Spectrum-LTX
# restart ComfyUI

No pip install beyond what ComfyUI ships - pyproject.toml lists only torch. The pack ships no weights, so you still bring your own LTX-2.5 files (the example workflow loads the 22B dev transformer, the distilled LoRA for stage 2, video and audio VAEs, and a Gemma-4 12B text encoder). It wants a reasonably current ComfyUI, since the wrapper hooks it rides on are core patcher-extension plumbing.

Where people get burned

  • inactive for this run: ... is not an error. Warmup plus tail ate your whole schedule - normal on short or distilled runs, and identical to the node being disabled.
  • Don't put it on the 3-step refinement stage. The README tells you to skip it there, and the general Spectrum finding backs that up: speed/distilled LoRAs compress the trajectory the forecaster fits to, so the two mechanisms fight.
  • NaN on Euler plus an audio mux error usually traces to a terminal=0 scheduler, not this node. It'll log removed N redundant zero-sigma step(s) when it saves you; set terminal to something like 0.1 regardless.
  • Drift on fast motion or text - drop to preset=quality, raise warmup_steps to 7–8, and run validate=true once. The author's own example prompt asks for a big on-screen title, so that's exactly the case to check.
  • ValueError: not a native LTXV/LTXAV model (missing ...) means you fed it something that isn't a native ComfyUI LTX model. Guard rail, not a bug.
Categorysampling/spectrum

Inputs (13)

NameTypeDefaultDescription
modelMODEL—
enabledBOOLEANtrue—
presetCOMBObalancedquality: real step after every forecast. balanced: up to 2 forecasts in a row in the later half. fast: 2 early / 3 late (more drift).
warmup_stepsINT51–100Initial steps always run on the model (composition, text layout, sampler detection).
tail_actual_stepsINT20–20Final steps always run on the model.
degreeINT31–8—
ridge_lambdaFLOAT0.100–10—
blend_weightFLOAT0.500–1Chebyshev share; remainder is 2-point linear extrapolation.
max_historyINT82–32—
forecast_spaceCOMBOautoVideo forecast space. auto: features for deterministic samplers, denoised for noise-injecting ones. Audio always uses denoised.
history_storageCOMBOsystem_ram2 options: system_ram, vram
validateBOOLEANfalseAlso run the model on forecast steps and print forecast error (no speed-up).
debugBOOLEANfalse—

Outputs (1)

NameTypeDescription
MODELMODEL—