LTX-2.3 training guide#

Download model#

Download the LTX-2.3 transformer weights and the Gemma3 text encoder:

# LTX-2.3 transformer weights
python3 scripts/download_hf_model.py \
    --repo_id Lightricks/LTX-2.3 \
    --local_dir /path/to/models

# Gemma3 text encoder (required for conditioning)
python3 scripts/download_hf_model.py \
    --repo_id google/gemma-3-12b-it-qat-q4_0-unquantized \
    --local_dir /path/to/models

The download helper appends each Hugging Face repository name to --local_dir, producing /path/to/models/LTX-2.3 and /path/to/models/gemma-3-12b-it-qat-q4_0-unquantized in this example.

Prepare Dataset#

Use the built-in preprocessing pipeline to split videos, generate captions, and compute latents/embeddings:

Step 1: Split scenes (optional)#

Split raw videos into scene clips using PySceneDetect:

python veomni/models/diffusers/ltx2_3/ltx_condition/preprocess_dataset.py split-scenes \
    --video_dir /path/to/raw/videos \
    --output_dir /path/to/output/clips

Step 2: Generate captions#

Auto-caption video clips using a multimodal model (Qwen2.5-Omni by default):

python veomni/models/diffusers/ltx2_3/ltx_condition/preprocess_dataset.py caption \
    --input_dir /path/to/output/clips \
    --output /path/to/output/clips/dataset.json

The captioner writes each media_path as a filename relative to the dataset file’s directory. Keep dataset.json beside the clips so later stages resolve those paths correctly.

Step 3: Generate reference videos (optional, for IC-LoRA)#

Generate Canny edge reference videos before preprocessing so their paths are written to the dataset file:

python veomni/models/diffusers/ltx2_3/ltx_condition/preprocess_dataset.py compute-reference \
    --input_dir /path/to/output/clips \
    --dataset_file /path/to/output/clips/dataset.json

Step 4: Compute text embeddings and VAE latents#

Compute text embeddings + VAE latents from the dataset file:

python veomni/models/diffusers/ltx2_3/ltx_condition/preprocess_dataset.py preprocess \
    --dataset_file /path/to/output/clips/dataset.json \
    --gemma_model_path /path/to/models/gemma-3-12b-it-qat-q4_0-unquantized \
    --checkpoint_path /path/to/models/LTX-2.3 \
    --resolution_buckets "960x544x49" \
    --with_audio

The shipped AV configs set condition_model_cfg.with_audio: true, so their preprocessing command must include --with_audio. For video-only training, set that config field to false and omit the flag. For IC-LoRA, append --reference_column reference_path to the command above; this encodes the reference videos generated in Step 3.

Step 5: Pack precomputed files#

Pack precomputed .pt files into parquet shards for offline training:

python veomni/models/diffusers/ltx2_3/ltx_condition/preprocess_dataset.py save-parquet \
    --precomputed_dir /path/to/output/clips/.precomputed \
    --output_dir /path/to/output/parquet_output \
    --pad_to_multiple_of 8 \
    --with_audio

Use --with_audio whenever the training config has audio enabled. Reference latents are included automatically when reference_latents/ exists.

Output directory structure:

output/
├── clips/
│   ├── dataset.json          # Captions + clip-relative media paths
│   ├── *.mp4                 # Scene-split video clips
│   ├── *_reference.mp4       # Optional IC-LoRA reference videos
│   └── .precomputed/
│       ├── audio_latents/    # Optional, for AV training
│       ├── conditions/       # Gemma text embeddings
│       ├── latents/          # VAE-encoded video latents
│       └── reference_latents/# Optional, for IC-LoRA training
└── parquet_output/           # Parquet shards (from save-parquet)
    ├── shard_0000.parquet
    ├── shard_0001.parquet
    └── ...

Update config paths#

Before training, update the model and data paths in the config file:

# configs/dit/ltx2_av_lora.yaml
model:
  model_path: "/path/to/models/LTX-2.3"
  condition_model_path: "/path/to/models/LTX-2.3"

data:
  train_path: "/path/to/output/parquet_output"

The Gemma path is used by the preprocessing command; the shipped offline training configs consume the precomputed embeddings and do not reload Gemma.

Start training#

Audio-Video LoRA (default)#

bash train.sh tasks/train_dit.py configs/dit/ltx2_av_lora.yaml

Audio-Video LoRA (Low VRAM)#

For GPUs with limited VRAM, use the low-memory configuration with reduced LoRA rank (16 vs 32):

bash train.sh tasks/train_dit.py configs/dit/ltx2_av_lora_low_vram.yaml

Video-to-Video (IC-LoRA)#

For video-to-video transformations (e.g., depth-to-video, style transfer), use the IC-LoRA configuration. This requires reference videos in your dataset:

bash train.sh tasks/train_dit.py configs/dit/ltx2_v2v_ic_lora.yaml