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).

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support