ltx-2-mlx vs ltx-2-mlx-swift:ltx-2.5-mlx两大消费端实现对比与选型指南
ltx-2-mlx vs ltx-2-mlx-swift:ltx-2.5-mlx两大消费端实现对比与选型指南
ltx-2-mlx 与 ltx-2-mlx-swift 是 ltx-2.5-mlx 权重包的两套消费端实现:前者是 Python-MLX 命令行工具,后者是 Swift-MLX 原生库,二者都能让 LTX-2.5(22B 音视频联合生成模型)在 Apple Silicon 上端到端本地生成带声音的视频。本文用一张对照表讲清两者的差异、显存占用与选型建议,帮你 3 分钟做出不后悔的决定。
🎬 先搞懂 ltx-2.5-mlx:一个"权重仓库",两种用法
ltx-2.5-mlx 本身不是一个可执行程序,而是把 Lightricks LTX-2.5 转成 MLX 格式、并按组件拆分的权重仓库,由两个"消费端(consumer)"来加载运行:
ltx-2-mlx(Python):脚本化命令行工具,uv管理环境,适合自动化批处理与快速实验ltx-2-mlx-swift(Swift):MLX-Swift 原生管线,提供异步 API,适合 App 集成与长期运行
⚠️ 两者的移植状态均为研究级(research port):能完整跑通,但不是受支持的产品,正式使用前请先评估风险(详见 README.md)。
仓库按功能把模型拆成了 11 个组件,这也是"选型"的基础——消费端负责把它们串成完整管线:
| 组件文件 | 作用 | 规模 |
|---|---|---|
| transformer-distilled.safetensors | 蒸馏版音视频 DiT(固定 8 步采样、CFG=1,速度最快) | 22B |
| transformer-dev.safetensors | 完整版 DiT(质量上限更高) | 22B |
| gemma4-12b-ltx-v1/ | Lightricks 调优的 Gemma-4 文本编码器(bf16,约 24 GB 常驻) | 12B |
| vae_encoder.safetensors / vae_decoder.safetensors | 视频 VAE 编解码 | 726M |
| vae_diffusion_decoder.safetensors | DiffVAE 单步 x0 解码器 | 417M |
| vae_decoder_pruna.safetensors | PrunaAI 精简解码器(可选,解码约 2× 提速) | — |
| audio_vae.safetensors / vocoder.safetensors | 音频 VAE + BigVGAN 声码器 | 182M |
| spatial_upscaler_x2_v1_1.safetensors / temporal_upscaler_x2_v1_0.safetensors | 空间 ×2 / 时间 ×2 潜在上采样器 | 498M / 131M |
| connector.safetensors / duration_head.safetensors | 文本嵌入连接器 / 提示词→时长预测头 | — / 1.9M |
管线与 DiT 的架构参数见 config.json 与 embedded_config.json:48 层音视频联合 DiT、音视频交叉注意力(use_audio_video_cross_attention)、RoPE 位置编码——也就是说,视频画面与声音是在同一个 Transformer 里联合生成的,这正是 LTX-2.5 的卖点。
⚖️ 核心差异:Python 端 vs Swift 端
2026-08-13 起,两个消费端均已对 LTX-2.5完成移植(COMPLETE),并通过了与 PyTorch 参考实现的逐项对拍(parity):文本编码器 49 个隐藏状态平均余弦相似度 0.999985,采样器、关键帧槽位、DFR 画布几何均一致。功能层面两者基本对齐,差异集中在默认行为与使用形态:
| 对比维度 | ltx-2-mlx(Python-MLX) | ltx-2-mlx-swift(Swift-MLX) |
|---|---|---|
| 形态 | 命令行工具(CLI) | 原生 Swift 异步 API(LTX2Pipeline) |
| 典型场景 | 脚本批处理、快速实验、参数调优 | macOS/iOS App 集成、长期稳定运行 |
| 环境管理 | uv虚拟环境 +uv run | Xcode / Swift 工程直接依赖 |
| DiT 分阶段驱逐(省 21.74 GB 显存) | 非默认,需自行配置 | ✅默认开启,输出比特一致 |
| Pruna 精简 VAE 解码器 | 支持 | ✅ 低档位(compact24 / balanced32)默认启用 |
| 模型版本识别 | 按检查点目录解析 | 从目录内 gemma4-12b-ltx-v1/ 自动识别 2.5,改名/移动目录也不受影响 |
蒸馏版 8 步快速采样(--distilled) | ✅ | ✅ |
多镜头关键帧(--num-generated-keyframes) | ✅ | ✅ |
| DFR 细节增强管线 | ✅ | ✅ |
一句话总结:Swift 端把"省显存、跑得久"的优化做成了默认行为;Python 端赢在脚本化灵活性和上手速度。
🧮 内存账本:运行 LTX-2.5 到底需要多大统一内存
这是选型前最容易被忽略的一环。实测数据(Apple Silicon 128 GB,448×320×9 帧,bf16,Swift 消费端):
| 配置 | 峰值内存 |
|---|---|
| 默认(文本编码器与 DiT 同时常驻) | 62.40 GB |
| DiT 在编码阶段被驱逐 | 40.66 GB(−34.8%) |
| 文本编码器 int8 量化 | 编码器 24.42 → 14.20 GB,端到端降至52.18 GB |
要点拆解:
- DiT 本体 37.98 GB 常驻(bf16)是硬底——48 层 22B 模型摆在那,量化前绕不开;
- 真正的大户是文本编码器:gemma4-12b-ltx-v1/ 是未量化的 bf16 12B,磁盘 23.8 GB、常驻约 24.4 GB。LTX-2.3 时代只用 4-bit Gemma-3(约 7 GB),从 2.3 迁移过来的用户容易严重低估 2.5 的内存需求;
- 两个"显存杠杆"可以叠加:分阶段驱逐 DiT(调度优化,不损失质量、不增加耗时)+ 编码器 int8 量化(组大小 64、保留
embed_tokens为 bf16,实测数值保真且盲测观感中性); - ⚠️ 官方明确拒绝 int4 量化(余弦 0.996728,明显劣化)——第三方 MLX 打包若提供 4-bit 编码器且无公开质量数据,请谨慎。
建议:统一内存 ≥ 96 GB 再考虑本地跑 LTX-2.5;48/64 GB 机型建议优先云端或更低规格模型。
🚀 快速上手:两种消费端各跑一步
方式一:Python CLI(ltx-2-mlx)
# 注意:权重来自 Hugging Face 的 mlx-community/ltx-2.5-mlx uv sync uv run ltx-2-mlx generate \ --model mlx-community/ltx-2.5-mlx \ --distilled \ --prompt "a red fox standing in deep snow, closeup wildlife photography, golden hour" \ -H 512 -W 768 -f 121 --frame-rate 24 -o fox.mp4参数速记:--distilled启用 8 步快速采样;-H/-W/-f控制高、宽、帧数;--frame-rate设帧率;-o输出文件。
进阶参数:
--num-generated-keyframes N:在等距的内部位置生成 N 个"虚构关键帧",放松这些位置的时间压缩。注意它并不会自动把分镜提示词变成多镜头切换——那是 DFR 管线的工作。- DFR(diffusion fidelity rendering):空间细节增强档在 4/4 对比测试中更受操作员青睐,代价约 1.2× 耗时;时间轮(temporal rounds)耗时 1 轮 2.767×、2 轮 3.542×,官方建议"想要时间密度再用轮次,想省时间请直接按目标帧率原生生成"。
方式二:Swift 原生(ltx-2-mlx-swift)
// 2.5 从检查点自动识别(看目录里的 gemma4-12b-ltx-v1/),不依赖路径名 let pipeline = try await LTX2Pipeline.load(ltxDir: modelDir, gemmaDir: gemma4Dir) let out = try await pipeline.t2vTwoStage(prompt: prompt, height: 320, width: 448, numFrames: 25, fps: 24, seed: 4242)Swift 端还有两个 Python 端需要手动开启的默认优化:
- DiT 分阶段驱逐:编码阶段把 37.98 GB 的 DiT 移出内存,峰值直降 21.74 GB,输出比特一致;
- Pruna 解码器选择:
LTX2Configuration.vaeDecoderPath或环境变量LTX_VAE_DECODER=pruna指定 vae_decoder_pruna.safetensors。实测在 24 GB M5 Pro 上解码约 2× 提速、每段视频节省 15.9% 墙钟时间;在解码瓶颈场景(704×512×121)峰值从 21.1 GB 降到 14.5 GB,把一次"超预算换页"的运行拉回预算之内。代价是解码近似但不比特精确。
✅ 选型指南:3 个判断条件帮你定
- 要不要写进 App / 追求长期稳定运行?→ 选ltx-2-mlx-swift。显存优化默认就绪(DiT 驱逐 + 低档位默认 Pruna 解码器),异步 API 天然贴合 Swift Concurrency。
- 要不要脚本化、批处理、快速调参?→ 选ltx-2-mlx(Python)。CLI +
uv环境最轻,一条命令出片,方便接进自动化流水线。 - 机器只有 96 GB 以下统一内存?→ 两个消费端都不推荐:bf16 下 DiT 37.98 GB + 编码器 24 GB 的叠加峰值,留给系统与其他进程的余量会非常紧张。
⚠️ 使用前的 3 个提醒
- 许可证:权重受 LTX-2.x Community License 约束,条款全文见 LICENSE.md,可接受使用政策快照为 ltx-acceptable-use-policy-snapshot-2026-08-12.pdf。年收入 ≥ 1000 万美元的实体必须先向 Lightricks 购买付费授权(非商业测试/评估除外),并履行"AI 生成内容披露"等义务。
- 定位:这是研究级移植,不是受支持的产品,别直接押在生产上。
- 转换说明:仓库内所有张量文件均经 MLX 惯例重序列化(conv 布局、组件拆分、键名方言),数值未做任何训练或微调改动——细节与完整性校验(如 Pruna 解码器的 SHA-256)见 README.md。
总结:功能上 Python 端与 Swift 端已对齐,真正的差异是"默认值"——脚本党选ltx-2-mlx,App 党选ltx-2-mlx-swift;而比选型更重要的,是先确认你的 Mac 有足够大的统一内存。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考