Files
Model-Optimizer/examples/windows/diffusers/qad_example/README.md
T
ynankani-nv 4a70040ddd Ynankani/fvd benchmark (#1182)
### What does this PR do?

Type of change: ? New benchmark addition

<!-- Details about the change. -->
This PR adds the following to examples/windows/:
1) FVD (Fréchet Video Distance) evaluation tool — a standalone script
for computing FVD between two sets of videos using a pre-trained I3D
model (Kinetics-400, 1024-dim pooled features).
2) Directory reorganization — moved torch_onnx/ and qad_example/ under a
new diffusers/ folder for clearer grouping of diffusion model examples.
3) Minor fixes: Updated WikiText-2 dataset link in
perplexity_metrics/README.md (old wikitext → Salesforce/wikitext)
### Usage

```python
python compute_fvd.py \
  --ref-dir /path/to/reference/videos \
  --gen-dir /path/to/generated/videos \
  --output results.json \
  --device cuda
```

### Testing
Evaluated FVD tool on LTX-2.3 outputs comparing QAD vs PTQ checkpoints
(both NVFp4) against a BF16 baseline across 11 VBench dimensions.

### Before your PR is "*Ready for review*"

Make sure you read and follow [Contributor
guidelines](https://github.com/NVIDIA/Model-Optimizer/blob/main/CONTRIBUTING.md)
and your commits are signed (`git commit -s -S`).

Make sure you read and follow the [Security Best
Practices](https://github.com/NVIDIA/Model-Optimizer/blob/main/SECURITY.md#security-coding-practices-for-contributors)
(e.g. avoiding hardcoded `trust_remote_code=True`, `torch.load(...,
weights_only=False)`, `pickle`, etc.).

- Is this change backward compatible?: ✅ 
- If you copied code from any other sources or added a new PIP
dependency, did you follow guidance in `CONTRIBUTING.md`: N/A <!---
Mandatory -->
- Did you write any new necessary tests?: N/A <!--- Mandatory for new
features or examples. -->
- Did you update
[Changelog](https://github.com/NVIDIA/Model-Optimizer/blob/main/CHANGELOG.rst)?:
N/A <!--- Only for new features, API changes, critical bug fixes or
backward incompatible changes. -->

### Additional Information
<!-- E.g. related issue. -->


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added FVD (Fréchet Video Distance) evaluation: command‑line tool,
I3D‑based feature extraction, PCA option, and quantized comparisons (PTQ
vs QAD) with per‑category and overall results showing QAD's lower
average FVD.

* **Documentation**
* Expanded benchmarks TOC with “Additional Metrics”, added FVD
evaluation guide, usage examples, troubleshooting, and updated
perplexity dataset reference.

* **Chores**
  * Added Python requirements for the FVD benchmark.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: ynankani <ynankani@nvidia.com>
Signed-off-by: Yash Nankani <ynankani@nvidia.com>
2026-04-08 19:19:13 +00:00

8.3 KiB
Raw Blame History

LTX-2 QAD Example (Quantization-Aware Distillation)

Note: This is a sample script for illustrating the QAD pipeline. It has been verified to run on a Linux RTX 5090 system, but runs into OOM (Out of Memory) on that configuration.

This example demonstrates Quantization-Aware Distillation (QAD) for LTX-2 using the native LTX training loop and NVIDIA ModelOpt. It combines:

  • LTX packages: training loop, datasets, and strategies (masked loss, audio/video split)
  • NVIDIA ModelOpt: PTQ calibration (mtq.quantize), distillation (mtd.convert), and NVFP4 quantization

Combined loss (same idea as the full distillation trainer):

L_total = α × L_task + (1−α) × L_distill

For the full-stage QAD implementation (LTX-2 DiT with ModelOpt quantization, full calibration options, checkpoint resume, and multi-node training), see the NVIDIA Model-Optimizer distillation example:

Requirements

  • Python 3.10+
  • CUDA-capable GPU(s)
  • Accelerate (for FSDP multi-GPU training)

Installation

Create a virtual environment and install dependencies:

python -m venv .venv
.venv\Scripts\activate   # Windows
# source .venv/bin/activate   # Linux/macOS

pip install -r requirements.txt

The requirements.txt includes:

Package Source
ltx-core git+https://github.com/Lightricks/LTX-2.git#subdirectory=packages/ltx-core
ltx-pipelines git+https://github.com/Lightricks/LTX-2.git#subdirectory=packages/ltx-pipelines
ltx-trainer git+https://github.com/Lightricks/LTX-2.git#subdirectory=packages/ltx-trainer
nvidia-modelopt PyPI (nvidia-modelopt)

You may also need to install PyTorch, Accelerate, safetensors, and PyYAML if not already present:

pip install torch accelerate safetensors pyyaml

Project layout

File Description
sample_example_qad_diffusers.py Main script: QAD training and inference checkpoint creation
ltx2_qad.yaml LTX training config (model, data, optimization, QAD options)
fsdp_custom.yaml Accelerate FSDP config for multi-GPU training

Usage

1. Prepare your dataset

Run the LTX preprocessing script to extract latents and text embeddings from your videos. Use preprocess_dataset.py with the following arguments (matching the LTX training pipeline):

python scripts/process_dataset.py /path/to/dataset.json \
    --resolution-buckets 384x256x97 \
    --output-dir /path/to/preprocessed \
    --model-path /path/to/ltx2/checkpoint.safetensors \
    --text-encoder-path /path/to/gemma \
    --batch-size 4 \
    --with-audio \
    --decode
  • Positional: path to dataset metadata file (CSV/JSON/JSONL with captions and video paths).
  • Required: --resolution-buckets, --model-path, --text-encoder-path.
  • Optional: --output-dir (defaults to .precomputed in dataset dir), --batch-size (default 1), --with-audio, --decode (decode and save videos for verification).

Set data.preprocessed_data_root in your config (step 2) to the same path as --output-dir.

On a Slurm cluster, run the same script via srun and torchrun (set MASTER_ADDR, MASTER_PORT, WORLD_SIZE from Slurm and use --nnodes=$SLURM_NNODES and --nproc_per_node=8).

2. Configure paths

Edit ltx2_qad.yaml and set:

  • model.model_path – path to base LTX checkpoint (e.g. .safetensors)
  • model.text_encoder_path – path to Gemma text encoder
  • data.preprocessed_data_root – path to preprocessed LTX dataset

Adjust qad section as needed: calib_size, kd_loss_weight, exclude_blocks, skip_inference_ckpt.

Hyperparameters controllable via YAML (ltx2_qad.yaml)

All of the following can be set in ltx2_qad.yaml. QAD-specific options can also be overridden from the CLI (see step 3).

Section Key Default (example) Description
qad calib_size 512 Number of calibration batches for PTQ (more = better scale estimates, slower startup).
qad kd_loss_weight 0.5 Weight for distillation loss in combined loss; 0 = task loss only, 1 = distillation only.
qad exclude_blocks [0, 1, 46, 47] Transformer block indices to exclude from quantization (e.g. first/last blocks).
qad skip_inference_ckpt false If true, do not build the inference checkpoint after training.
optimization learning_rate 1e-6 Learning rate (low is typical for QAD/distillation).
optimization steps 300 Total training steps.
optimization batch_size 1 Per-device batch size.
optimization gradient_accumulation_steps 4 Gradient accumulation steps (effective batch = batch_size × accumulation × num_gpus).
optimization optimizer_type "adamw" Optimizer (adamw, etc.).
checkpoints interval 100 Save a checkpoint every N steps; null to disable.
(root) output_dir "outputs/ltx2_qad" Where to write checkpoints and logs.

3. Run QAD training

Using Accelerate with the provided FSDP config:

accelerate launch --config_file fsdp_custom.yaml sample_example_qad_diffusers.py train \
    --config ltx2_qad.yaml \

Checkpoints are saved under output_dir (e.g. outputs/ltx2_qad/checkpoints/) as safetensors plus optional amax and modelopt state files.

4. Create inference checkpoint (ComfyUI-compatible)

ComfyUI is a node-based interface for running diffusion models (Stable Diffusion, LTX, etc.). You load your exported checkpoint in ComfyUI to generate images or videos from prompts and workflows.

To build a single inference checkpoint compatible with ComfyUI, use the PTQ checkpoint merger:

python -m ltx2.tools.ptq.checkpoint_merger \
    --artefact /path/to/amax_artifact.json \
    --checkpoint /path/to/ltx2_qad_bf16.safetensors \
    --config /path/to/config.yaml \
    --output /path/to/comfyui_checkpoints/nvfp4_qad_inference.safetensors
  • --artefact – Path to the amax artifact JSON (from calibration / QAD training).
  • --checkpoint – Path to the trained QAD weights (e.g. ltx2_qad_bf16.safetensors from your run).
  • --config – Path to the merger config YAML.
  • --output – Output path for the ComfyUI-ready .safetensors file.

This produces a single .safetensors file you can load in ComfyUI.

How it works

  1. Model load – Base transformer is loaded via ltx_trainer.model_loader.load_transformer.
  2. PTQ calibration – ModelOpt mtq.quantize runs a calibration loop using the LTX dataset and training strategy; NVFP4 config excludes sensitive layers and optionally specific blocks.
  3. Distillation – A full-precision teacher (same checkpoint) is loaded and the quantized model is wrapped with ModelOpt mtd.convert (KD loss).
  4. Training – Standard LTX training loop with an overridden _training_step that adds KD loss via ModelOpt’s loss balancer.
  5. Checkpoint save – Checkpoints are filtered (no teacher/loss/quantizer state), optionally dtype-matched to the base model, and saved as safetensors; amax and modelopt state can be saved separately.

References