TinkerLab
01 // HOMELABApple Silicon MacStreaming / API~11 min read & lab

Apple M6 MacBook Pro (16GB / 24GB / 32GB) for Local LLMs: Which Memory Tier, Which Models, and Why the Dual Neural Engine Does Not Speed Up llama.cpp

The new 2nm M6 brings per-core GPU Neural Accelerators, a dual 16-core Neural Engine, and 153 GB/s (16GB) or 170 GB/s (24/32GB) of memory bandwidth. For local LLMs the decisive spec is the memory tier: 16GB is an 8B-class machine, 24GB is a 14B machine, and 32GB is the only tier that comfortably runs Qwen3-30B-A3B. The Neural Engine is not used by llama.cpp, Ollama, or MLX — buy for memory, not for NPU TOPS.

[SPEC-DERIVED TAKEAWAY / TL;DR][Evidence level: spec-derived estimate, not lab-measured] "Apple M6 MacBook Pro (16GB / 24GB / 32GB) for Local LLMs: Which Memory Tier, Which Models, and Why the Dual Neural Engine Does Not Speed Up llama.cpp" (spec basis: Spec basis (not lab-measured): 14-inch MacBook Pro with base Apple M6 (TSMC N2 · 12-core CPU: 2 super + 4 performance + 6 efficiency · 12-core GPU with per-core Neural Accelerators · dual 16-core Neural Engine · 16GB @ 153 GB/s, 24GB/32GB @ 170 GB/s, as reported at launch); suggested stack: macOS 26.x (Metal 4), llama.cpp master (2026-11, Metal backend) / Ollama (latest stable), MLX + mlx-lm (latest, uses GPU Neural Accelerators via Metal 4 tensor ops), Models: Qwen3-8B / Qwen3-14B / Gemma 3 27B / Qwen3-30B-A3B / Qwen3-32B (GGUF Q4_K_M or MLX 4-bit); specs checked 2026-11-05): The new 2nm M6 brings per-core GPU Neural Accelerators, a dual 16-core Neural Engine, and 153 GB/s (16GB) or 170 GB/s (24/32GB) of memory bandwidth. For local LLMs the decisive spec is the memory tier: 16GB is an 8B-class machine, 24GB is a 14B machine, and 32GB is the only tier that comfortably runs Qwen3-30B-A3B. The Neural Engine is not used by llama.cpp, Ollama, or MLX — buy for memory, not for NPU TOPS. Offline capability: "Fully Offline After Model Download" (llama.cpp / Ollama / MLX inference runs entirely on-device. Apple Intelligence features that hand off to Private Cloud Compute are not part of this guide.).
REPRODUCIBILITY MANIFEST // SPEC ESTIMATE & PROTOCOL
Spec estimate · not lab-measured · specs checked 2026-11-05
Spec Basis Hardware (Not Lab-Measured)

Spec basis (not lab-measured): 14-inch MacBook Pro with base Apple M6 (TSMC N2 · 12-core CPU: 2 super + 4 performance + 6 efficiency · 12-core GPU with per-core Neural Accelerators · dual 16-core Neural Engine · 16GB @ 153 GB/s, 24GB/32GB @ 170 GB/s, as reported at launch)

Pinned Stack & Model Versions
macOS 26.x (Metal 4)llama.cpp master (2026-11, Metal backend) / Ollama (latest stable)MLX + mlx-lm (latest, uses GPU Neural Accelerators via Metal 4 tensor ops)Models: Qwen3-8B / Qwen3-14B / Gemma 3 27B / Qwen3-30B-A3B / Qwen3-32B (GGUF Q4_K_M or MLX 4-bit)
Offline & Network Boundary
Fully Offline After Model Download

llama.cpp / Ollama / MLX inference runs entirely on-device. Apple Intelligence features that hand off to Private Cloud Compute are not part of this guide.

