LTXVScheduler (Power)
The LTX scheduler's hidden trap — and the one knob that fixes it
- latent
- SIGMAS
If you've run LTX long enough you've felt it: the clip looks fine for the first few steps, then does almost nothing for most of the denoise, and the last couple of steps carry all the weight. That's not your prompt. That's the stock LTX scheduler - a plain logistic that clings to sigma ≈ 1 and then falls off a cliff. LTXVScheduler (Power) is a drop-in fork of ComfyUI's built-in LTXVScheduler that adds one exponent knob, power, so you can hold the schedule high and still come down smoothly. power = 1.0 is bit-for-bit the stock node; anything above that changes the shape without changing the recipe.
The stock node hardcodes that exponent at 1.0, and it leaves you stuck with a coupling: raise the shift to hold the curve near 1 longer and you necessarily flatten the midpoint and shove the whole descent into the final steps. power breaks that trade. Because it only touches the (1/s − 1) term - which equals 1 at the midpoint (s = 0.5) - it changes the slope there without moving the value. Higher power exits the midpoint faster and spreads the descent more evenly. The author's suggested starting range is 1.5–2.0, and that matches what you'll hear from LTX tinkerers: people have been hand-tuning "min/max sigma shift" on the stock node for ages (a well-known r/StableDiffusion settings post runs 0.35–3.25), and this just gives you a cleaner lever for the shape half of it.
How it works
Each linspace value s running 1→0 across your steps is mapped to a sigma:
σ(s) = e^k / (e^k + (1/s − 1)^power) k = sigma_shift
k is a linear function of the latent's token count: base_shift at 1024 tokens, max_shift at 4096. The killer detail for video: if you don't touch the shifts, the schedule silently drifts when you change resolution or frame count, because k moves with token count. Setting max_shift == base_shift pins k to one value and kills the drift - the README's own tip, and the first thing you should do.
The inputs that matter
You'll actually set four of these, and the rest are background:
steps- your sampler step count (default 20).power- the headline. 1.0 = stock, 1.5–2.0 to fix the cliff.max_shift/base_shift- the shiftkat 4096/1024 tokens. Set them equal to lock the schedule against resolution changes.sigma_max- a final scalar multiply that becomes your new starting sigma (1.0 = no-op). Mostly for people scaling the whole denoise range.stretch/terminal- advanced; they linearly rescale the tail so the last non-zero sigma lands onterminal(default 0.1). A lift, not a reshape.latent- optional. Its token count drivesk; leave it unplugged and it assumes 4096 tokens.
The single output is SIGMAS, which wires straight into a sampler's sigmas input - SamplerCustom is the usual home in LTX workflows.
Install
Pure Python, zero dependencies, no model downloads - the whole pack is one node class. Via ComfyUI Manager search "alt_ltx23_scheduler", or:
cd ComfyUI/custom_nodes
git clone https://github.com/baslack/alt_ltx23_scheduler
Restart ComfyUI and you'll find LTXVScheduler (Power) under model/sampling/schedulers, next to the stock node it leaves untouched.
Gotchas
The one real caveat is in the README: this mirrors the v0.24.0 stock LTXV math. If Lightricks changes the upstream formula in a future ComfyUI release, this fork won't track it automatically - you may end up with two schedulers that disagree. That's the usual price of a good fork, and for a shape knob like this it's a fine trade. If your results suddenly look like the old cliff-y LTX after a ComfyUI update, check the version math rather than your prompt.
Troubleshooting is blessedly short for a math node: schedule shifting when you change resolution → set max_shift == base_shift. Last steps doing everything → raise power toward 2.0. Want to confirm you're not crazy → set power = 1.0 and it is the stock node.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| steps | INT | 201–10000 | — |
| max_shift | FLOAT | 2.050–100 | — |
| base_shift | FLOAT | 0.950–100 | — |
| power | FLOAT | 1.000.1–10 | Exponent on the (1/sigma - 1) term. 1.0 matches the stock node. Higher values steepen the slope at the midpoint without changing the value there, for a more even descent. |
| sigma_max | FLOAT | 1.000–1000 | Scales the whole sigma curve. The schedule's natural peak is 1.0 at the first step, so this value becomes the new starting sigma and everything else scales proportionally. 1.0 leaves the curve unchanged. Applied after stretch. |
| stretch | BOOLEAN | true | Stretch the sigmas to be in the range [terminal, 1]. |
| terminal | FLOAT | 0.100–0.99 | The terminal value of the sigmas after stretching. |
| latentopt | LATENT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SIGMAS | SIGMAS | — |