Local AI Models on Apple Silicon
Autonomous coding agents on your Mac. Coding vs reasoning models, real-world RAM after macOS overhead, and tok/s by memory bandwidth. Rebuilt in September 2026 around models you can run today — and around numbers measured on an M5 Max rather than quoted.
Coding Models
Reasoning Models — and What Actually Fits
macOS Memory Overhead
Metal wires about 75% of unified memory by default. sysctl iogpu.wired_limit_mb reads 0 until you change it — 0 means the default, not unlimited.
iogpu.wired_limit_mb works and resets on reboot — a shelf that only fits because of a command someone typed once is not a shelf.
RAM Footprint — vs What macOS Will Wire
Memory Bandwidth & Tokens/Second
| Chip | Bandwidth | 14B Q4 | 32B Q4 | 70B Q4 | 70B Q8 |
|---|---|---|---|---|---|
| M4 Pro | 273 GB/s | ~45 t/s | ~22 t/s | won't fit | won't fit |
| M4 Max | 546 GB/s | ~80 t/s | ~40 t/s | ~28 t/s | ~16 t/s |
| M5 Max | 614 GB/s | ~90 t/s | ~48 t/s | ~32 t/s | ~18 t/s |
| M3 Ultra | 800 GB/s | ~110 t/s | ~55 t/s | ~50 t/s | ~28 t/s |
| M5 Ultra | 1,228 GB/s | ~140 t/s | ~80 t/s | ~65 t/s | ~36 t/s |
Best Models by Mac Tier
- Qwen3.6-35B-A3B (Q4) MoE · 3B active · ~21 GB ~55 t/s — still the right first model
- Qwen3.8-27B (4-bit) Vision + 262K · 16.1 GB ~12 t/s — dense, so it reads everything
- Gemma 4 12B Vision + tool calling · ~8 GB ~40 t/s
- Qwen3.6-35B-A3B (8-bit) 37.75 GB measured · 262K context · reads images 78.6 t/s · 41/41 on executed code tests
- Qwen3-VL-Embedding + Reranker 2B Retrieval over your own documents · ~9 GB warm alongside the main model
- Qwen3.8-27B (8-bit), on call 29.53 GB measured · vision and long context 17.5 t/s — load it for a reason, not by default
- Qwen3.8-Flash-Next 180B/6B ~103 GB at 4-bit · cramped on 128 GB, comfortable here fast for its size — 6B active
- DeepSeek V4-Flash 284B/13B ~160 GB FP8 · 1M context · MIT the first model that needs this machine
- Two big models at once Flash-Next + 35B-A3B 8-bit = ~141 GB no unloading between tasks
Inference Stack — Performance Hierarchy
| Runner | Best For | Speed |
|---|---|---|
| vllm-mlx | Production serving, continuous batching, paged KV cache | Fastest overall · 2x llama.cpp · 6x Ollama (8 concurrent) |
| MLX (mlx-lm) | Single-stream inference, zero-copy unified memory | 20-50% faster than llama.cpp · purpose-built for Metal |
| MLC-LLM | Cross-platform deployment | Slightly behind MLX |
| Ollama | Easiest setup, OpenAI-compatible API | llama.cpp backend · best DX for agent integration |
| llama.cpp | Portable C++ with Metal backend | Good, but Metal is an add-on — not native like MLX |
| llamafile | Single-file distribution (cosmopolitan libc) | Same as llama.cpp · convenience, not speed |
Solo Developer Recommendation
128 GB is still the sweet spot — for a new reason.
March’s version of this page recommended a 70 GB reasoning model plus a small triage model, sized so the pair just fit. Measurement retired that plan. On this machine the constraint is not memory — the whole shelf fits with room to spare — it is wall-clock. A sparse model activating 3B parameters per token answered every task in a five-task executed-code suite in 329 seconds; the dense 27B usually recommended for coding scored lower and took 1,804 s at 4-bit and 2,147 s at 8-bit. Buy the memory so you stop thinking about it, then spend your attention on how long a turn takes.