Home / 256 GB Mac

256 GB Mac · Mac Studio M5 Ultra 256 GB

Qwen3.8-Flash-Next oQ4e-mtp (oMLX requant)

Mac Studio M5 Ultra 256 GB

oMLX 0.7.0 (MLX), MTP depth 3: model setting mtp_enabled=true + mtp_fixed_depth=3 (omlx/model_settings.py:452 (mtp_enabled), 461 (mtp_fixed_depth), 458 (mtp_adaptive_max_depth)), set per model in <base-path>/model_settings.json or admin /admin; default mtp_enabled=falsecommit 0.7.01 GPUmeasured 2026-10-19independent check passed
Rank in 256 GB Mac
1of 2
Overall score
87.3/ 100
Speed
45.0/ 45
Quality
30.0/ 30
Browser check
4.3/ 5
My rating
8.0/ 20

Overall score as of 20 Oct 2026. Scores are relative to the best run in the class today; a better model later moves older runs down.

How the overall score is calculated
PartThis runBest in classRelativeWeightPoints
Speeddecode 152.5 tok/sbest 152.5 tok/s100.0 %45 %45.0
Qualitymean of 7 tests: 64.8 %best mean 64.8 %100.0 %30 %30.0
Browser check8.5 of 1085.0 %5 %4.3
My rating4 of 1040.0 %20 %8.0
Overall100 %87.3

The seven quality tests: MMLU-Pro 64.3 · GPQA 43.9 · IFEval 84.0 · LiveCodeBench 57.5 · long text 8K 85.0 · long text 32K 62.5 · GPQA 30 with thinking 56.7.

Speed and quality are relative to the best run of this class, the browser check and my rating are out of 10. The parts are rounded one by one. sparkDash, the memory test and speculative-decoding numbers are not part of it. How the score is made, and the assumption behind it.

Build test

What it builds as an agent

Task: Voxel world (3D scene, one HTML file). One attempt, no help. Counted: the final file counts.

Browser check
8.5/ 10
My rating
4/ 10
Time
58.1min
Tokens
225,892
Harness
Qwen Code 0.25.2
Screen recording of the page this run built, made in Chrome after the run. The page files are unchanged. Still image

Play it yourself

Open full screen

AI-generated The page this setup built, running live in your browser: click into it and use the controls it shows itself (usually drag to look around, scroll to zoom). It needs WebGL and can be slow on a weak graphics card.

The browser check

  • page loads without page error1 / 1
  • window.ready === true within 30 s1 / 1
  • no console errors (whole session)1 / 1
  • frame is not blank1 / 1
  • frame rate in software GL (rAF over 5 s)0 / 1
  • world: scene size 0.5 (parts >= 80 or >= 20000 triangles; canvas fallback), visible text English if any 0.51 / 1
  • automatic camera tour: the view changes on its own in two successive ~5 s windows (1 each)2 / 2
  • animation in the world (nodes / instances / particles moving besides the camera)1 / 1
  • OrbitControls: drag and wheel change the picture beyond the animation baseline0.5 / 1

Measured 2026-10-19. Raw files: run info · command · final choice · contract · sampling · check · screenshot · clip.mp4 · web.mp4 · web-poster.jpg.

The score of 8.5 comes from check.json: the browser check was re-run on a DGX Spark with more CPU cores, and the page files are unchanged. The check that ran together with the agent run did not start (it used too few CPU cores), so contract-show.json lists 0.0. Qwen Code stopped the run with its own loop guard (exit code 1, per-turn tool-call limit); the last saved working version counts.

Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

Build test (run show-r2)
run_showcase.sh --harness qwen-code --task VX --upstream http://127.0.0.1:65149/v1 --model Qwen3.8-Flash-Next-oQ4e-mtp --sampling-file $RUN/sampling-show.json --out $RUN/raw/tag-1910-show-r2/show --limit-s 7200 --inject-after-s 5400 --poll-s 20 --ctx 262144
Speed v2

How fast it runs

