Muse Spark Open 816B-A42B · Atomic Dynamic GGUF
Atomic Dynamic (AD) quants of Meta's Muse Spark Open with our own importance matrix. A file goes up here only when it beats the other GGUF builds of the same size or larger, measured side by side on one stand.
Built with Muse Spark Open. The model is Meta's, under the Muse Model License and its Usage Policy, both
included in this repo (LICENSE.md, USE_POLICY.md).
Pick a file
| File | Size on disk | KL divergence | top-1 | For |
|---|---|---|---|---|
AD-Q2_K |
309.9 GB | 0.0593 | 92.34% | 512 GB of unified memory or more |
AD-IQ2_XXS |
224.6 GB | 0.1162 | 89.16% | 256 GB, with little room left for context |
AD-IQ1_M |
208.5 GB | 0.1607 | 87.12% | 256 GB, with room for a longer context |
AD-IQ1_S |
174.9 GB | 0.2317 | 84.45% | 256 GB with the most room left; the smallest file |
KL divergence is how far the quantized model's predictions drift from the original BF16 weights; lower is
better, zero means identical. top-1 is how often it picks the same next token the original would have picked.
The sizes are bytes on disk; the KV cache and compute buffers come on top and grow with the context. On a Mac
the GPU may use only part of the unified memory by default: for the 256 GB files raise the limit first
(sudo sysctl iogpu.wired_limit_mb=...). We measured these files on NVIDIA GPUs and have not run them on a Mac.
We publish a size only where our file beats the other GGUF builds of the same size or larger.
How they compare
We downloaded the other publishers' files and measured them with the same reference logits, held-out text, context, chunk count and llama.cpp build as ours. Each of our files against the other file of the same size or larger:
| Ours | Size | KL divergence | top-1 | Theirs | Size | KL divergence | top-1 |
|---|---|---|---|---|---|---|---|
AD-Q2_K |
309.9 GB | 0.0593 | 92.34% | unsloth UD-Q2_K_XL |
311.2 GB | 0.0622 | 92.14% |
AD-IQ2_XXS |
224.6 GB | 0.1162 | 89.16% | unsloth UD-IQ2_XXS |
225.6 GB | 0.1315 | 88.47% |
AD-IQ1_M |
208.5 GB | 0.1607 | 87.12% | unsloth UD-IQ1_M |
208.9 GB | 0.1808 | 86.46% |
AD-IQ1_S |
174.9 GB | 0.2317 | 84.45% | unsloth UD-IQ1_S |
175.6 GB | 0.2617 | 83.54% |
Paired chunk by chunk over the 97 chunks of the held-out text, Unsloth's file drifts more than ours by:
UD-Q2_K_XLagainstAD-Q2_K: 4.9% (95% interval 1.2% to 9.0%); ours matches the original's top token 0.20 points more often (0.04 to 0.36);UD-IQ2_XXSagainstAD-IQ2_XXS: 13.1% (10.2% to 16.4%); top token +0.70 points (0.52 to 0.87);UD-IQ1_MagainstAD-IQ1_M: 12.5% (10.0% to 15.3%); top token +0.66 points (0.49 to 0.83);UD-IQ1_SagainstAD-IQ1_S: 12.9% (10.3% to 15.8%); top token +0.91 points (0.70 to 1.12).
Also measured: ggml-org Q2_K (304.1 GB) 0.0963 / 90.08%.
Where Unsloth's files are better than anything of ours of the same size or smaller (measured the same way):
| Unsloth file | Size | KL divergence | Our nearest file at or below that size | KL divergence |
|---|---|---|---|---|
UD-Q3_K_XL |
401.5 GB | 0.0197 | AD-Q3_K_M (397.2 GB, not published) |
0.0226 |
UD-IQ3_XXS |
340.4 GB | 0.0324 | AD-IQ3_XXS (336.3 GB, not published) |
0.0384 |
UD-IQ2_S |
275.5 GB | 0.0665 | AD-IQ2_M (275.0 GB, not published) |
0.0742 |
If you need one of those sizes, take Unsloth's file.
What is inside
Atomic Dynamic is how we decide which tensor gets which bits. The files use only standard llama.cpp
quantization types; upstream llama.cpp with muse-spark support reads them.
- About 97% of the weights are the 256 routed experts (gate, up and down projections of 4096 x 4096 each, in the model's 4096-wide latent space). Only they are compressed hard.
- Attention (q, k, v, output, gate) and the latent projections stay at q8_0; the token embedding and the output head at q6_k.
- Bits move between experts and blocks without dropping anything into a lower precision regime. Each file
starts from the expert types of the file it faces and changes only what costs almost nothing:
AD-Q2_K: gate and up q2_k, down q3_k on 38 blocks; on 8 blocks (0, 1, 56 to 61) gate and up iq3_xxs, down iq4_xs; on 16 blocks (29, 33 to 46, 52), the ones with the least activation energy into the expert down projections, gate and up iq2_xs, down iq3_xxs (an i-quant that nearly matches q2_k / q3_k with an importance matrix, at fewer bits);AD-IQ2_XXS: every expert iq2_xxs, except the down projections of blocks 0, 1 and 56 to 61 at iq2_xs; paid for by the attention gate and the latent projections at q6_k;AD-IQ1_M: gate and up iq1_m, down iq2_xxs (whereUD-IQ1_Mhas iq1_s and iq2_s); blocks 0, 1 and 56 to 61 at iq2_xxs and iq2_xs;AD-IQ1_S: every expert iq1_s, except blocks 0, 1 and 56 to 61 at iq1_m; paid for by the attention gate and the latent projections at q6_k and attention q and output at q5_k.
- Attention and the latent projections stay at q8_0 or q6_k, the token embedding at q4_k or q6_k, the output
head at q6_k (exact types per file in the
--tensor-typerules below and in the file itself). - Every row length in this model is a multiple of 256, so no quantization type is swapped silently; we checked the type of every tensor in the finished file.
Running it
llama-server -m Muse-Spark-Open-816B-A42B-AD-IQ1_M-00001-of-00005.gguf -ngl 99 -c 16384 --jinja
Point llama.cpp at the first part of a file; it loads the rest. The chat template is inside the file.
The recommended sampling (temperature 1.0, top-p 1.0, top-k 64) is stored in the file's metadata. The model
always reasons; the depth is set with reasoning_effort (low, medium, high, xhigh, the default), for
example --chat-template-kwargs '{"reasoning_effort": "medium"}'.
Needs llama.cpp with muse-spark support: commit ba3c05f71da8 (the merge of ggml-org/llama.cpp#30616)
or later. We built and measured everything with that commit.
Images and audio
The vision and audio encoders are in a separate file, shared by every quant:
mmproj-Muse-Spark-Open-816B-A42B-F16.gguffor most peoplemmproj-Muse-Spark-Open-816B-A42B-BF16.ggufif your setup prefers bfloat16mmproj-Muse-Spark-Open-816B-A42B-Q8_0.gguf, smaller
llama-mtmd-cli -m Muse-Spark-Open-816B-A42B-AD-Q2_K-00001-of-00007.gguf \
--mmproj mmproj-Muse-Spark-Open-816B-A42B-F16.gguf \
--image your-photo.jpg -ngl 99 -c 16384 -p "What is in this image?"
These are ggml-org's conversions of Meta's encoders, copied here unchanged. We have not tested image or
audio input with AD-Q2_K.
How we measured
- Reference: the BF16 weights in GGUF, run unquantized (ggml-org's conversion of Meta's checkpoint with llama.cpp's converter). Perplexity on the held-out text is 4.2948 plus or minus 0.0275.
- Held-out text:
eval_neutralfrom our calibration dataset (30 languages), never used for calibration. 97 chunks at 4096 context. - Metric: per-token KL divergence of each file's predictions against the reference, plus top-1 agreement.
- Hardware: 8x A100-SXM4 80 GB for every file we publish and every file we compare them with.
AD-IQ2_Min the last table was measured on 8x A100-SXM4 40 GB;UD-IQ2_SandUD-IQ2_XXS, measured on both machines, gave the same numbers to six digits. - llama.cpp
ba3c05f71da8, the same build for every file in the tables.
How the importance matrix was made
The matrix comes from 2.95M tokens of our calibration corpus (agentic and tool use, code, reasoning, many
languages, long documents, and a sweep that reaches 99.99% of the vocabulary), every conversation rendered
through this model's own chat template and read with --parse-special:
- 2.52M tokens at context 512, split over six workers;
- 0.43M tokens of 16k to 32k token documents at context 32768.
It was collected on a Q8_0 copy of the model, not on the BF16 weights: the BF16 is 1.64 TB, more than the 640 GB of VRAM of the machines we had. Q8_0 activations are very close to the BF16 ones, but this is a proxy, and we say so.
To rebuild AD-Q2_K with your own matrix, the quantization rules are:
llama-quantize --imatrix imatrix.gguf \
--tensor-type '^token_embd\.weight$=q6_k' \
--tensor-type '^output\.weight$=q6_k' \
--tensor-type '^blk\.(0|1|56|57|58|59|60|61)\.ffn_down_exps\.weight$=iq4_xs' \
--tensor-type '^blk\.(0|1|56|57|58|59|60|61)\.ffn_(gate|up)_exps\.weight$=iq3_xxs' \
--tensor-type '^blk\.(29|33|34|35|36|37|38|39|40|41|42|43|44|45|46|52)\.ffn_down_exps\.weight$=iq3_xxs' \
--tensor-type '^blk\.(29|33|34|35|36|37|38|39|40|41|42|43|44|45|46|52)\.ffn_(gate|up)_exps\.weight$=iq2_xs' \
--tensor-type '^blk\.\d+\.ffn_down_exps\.weight$=q3_k' \
--tensor-type '^blk\.\d+\.ffn_(gate|up)_exps\.weight$=q2_k' \
--tensor-type '^blk\.\d+\.ffn_latent_(down|up)\.weight$=q8_0' \
--tensor-type '^blk\.\d+\.attn_(q|k|v|output|gate)\.weight$=q8_0' \
Muse-Spark-Open-816B-A42B-BF16-00001-of-00022.gguf Muse-Spark-Open-816B-A42B-AD-Q2_K.gguf Q2_K
For AD-IQ1_M:
llama-quantize --imatrix imatrix.gguf \
--tensor-type '^token_embd\.weight$=q4_k' \
--tensor-type '^output\.weight$=q6_k' \
--tensor-type '^blk\.(0|1|56|57|58|59|60|61)\.ffn_down_exps\.weight$=iq2_xs' \
--tensor-type '^blk\.(0|1|56|57|58|59|60|61)\.ffn_(gate|up)_exps\.weight$=iq2_xxs' \
--tensor-type '^blk\.\d+\.ffn_down_exps\.weight$=iq2_xxs' \
--tensor-type '^blk\.\d+\.ffn_(gate|up)_exps\.weight$=iq1_m' \
--tensor-type '^blk\.\d+\.ffn_latent_(down|up)\.weight$=q8_0' \
--tensor-type '^blk\.\d+\.attn_(k|v|gate)\.weight$=q8_0' \
--tensor-type '^blk\.\d+\.attn_(q|output)\.weight$=q6_k' \
Muse-Spark-Open-816B-A42B-BF16-00001-of-00022.gguf Muse-Spark-Open-816B-A42B-AD-IQ1_M.gguf IQ1_M
For AD-IQ2_XXS: every expert iq2_xxs except ^blk\.(0|1|56|57|58|59|60|61)\.ffn_down_exps\.weight$=iq2_xs;
attention q, output, gate and the latent projections q6_k, attention k and v q8_0, token_embd q4_k, output q6_k.
For AD-IQ1_S: every expert iq1_s except ^blk\.(0|1|56|57|58|59|60|61)\.ffn_(gate|up|down)_exps\.weight$=iq1_m;
attention q and output q5_k, attention gate and the latent projections q6_k, attention k and v q8_0,
token_embd q4_k, output q6_k.
The first rule that matches a tensor wins.
Model details
Mixture of experts, 816B parameters in total and about 42B active per token: 62 layers, hidden size 8192, grouped-query attention (128 query heads, 16 key-value heads, head size 64) with sliding-window attention in three of every four layers, 256 experts with 8 active per token in a 4096-wide latent space, vocabulary 202,048. Meta's config sets a maximum context of 1,048,576 tokens; we measured at 4096 and did not test long context.