~/satyajit

MiniMax M3.1 Flash: M3's shape, all-sparse attention, four-bit experts, and Space Bunny unmasked

mdjsonmcp

2026-10-23 · 18 min · mixture-of-experts · sparse-attention · speculative-decoding · benchmarks · agentic-coding

A 1:45 narrated explainer, drawn in code. Every number and picture in it is this article's own; the sources are below.

› transcript

Hi, I'm Mizzen! MiniMax opened the weights of M3.1 Flash. The name sounds small. The files say otherwise. Flash keeps the whole backbone of M3. What changes is how much memory each token reads. A token climbs sixty layers. The first three are dense. The other fifty seven each hold a hundred and twenty eight experts. A router picks four experts per layer, so about twenty three billion of four hundred and twenty seven billion parameters do the work. The experts now ship as four bit numbers. The checkpoint drops from about eight hundred and seventy gigabytes to two hundred and fifty. A small draft head guesses seven tokens ahead, and the full model checks them, so the output does not change. In full attention, every new token reads every past key and value. At a million tokens, that is the slow part. Sparse attention scores past blocks with a tiny index and attends exactly to the best sixteen blocks per head group. M3 kept three layers on full attention. Flash makes all sixty sparse. At a million tokens, plain attention reads about a hundred and twenty nine gigabytes per token. Flash reads about sixteen, but still stores every key and value. MiniMax's own table has Flash leading three of fifteen rows. The newest DeepSeek Flash leads four of the six they share. So Flash is not a smaller model. It is the same model, made to read fewer bytes per token. Same backbone. Sparse attention everywhere. Four bit experts and a draft head. Every source is in the full article. I'm Mizzen. Bye!

Why read this

Notabletop 60%

Headers show Flash is M3's backbone re-encoded; KV arithmetic of going all-sparse; the card checked row by row against the posts and DeepSeek's card.

  • Original analysis
  • Widely used
  • Concrete numbers to act on

LLM architectureNeeds datacenter GPUsCustom licencePractitioner model

How this was scored
Is it new?
1 of 3: An incremental tweak
Can I trust it?
2 of 3: Measures key facts from files, code or configs
Can I run it?
1 of 3: API-only, gated or restrictive licence
Will I understand it?
2 of 3: Mechanism from first principles with figures
Can I act on it?
2 of 3: A concrete recipe, numbers or comparison
Will it last?
1 of 3: Relevant for months
Does it affect many?
2 of 3: A widely used model, tool or lab release
Only here?
2 of 3: A teardown or measurement few others did

Score 60 of 100, ranked 330 of 577 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored

On 19 October MiniMax posted "Space Performance + Bunny Speed" and settled a small mystery: "Space Bunny - which has topped global leaderboards with 200T+ tokens - was an earlier version of M3.1 Flash." The same post priced the API at $0.15 per million input tokens and $0.60 per million output, claimed "1/3 the cost of M3 and 3x the speed", and promised weights on 23 October. They arrived on time. The release post gives "428B parameters total, 23B activated per token" and five headline numbers: 76.2 on BankerToolBench, 73.7% on DeepSWE v1.1, 61.7 on OSWorld V2, 29.6 on Agents' Last Exam and 82.2 on CyberGym, with "MiniMax Sparse Attention and DSpark speculative decoding" for efficiency.

The name suggests a smaller sibling of M3. The files say otherwise, and that is the interesting part. Labels below: measured means I computed it from a file in the repo, reported means MiniMax's (or someone else's) number that I did not re-run, and reasoned means my arithmetic on the other two.

MiniMaxAI/MiniMax-M3.1-Flash@54e4e69 · snapshot 2026-10-23
parameters
220.49B
repo size
252.43 GB
architecture
MiniMaxM3SparseForConditionalGeneration
task
image-text-to-text
library
transformers
license
other
safetensors
49 shards
largest file
10.21 GB
files
72
downloads
357
likes
91
parameters by dtype
BF163.32BF3246.3MF8_E4M310.56BU8206.56B
multimodalmoeagentcodingvideo

repo last modified 2026-10-23

The card's parameter count is Hugging Face's, and it reads low: Hugging Face counts the elements of each stored tensor, and a packed NVFP4 tensor holds two 4-bit weights per byte, so every routed expert counts at half its size. Counting the unpacked weights, as below, gives 427.05B.

Flash is M3's backbone, in files

I fetched config.json from both MiniMaxAI/MiniMax-M3 and MiniMaxAI/MiniMax-M3.1-Flash and compared the text model's fields (measured). They agree on everything that sets the model's size: 60 layers, hidden size 6,144, 64 query heads and 4 KV heads of 128 dimensions, 128 routed experts with 4 picked per token, one shared expert, a dense FFN in the first three layers and MoE in the other 57, a 200,064-token vocabulary and a 1,048,576-position context. M3's card says "~428B parameters and ~23B activated parameters". M3.1 Flash's card says "Approximately 428B total; 23B activated per token". Same numbers, because it is the same shape.