Decode
152.5tok/s
Decode, code
175.8tok/s
Decode, prose
129.1tok/s
500 words
≈ 5.4s
Prefill at 8K
3715.6tok/s
First token at 2K
0.5s
MeasurementResult
Decode152.5 tok/s
Words per second93.1 words/s
Characters per second726.3 chars/s
Spread of the decode runs (CV)5.1 %
Decode, window 1157.2 tok/s
Prefill at 2K3877.5 tok/s
Prefill at 8K3715.6 tok/s
Prefill at 32K3782.2 tok/s
Time to first token at 2K0.5 s
Time to first token at 8K2.2 s
Time to first token at 32K8.7 s
1 request at once (total)112.7 tok/s
Long answer, wall time33.2 s
Decode, code prompt175.8 tok/s
Decode, prose prompt129.1 tok/s
Spread of the code runs (CV)2.4 %
Spread of the prose runs (CV)5.1 %

Method: code+prose; 2 run(s) each; 512 tokens; 1 warm-up(s); median. Measured 2026-10-19. Raw files: speed result · speed contract · log · long answer.

Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

Speed v2 (run speed-r0)
python3 speed2.py --base-url http://127.0.0.1:53012/v1 --label run-speed-r0 --prompts $BENCH/repos/rigmark-v2/prompts-v2.json --output $RUN/raw/tag-1910-speed-r0/run-speed-r0/speed2 --contract $RUN/raw/tag-1910-speed-r0/run-speed-r0/speed2/speed-contract.json --parts decode,prefill,conc,l1 --prefill-depths 2048,8192,32768 --prompt-ids code,prose --runs 2 --max-tokens 512 --warmups 1 --prefill-runs 3 --tokenizer-json $HOME/engines/omlx-0.7.0/models/Qwen3.8-Flash-Next-oQ4e-mtp/tokenizer.json --tokenizer-python $HOME/not published --sampling {"temperature": 0.7, "top_p": 0.8, "top_k": 20, "min_p": 0.0, "presence_penalty": 1.5} --sampling-source Qwen/Qwen3.8-Flash-Next README.md:343 (Instruct/non-thinking) and :342 (Thinking), local copy not published; generation_config.json (1.0/20/0.95) = thinking default only, not used for instruct --model Qwen3.8-Flash-Next-oQ4e-mtp --no-cache-prompt --server-log $RUN/logs/server-A.log --engine-version-file $RUN/logs/engine-version.txt
Quality v2

How well it answers

TestResult95 % marginRightCut offcount as wrongRaw files
MMLU-Pro
400 fixed questions, letter only
64.3 % ± 4.7 pts257 / 4004answers · summary · log · contractcommand
GPQA Diamond
198 questions, letter only
43.9 % ± 6.9 pts87 / 1986answers · summary · log · contractcommand
IFEval
200 fixed prompts, strict
84.0 % ± 5.1 pts168 / 2000answers · summary · log · contractcommand
LiveCodeBench
40 newest tasks, the code runs
57.5 % ± 14.7 pts23 / 402summary · log · contractcommand
Long text 8K
4 tasks x 10 at 8192 tokens
85.0 % ± 11.0 pts34 / 400log · contract · answers · summarycommand
Long text 32K
4 tasks x 10 at 32768 tokens
62.5 % ± 14.4 pts25 / 400log · contract · answers · summarycommand
GPQA 30, thinking on
30 questions, limit 16,384 tokens
56.7 % ± 16.7 pts
median 5,684 tokens, 37.9 s per question
17 / 3012log · contract · answers · summarycommand

Thinking off, except the last test. Seed 42. Sampling from the model card. A cut-off answer counts as wrong. Measured 2026-10-19.

Exact commands we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

MMLU-Pro (run inst-r13)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts mmlupro --job nacht-1910
GPQA Diamond (run inst-r13)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts gpqa --job nacht-1910
IFEval (run inst-r13)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts ifeval --job nacht-1910
LiveCodeBench (run inst-r13)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts lcb --job nacht-1910
Long text 8K (run inst-r1)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts ruler --job tag-1910
Long text 32K (run inst-r1)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts ruler --job tag-1910
GPQA 30, thinking on (run think-r14)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts think --job nacht-1910
Memory test

How much context fits

