#283·LTX-2

Bug - Train/inference parity: three divergences between ltx-trainer and ltx-core / ltx-pipelines

Author: McMvMcCreated Aug 14, 2026Updated Aug 18, 2026

Version: v1.2.0, commit fd4ded7 (2026-08-11) · Model: LTX 2.5 22B (dev and distilled)

Summary. While reading the repo to implement a custom sequence-concat conditioning scheme, I found three places where the shipped trainer and the shipped inference stack disagree. Two are internal to ltx-trainer alone — its training path versus its own validation runner. None raise an error; all three would silently train a model that behaves differently at sampling time.

  1. σ schedule. ShiftedLogitNormalTimestepSampler derives its shift from actual sequence length (timestep_samplers.py:77,122). At sampling time LTX2Scheduler.execute() only applies the equivalent shift when passed latent= — and of eight call sites, exactly one does (ti2vid_two_stages_hq.py:267). The other seven, including the trainer's own validation_runner.py:875, get the fixed 4096-token default. At the trainer's default validation geometry (960×544×89 → 6120 tokens) training draws σ at mu ≈ 2.77 while validation samples at mu = 2.05.

  2. keyframes_mask. Never set in training — zero grep hits across all five strategy files, Modality built without it at flexible.py:432-440. Always set at inference (tools.py:184, unconditional). Also set by the trainer's own validator (validation_runner.py:783,809). Code default for use_keyframes_abs_pos_embedding is False, which would make this inert — but both LTX 2.5 checkpoints ship it True (read from safetensors metadata).

  3. Token order. Training prepends (flexible.py:665) and slices the tail (:680); inference appends (reference_video_cond.py:97) and every consumer slices the head (clear_conditioning, _first_frame_keyframes_mask, build_attention_mask, multi-GPU padding). Equivalent for the model — attention is dense, positions ride on RoPE — but opposite conventions in the two halves, so porting logic between them fails silently rather than on shape.

What I'm not claiming: I haven't verified how the released checkpoints were actually trained (pretraining code isn't public, so internal training may have matched inference and only the shipped fine-tuner diverged); I haven't measured quality impact; and #3 may be deliberate.