MiniMax-Music3 β MNN (Apple Silicon)
MNN conversion of MiniMaxAI/MiniMax-Music3 (~11.1B params) for on-device inference on Apple Silicon (CPU + Metal). This repo holds the converted models used by the music3-mnn pip package.
MNN vs MLX speed report with minimal step-level repro scripts: see mnn-speed-repro.md and the repro/ directory (DiT + AR-backbone benchmarks, ~4Γ flow gap, Metal4 probe compile failure evidence).
Pipeline: Qwen3-8B autoregressive backbone (semantic + RVQ codes) β condition encoder β 36-layer flow-matching DiT β DAC vocoder. 25 AR frames = 1s of 44.1 kHz stereo audio; up to 6 minutes per song (multi-window latent stitching with overlap blending).
Files
| file | size | role | quant |
|---|---|---|---|
backbone_step_masked_nc4.mnn (+.weight) |
6.9 GB | Qwen3-8B AR backbone β single-token step graph with masked, segment-padded (64) KV-cache inputs | int8 weight, block 128 |
c0_head.mnn |
256 MB | first RVQ level head | fp32 |
depth_int8.mnn (+.weight) |
590 MB | RVQ depth decoder, levels 2β8 | int8 |
cond_conv_int8.mnn |
24 MB | condition encoder conv stack | int8 |
dit.mnn (+.weight) |
9.1 GB | 36-layer flow-matching DiT | fp32 (run with fp16 compute) |
vocoder_int8.mnn |
52 MB | DAC vocoder (must run fp32 compute β fp16 overflows) | int8 |
Requirements
- Apple Silicon Mac (tested: M5 Pro, 48 GB). Peak RAM: ~16 GB for 8s clips, ~22 GB for 2-minute songs.
pip install music3-mnn- The original MiniMaxAI/MiniMax-Music3 checkpoint β still needed at runtime for the tokenizer, embedding / lm-head tables and condition-encoder weights.
Usage
One-liner with uv β models (this repo + the runtime-required parts of the original checkpoint) download automatically on first run (26 GB total, cached in `/.cache/huggingface`):
uvx music3-mnn \
--prompt "a happy piano jazz trio, upbeat swing" \
--lyrics "[verse]
la la la" \
--seed 0 --max-frames 200 --out song.wav
Equivalent: pip install music3-mnn && music3-mnn .... Use --ckpt <dir> / --models <dir> to point at local copies. The auto-download fetches only what inference needs (tokenizer, embedding / lm-head tables, depth decoder and condition-encoder weights), skipping the other ~32 GB of the original repo.
Python API: from music3_mnn import generate; generate(prompt, lyrics, ...).
Performance (M5 Pro, 48 GB, 8s clip)
| stage | MNN | MLX (open-source port) |
|---|---|---|
| AR backbone | 1.91 frames/s | 4.92 frames/s |
| flow + vocoder | RTF ~5.7 | RTF 1.39 |
Conversion
Export ONNX subgraphs with the package, then MNNConvert. The backbone must be converted with --transformerFuseC4 0 β with the default C4 fusion the attention-mask graph is corrupted under int8 weight quant (cos 0.03β0.63 vs the ONNX reference, which is bit-correct in onnxruntime):
python -m music3_mnn.export_onnx --ckpt MiniMax-Music3 --out artifacts/onnx \
--components backbone_step_masked,depth,cond_conv,dit,vocoder,c0_head
MNNConvert -f ONNX --modelFile artifacts/onnx/backbone_step_masked/backbone_step_masked.onnx \
--MNNModel artifacts/mnn/backbone_step_masked_nc4 \
--weightQuantBits 8 --weightQuantBlock 128 --transformerFuseC4 0
License
The weights here are derivatives of MiniMax-Music3 and inherit the MiniMax-Music3 Community License (Β© MiniMax). The music3-mnn Python package is MIT. MiniMax-Music3 is fine-tuned from Qwen3-8B (Apache-2.0); its DiT is modified from Stable Audio tools and its VAE from descript-audio-codec (both MIT).