Largest size tested
262,144tokens
Peak memory
117.29GiB
Decode at that size
53.1tok/s
Context sizePrompttokensFilledFirst tokenPrefilltok/s, as the server reports itDecodetok/sPeak memoryGiBResult
4K 4,096 tokens3,78692.4 %1.2 s3,076104.0102.97answered (stop)
8K 8,192 tokens7,74794.6 %2.2 s3,524109.3111.21answered (stop)
16K 16,384 tokens15,78996.4 %4.1 s3,81898.5104.97answered (stop)
32K 32,768 tokens31,54396.3 %6.2 s5,06990.8107.36answered (stop)
64K 65,536 tokens62,65495.6 %10.4 s6,00182.1109.01answered (stop)
128K 131,072 tokens125,70795.9 %19.5 s6,43264.5114.47answered (length)
256K 262,144 tokens249,41495.1 %37.7 s6,61853.1117.29answered (stop)

Memory test. For each context size (4K, 8K, 16K ... up to the largest size tested for the setup) the server is started again with that context, one prompt that fills about 95 % of the context is sent, and the model must answer. The largest size that loaded and answered counts. Decode speed is measured on that answer at the largest size. Peak memory is the rise of used memory over the idle value before each server start (unified memory, so GPU and CPU share it). Measured 2026-10-20. Raw files: result of every step · log · contract.

Note from the run: The idle memory before the steps was not constant: 30.1 GiB before the first step, 42.3 GiB before the last one. Each peak is counted over the idle value before its own step. Steps from 32K upwards were partly served from oMLX's SSD prefix cache (26 %, 39 %, 46 % and 49 % of the prompt restored at 32K, 64K, 128K and 256K), so the prefill speed in fit.json is not a cold value. Idle memory before the first step 30.1 GiB, before the last step 42.3 GiB (each peak is counted over the idle value before its own step).

Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

Memory test (run fit-r0)
bash tools/quality2/measure_all.sh tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json --parts fit --job plan-2010
Credits

Also made this possible

Setup

Run it yourself

What you need and how to start it, step by step. The results below come from exactly this setup.

What you need

Hardware
Mac Studio M5 Ultra 256 GB
System
macOS (the Mac above)
Model
Qwen3.8-Flash-Next oQ4e-mtp (oMLX requant)
Engine
oMLX 0.7.0 — the program that loads the model and answers requests · github.com/jundot/omlx
Context window
262,144 tokens: how much text the model can see at once

Steps

  1. Get the engine from the list above. The list has no direct download link for the model file itself. The base model is huggingface.co/Qwen/Qwen3.8-Flash-Next. The oQ quantisation comes from oMLX (jundot and contributors).

  2. Turn on MTP (multi-token prediction, depth 3) for this model: set mtp_enabled=true and mtp_fixed_depth=3 in model_settings.json in the base folder of your oMLX install (BASE_FOLDER in the command below) or on the admin page /admin. It is off by default (mtp_enabled=false).

  3. Start the server with this command. It loads the model into memory. When the model has loaded, the server waits for requests on port 8888, only from this computer.

    omlx serve \
      --model-dir MODELS_FOLDER \
      --base-path BASE_FOLDER \
      --host 127.0.0.1 \
      --port 8888 \
      --api-key YOUR_KEY

    Replace MODELS_FOLDER with the folder of your oMLX install that holds the model files, and BASE_FOLDER with the base folder of your oMLX install (the per-model settings file model_settings.json is in it). Replace YOUR_KEY with a key of your own.

    What the parts mean

    • --model-dir MODELS_FOLDERthe folder with the model files
    • --host 127.0.0.1who can connect: only this computer
    • --port 8888the network port the server listens on
    • --api-key YOUR_KEYa key that clients must send with every request; pick your own
Exact command we measured withfor reproducing↓

You do not need this to run the model. It is the start text exactly as our run recorded it, with the engine build in front, so anyone can repeat the result.

Start, as recorded with the run
oMLX 0.7.0 (MLX), MTP depth 3: model setting mtp_enabled=true + mtp_fixed_depth=3 (omlx/model_settings.py:452 (mtp_enabled), 461 (mtp_fixed_depth), 458 (mtp_adaptive_max_depth)), set per model in <base-path>/model_settings.json or admin /admin; default mtp_enabled=false; omlx serve --model-dir $HOME/engines/omlx-0.7.0/models --base-path $HOME/engines/omlx-0.7.0/base --host 127.0.0.1 --port 8888 --api-key speed2

