| # Utility Scripts Reference |
|
|
| This guide covers the various utility scripts available for preprocessing, conversion, and debugging tasks. |
|
|
| ## 🎬 Dataset Processing Scripts |
|
|
| ### Video Scene Splitting |
|
|
| The `scripts/split_scenes.py` script automatically splits long videos into shorter, coherent scenes. |
|
|
| ```bash |
| # Basic scene splitting |
| uv run python scripts/split_scenes.py input.mp4 output_dir/ --filter-shorter-than 5s |
| ``` |
|
|
| **Key features:** |
|
|
| - **Automatic scene detection**: Uses PySceneDetect for intelligent splitting |
| - **Multiple algorithms**: Content-based, adaptive, threshold, and histogram detection |
| - **Filtering options**: Remove scenes shorter than specified duration |
| - **Customizable parameters**: Thresholds, window sizes, and detection modes |
|
|
| **Common options:** |
|
|
| ```bash |
| # See all available options |
| uv run python scripts/split_scenes.py --help |
| |
| # Use adaptive detection with custom threshold |
| uv run python scripts/split_scenes.py video.mp4 scenes/ --detector adaptive --threshold 30.0 |
| |
| # Limit to maximum number of scenes |
| uv run python scripts/split_scenes.py video.mp4 scenes/ --max-scenes 50 |
| ``` |
|
|
| ### Automatic Video Captioning |
|
|
| The `scripts/caption_videos.py` script generates a single, detailed combined audio-visual |
| caption per video as a continuous paragraph of prose. Two backends are available: |
|
|
| - **`qwen_omni` (default)** — Qwen3-Omni-30B-A3B-Thinking served via a local |
| [vLLM](https://docs.vllm.ai/) HTTP server (~1-3 s/video on H100). Highest quality, runs |
| fully offline once the model is downloaded. |
| - **`gemini_flash`** — Google Gemini (cloud, `gemini-3.5-flash`). No GPU required. Auth is |
| automatic: set `GEMINI_API_KEY` (or `GOOGLE_API_KEY`) for the Developer API, or just have |
| Google Cloud credentials available (`gcloud auth` / an attached service account) and it |
| uses Vertex AI with no extra setup. |
|
|
| **Step 1 — launch the captioner server** (`qwen_omni` only, one-time). |
|
|
| `scripts/serve_captioner.py` runs vLLM in an isolated environment via `uvx`, so vLLM's heavy |
| CUDA dependencies never touch the trainer's venv. It defaults to dynamic FP8 quantization |
| (~31 GiB weights, fits on 40 GB GPUs, same speed as BF16 on H100): |
|
|
| ```bash |
| # Terminal 1 - stays running |
| uv run python packages/ltx-trainer/scripts/serve_captioner.py |
| |
| # Useful variants: |
| # --print-cmd show the vLLM command without running it |
| # --quantization bf16 use BF16 instead (needs ~66 GiB free VRAM) |
| # --hf-home /mnt/disk override where the ~65 GB model is downloaded |
| ``` |
|
|
| **Step 2 — caption your videos.** |
|
|
| ```bash |
| # Terminal 2 - default backend talks to the server above |
| uv run python packages/ltx-trainer/scripts/caption_videos.py videos_dir/ --output dataset.json |
| |
| # Remote server: --vllm-url http://other-host:8001/v1 |
| # Gemini (gemini-3.5-flash): --captioner-type gemini_flash (uses GEMINI_API_KEY, else gcloud/Vertex) |
| # Gemini, parallel calls: --captioner-type gemini_flash --num-workers 5 |
| # Re-caption everything: --override |
| ``` |
|
|
| Captioning is incremental (already-captioned files are skipped, progress saves every 5 videos) |
| and writes JSON, JSONL, CSV, or TXT based on the output extension. |
|
|
| Qwen3-Omni-Thinking can optionally emit a `<think>...</think>` chain-of-thought before the |
| caption (`--enable-thinking`). It is off by default, which is recommended for bulk captioning |
| (thinking is slower as it generates the reasoning trace first). |
|
|
| For Gemini, keep `--num-workers` at 3-5 (higher values may hit API rate limits). |
|
|
| ### Dataset Preprocessing |
|
|
| The `scripts/process_dataset.py` script processes videos and caches latents for training. |
|
|
| ```bash |
| # Basic preprocessing |
| uv run python scripts/process_dataset.py dataset.json \ |
| --resolution-buckets "960x544x49" \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --text-encoder-path /path/to/gemma-model |
| |
| # With video decoding for verification |
| uv run python scripts/process_dataset.py dataset.json \ |
| --resolution-buckets "960x544x49" \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --text-encoder-path /path/to/gemma-model \ |
| --decode |
| ``` |
|
|
| Multiple resolution buckets can be specified, separated by `;`: |
|
|
| ```bash |
| uv run python scripts/process_dataset.py dataset.json \ |
| --resolution-buckets "960x544x49;512x512x81" \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --text-encoder-path /path/to/gemma-model |
| ``` |
|
|
| > [!NOTE] |
| > When training with multiple resolution buckets, set `optimization.batch_size: 1`. |
| |
| **Multi-GPU preprocessing.** Launch with `accelerate launch` to shard the dataset across processes. Reruns resume |
| by default (existing `.pt` outputs are skipped); writes are atomic so interrupted runs are safe. Pass `--overwrite` |
| when rerunning with changed parameters (different model, resolution buckets, text encoder, `--lora-trigger`, etc.) |
| so stale outputs are replaced. Use the same `accelerate launch` pattern (and `--overwrite` when needed) with |
| `process_videos.py` or `process_captions.py` when you run those scripts standalone. |
| |
| ```bash |
| # Multi-GPU preprocessing |
| uv run accelerate launch --num_processes 4 scripts/process_dataset.py dataset.json \ |
| --resolution-buckets "960x544x49" \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --text-encoder-path /path/to/gemma-model |
| |
| # Force re-encoding of all items (e.g. after switching model or resolution) |
| uv run accelerate launch --num_processes 4 scripts/process_dataset.py dataset.json \ |
| --resolution-buckets "960x544x49" \ |
| --model-path /path/to/ltx-2.3-model.safetensors \ |
| --text-encoder-path /path/to/gemma-model \ |
| --overwrite |
| ``` |
| |
| For detailed usage, see the [Dataset Preparation Guide](dataset-preparation.md). |
| |
| ### Reference Video Generation |
| |
| The `scripts/compute_reference.py` script provides a template for creating reference videos needed for IC-LoRA training. |
| The default implementation generates Canny edge reference videos. |
|
|
| ```bash |
| # Generate Canny edge reference videos |
| uv run python scripts/compute_reference.py videos_dir/ --output dataset.json |
| ``` |
|
|
| **Key features:** |
|
|
| - **Canny edge detection**: Creates edge-based reference videos |
| - **In-place editing**: Updates existing dataset JSON files |
| - **Customizable**: Modify the `compute_reference()` function for different conditions (depth, pose, etc.) |
|
|
| > [!TIP] |
| > You can edit this script to generate other types of reference videos for IC-LoRA training, |
| > such as depth maps, segmentation masks, or any custom video transformation. |
|
|
| > [!NOTE] |
| > `compute_reference.py` writes generated references to the `reference_video` column, which |
| > `process_dataset.py` detects automatically. |
| |
| ## 🔍 Debugging and Verification Scripts |
| |
| ### Latents Decoding |
| |
| The `scripts/decode_latents.py` script decodes precomputed video latents back into video files for visual inspection. |
|
|
| ```bash |
| # Basic usage |
| uv run python scripts/decode_latents.py /path/to/latents/dir \ |
| --output-dir /path/to/output \ |
| --model-path /path/to/ltx-2-model.safetensors |
| |
| # With VAE tiling for large videos |
| uv run python scripts/decode_latents.py /path/to/latents/dir \ |
| --output-dir /path/to/output \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --vae-tiling |
| |
| # Decode both video and audio latents |
| uv run python scripts/decode_latents.py /path/to/latents/dir \ |
| --output-dir /path/to/output \ |
| --model-path /path/to/ltx-2-model.safetensors \ |
| --with-audio |
| ``` |
|
|
| **The script will:** |
|
|
| 1. **Load the VAE model** from the specified path |
| 2. **Process all `.pt` latent files** in the input directory |
| 3. **Decode each latent** back into a video using the VAE |
| 4. **Save resulting videos** as MP4 files in the output directory |
|
|
| **When to use:** |
|
|
| - **Verify preprocessing quality**: Check that your videos were encoded correctly |
| - **Debug training data**: Visualize what the model actually sees during training |
| - **Quality assessment**: Ensure latent encoding preserves important visual details |
|
|
| ### Inference with Trained Models |
|
|
| For inference with trained LoRAs, use the [`ltx-pipelines`](../../ltx-pipelines/) package which provides |
| production-ready pipelines: |
|
|
| - **Text/Image-to-Video**: `TI2VidOneStagePipeline`, `TI2VidTwoStagesPipeline` |
| - **Distilled (fast) inference**: `DistilledPipeline` |
| - **IC-LoRA video-to-video**: `ICLoraPipeline` |
| - **Keyframe interpolation**: `KeyframeInterpolationPipeline` |
|
|
| All pipelines support loading custom LoRAs trained with this trainer. |
|
|
| ## 🚀 Training Scripts |
|
|
| ### Basic and Distributed Training |
|
|
| Use `scripts/train.py` for both single GPU and multi-GPU runs: |
|
|
| ```bash |
| # Single-GPU training |
| uv run python scripts/train.py configs/t2v_lora.yaml |
| |
| # Multi-GPU (uses your accelerate config) |
| uv run accelerate launch scripts/train.py configs/t2v_lora.yaml |
| |
| # Override number of processes |
| uv run accelerate launch --num_processes 4 scripts/train.py configs/t2v_lora.yaml |
| ``` |
|
|
| For detailed usage, see the [Training Guide](training-guide.md). |
|
|
| ## 💡 Tips for Using Utility Scripts |
|
|
| - **Start with `--help`**: Always check available options for each script |
| - **Test on small datasets**: Verify workflows with a few files before processing large datasets |
| - **Use decode verification**: Always decode a few samples to verify preprocessing quality |
| - **Monitor VRAM usage**: Reach for quantization or lower-memory settings (e.g. FP8 for the captioner server) when running into memory issues |
| - **Keep backups**: Make copies of important dataset files before running conversion scripts |
|
|