Run JANG models in MLX Studio / vMLX
⚠️ Runtime: this bundle needs a vMLX (Python) build that is not released yet. It was built and validated on a vMLX development build that adds MiMo-V2.6 JANGHT loading (JANGT trellis + JANGH codebook experts on the MiMo-V2.6 omni model). Released vMLX builds do not load it. Use it with the first vMLX release that lists MiMo-V2.6 JANGHT support.
JANGQ-AI/MiMo-V2.6-Flash-MOPD-JANGHT2.5
MiMo-V2.6-Flash-MOPD for 128 GB Macs: the full omni model (text, image, video, audio in) in 93.9 GiB, with its native DFlash drafter in the box.
A JANGHT bundle of XiaomiMiMo/MiMo-V2.6-Flash-MOPD: a 310B-parameter MoE (48 layers, 256 routed experts top-8, layer 0 dense; 9 full-attention + 39 sliding-window layers with attention sinks) with vision, video and audio input.
- Routed experts: JANGHT, a per-unit mix of two formats, chosen by measurement:
- JANGT: a trellis code at 2, 2.5 or 3 bits per weight (Hadamard-128 rotation with signs, 12-bit state, up to 8 exact fp16 outlier columns per projection).
- JANGH: our Hadamard-32 codebook format at 2, 3 or 4 bits, rounded with GPTQ.
- Everything else in the text model: affine 8-bit (group 64) — attention, the dense layer-0 MLP, embeddings and lm_head. Routers, expert-score bias and attention sinks stay fp32.
- Vision tower, audio encoder, speech embeddings: bf16, unchanged from the source. Audio tokenizer: the encoder half, verbatim (the decoder only produces speech and is not used for input).
- DFlash drafter (
dflash/): MiMo's native block-diffusion draft model (MIT), 2-D weights affine 8-bit. - No MTP: the three MTP layers are omitted (
num_nextn_predict_layers: 0); DFlash replaces them. - Name: JANGHT + 2.5 bits per weight averaged over the whole model (91.84 GiB of model shards × 8 / 310.76B source parameters = 2.539), drafter and audio tokenizer excluded.
Quality vs the original model
254 held-out sequences, 153,581 teacher-forced positions, scored against the original checkpoint (official MXFP4 experts decoded exactly, FP8 attention dequantized per block, bf16 elsewhere) run layer by layer from disk. Top-128 renormalized KL. Most positions are prompts and conversations from public datasets (multi-turn tool use, image and audio questions, long documents); every assistant turn was written by MiMo-V2.6-Flash-MOPD itself (T=1.0, top-p 0.95, thinking on and off), so on those turns agreement measures how often the quant makes the same next-token choice as the original model on its own text.
| experts | non-experts | median KL ↓ | mean KL ↓ | p90 / p95 / p99 ↓ | top-1 ↑ | top-5 ↑ | top-10 ↑ | |
|---|---|---|---|---|---|---|---|---|
| harness check: original vs its own reference (68,811 positions) | original | original | 0.0000 | 0.0000 | 0.00 / 0.00 / 0.00 | 100.0% | 100.0% | 100.0% |
| floor: original experts, 8-bit non-experts | original | affine 8-bit | 0.079 | 0.931 | 3.01 / 5.69 / 10.40 | 69.6% | 84.6% | 87.7% |
| floor: original experts, MXFP8 non-experts | original | MXFP8 | 0.100 | 1.036 | 3.48 / 6.16 / 10.73 | 67.9% | 83.1% | 86.3% |
| MiMo-V2.6-Flash-MOPD-JANGHT2.5 | JANGHT | affine 8-bit | 0.519 | 1.758 | 5.51 / 7.86 / 12.06 | 54.8% | 71.7% | 76.5% |
How to read this:
- MiMo is sensitive to tiny changes on long, high-entropy text. Rounding only the non-expert weights to 8 bits, with the experts untouched, already drops top-1 agreement to 69.6% overall and to 58–67% on image-conversation and tool-conversation text. No quant of this model reaches 100% on those sets; the floor rows are the realistic ceiling. Affine 8-bit beat MXFP8 on every domain and is what ships.
- On reasoning, chat and security text the bundle stays close: 91–93% top-1 agreement, median KL 0.001–0.007.
- Next-token accuracy on the actual held-out text: 34.9% for the bundle vs 36.0% for the original model.
By domain, median KL · mean KL · top-1 agreement:
| domain | positions | JANGHT2.5 | floor (original experts, 8-bit non-experts) |
|---|---|---|---|
| tool conversations (multi-turn, public datasets) | 84,770 | 0.941 · 1.861 · 48.7% | 0.145 · 0.809 · 67.2% |
| image conversations | 34,192 | 0.827 · 2.612 · 46.3% | 0.219 · 1.810 · 58.0% |
| prose / long documents | 11,650 | 0.192 · 1.037 · 67.1% | 0.036 · 0.517 · 80.0% |
| coding | 10,604 | 0.027 · 0.715 · 79.9% | 0.003 · 0.515 · 85.7% |
| reasoning | 3,483 | 0.001 · 0.075 · 93.5% | 0.000 · 0.014 · 97.9% |
| cybersecurity | 2,894 | 0.002 · 0.066 · 93.0% | 0.000 · 0.013 · 97.9% |
| Chinese | 2,013 | 0.031 · 0.079 · 88.6% | 0.002 · 0.006 · 97.0% |
| agentic | 1,401 | 0.362 · 1.088 · 61.4% | 0.029 · 0.387 · 78.7% |
| audio conversations | 1,353 | 0.091 · 0.777 · 74.0% | 0.004 · 0.262 · 89.2% |
| chat | 1,221 | 0.007 · 0.111 · 91.0% | 0.000 · 0.023 · 97.3% |
Tool decisions
Inside the 153k positions: 89 points where the original model's own transcript starts a tool call, 149 where it starts
the answer (first token after </think>).
| JANGHT2.5 | floor (8-bit non-experts) | |
|---|---|---|
| tool-call points: same next token as the original | 98.9% | 100% |
| tool-call points: model starts a tool call (original: 89 of 89) | 88 | 89 |
median P(<tool_call>) at tool-call points (original: 0.9994) |
0.996 | 0.999 |
lowest P(<tool_call>) at a tool-call point |
0.28 | 0.72 |
| answer points: same next token as the original | 73.2% | 94.6% |
| decisions flipped call ↔ answer (all points) | 3 | 0 |
| tool-call tokens: next-token accuracy (original: 98.8%) | 97.6% | 98.8% |
Reasoning ends on its own
At the 231 points where the original model closes its reasoning (</think>) in its own transcripts:
| JANGHT2.5 | floor (8-bit non-experts) | |
|---|---|---|
median P(</think>) (original: 0.993) |
0.964 | 0.989 |
points where P(</think>) < 0.1 |
7 of 231 | 2 of 231 |
Every expert unit carries the unit-gain row scales (the fix for low-bit reasoning that never closes, see our GLM-5.3-Flash JANGH2 revision 2).
Free generation (served, thinking on, T=1.0, top-p 0.95, 4 hard prompts × 3 seeds, 12k-token cap): 11 / 12 runs
closed their reasoning by themselves with no repetition, after 268 to 9,003 characters of reasoning. The twelfth (the
23-person birthday problem, seed 2) was still multiplying the 22 factors out by hand, digit by digit and without
repeating itself, when it reached the 12k-token cap; the other two seeds of that prompt closed. Re-run alone with a 32k-token cap, that prompt and seed still had not closed after 32,000 reasoning tokens. Long hand-arithmetic derivations can overrun the reasoning budget; set a generous max_tokens.
Live behavior (served, vMLX, plain lane)
| suite | JANGHT2.5, omni route (default) | JANGHT2.5, text-only route (--text-only) |
|---|---|---|
| behavior probes: math (thinking on / off), follow-up, 8 tool calls (required / auto × thinking on / off), tool round trip, prime check (thinking on / off), image, video, audio transcription | 16 / 16 | 13 / 13 (no media) |
| 48-case tool-use eval (required / auto × thinking on / off), temperature 0 | 46 / 48 | 46 / 48 |
| multi-round agent episodes vs a scripted environment (8 tasks × thinking on / off × 2 seeds, T=1.0): no repeated tool calls, task completed | 30 / 32 | — |
- The two tool-use misses are the same case: asked "how many kilometers is 26.2 miles?" with thinking on, the model
called
calculatorwith26.2 * 1.609344instead ofconvert_units. - Agent episodes: 160 tool calls, 1 repeat (page 2 of a search fetched twice, then a correct summary). One episode ignored a tool error that said the exchange was closed and answered that the ticker was not real. The test-fix loop (run tests → read → edit → re-run until green), schema exploration and a 5-item to-do were completed in every run.
- Audio transcription of a spoken sentence: "The quick brown fox jumps over the lazy dog near the river bank." — exact.
Speed (M5 Max 128 GB)
Served, one request at a time, plain lane, median of 3 probes on never-seen prompts (one server run).
| JANGHT2.5 | |
|---|---|
| decode (tok/s) | 45.9 (45.9 – 46.1) |
| prefill, ~5.1k-token prompt (tok/s) | 692 |
| time to first token, ~5.1k-token prompt | 7.4 s |
| Metal memory after load | 91.5 GB active (~100 GB peak during an image request) |
All numbers on this card are from the plain lane. vMLX support for the bundled DFlash drafter is in progress; until it ships, serve with --no-bundled-dflash2.
What's in the bundle
Experts (47 MoE layers; a unit is the gate+up pair or the down projection of one layer):
projection JANGT 2 JANGT 2.5 JANGT 3 JANGH 2 JANGH 3 JANGH 4 gate / up 20 layers 22 2 2 — 1 down 8 24 — 12 1 2 Layers 5 and 16 are all-JANGH; the per-layer map is in
Per-layer formats (measured from the shards)config.json→quantizationandjang_config.json→expert_units.Layer 0 is the dense MLP (affine 8-bit). Type = attention (full, or sliding window 128 with sinks). Outlier = exact fp16 columns per JANGT projection.
layer type gate up down outlier g/u/d GiB 1 SWA-128 JANGT2 JANGT2 JANGT2 8/8/8 1.557 2 SWA-128 JANGT2 JANGT2 JANGT2 8/8/8 1.557 3 SWA-128 JANGT2 JANGT2 JANGT2 8/8/8 1.557 4 SWA-128 JANGT2 JANGT2 JANGT2 8/8/8 1.557 5 full JANGH2 JANGH2 JANGH2 –/–/– 1.504 6 SWA-128 JANGH2 JANGH2 JANGT2 –/–/8 1.531 7 SWA-128 JANGT2 JANGT2 JANGT2 8/8/8 1.557 8 SWA-128 JANGT2 JANGT2 JANGT2.5 8/8/8 1.682 9 SWA-128 JANGT2 JANGT2 JANGH2 5/5/– 1.523 10 SWA-128 JANGT3 JANGT3 JANGH4 3/3/– 2.520 11 full JANGT2.5 JANGT2.5 JANGH3 2/2/– 2.018 12 SWA-128 JANGT2 JANGT2 JANGH2 1/1/– 1.516 13 SWA-128 JANGT2 JANGT2 JANGT2.5 0/0/8 1.668 14 SWA-128 JANGT2 JANGT2 JANGT2.5 0/0/8 1.668 15 SWA-128 JANGT2 JANGT2 JANGH2 0/0/– 1.516 16 SWA-128 JANGH4 JANGH4 JANGH4 –/–/– 3.004 17 full JANGT2 JANGT2 JANGT2.5 0/0/8 1.668 18 SWA-128 JANGT2 JANGT2 JANGH2 0/0/– 1.516 19 SWA-128 JANGT2 JANGT2 JANGT2.5 0/0/8 1.668 20 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 0/0/8 1.918 21 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 0/0/8 1.918 22 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 23 full JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 24 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 25 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 26 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 27 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 28 SWA-128 JANGT2.5 JANGT2.5 JANGT2 2/2/8 1.795 29 full JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 30 SWA-128 JANGT2 JANGT2 JANGH2 2/2/– 1.518 31 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 32 SWA-128 JANGT2 JANGT2 JANGH2 1/1/– 1.516 33 SWA-128 JANGT2 JANGT2 JANGH2 2/2/– 1.518 34 SWA-128 JANGT2 JANGT2 JANGH2 1/1/– 1.516 35 full JANGT2 JANGT2 JANGH2 2/2/– 1.518 36 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 0/0/8 1.918 37 SWA-128 JANGT2 JANGT2 JANGH2 1/1/– 1.516 38 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 0/0/8 1.918 39 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 40 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 41 full JANGT3 JANGT3 JANGT2 2/2/8 2.045 42 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 43 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 44 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 2/2/8 1.920 45 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 46 SWA-128 JANGT2.5 JANGT2.5 JANGT2.5 1/1/8 1.918 47 full JANGT2.5 JANGT2.5 JANGH2 1/1/– 1.766 Model shards: 18 shards, 91.84 GiB. Routed experts 83.94 GiB; text non-experts affine 8-bit; vision tower, audio encoder and speech embeddings bf16.
audio_tokenizer/(0.61 GiB): encoder only, verbatim.dflash/(1.45 GiB): DFlash drafter — 5 sliding-window (1024) layers reading the target's hidden states from layers 0 / 11 / 23 / 35 / 47, block size 8, sharing the target's embeddings and lm_head; 36 linears affine 8-bit g64,mask_embedding.safetensors(+ the original.pt), MIT.Thinking + agentic:
- Thinking is ON by default; pass
chat_template_kwargs: {"enable_thinking": false}to turn it off. There are no reasoning-effort levels. - Tool calls use MiMo's XML dialect (
<tool_call><function=name><parameter=key>value</parameter></function></tool_call>), declared astool_parser: xml_function; reasoning asthink_xml. - Past assistant turns keep their
reasoning_contentin the template; send it back in multi-turn agent loops.
- Thinking is ON by default; pass
Self-describing:
config.jsoncarries the per-modulequantizationmap: 120 JANGT expert projections ("mode": "jangt","kbits"), 21 JANGH ("mode": "jangtq2","bits","rotation": "hadamard32"), affine 8-bit (group 64) for every other quantized linear. Thejangtblock holds the trellis parameters and the per-projection outlier columns; thejangtqblock (version 2) holds the JANGH codebooks.jang_config.jsonrecords the calibration, the allocation plan, the per-unit formats, the drafter and the capabilities.
Every tensor file is alignment-safe (zero-copy memory mapping), including the drafter and audio tokenizer.
Serving contract
- Sampling:
temperature=1.0, top_p=0.95(model card defaults), no repetition penalty - EOS:
[151643, 151645, 151672]· context: 1M declared (memory, not the model, sets the practical limit on 128 GB) - Thinking:
enable_thinkingchat-template kwarg, default on - JANGH units keep their on-disk identifiers (
jangtqblock,"mode": "jangtq2",*.tq2_packed/*.tq2_scales). They are not loadable by, and must not be routed to, JANGTQ v1 loaders.
Build details
- Source:
XiaomiMiMo/MiMo-V2.6-Flash-MOPD@b12f557; experts decoded exactly from the official MXFP4 (QAT) weights - Calibration: 1.29M tokens. Every assistant turn was generated by the source model itself (364k generated tokens, thinking on and off), over coding in 9 languages, multi-round agentic tool use, tool conversations, terminal / shell, cybersecurity (two public instruction and vulnerability-fix datasets), reasoning, chat, Chinese, prose, 165 images and 60 audio clips run through the bf16 towers. Held out: 254 sequences (154k tokens) never used for calibration
- Allocation: per unit (gate+up or down of each layer), the format and width with the lowest predicted cost: measured held-out error curves weighted by each layer's measured sensitivity (real quantization error, frozen routing)
- Rounding: JANGT trellis on per-expert input statistics with outlier columns and column scaling on down projections; JANGH GPTQ with act-order in the rotated basis; unit-gain row scales on every unit
- Drafter: MiMo's native DFlash drafter, weights rounded to affine 8-bit; architecture unchanged
Quantized and validated by Jinho Jang — eric@jangq.ai