Context and sampling: 262144 (oMLX has no context flag; limit = model-native max_position_embeddings, $HOME/models/flashnext-mac/config.json:84 inside text_config, read by model_discovery._read_model_context_length and used in omlx/server.py:2089-2100 get_max_context_window; no per-model max_context_window override set; oMLX rejects longer prompts), seed 42, model-card sampling (Instruct: temp 0.7 / top_p 0.8 / top_k 20 / min_p 0.0 / presence 1.5; Thinking: temp 1.0 / top_p 0.95 / top_k 20 / min_p 0.0 / presence 0.0), cache_prompt: not available. Hardware: Mac Studio M5 Ultra 256 GB. All raw files of this setup: raw/v2/qwen38-flash-next-mac-omlx-mtp.

Mia's sparkDash 2.50.0

Mia's own benchmark, run unchanged

This is Mia's own benchmark tool (commit 21a3511), run unchanged. It has its own section here and its own column on the class page, and it is never mixed with my numbers. A cut-off answer counts as wrong here, so a value can differ from sparkDash's own screen.

Tool Eval Quick
97/ 100
Decode, 1 request
217.3tok/s
TestResult95 % marginRightCut offcount as wrongRaw files
Quality QA
150 questions
89.3 % ± 5.0 pts134 / 1500answers · summarycommand
Quality MMLU
285 questions
90.5 % ± 3.4 pts258 / 28512answers · summarycommand
Tool Eval Quick
15 scenarios, tool use
97 / 10014 / 15 passed—tool eval result · tool eval report · tool eval command · summarycommand
Decode, 1 request at once
first token 191 ms
217.3 tok/s——decode result · summarycommand
Prefill at 4K
first token 1.2 s
4139.8 tok/s——prefill result · summarycommand
Prefill at 8K
first token 2.3 s
3939.2 tok/s——prefill result · summarycommand
Prefill at 16K
first token 4.4 s
3898.5 tok/s——prefill result · summarycommand
Prefill at 32K
first token 8.7 s
3858.1 tok/s——prefill result · summarycommand

Seed 1234 applies to the two quality tests; decode, prefill and tool eval send no seed. The benchmark client ran on a separate machine that is never part of the measured group. Measured 2026-10-19. Version 2.50.0, commit 21a3511.

QA. Quality QA, 150 items, seed 1234, temperature 0, thinking off, 4 requests at once (Mia's default). An answer cut off at the token limit counts as wrong. ± is the 95 % margin (Wilson).

MMLU. Quality MMLU, 285 items (5 for each of 57 subjects, 4 answers), seed 1234, temperature 0, thinking off. An answer cut off at the token limit counts as wrong. ± is the 95 % margin (Wilson).

Decode. Decode bench, 1 request at once, 400 tokens, prompt type structured, temperature 0, thinking off. No seed is sent.

Prefill. Prefill bench at 4K, 8K, 16K and 32K tokens. sparkDash skips a size that does not fit into the context. No seed is sent.

Tool Eval Quick. Tool Eval Quick: tool-eval-bench (SeraphimSerapis, commit c61319b), 15 core scenarios (--short), --no-think, --timeout 120. Score 0 to 100. No seed is sent.

Note from the run: Tool Eval Quick is from the re-run sparkdash-r5 (2026-10-19): in run sparkdash-r4 it was sent to another model on the same server, so that result is not shown.

Exact commands we measured withfor reproducing↓

You do not need this to run the model. It is the exact command of our measurement, so anyone can repeat the result.

sparkDash (run sparkdash-r4)
python3 tools/quality2/sparkdash_client.py tools/quality2/cards/flashnext-oq4e-mtp-omlx-0.7.0.json <box> --client <client machine> --job tag-1910 --out $RUN
Tool Eval Quick, as sparkDash starts it
tool-eval-bench --base-url http://127.0.0.1:<port> --model Qwen3.8-Flash-Next-oQ4e-mtp --short --no-think --timeout 120 --json-file $BENCH/sparkdash-client/runs/run-sparkdash-r5/tooleval/result.json --no-live