Known Limits & Failure Modes
  • Evidence level: SPEC-DERIVED ESTIMATE. Tok/s figures are computed from published bandwidth (× 0.68 efficiency), not measured on an M6 in our lab. Run the attached script and replace them with your numbers.
  • macOS caps GPU-wired memory at roughly two-thirds to three-quarters of RAM by default. Raising `iogpu.wired_limit_mb` helps on 32GB but leaves less headroom for the OS, browser, and IDE; it resets on reboot.
  • The dual 16-core Neural Engine is only reachable via Core ML / Apple Foundation Models. llama.cpp, Ollama and MLX run on the GPU; their speed is governed by memory bandwidth (decode) and GPU Neural Accelerators (prefill, MLX/Metal 4 path).
Hit an edge-case failure?Open Troubleshooter →

1. NPU TOPS vs GPU Neural Accelerators vs Memory Bandwidth: What Each One Actually Speeds Up

Apple's M6 marketing highlights three AI features, and they matter very differently for local LLMs. **Memory bandwidth (153 / 170 GB/s)** sets the ceiling for token generation — every new token re-reads the model weights. **GPU Neural Accelerators** (matrix units in each GPU core, first introduced with M5) mainly speed up prompt processing (prefill) when the runtime uses Metal 4 tensor ops — MLX does, llama.cpp's Metal backend is catching up. The **dual 16-core Neural Engine** is a separate NPU that llama.cpp, Ollama and MLX do not use at all; it powers Apple Intelligence and Core ML apps. Practical takeaway: on the base M6 you are buying a **memory tier**, and the extra +11% bandwidth of the 24/32GB configs (170 vs 153 GB/s) is a small bonus on top.
Table 1: Which M6 feature affects which local-LLM metric
M6 featureUsed by llama.cpp / Ollama?Used by MLX?Affects
Unified memory capacity (16/24/32GB)YesYesWhich models fit; max context length
Memory bandwidth (153 / 170 GB/s)YesYesDecode tok/s (generation speed)
GPU Neural Accelerators (per core)Partially (Metal backend, version-dependent)Yes (Metal 4 tensor ops)Prefill / time-to-first-token
Dual 16-core Neural EngineNoNoApple Intelligence, Core ML apps only

2. Memory-Tier Sizing: What Fits, and Estimated Decode Speed

Usable GPU memory is what macOS lets Metal wire, minus whatever your browser and IDE are holding. Rough practical budgets: **16GB → ~10.5GB**, **24GB → ~17GB**, **32GB → ~22GB by default, ~26GB with a raised wired limit**. The table estimates decode speed as bandwidth × 0.68 ÷ weights read per token, with Q8_0 KV cache at 8K context. Treat "tight" rows as "works only with apps closed".
Table 2: ESTIMATED fit and decode tok/s on base M6 (GGUF Q4_K_M, 8K context, Q8_0 KV). Not measured.
ModelWeights (Q4_K_M)M6 16GB (153 GB/s)M6 24GB (170 GB/s)M6 32GB (170 GB/s)
Qwen3-8B~5.0 GBfits · ~21 tok/sfits · ~23 tok/sfits · ~23 tok/s
Qwen3-14B~9.0 GBtight (apps closed) · ~11 tok/sfits · ~13 tok/sfits · ~13 tok/s
Gemma 3 27B~16.5 GBdoes not fittight / swap risk · ~7 tok/sfits · ~7 tok/s
Qwen3-30B-A3B (MoE, ~3B active)~18.6 GBdoes not fitdoes not fit (spills to swap)fits · ~55 tok/s
Qwen3-32B (dense)~19.8 GBdoes not fitdoes not fittight (raise wired limit) · ~6 tok/s
[TIP]If you are choosing between the 24GB and 32GB M6 for local AI, the 32GB tier is the one that unlocks Qwen3-30B-A3B — a MoE model that is both smarter than 14B dense models and roughly 4× faster at decode on this bandwidth. That single model is usually worth the upgrade.

3. Reproduce on Your Own M6: Wired Limit, Fixed Benchmark, Swap Check

