Views
No views yet
ltx-2-mlx (branch ltx-2.5).Status (2026-08-13): the port is COMPLETE on both consumers. Python-MLX (ltx-2-mlx, branchltx-2.5) and Swift-MLX (ltx-2-mlx-swift) both generate end to end, including the DFR pipeline with temporal rounds. Parity-gated per component against the PyTorch reference: text encoder 49 states (mean cosine 0.999985), DiT forward, sampler, keyframe slots, and the DFR canvas geometry bit-exactly.Still a research port — it is not a supported product, and see Memory below before you plan a run.
LICENSE.md, and the Acceptable Use Policy it incorporates by
reference is snapshotted here as
ltx-acceptable-use-policy-snapshot-2026-08-12.pdf
(the version in effect at your time of use governs — check
Lightricks' current AUP).ltx-2-mlx dialect, fused projections split). No weights were trained, fine-tuned, or
numerically altered beyond layout/serialization transforms. Conversion tooling:
scripts/convert_ltx25.py.| File | Contents | Params |
|---|---|---|
transformer-distilled.safetensors | distilled joint-AV DiT (fixed 8-step, CFG=1) | 22B |
transformer-dev.safetensors | dev (full) joint-AV DiT | 22B |
gemma4-12b-ltx-v1/ | Lightricks-tuned Gemma-4-unified text encoder, HF layout (loads via mlx-lm) | 12B |
connector.safetensors | text-embeddings connectors + aggregate projections | — |
vae_encoder.safetensors / vae_decoder.safetensors | conv video VAE (byte-identical to LTX-2.3's) | 726M |
vae_diffusion_decoder.safetensors | DiffVAE 1-step x0 video decoder (NA attention) | 417M |
audio_vae.safetensors / vocoder.safetensors | audio VAE + BigVGAN v2 + BWE (byte-identical to 2.3's) | 182M |
spatial_upscaler_x2_v1_1.safetensors | ×2 spatial latent upscaler (byte-identical to 2.3's) | 498M |
temporal_upscaler_x2_v1_0.safetensors | ×2 temporal latent upscaler (byte-identical to 2.3's) | 131M |
duration_head.safetensors | prompt→duration predictor (fused MHA split to q/k/v) | 1.9M |
config.json / embedded_config.json | pipeline + transformer configs | — |
mlx-forge 2.3 conversions — validating this converter's conv/layout/rename
handling against independent tooling.ff_bias: false) + keyframes_abs_pos_embedding.Gemma4Unified): tokenization
identical; all 49 tapped hidden states ≥ 0.9997 cosine; pre-connector projections ≥ 0.99996.| peak | |
|---|---|
| default (text encoder co-resident with the DiT) | 62.40 GB |
| with the DiT evicted around the encode phase | 40.66 GB |
gemma4-12b-ltx-v1/ is an unquantized bf16 12B —
23.8 GB on disk, ~24.4 GB resident. LTX-2.3 used a 4-bit Gemma-3 (~7 GB), so anything you
carry over from a 2.3 setup will badly under-estimate 2.5. The DiT itself is a 37.98 GB
resident floor at bf16.embed_tokens in bf16): encoder
24.42 → 14.20 GB, end-to-end 62.40 → 52.18 GB. We measured this as numerically faithful
(valid-token cosine 0.999820 against a 0.999879 bf16 floor) and perceptually neutral in a
blinded 6-pair operator A/B (3 ties, 2–1, all "very close").
⚠️ int4 was REJECTED — 0.996728 on the same metric, consistent with an independent
in-fleet measurement of a different frozen encoder. Note that several third-party MLX packs
ship this encoder at 4-bit with no published quality data.
No quantized sibling is published here; the recipe is in the consuming repo.mlx_lm.convert -q also quantizes
embed_tokens, which is hidden state 00 and the input to all 48 layers — exclude it. The
mixed_* recipes are worse: with tied embeddings they put the embedding table at 3 bits.1git clone -b ltx-2.5 https://github.com/xocialize/ltx-2-mlx
2cd ltx-2-mlx && uv sync
3uv run ltx-2-mlx generate \
4 --model mlx-community/ltx-2.5-mlx \
5 --distilled \
6 --prompt "a red fox standing in deep snow, closeup wildlife photography, golden hour" \
7 -H 512 -W 768 -f 121 --frame-rate 24 -o fox.mp4--num-generated-keyframes N places N
invented keyframes at evenly spaced interior positions. Note what this does and does not do:
it relaxes the effective temporal compression at those positions (each slot costs a full
latent frame of tokens to buy one pixel frame). In our measurement it did not, on its own,
turn a shot-listed prompt into multiple cut shots — that is the DFR pipeline's job.1// https://github.com/xocialize/ltx-2-mlx-swift — MLX-Swift consumer.
2// 2.5 is detected from the CHECKPOINT (the in-dir gemma4-12b-ltx-v1/), never a path name,
3// so a renamed or relocated copy still resolves correctly.
4let pipeline = try await LTX2Pipeline.load(ltxDir: modelDir, gemmaDir: gemma4Dir)
5let out = try await pipeline.t2vTwoStage(prompt: prompt, height: 320, width: 448,
6 numFrames: 25, fps: 24, seed: 4242)Lightricks/LTX-2.5 (comfy split
pack; connectors sourced from the transformer-file bundle, which is what the reference
runtime loads) and Lightricks/LTX-2.5-Diffusers
(diffusion decoder). All credit for the models to Lightricks — see the
LTX-2 reference implementation and the
LTX-2.5 announcement.