Apple M2 Ultra for local LLMs
Quick answer
How fast is the Apple M2 Ultra for local LLMs?
The fastest plain-decode result we have is 132.5 tok/s on Ornith 1.5 35B-A3B (oQ4e-mtp mixed 4-bit MLX (20.5 GB loaded), oMLX 0.7.1rc1 (MLX), MTP off) in Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX). Speed depends heavily on the model, quant and engine, so compare like with like in the table. RigBase lists 6 measured results from 2 builds.
Last updated:
6 measured results from 2 builds, each linked to its source.
| Memory | unified memory |
|---|---|
| Memory bandwidth | not listed |
| Typical EU price | not tracked yet |
Can it run? Ornith 1.5 35B-A3B on Apple M2 Ultra Qwen3.8 27B on Apple M2 Ultra gpt-oss 120B on Apple M2 Ultra gpt-oss 20B on Apple M2 Ultra
All builds with the Apple M2 Ultra
| Build | GPU(s) | Memory GB (total) | Results |
|---|---|---|---|
| Mac Studio M2 Ultra 76-core GPU, 192 GB | Apple M2 Ultra 76-core GPU | 192 | 3 |
| Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX) | Apple M2 Ultra 60-core GPU (unified, Mac Studio) | 64 | 3 |
All measured results
(MTP, DFlash, DSpark and similar draft-and-verify methods give much higher tok/s on predictable text and are not comparable 1:1 with plain decode)
| Model | Build | Ran on | Quant | Engine | tok/s | Details |
|---|---|---|---|---|---|---|
| Ornith 1.5 35B-A3B | Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX) | Apple M2 Ultra | oQ4e-mtp mixed 4-bit MLX (20.5 GB loaded) | oMLX 0.7.1rc1 (MLX), MTP off | 132.5 | context: short Kotlin coding prompt, thinking off📏 oMLX 0.7.1rc1 (OpenAI-compatible server for Apple Silicon), one model per server process, temperature 0, streaming, one request at a time, prefix cache off, 512 max tokens, 10 runs per prompt per phase over 2 phases (20 runs); decode tok/s = completion tokens / (last streamed chunk - first chunk), time to first token excluded; thinking off; 132.5 tok/s on the code prompt and 133.1 on the prose prompt. With MTP on, code rose to 147.9 but prose fell to 107.6 (0.81x), so MTP did not help on this MoE |
| Qwen3.8 27B | Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX) | Apple M2 Ultra | oQ4e-mtp mixed 4/5-bit MLX (4.887 bits/weight, 16.2 GB loaded) | oMLX 0.7.1rc1 (MLX), Lightning MTP on | 41.6 | ⚡ spec-decode (MTP)context: 350-word prose explanation, thinking off📏 oMLX 0.7.1rc1 (OpenAI-compatible server for Apple Silicon), one model per server process, temperature 0, streaming, one request at a time, prefix cache off, 512 max tokens, 10 runs per prompt per phase over 2 phases (20 runs); decode tok/s = completion tokens / (last streamed chunk - first chunk), time to first token excluded; thinking off; prose 41.6 tok/s (MTP acceptance 69.6%, 2.64 tokens per cycle) and code 64.3 tok/s (acceptance 93.4%, 4.20 tokens per cycle, 1.92x); with thinking on, code 46.7 and prose 33.9 (MTP parked in all 20 runs). Lower end listed. The author found that with MTP on, the greedy output text differed from the MTP-off text in 7 of 8 scenarios and did not measure quality |
| Qwen3.8 27B | Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX) | Apple M2 Ultra | oQ4e-mtp mixed 4/5-bit MLX (4.887 bits/weight, 16.2 GB loaded) | oMLX 0.7.1rc1 (MLX), MTP off | 33.6 | context: short Kotlin coding prompt, thinking off📏 oMLX 0.7.1rc1 (OpenAI-compatible server for Apple Silicon), one model per server process, temperature 0, streaming, one request at a time, prefix cache off, 512 max tokens, 10 runs per prompt per phase over 2 phases (20 runs); decode tok/s = completion tokens / (last streamed chunk - first chunk), time to first token excluded; thinking off; 33.6 tok/s on the code prompt and 33.7 on the prose prompt (20 runs each, MTP-off phases agree within 1.4%) |
| gpt-oss 120B | Mac Studio M2 Ultra 76-core GPU, 192 GB | Apple M2 Ultra | MXFP4 | llama.cpp | 79.68 | |
| gpt-oss 20B | Mac Studio M2 Ultra 76-core GPU, 192 GB | Apple M2 Ultra | MXFP4 | llama.cpp | 116.08 | |
| Llama 2 7B legacy | Mac Studio M2 Ultra 76-core GPU, 192 GB | Apple M2 Ultra | Q4_0 | llama.cpp Metal (FA, Aug 2026 build) | 125.21 |
All Apple M2 Ultra builds: see also all GPUs · best LLMs by memory size · download the dataset.
FAQ
How fast is the Apple M2 Ultra for local LLMs?
The fastest plain-decode result we have is 132.5 tok/s on Ornith 1.5 35B-A3B (oQ4e-mtp mixed 4-bit MLX (20.5 GB loaded), oMLX 0.7.1rc1 (MLX), MTP off) in Mac Studio M2 Ultra (60-core GPU, 64 GB): Qwen3.8 27B 4-bit at 33.6 tok/s, 41.6-64.3 with MTP; Ornith 1.5 35B-A3B at 132.5 tok/s (oMLX). Speed depends heavily on the model, quant and engine, so compare like with like in the table. RigBase lists 6 measured results from 2 builds.
How much memory does the Apple M2 Ultra have?
unified memory.
Which models have been measured on the Apple M2 Ultra?
Llama 2 7B, Ornith 1.5 35B-A3B, Qwen3.8 27B, gpt-oss 120B, gpt-oss 20B.
Where do these numbers come from?
Every row links to a build page with its original public source (benchmark logs, READMEs, forum posts). RigBase does not re-run the benchmarks. Results marked ⚡ use speculative decoding and are not comparable 1:1 with plain decode.
Referral link: if you sign up with Google and add $10, Runpod gives you and RigBase bonus credit (terms). It never affects our data.