Three steps turn the estimates above into your own data. First, read the current wired limit and (on 32GB only) raise it temporarily. Second, run a fixed `llama-bench` so results are comparable with other machines in our guides. Third, confirm no swap was used during the run — if `Swapins` grows, your result is invalid for that memory tier.
M6 local-LLM reproduction steps (macOS Terminal)
# 1) Inspect / raise the GPU wired-memory limit (resets on reboot)
sysctl iogpu.wired_limit_mb                 # 0 = macOS default (~2/3–3/4 of RAM)
sudo sysctl iogpu.wired_limit_mb=26624      # 32GB M6 only: allow ~26GB for Metal

# 2) Fixed benchmark: prompt 2048 / generate 128, 3 reps, flash attention, Q8_0 KV
vm_stat | grep -E "Swapins|Swapouts"        # record BEFORE
./llama-bench -m Qwen3-30B-A3B-Q4_K_M.gguf -ngl 99 -fa 1 \
  -ctk q8_0 -ctv q8_0 -p 2048 -n 128 -r 3 -o md
vm_stat | grep -E "Swapins|Swapouts"        # record AFTER — must not grow

# 3) Optional: compare MLX on the same model (uses GPU Neural Accelerators for prefill)
pip install -U mlx-lm
mlx_lm.generate --model mlx-community/Qwen3-30B-A3B-4bit \
  --prompt "Summarize the trade-offs of unified memory for local LLMs." --max-tokens 256
FIELD Q&A // 常见实测疑问与边界解答

Frequently Asked Questions & Edge Cases

Q: Should I wait for M6 Pro / M6 Max instead of buying the base M6 for local AI?

If your target is 30B-class MoE or 14B dense models, a 32GB base M6 is a reasonable portable machine. If you want 70B dense models or 100B+ MoE, no base-chip memory tier is large enough — you need a Max-class chip (wider bus, 64–128GB) or a desktop such as Mac Studio. See our M5 Max and M3 Ultra guides for those tiers.

Q: Is the M6 much faster than the M5 for local LLMs?

For decode, expect at most around the bandwidth difference (~10% on the 24/32GB configs), since token generation is bandwidth-bound. Prefill gains depend on how well your runtime uses the GPU Neural Accelerators; MLX benefits most. If you already own a 32GB M5 machine, upgrading for LLM speed alone is hard to justify.

REPRODUCIBLE ARTIFACT // 配套可参数化附件

Apple M6 MacBook Pro Memory-Tier Benchmark (wired limit + swap guard)

Records chip and memory tier, optionally raises iogpu.wired_limit_mb, runs a fixed llama-bench with Q8_0 KV cache, and flags the result as invalid if macOS swapped during the run.

bench-m6-memory-tier.sh ↗
Edit variables above to update the configuration live
#!/usr/bin/env bash
# Tinker AI — Apple M6 MacBook Pro Memory-Tier Benchmark (Guide #38)
set -euo pipefail

MODEL="./models/Qwen3-14B-Q4_K_M.gguf"
WIRED="0"
PROMPT_TOKENS="2048"

echo "=== [1/4] Chip & memory tier ==="
system_profiler SPHardwareDataType | grep -E "Chip|Memory"

echo "=== [2/4] GPU wired-memory limit ==="
if [ "$WIRED" != "0" ]; then
  sudo sysctl iogpu.wired_limit_mb="$WIRED"
fi
sysctl iogpu.wired_limit_mb

swapins() { vm_stat | awk '/Swapins/ {gsub("\\.","",$2); print $2}'; }
BEFORE=$(swapins)

echo "=== [3/4] llama-bench pp$PROMPT_TOKENS / tg128 x3, Q8_0 KV ==="
llama-bench -m "$MODEL" -ngl 99 -fa 1 -ctk q8_0 -ctv q8_0 -p "$PROMPT_TOKENS" -n 128 -r 3 -o md

AFTER=$(swapins)
echo "=== [4/4] Swap guard ==="
if [ "$AFTER" -gt "$BEFORE" ]; then
  echo "[INVALID] macOS swapped $((AFTER - BEFORE)) pages during the run — this model is too large for this memory tier."
else
  echo "[OK] No swap during benchmark — result is valid for this memory tier."
fi

More Reproducible Engineering Guides

View All 42 Guides →