The MTPLX rows were measured on MTPLX's own M5 Max with fans verified at max. The Ollama rows were published by their authors and measured on their own machines. Created by Youssof Altoukhi, who brought native MTP to the Mac in April 2026.
What Ollama does well
Ollama pulls a model with one command and has a huge catalog. It runs GGUF models through llama.cpp and also has an MLX runner.
The numbers
The three Ollama rows are published third-party runs of Qwen 3.8 27B Q4_K_M. The two MTPLX rows are the Qwen 3.8 27B packs measured for the MTPLX 2.7.0 release on 15 Aug 2026.
| Engine | Model | Machine | Task | Sampling | Decode tok/s | Source | Date |
|---|---|---|---|---|---|---|---|
| Ollama (version: see source) | Qwen 3.8 27B Q4_K_M (GGUF) | Mac Studio M3 Ultra, the author's machine | 5-run average (prompt: see source) | see source | 14.0 | terminalbytes.com, third party | Aug 2026 |
| Ollama (version: see source) | Qwen 3.8 27B Q4_K_M (GGUF) | M4 Max 128 GB, the author's machine | see source | see source | 16.6 | chrisleverseo.com, third party | Aug 2026 |
| Ollama (version: see source) | Qwen 3.8 27B Q4_K_M (GGUF) | M1 Max 64 GB, the author's machine | see source | see source | 10.0 to 12.2 | chrisleverseo.com, third party | Aug 2026 |
| MTPLX 2.7.0, MTP depth 3, mtplx serve | Qwen 3.8 27B Optimized Speed: 4-bit dynamic, 32-weight groups | M5 Max, MTPLX's own machine, fans verified at max | coding task, medium reasoning, single stream, generation to the model's own stop | official Qwen 3.8 sampling: temp 1.0 / top-p 0.95 / top-k 20 | 58.7 | MTPLX 2.7.0 release note | 15 Aug 2026 |
| MTPLX 2.7.0, MTP depth 3, mtplx serve | Qwen 3.8 27B Bare Speed: flat 4-bit, 64-weight groups | M5 Max, MTPLX's own machine, fans verified at max | coding task, single stream, generation to the model's own stop | official Qwen 3.8 sampling: temp 1.0 / top-p 0.95 / top-k 20 | 65.2 | MTPLX 2.7.0 release note | 15 Aug 2026 |
The Ollama rows are other people's machines, prompts and harnesses. The MTPLX rows are MTPLX's own M5 Max and its own coding task. Different Macs and different prompts: the table shows the scale of each engine's published numbers. It does not show a head-to-head. Cells that read "see source" are recorded only in the linked post.
What is different
- Native MTP head. MTPLX decodes with the model's own MTP head: on the Qwen 3.8 27B packs the model drafts three tokens ahead, the target verifies them in one forward pass, and the speculative path runs the same model as the AR path. Ollama runs GGUF through llama.cpp and has an MLX runner.
- Exact at any temperature. Acceptance is probability-ratio min(1, p/q) with residual (p - q)+ resampling (Leviathan–Chen), so output follows the model's distribution at any temperature. MTPLX has never shipped a greedy-only path. Activations stay bf16 (fp16 on M1/M2) on every pass.
- Prefix caching together with speculation. Since 2.0.0 (6 Jul 2026) MTPLX checkpoints the attention KV cache plus the recurrent and conv GDN state at commit boundaries. A 100k-token session restores in about 2 s after a restart instead of a five-minute cold prefill, and mid-session tool rounds restore warm in under 2 s.
- Model format. The Ollama rows above are GGUF (Q4_K_M). MTPLX runs MTP-ready MLX builds published under huggingface.co/Youssofal; Forge converts a Hugging Face repo into an MTP-ready MLX build on your own Mac, measures the speedup, and refuses incompatible models instead of silently falling back.
- One server, two dialects.
mtplx startor the app's play button serves an OpenAI-compatible API on 127.0.0.1:8000 (/v1/chat/completions,/v1/completions,/v1/models,/v1/embeddings,/v1/rerank) and an Anthropic-compatible/v1/messages, with streaming and tool calls in both styles. The app and the CLI share one server:mtplx startattaches to the app's loaded model instead of loading a second copy.