To check the totals rather than trust them, I read the JSON header of every one of the 48 weight shards with two HTTP range requests each, about 13 MB in all, and summed the tensor shapes (measured). Packed NVFP4 weights hold two values per byte, so they count double; scale tensors are not parameters.

PartParametersStored as
Routed experts, 57 layers x 128413.12BNVFP4, 206.6 GB
Attention projections6.42BFP8 (E4M3)
Shared experts3.23BFP8
Embedding table1.23BBF16
LM head1.23BBF16
Vision tower and projectors0.87BBF16
Dense FFN, layers 0-20.68BFP8
MSA index projections0.24BFP8
Router gates0.05BFP32
Total427.05B250.1 GB with 26.2 GB of scales

427.05B rounds to the card's "approximately 428B" well enough. The per-token count depends on what you include. Four of 128 routed experts is 12.91B; add attention, the shared expert, the dense layers and the index branch and the text path is 23.52B, or 24.75B if the LM head counts (measured). The card's 23B is the first convention.

So where did "Flash" come from? Not from the parameter count. The card is explicit: "M3.1-Flash retains M3's core mixture-of-experts architecture, with three main changes": sparse attention throughout, quantization-aware training, and DSpark. Each is visible in the files.

Change one: the last three full-attention layers go sparse

MiniMax Sparse Attention (MSA) keeps attention exact but makes each query read only part of the context. A small index branch, one 128-dimension index query per GQA group and one shared 128-dimension index key, scores every past block of 128 tokens. Each group keeps its top 16 blocks, plus the block it sits in, and the main branch runs ordinary attention over those 2,048 tokens and nothing else.

MSA architecture diagram. Left, an Index Branch takes hidden states through linear projection, norm and RoPE to index query and key heads, computes a score matrix, applies block max pooling, and emits a Top-K block index. Right, a Main Branch selects those Top-K KV blocks and runs exact sparse attention over Q, K, V. Far right, two attention-mask grids for Query Group 1 and Query Group 2 show different selected key blocks per group.
MSA: the index branch scores KV blocks and keeps the top k; the main branch attends exactly over those blocks, chosen separately for each GQA group. M3.1 Flash's config sets block size 128 and k = 16 (MiniMax Sparse Attention paper, Figure 1).

M3 shipped MSA in 57 of 60 layers. Its sparse_attention_freq is [0, 0, 0, 1, 1, …], and its weight index has no index_q_proj or index_k_proj tensors in layers 0 to 2 (measured). M3.1 Flash sets all 60 entries to 1, and the headers show index projections in layers 0, 1 and 2 (measured). Block size, top-k, index dimension and the number of index heads are unchanged.

Three layers out of sixty sounds small. It isn't, at long context, because a full-attention layer's cost grows with the context and a sparse layer's mostly doesn't. Count the values one decoded token has to read from the KV cache in one layer, with NN tokens of context:

full: 4×2×128×N=1024 NMSA: 1024×min⁡(N,2048)+128 N\text{full: } 4 \times 2 \times 128 \times N = 1024\,N \qquad \text{MSA: } 1024 \times \min(N, 2048) + 128\,N

Four groups times keys and values times 128 dimensions is 1,024 values per past token. MSA reads that for at most 2,048 tokens, but its index branch still has to score every block, so it scans one 128-dimension index key per past token. That scan is the floor. As NN grows the MSA reads approach 128N128N, one eighth of full attention, never less (reasoned).

Put the 60 layers together at 1M tokens of context, with the cache in BF16 (reasoned):

At 128K the same sums give 2.96 GB for M3 and 2.26 GB for M3.1 Flash, a ratio of 1.31 (reasoned). The MSA paper's own measurement at 1M is a 7.6x decode speedup over GQA on H800 (reported), close to the 7.88 these read counts allow, which is what you'd expect of a step bound by memory reads.

