{"slug": "ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda", "title": "LTX-2.5 text-to-video locally on Apple Silicon in one command — with audio, no ComfyUI/CUDA. 16x faster than PyTorch-on-MPS (53s vs 853s) via macOS 26 watchdog + eval-guard fixes.", "summary": "A developer has released a clone-and-run launcher that runs LTX-2.5 text-to-video generation locally on Apple Silicon in a single command, with audio support and no need for ComfyUI or CUDA. The launcher achieves a 16x speedup over PyTorch-on-MPS (53 seconds vs 853 seconds) by applying macOS 26 watchdog and eval-guard fixes. It bootstraps a pinned MLX runtime and downloads a ~36 GiB quantized weight subset from HuggingFace.", "body_md": "|\n#!/bin/zsh |\n|\n# LTX-2.5 text-to-video on Apple Silicon — clone-and-run launcher. |\n|\n# |\n|\n# First run bootstraps everything: clones the pinned MLX runtime, lets uv |\n|\n# create the Python env, and downloads the ~36 GiB q8 weight subset from |\n|\n# HuggingFace (ungated, no login). Subsequent runs go straight to generation. |\n|\n# |\n|\n# Usage: |\n|\n# ./generate \"A sailboat crossing a calm sea at golden hour\" |\n|\n# ./generate \"prompt\" --width 768 --height 512 --frames 121 --output clip.mp4 |\n|\n# |\n|\n# Constraints: width/height divisible by 32, frames = 8n+1 (33, 65, 97, 121...). |\n|\nset -euo pipefail |\n|\n|\n|\nROOT=\"$(cd \"$(dirname \"$0\")\" && pwd)\" |\n|\nRUNTIME=\"$ROOT/.runtime\" |\n|\nWEIGHTS=\"$ROOT/models/ltx-2.5-mlx-q8\" |\n|\n|\n|\nPROMPT=\"${1:?usage: generate \\\"prompt\\\" [ltx-2-mlx args...]}\" |\n|\nshift |\n|\n|\n|\n# The MLX runtime with LTX-2.5 support, pinned to a validated commit. |\n|\nRUNTIME_REPO=\"https://github.com/MrMoferFRAN/ltx-2-mlx.git\" |\n|\nRUNTIME_COMMIT=\"57952288076766abe27dda3a774b2c24f7346977\" |\n|\nWEIGHTS_REPO=\"MrMofer/ltx-2.5-mlx-q8\" |\n|\n|\n|\nfor tool in git uv ffmpeg; do |\n|\ncommand -v \"$tool\" >/dev/null || { echo \"error: '$tool' is required — install it with: brew install $tool\" >&2; exit 1; } |\n|\ndone |\n|\n|\n|\nif [[ ! -d \"$RUNTIME\" ]]; then |\n|\necho \"[bootstrap] Cloning MLX runtime (pinned $RUNTIME_COMMIT) ...\" |\n|\ngit clone --quiet \"$RUNTIME_REPO\" \"$RUNTIME\" |\n|\ngit -C \"$RUNTIME\" checkout --quiet \"$RUNTIME_COMMIT\" |\n|\nfi |\n|\n|\n|\nif [[ ! -f \"$WEIGHTS/transformer-distilled.safetensors\" ]]; then |\n|\necho \"[bootstrap] Downloading LTX-2.5 q8 weights (~36 GiB, one time) ...\" |\n|\necho \" License: LTX-2.x Community License — https://huggingface.co/$WEIGHTS_REPO\" |\n|\nuv run --project \"$RUNTIME\" python - \"$WEIGHTS_REPO\" \"$WEIGHTS\" <<'PY' |\n|\nimport sys |\n|\nfrom huggingface_hub import snapshot_download |\n|\n|\n|\nrepo, dest = sys.argv[1], sys.argv[2] |\n|\n# Distilled-pipeline subset only: skips the dev transformer and the stage-2 |\n|\n# LoRA (needed only for CFG modes), saving ~27 GiB. |\n|\nsnapshot_download( |\n|\nrepo, |\n|\nlocal_dir=dest, |\n|\nallow_patterns=[ |\n|\n\"transformer-distilled.safetensors\", |\n|\n\"connector.safetensors\", |\n|\n\"text_encoder/*\", |\n|\n\"vae_encoder.safetensors\", |\n|\n\"vae_decoder.safetensors\", |\n|\n\"audio_vae.safetensors\", |\n|\n\"vocoder.safetensors\", |\n|\n\"spatial_upscaler_x2.safetensors\", |\n|\n\"temporal_upscaler_x2.safetensors\", |\n|\n\"duration_head.safetensors\", |\n|\n\"*.json\", |\n|\n\"LICENSE.md\", |\n|\n], |\n|\n) |\n|\nPY |\n|\nfi |\n|\n|\n|\n# AGX_RELAX_CDM_CTXSTORE_TIMEOUT works around the macOS 26 + MLX 0.31 GPU |\n|\n# watchdog stall (dgrauet/ltx-2-mlx#75); the per-step cost is otherwise |\n|\n# 25-130x higher. With the watchdog relaxed, the runtime's per-block eval |\n|\n# guards are redundant on >=32 GB machines, so they are disabled too. |\n|\nexec env \\ |\n|\nAGX_RELAX_CDM_CTXSTORE_TIMEOUT=1 \\ |\n|\nLTX2_DIT_EVAL_EVERY=0 \\ |\n|\nLTX2_GEMMA_EVAL_EVERY=0 \\ |\n|\nuv run --project \"$RUNTIME\" ltx-2-mlx generate \\ |\n|\n--model \"$WEIGHTS\" \\ |\n|\n--distilled --frame-rate 24 \\ |\n|\n--prompt \"$PROMPT\" \\ |\n|\n\"$@\" |", "url": "https://wpnews.pro/news/ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda", "canonical_source": "https://gist.github.com/DanielHauschildt/9ad1d7cef482ed508a121881280b74dd", "published_at": "2026-08-14 17:26:37+00:00", "updated_at": "2026-08-15 11:41:36.097322+00:00", "lang": "en", "topics": ["machine-learning", "generative-ai", "developer-tools"], "entities": ["LTX-2.5", "Apple Silicon", "MLX", "HuggingFace", "MrMoferFRAN", "MrMofer"], "alternates": {"html": "https://wpnews.pro/news/ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda", "markdown": "https://wpnews.pro/news/ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda.md", "text": "https://wpnews.pro/news/ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda.txt", "jsonld": "https://wpnews.pro/news/ltx-2-5-text-to-video-locally-on-apple-silicon-in-one-command-with-audio-no-cuda.jsonld"}}