Pick the pack that fits your memory, install MTPLX, run mtplx start. The speeds to expect are
listed with the conditions they were measured under, and the exactness check at the end confirms on your own
Mac that the speedup leaves the output unchanged. Created by Youssof Altoukhi, who brought
native MTP to the Mac in April 2026.
Pick a pack by RAM
Qwen 3.8 27B comes in three MTPLX packs, all built from Qwen/Qwen3.8-27B with a 262,144-token
context and MTP depth 3. The 125B Flash-Next MoE is a separate model for 96 GB and larger Macs. Each of the three
27B packs has an FP16 sibling for M1 and M2, the same weights in the precision those chips run natively; the app
and CLI pick it automatically, and no M1 or M2 numbers are published.
| Pack | Quantization | Download | Peak memory | KL vs bf16 | RAM |
|---|---|---|---|---|---|
| Optimized Speed (recommended for coding) | 4-bit dynamic, 32-weight groups; 8-bit on embeddings, output head, all 48 GDN output projections and the last 8 MLP blocks; 16-bit GDN conv and recurrent-state params, norms and the whole MTP head | 20.4 GB | 23.6 GB | 0.0220 | 32 GB+ (default) |
| Bare Speed | flat 4-bit, 64-weight groups | 16.0 GB | 17.0 GB | 0.0376 | no separate tier published |
| Optimized Quality | 8-bit, 64-weight groups | 29.4 GB | 32.7 GB | 0.00105 | 36 GB+ |
| Flash-Next Optimized Speed (125B MoE) | dynamic 4-bit with 8-bit attention | 115.1 GB incl. the 32 GB n-gram table | ~83 GB resident weights plus working set | 96 GB+ | |
| Flash-Next Bare Speed (125B MoE) | flat 4-bit | 96 GB+ |
Optimized Speed is the default on Macs with 32 GB or more and the pack to pick for coding. Bare Speed is described on its card as "Quickest burst chat speeds. Lower quality and slower on long coding tasks." Optimized Quality is the 8-bit pack for Macs with 36 GB or more. Below 32 GB, the Qwen 3.5 9B and 4B packs run comfortably on 16 GB. Quantization maps and every measured number are on the Qwen 3.8 27B page and the Flash-Next page.
Install and run
The Mac app from the DMG checks your hardware, recommends the pack that fits, downloads it, and measures your machine to pick the fastest decoding depth. From the terminal:
brew install youssofal/mtplx/mtplx
mtplx start
Or with pip, python3 -m pip install -U mtplx. To fetch a specific pack ahead of time and read its
compatibility report before anything runs:
mtplx pull Youssofal/Qwen3.8-27B-MTPLX-Optimized-Speed
mtplx inspect Youssofal/Qwen3.8-27B-MTPLX-Optimized-Speed --json
Onboarding runs the model itself at each draft depth with fans pinned, keeps plain autoregressive decoding as the
baseline, and saves a depth only if it beats that baseline. The Qwen 3.8 packs run the Turbo profile by default
(2.0.0, 6 Jul 2026): verify-specialized quantized-matmul kernels plus a compiled verify step. The server then
answers on 127.0.0.1:8000 for any OpenAI-compatible or Anthropic-compatible client; the
quickstart covers the first request.
Expected speeds
All numbers below are from the public Hugging Face model cards, measured on an M5 Max with fans verified at max, single stream, generation running to the model's own stop, official Qwen 3.8 sampling (temperature 1.0, top-p 0.95, top-k 20), MTPLX 2.7.0, 15 Aug 2026.
| Pack | Coding task, medium reasoning | Long xhigh reasoning answers | Acceptance by depth | Verify step | Conditions |
|---|---|---|---|---|---|
| Qwen 3.8 27B Optimized Speed | 58.7 tok/s via mtplx serve; 55.5 in the app | 35.1 tok/s on a 28k-token answer; 37.3 on a 20k-token answer | 0.95 / 0.88 / 0.80 | 50 to 53 ms | MTPLX 2.7.0, 15 Aug 2026, M5 Max, fans verified at max, single stream, official Qwen 3.8 sampling |
| Qwen 3.8 27B Bare Speed | 65.2 tok/s via mtplx serve; 64.4 in the app | 35.7 tok/s on a 34k-token answer; 32.0 on a 37k-token answer; one 52,740-token answer in 27.2 minutes at 32.4 tok/s sustained | 0.95 / 0.86 / 0.78 | 44 ms | MTPLX 2.7.0, 15 Aug 2026, M5 Max, fans verified at max, single stream, official Qwen 3.8 sampling |
| Qwen 3.8 27B Optimized Quality | 48.3 tok/s in the app | 33.2 tok/s on a 34k-token answer; 33.1 on a 46k-token answer | 0.96 / 0.88 / 0.79 | 63.5 ms | MTPLX 2.7.0, 15 Aug 2026, M5 Max, fans verified at max, single stream, official Qwen 3.8 sampling |
Two later instruments. The MTPLX 2.9.0 pack table for Qwen 3.8 27B (20 Aug 2026, depth 3, M5 Max, official Qwen 3.8 sampling; a different instrument from the 2.7.0 coding task) lists Optimized Speed at 46.8 tok/s, 2.3x the same model's plain decode without MTP; Bare Speed 49.9 tok/s, 2.3x; Optimized Quality 39.2 tok/s, 3.0x; Speed FP16 45.4, 2.3x; Bare FP16 50.2, 2.3x; Quality FP16 48.7, 2.8x. The 2.10.0 context curve (29 Aug 2026, M5 Max, stock settings, Qwen 3.8 27B Optimized Speed) is the one to read for long sessions:
| Lane: Qwen 3.8 27B Optimized Speed, M5 Max, stock settings, MTPLX 2.9.2 vs 2.10.0 (29 Aug 2026) | 2.9.2 | 2.10.0 |
|---|---|---|
| 3k-token chat answer, decode | 55.9 tok/s | 64.3 tok/s |
| 88k context, decode | 23.6 tok/s | 30.4 tok/s |
| 147k context, decode | 12.0 tok/s | 18.4 tok/s |
| 88k context, prefill | 379 tok/s | 535 tok/s |
| Rewriting a file the model just wrote (cache-copy rewrite lane) | 73.8 tok/s | 87.6 tok/s |
On the same night (15 Aug 2026, MTPLX 2.7.0, M5 Max, official Qwen 3.8 sampling, fans verified at max) the same coding task at medium reasoning ran on other engines and models: Qwen 3.6 27B Optimized Speed V2 on MTPLX 59.9 to 60.1 tok/s; oMLX 0.5.7 serving its own Qwen 3.8 4-bit MTP quant 63.3 tok/s, against MTPLX Qwen 3.8 27B Bare Speed at 65.2 and Optimized Speed at 58.7. On the 52,740-token long xhigh answer that night (same machine, same sampling), LM Studio ran 17.40 tok/s against MTPLX Qwen 3.8 27B Bare Speed at 32.4. oMLX is a continuous-batching server with SSD caching, and its Lightning MTP runs on MTPLX kernels. LM Studio's speculative decoding uses a separate draft model. The full set is on the benchmarks page.
Flash-Next on 96 GB+ Macs
Qwen 3.8 Flash-Next is the 125B MoE. MTPLX 2.10.0 (29 Aug 2026) shipped the first Apple Silicon backend for the family, in two packs: Optimized Speed (dynamic 4-bit with 8-bit attention) and Bare Speed (flat 4-bit, the quickest). Through the MTPLX server on an M5 Max at the pack's own sampler (temperature 1.0, top-p 0.95, top-k 20), MTPLX 2.10.0 (29 Aug 2026) decoded Flash-Next at 61 tok/s plain and 63 to 76 tok/s with the MTP head, depending on workload. The Optimized Speed download is 115.1 GB including a 32 GB n-gram table that streams from SSD; resident weights are about 83 GB plus the working set, which is why 96 GB is the floor. Clients may request depths up to 5.
2.10.1 (30 Aug 2026) added block-sparse prefill and image input. On the M5 Max a 98k-token Flash-Next prompt went from 175.7 s to 114.5 s with peak memory from 91.4 to 83.0 GB, and a cold 262,144-token prompt completes in 355 s at 87.4 GB peak, where it previously reached 119 GB or did not complete. 96 GB Macs can load Flash-Next.
Check exactness
MTPLX's claim is that the speculative path produces the same distribution of output as plain decoding of the
same model. Acceptance is probability-ratio min(1, p/q) with residual (p - q)+
resampling (Leviathan–Chen); activations stay bf16 (fp16 on M1 and M2) on every pass, and the speculative path
runs the same weights as the plain path. MTPLX has never shipped a greedy-only path. You can check this on your
own Mac with the same loaded model.
Run the same prompt twice, once with generation_mode set to "ar" (plain decoding,
the response reports mtp_depth: 0) and once with the default. Fix seed and set
temperature to 0 for the first pass:
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"mtplx","messages":[{"role":"user","content":"Write a Python function that parses ISO 8601 dates."}],"temperature":0,"seed":7,"generation_mode":"ar"}'
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"mtplx","messages":[{"role":"user","content":"Write a Python function that parses ISO 8601 dates."}],"temperature":0,"seed":7}'
At temperature 0 the model's distribution has a single outcome, so the two replies should match token for token. Then repeat the pair at the family sampler (temperature 1.0, top-p 0.95, top-k 20). Now each reply is a draw from the same distribution and the wording may differ between the two; the guarantee is that over repeated runs neither path produces answers the other could not. The pack cards' KL numbers (0.0220 Optimized Speed, 0.0376 Bare Speed, 0.00105 Optimized Quality, each against bf16) measure the quantization; the speculative path samples from that same quantized model, so it adds nothing on top.
The same comparison is available at the server level and in the terminal chat: mtplx start --no-mtp
serves plain decoding of the same loaded model, and inside mtplx start cli the commands
/mtp off, /mtp on and /mtp status switch without reloading.
/health reports mtp_enabled and depth so you know which path answered.
Since the day after release
Qwen released Qwen 3.8 on 14 Aug 2026. MTPLX 2.7.0 shipped Qwen 3.8 support on 15 Aug 2026, the day after, with the three 27B packs measured the same night. All six Qwen 3.8 27B repos ship their vision towers (restored 15 Aug 2026), so image input runs with MTP intact. On 3 Sep 2026 the Optimized Speed pack had 61,275 Hugging Face downloads in the trailing 30 days and all Qwen 3.8 packs together 119,875. The catalog lives at huggingface.co/Youssofal.