What MSA does not do is shrink the cache. Every key and value is kept, because any block may be picked by a later query, and each layer adds an index key per token. That is 138,240 bytes per token in BF16, 135 KiB: 18.1 GB for a 128K sequence and 145 GB for a 1M one (reasoned; the card doesn't say what precision servers keep the cache in, and FP8 halves all of these). For scale, DeepSeek reports 890 bytes of global KV per token for V4.1 Flash, the peer I covered in DeepSeek-V4.1-Flash-1017. MiniMax's design saves reads, not storage.

The widget runs these sums from 4K to 1M in either cache precision. At batch 1 the weights cost a fixed 20.8 GB per step (next section), and at 1M the attention reads are 16.4 GB on top. The weights are shared by every sequence in a batch; the attention reads are not. Converting the last three layers is a change aimed at long-context serving with many concurrent sessions, which is what an agent platform runs.

Change two: four-bit experts, trained for it

config.json carries a quantization_config with two formats (measured). Routed experts are NVFP4: each weight is a 4-bit float, with an FP8 scale for every 16 weights and an FP32 global scale per tensor. In the header that shows up as a weight_packed tensor of bytes holding two values each, beside a weight_scale of shape [rows, cols / 16]. Attention, shared experts and the dense layers are MXFP8, FP8 with a scale per block of 32. Embeddings, the LM head, the router gates and the vision tower stay at full precision.

The card calls it "quantization-aware training": "the routed MoE experts and the attention paths are quantized during training". I can't check that from weights, only that they ship in these formats. (For how NVFP4 scales work, see Nemotron in NVFP4.)

The byte effect is checkable (measured, from header offsets):

A decode step at small batch is bound by memory bandwidth, so 2.4 times fewer weight bytes per token is the largest single lever behind "3x the speed" I can find in the files. It is also why the checkpoint fits in the memory of four 80 GB GPUs with about 70 GB left over, where M3 in BF16 needs a multi-node setup or its own quantization (reasoned). It is still not a laptop model, whatever 23B active suggests: every expert has to be resident somewhere.

Change three: DSpark replaces MTP

The card: "DSpark replaces the earlier EAGLE-like MTP approach. The release includes the draft head." M3's config declares num_mtp_modules: 7, but its public index contains no MTP tensors (measured), so M3's draft modules were never published. M3.1 Flash ships dspark/model-dspark-00001.safetensors, 2.3 GB.

DSpark is DeepSeek's speculative-decoding head: a parallel drafter in the style of DFlash proposes a block of tokens in one pass, a small Markov head adds first-order dependencies between neighbouring draft tokens, and a confidence head lets the server verify only the prefix it trusts. Verification is by the full model, so output is unchanged. MiniMax's version, from dspark/config.json and its header (measured):

MiniMax publishes no accepted length or speedup for it. The speed claim in the 19 October post is for the whole model, so the drafter's share of it is unknown.

"1/3 the cost of M3 and 3x the speed"

Neither half has a number I can check. The posts don't say what M3 costs, which workload the 3x is measured on, or on which hardware, and I found no M3 price in the sources I read. The parts I can check point the same way: the weights move 2.4 times fewer bytes per token than M3 in BF16, the attention reads fall 1.3 times at 128K, and a draft head now exists. That makes the claim plausible, not shown.

The prices that are stated: $0.15 in, $0.60 out and $0.015 for cached input, flat. DeepSeek-V4.1-Flash-1017's peak rates are $0.30 and $1.20 (reported), twice as much.

The table, checked three ways

The card compares M3.1 Flash against six models on 15 benchmarks. I transcribed it and checked it against the 19 October post, the table image attached to that post, and DeepSeek's own card for the comparators the two share.

Benchmark table grouped into CoWork, Coding, Cyber and General Capabilities, comparing MiniMax M3.1 Flash with DeepSeek-V4.1-Flash-1017, DeepSeek-V4.1-Flash, Kimi-K3, GLM-5.3, GPT-5.6 Sol and Opus 5. M3.1 Flash's column is highlighted: Automation-Bench v1.0.6 62.2, OSWorldV2 61.7, Agents' Last Exam 29.6, BankerToolBench 76.2, GDP.pdf AA 20.8, Terminal Bench 4.0 38.1, LOCA-Bench 256K 60.3, PostTrain Bench-v1.1 39.3, DeepSWE v1.1 73.7, NL2Repo-Bench 61.2, SWE Refactor Bench 23.0, CyberGym 82.2, BabyVision with tools 91.0, HLE without tools 43.4, CharXiv RQ 82.5.
The table image attached to the 19 October announcement. Its Automation-Bench cell reads 62.2; the model card and MiniMax's own cost chart both say 62.8 (MiniMax on X, 19 October, image 1).

What I found (measured, by comparing the documents):

Pick a rival in the widget to see the deltas row by row. By my count from the card: M3.1 Flash leads DeepSeek V4.1 Flash on 10 of 12 shared rows, Kimi K3 on 12 of 15, GLM-5.3 on 10 of 11, GPT-5.6 Sol on 7 of 15, and Opus 5 on 2 of 14 with one tie (measured).

The cost charts in the thread carry the stronger argument, and the card doesn't include them.

Scatter plot, DeepSWE v1.1 score against average cost per task in USD on a log scale. MiniMax-M3.1-Flash runs from high 68.1% to xhigh 72.1% to max 73.7% at roughly 25 to 28 cents. DeepSeek V4.1 Flash-1017 sits higher and further left, low about 72.6% to max 77.0% near 20 cents. Claude Opus 5, Claude Fable 5, GPT-6 Astra, GPT-6.1 Sol and Gemini 3.8 Flash curves sit further right at higher cost.
DeepSWE v1.1 score against cost per task. Its footer says the leaderboard data is as of 2026-09-22, yet it plots 1017, which shipped on 17 October (MiniMax on X, 19 October, image 3).

On DeepSWE, MiniMax's own chart puts DeepSeek V4.1 Flash-1017 above and to the left of M3.1 Flash: 77.0 at max effort for about $0.19 a task, against 73.7 for about $0.27 (read by eye off a log axis, so approximate). On Automation-Bench the order flips: M3.1 Flash at max effort, 62.8, costs about $0.045 a task, and 1017's max, 60.5, about $0.09 (approximate, same method). The Agents' Last Exam chart puts M3.1 Flash at $111 for the whole run at 29.6, the cheapest point on the plot, with Opus 5.5 at about 38% for over ten times the cost.

Scatter plot, Agents' Last Exam pass rate against estimated total cost in USD on a log scale. MiniMax-M3.1-Flash is at the far left, 29.6% for 111 dollars. A dotted cost-performance frontier runs from it through GPT-5.6 Luna, GPT-6 Sol and GPT-6 Astra to Claude Opus 5.5 near 38%. Kimi K3, GPT-5.6 Sol, Claude Opus 5 and others sit between.
Agents' Last Exam pass rate against total cost, ALE-V1 Overall, 152 tasks, best harness and effort per model (MiniMax on X, 19 October, image 2).

On quality M3.1 Flash is level with the open models of its size and behind the closed frontier; on cost per task it is at or near the cheap end of every chart MiniMax drew. All of these are MiniMax's runs, with harnesses named per row in the card's notes (Claude Code on five rows, Codex on Terminal Bench, mini-SWE-agent on DeepSWE, OpenCode on BankerToolBench), and none of them are mine.

Space Bunny

"Space Bunny" was a codename for a model nobody had claimed; the posts that used it called it free. MiniMax's 19 October post says it "topped global leaderboards with 200T+ tokens". The post names no leaderboard and no time window, so I can't check the 200 trillion (reported).

This site has met it before. In the integer-multiplication exponent race, Rohan Arun's posts on 17 October credited "a free model, @opencode Space Bunny Max" with a new best bound, and then with four records in a row. The PRs said less. Every commit carried the text "Done with help from OpenCode (Space bunny free)" and a "Co-Authored-By: Claude Opus 5.5" trailer, and the first of them, #3184, was refuted by an exact counterexample 25 minutes after it was committed. The free model's contribution was proposing to port a known move, with a gain estimate about 31 times too high; Claude found the data, built the package and measured it.

What the reveal changes:

Licence

The weights carry the MiniMax Community License, not Apache or MIT. The grant is for "non-commercial purposes". Commercial use needs a "Built with MiniMax M3.1-Flash" credit; above $20 million a year in revenue it needs "prior written authorization", and below that "a one-time notice" by email. Fine-tuned derivatives used commercially count as commercial use. The appendix bars military use, among others. Unlike MiniMax H3's licence, this one names no excluded countries.

What holds

SGLang and vLLM had day-0 support; Inferact says it has served M3.1 Flash in production since launch (reported).

How I checked

On 23 October I read MiniMax's posts of 19 and 23 October, their threads and their first page of replies, and Inferact's post and announcement, through the fxtwitter mirror and Inferact's site. From Hugging Face I fetched the file listing, README.md, config.json, LICENSE, generation_config.json, dspark/config.json and both weight indexes of MiniMaxAI/MiniMax-M3.1-Flash at commit 54e4e69, and config.json, README.md, the eval-results files and model.safetensors.index.json of MiniMaxAI/MiniMax-M3. I read the JSON header of all 48 weight shards and the DSpark shard by HTTP range request, about 13 MB in total, and downloaded no weights. Parameter counts, byte counts and tensor layouts come from those headers. The KV sums are my arithmetic on the config, assuming keys, values and index keys cached at one precision. I didn't run the model: 250 GB doesn't fit on the shared 4-core, GPU-less VM I work on. Benchmarks are MiniMax's, costs are read by eye off its charts, and DeepSeek's card numbers are from my article on 1017.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "MiniMax M3.1 Flash: M3's shape, all-sparse attention, four-bit experts, and Space Bunny unmasked", ai.thesatyajit.com, October 2026.

bibtex
@misc{ghana2026minimaxm31flash,
  author = {Satyajit Ghana},
  title  = {MiniMax M3.1 Flash: M3's shape, all-sparse attention, four-bit experts, and Space Bunny unmasked},
  url    = {https://ai.thesatyajit.com/articles/minimax-m3-1-flash},
  year   = {2026}
}
share