Context
FastVideo shipped packed MLX DiT checkpoints for FastH3 Preview v1 Dense / Data-Free on 2026-09-01. These skip scripts/checkpoint_conversion/convert_minimax_h3_mlx.py. Hugging Face cards say they "avoid the local conversion step."
This is not the VSA-DataFree CUDA checkpoint tracked in #5351. That watch stays CUDA/VSA. This issue is the Dense MLX packed path that now runs on Apple Silicon.
Default for a 128 GB MacBook Pro: INT6 (~15.41 GiB DiT). INT8 and INT4 are optional. Upstream validated on an M4 Max with 36 GB; 128 GB has headroom.
Caveats to keep explicit in catalog copy and disclosures:
- Dense / Data-Free Preview v1 only. No
--vsa.
- The Apple Silicon install guide still documents the old convert path. HF cards are the no-convert recipe.
- Two downloads: shared H3 components (tokenizer, Qwen3-VL, VAEs) plus the MLX DiT pack.
Decision
Extend the existing fastvideo BYOV runtime (do not add a new runtime, and do not reuse minimax_h3 / PipeNetwork or minimax_h3_cuda). Add FastH3 Dense-DataFree MLX as catalog entries in the MLX video bucket, same shape as FastMetal in migration 314.
Recommended default row: INT6. Also ship INT8 and INT4. Text-to-video-with-audio (T2VA). Opt-in --fast / --fast-spatial later if the UI already has a speed/quality toggle; do not block first ship on that.
Install stays user-triggered (INSTALL_FASTVIDEO). No cold-bootstrap downloads. Cache-only once weights are on disk.
Weights
Upstream run (INT6):
python examples/inference/basic/mlx_fasth3.py \
--model-root ./FastH3-Preview-v1-Dense-DataFree \
--mlx-checkpoint ./FastH3-MLX-INT6 \
--prompt '(S1) A presenter says <d>[English] Fast H3 runs on Apple silicon.</d>' \
--height 480 --width 832 --num-frames 124 --steps 4 --seed 2026 \
--output-path ./outputs/fasth3_int6.mp4
Implementation seams
Follow the FastMetal pattern (scripts/migrations/314-fastvideo-mlx-models.js, runtime: 'fastvideo'):
scripts/generate_fastvideo.py — teach it FastH3: call mlx_fasth3.py with --model-root + --mlx-checkpoint (two local dirs), 4-step schedule, 480×832 / 124 frames defaults. Keep FastMetal on mlx_wan_prompt_to_video.py / mlx_wan22_generate.py.
server/services/videoGen/renderArgs.js — argv for the new model ids.
server/services/videoGen/runtimes.js — keep using fastvideo; FastH3 is another model on that runtime, not a new BYOV id.
data.reference/media-models.json + a new migration (next id after the current last) seeding MLX-bucket rows (fasth3_dense_datafree_mlx_int6 etc.).
server/lib/mediaModels.js, server/lib/videoDisclosure.js, server/lib/huggingfaceModel.js — license, T2VA disclosure, HF auto-detect for the two-repo layout.
scripts/setup-image-video.sh — only if the FastVideo install block needs another extra; otherwise leave install as-is.
Do not invoke convert_minimax_h3_mlx.py in PortOS. Do not add these rows to the CUDA bucket. Do not claim VSA or FL2VA/Ref2VA.
Acceptance
- Video Gen on Apple Silicon lists FastH3 Dense-DataFree MLX (INT6 default; INT8/INT4 available).
- Install/download is explicit; first render does not convert DiT locally.
- A 4-step T2VA render writes a muxed mp4 via the existing FastVideo venv.
- FastMetal rows and MiniMax H3 runtimes are unchanged.
- Catalog copy states Dense-only / no VSA, MiniMax H3 Community License, and the two-download layout.
- Tests: migration idempotency + argv builder for the new ids (same style as 314).
References
Context
FastVideo shipped packed MLX DiT checkpoints for FastH3 Preview v1 Dense / Data-Free on 2026-09-01. These skip
scripts/checkpoint_conversion/convert_minimax_h3_mlx.py. Hugging Face cards say they "avoid the local conversion step."This is not the VSA-DataFree CUDA checkpoint tracked in #5351. That watch stays CUDA/VSA. This issue is the Dense MLX packed path that now runs on Apple Silicon.
Default for a 128 GB MacBook Pro: INT6 (~15.41 GiB DiT). INT8 and INT4 are optional. Upstream validated on an M4 Max with 36 GB; 128 GB has headroom.
Caveats to keep explicit in catalog copy and disclosures:
--vsa.Decision
Extend the existing
fastvideoBYOV runtime (do not add a new runtime, and do not reuseminimax_h3/ PipeNetwork orminimax_h3_cuda). Add FastH3 Dense-DataFree MLX as catalog entries in the MLX video bucket, same shape as FastMetal in migration 314.Recommended default row: INT6. Also ship INT8 and INT4. Text-to-video-with-audio (T2VA). Opt-in
--fast/--fast-spatiallater if the UI already has a speed/quality toggle; do not block first ship on that.Install stays user-triggered (
INSTALL_FASTVIDEO). No cold-bootstrap downloads. Cache-only once weights are on disk.Weights
f624f08c6c279ab43534c003e556fc5b295b6558unless a newer card says otherwise)Upstream run (INT6):
python examples/inference/basic/mlx_fasth3.py \ --model-root ./FastH3-Preview-v1-Dense-DataFree \ --mlx-checkpoint ./FastH3-MLX-INT6 \ --prompt '(S1) A presenter says <d>[English] Fast H3 runs on Apple silicon.</d>' \ --height 480 --width 832 --num-frames 124 --steps 4 --seed 2026 \ --output-path ./outputs/fasth3_int6.mp4Implementation seams
Follow the FastMetal pattern (
scripts/migrations/314-fastvideo-mlx-models.js,runtime: 'fastvideo'):scripts/generate_fastvideo.py— teach it FastH3: callmlx_fasth3.pywith--model-root+--mlx-checkpoint(two local dirs), 4-step schedule, 480×832 / 124 frames defaults. Keep FastMetal onmlx_wan_prompt_to_video.py/mlx_wan22_generate.py.server/services/videoGen/renderArgs.js— argv for the new model ids.server/services/videoGen/runtimes.js— keep usingfastvideo; FastH3 is another model on that runtime, not a new BYOV id.data.reference/media-models.json+ a new migration (next id after the current last) seeding MLX-bucket rows (fasth3_dense_datafree_mlx_int6etc.).server/lib/mediaModels.js,server/lib/videoDisclosure.js,server/lib/huggingfaceModel.js— license, T2VA disclosure, HF auto-detect for the two-repo layout.scripts/setup-image-video.sh— only if the FastVideo install block needs another extra; otherwise leave install as-is.Do not invoke
convert_minimax_h3_mlx.pyin PortOS. Do not add these rows to the CUDA bucket. Do not claim VSA or FL2VA/Ref2VA.Acceptance
References