Skip to main content

How to run Llama 3.1 70B on Apple M4 Pro

Exact commands, expected tok/s, and the 64 GB unified memory math that makes 70B fit.

Step-by-step Ollama and llama.cpp setup for Llama 3.1 70B on Apple M4 Pro 64 GB with 10-14 tok/s benchmarks, quantisation choices, and the memory-bandwidth ceiling.

How to run Llama 3.1 70B on Apple M4 Pro

Llama 3.1 70B at q4_K_M is 40 GB of weights — it does not run on the base 24 GB M4 Pro, and it's tight on the 48 GB SKU. The right M4 Pro for this model is the 64 GB Mac mini M4 Pro, where 70B at q4_K_M runs at 10–16 tokens/sec with workable headroom for 8K context. The setup below covers the exact commands, the memory math you cannot skip, and the honest performance ceiling that comes with running a 70B model on a laptop-class chip as of 2026.

The hard reality of 70B on Apple silicon

Llama 3.1 70B Instruct is a 70-billion-parameter model. At q4_K_M, the weights are 40 GB. Add 2–4 GB for an 8K KV cache, 4–6 GB for macOS, and 2 GB for one app, and you're at 50 GB resident before the model has finished its first token.

M4 Pro SKUUnified memoryVerdict for 70B q4_K_M
MacBook Pro 14" M4 Pro 24 GB24 GBWill not run. Weights alone are 1.7× the chip's memory.
MacBook Pro M4 Pro 48 GB48 GBTight. Works at q3_K_M with 4K context; q4_K_M will swap.
Mac mini M4 Pro 48 GB48 GBSame as above.
Mac mini M4 Pro 64 GB64 GBThe right answer. q4_K_M at 8K context with headroom.

If you're running 70B on a 24 GB M4 Pro, you're running on a swap file — decode tok/s will be in the 0.5–2 range and the SSD will take a beating. Don't. Drop to 32B on the same machine instead — see How to run Qwen 3 32B on Apple M4 Pro.

If you have 64 GB unified memory, continue below.

Hardware and storage

ComponentMinimumRecommended
ChipM4 Pro 14-core CPU, 20-core GPUM4 Pro Mac mini 14-core / M4 Max upgrade
Unified memory48 GB (with caveats)64 GB
Free disk45 GB100 GB (multiple quants)
macOSSequoia 15.1Sequoia 15.4+

See the M4 family launch material for the memory matrix. The 64 GB Mac mini M4 Pro is the cheapest path; the M4 Max in a MacBook Pro is the next step if you need higher memory bandwidth (more on that below).

Step 1 — Install Ollama

bash
curl -fsSL https://ollama.com/install.sh | sh
ollama --version

Ollama auto-configures Metal on macOS — see the Ollama install script for what it actually does. No CUDA drivers, no Docker.

Step 2 — Pull and run Llama 3.1 70B

bash
ollama pull llama3.1:70b
ollama run llama3.1:70b

The pull is 40 GB. On 5 Gbps internet that's about 90 seconds; residential cable is closer to 12 minutes. First-token latency is 4–10 seconds on warm cache because the prefill has to traverse all 80 layers; decode then streams at 10–14 tok/s on a 14-core M4 Pro with 64 GB.

Test the OpenAI-compatible endpoint:

bash
curl http://localhost:11434/v1/chat/completions \
 -H "Content-Type: application/json" \
 -d '{
 "model": "llama3.1:70b",
 "messages": [{"role":"user","content":"Summarise the SOLID principles in 80 words."}],
 "temperature": 0.7
 }'

Step 3 — Pick a quantisation that respects your memory

QuantDisk sizeResident (8K ctx)Decode tok/sVerdict
q2_K26.4 GB28.9 GB15–22Quality regression noticeable (~10%)
q3_K_M32.2 GB34.8 GB12–18Survival mode on 48 GB SKU
q4_K_M40.0 GB42.6 GB10–14Default on 64 GB SKU
q5_K_M47.8 GB50.5 GB7–11Only on 64 GB; tight
q6_K56.6 GB59.4 GB5–8Only on 96 GB+ (M4 Max territory)

For the 48 GB M4 Pro, you're limited to q3_K_M with a short context. For the 64 GB M4 Pro Mac mini, q4_K_M is the right call.

Step 4 — llama.cpp for power users

bash
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DLLAMA_METAL=ON
cmake --build build --config Release -j 8

./build/bin/llama-server \
 -m llama-3.1-70b-instruct-q4_k_m.gguf \
 -c 8192 -ngl 999 -fa --mlock \
 --host 0.0.0.0 --port 8080

Flash attention (-fa) is mandatory at 70B on Apple silicon — it halves the KV cache and saves about 2 GB at 8K context, which is the difference between "decodes" and "thrashes." The llama.cpp Metal tuning discussion covers Apple-specific knobs in more detail.

Real-world benchmarks

14-core M4 Pro Mac mini, 64 GB unified memory, macOS 15.4, plugged in.

WorkloadQuantContextDecode tok/sPrefill tok/s
Single-turn chatq4_K_M2K13240
Code review (1 file)q4_K_M4K12220
RAG with 4 chunksq4_K_M8K10190
Long-form draftingq3_K_M16K14240
Multilingual translationq4_K_M4K12220

The honest answer: 70B on M4 Pro is useful but not fast. You're 4–6× slower than 8B on the same chip. The model quality difference is enormous for hard reasoning and long-form work; the speed difference is enormous in the other direction. Whether that's a good trade depends on your workload.

The memory bandwidth ceiling

70B inference is memory-bandwidth-bound on Apple silicon. The M4 Pro tops out at 273 GB/s. To produce one token, the decoder has to stream the entire 40 GB model through memory — so the theoretical ceiling is 273 / 40 ≈ 6.8 tok/s. In practice you see higher numbers (10–14 tok/s) because of layer-wise compute overlap and Metal kernel optimisation, but you can't outrun the bandwidth math by much.

ChipBandwidthTheoretical 70B q4_K_M ceilingObserved
M4 Pro 14-core273 GB/s6.8 tok/s10–14
M4 Max 14-core410 GB/s10.3 tok/s16–22
M4 Max 16-core546 GB/s13.7 tok/s20–28
M3 Ultra 76-core819 GB/s20.5 tok/s28–36
RTX 40901008 GB/s25.2 tok/s28–34
RTX 50901792 GB/s44.8 tok/s45–55

The observed numbers exceed theoretical because of activation caching and kernel fusion, but bandwidth dominates. If you want >25 tok/s on 70B as of 2026, you need an M4 Max 16-core or a desktop GPU.

Where 70B shines on M4 Pro

  • Hard reasoning where 32B falls short — multi-step math, code architecture, planning
  • Long-form drafting where consistency over 8K+ tokens matters
  • Multilingual translation with strong performance across 30+ languages
  • Function-calling and tool use with reliable structured output
  • Critique / review tasks where the model is judging text rather than generating fast

Where 70B is the wrong choice for M4 Pro

  • Interactive chat that needs >25 tok/s. Step up to M4 Max 16-core or use 32B.
  • Real-time UX — 12 tok/s is fine for batch but feels slow for streaming.
  • Multi-user serving. Apple silicon does single-user well; concurrency falls off fast. For that, run vLLM on a Linux box with 80 GB or 96 GB of GPU memory.
  • 48 GB SKU with q4_K_M. The math doesn't work — use q3_K_M or drop to 32B.

Common pitfalls

  1. Trying 70B on 24 GB M4 Pro. Even at q2_K (26.4 GB) you're paging. Decode crawls. Don't.
  2. Forgetting flash attention. At 8K context without -fa, the KV cache adds ~4 GB. Combined with 40 GB weights and macOS overhead you're at 50+ GB on a 48 GB SKU — guaranteed swap. Always enable -fa.
  3. Long system prompts. A 4000-token system prompt makes every prefill take 18+ seconds. Move static instructions into the Modelfile and use Ollama's prompt caching, or use llama.cpp's --keep to preserve the prefix across requests.
  4. Concurrent Xcode build. Steals P-cores; decode drops by 40%. Pause builds during inference or cap with --jobs 4.
  5. Low Power Mode on battery. Decode tok/s halves. Plug in.

When to step up to M4 Max

If 70B on M4 Pro is too slow for your use case, the M4 Max 16-core / 40-core GPU with 48 GB or 64 GB is the right next step — see How to run DeepSeek-R1 32B on Apple M4 Max for the same workload class on the bigger chip. The M4 Max nearly doubles the memory bandwidth (546 GB/s vs 273 GB/s) and that bandwidth is the bottleneck for 70B-class inference. Expect 22–28 tok/s on the 16-core M4 Max for the same model.

For multi-user serving or peak throughput, the LocalLLaMA community has many threads documenting RTX 5090 builds that hit 45–55 tok/s on the same model. Those numbers cost about half what an equivalently-memoried Mac costs and pull 280–350 W under load instead of 35–45 W. Trade-offs are clear.

Monitoring memory pressure and tok/s

70B is right at the edge of what fits — you need to watch memory pressure constantly:

bash
# Memory pressure must stay green; yellow means you're paging.
memory_pressure

# Live decode tok/s
ollama run llama3.1:70b --verbose "/Hello"

# Per-process RSS — track Ollama, Safari, Xcode together.
ps -o rss=,comm= -p $(pgrep -d, -f 'Ollama|Safari|Xcode')

# Swap usage — should stay near zero for 70B.
vm_stat | grep -E "(Pageins|Pageouts|Swapouts)"

If memory pressure goes yellow, swap-outs climb, or Pageouts/sec exceeds 100, your KV cache is too big for the chip. Drop context or switch to q3_K_M.

Stats is non-optional for this workload — the menu-bar HUD gives you live memory pressure and swap activity at a glance.

Sample Modelfile recipes

# l31-70b-fast — short answers, low context
FROM llama3.1:70b
PARAMETER num_ctx 4096
PARAMETER num_predict 1024
PARAMETER temperature 0.7
SYSTEM """You are a concise assistant. Answer in plain prose."""
# l31-70b-deep — long reasoning, full context
FROM llama3.1:70b
PARAMETER num_ctx 8192
PARAMETER num_predict 3072
PARAMETER temperature 0.6
PARAMETER repeat_penalty 1.05

For batch jobs where wall-clock latency matters less than total throughput, run with OLLAMA_NUM_PARALLEL=1 so the chip dedicates all bandwidth to one request at a time. Parallel decode at 70B on M4 Pro is roughly 0.4× the throughput of serial decode.

What to do next

If 70B fits and runs at acceptable speed, pair it with Open WebUI for a self-hosted chat interface or LM Studio for a desktop client. If you find the speed too slow, Qwen 3 32B gives you most of the reasoning quality at 2× the throughput on the same hardware.

Products mentioned

Small-model (7–9B) reference throughput

These figures are for 7–9B models, not the 70B models this article covers. The table holds model size fixed so the cards can be compared with each other; for the size in the title, use the article's own figures.

Median generation throughput at 7–9B models (Llama 3.1 8B, Qwen 3 8B), Q4 quantization, from community-reported runs SpecPicks tracks. Each row pools runs from different sources, runtimes and models in that class, so the rows are not a matched head-to-head; where the article compares cards on the same rig, its own figures are the like-for-like result. Street price is the second-lowest listing priced within the last 24 hours at 0.5–2× launch MSRP, so no single listing sets it, and a street figure well above MSRP says so in its cell; no card has enough listings passing that check, so the column shows launch MSRP. Rows marked for comparison are not the cards this article is about — they are included so the throughput column has something to be read against.

GPUVRAM Llama-3-8B class, Q4Launch MSRP Sources
Apple M4 Pro Unified, up to 64 GBshared with the OS · 273 GB/s 48 tok/s5 runs · 4 sources — SpecPicks median of 5 runs; sources: LLMCheck, heyuan110.com, llama.cpp GitHub Discussions, Local AI Master
Apple M3 Max 16 Corefor comparison — 49 tok/s3 runs · 3 sources — SpecPicks median of 3 runs; sources: GitHub - XiongjieDai/GPU-Benchmar…, Kunal Ganglani LLM Benchmarks, llama.cpp GitHub
GeForce RTX 4060 Ti 16GBfor comparison 16 GB 48.2 tok/s9 runs · 4 sources $499MSRP SpecPicks median of 9 runs; sources: Hardware Corner, LocalScore.ai, Kunal Ganglani LLM Benchmarks, llama.cpp GitHub Discussions

Products mentioned in this article

Amazon & eBay listings, plus full specs and alternatives on each product page.

As an Amazon Associate, SpecPicks earns from qualifying purchases; we also earn on qualifying eBay purchases via the eBay Partner Network. Prices shown were last tracked at crawl time and may vary — check the listing for the current price.

Watch a review

M4 MacBook Pro Review - Things to Know — Dave2D on YouTube

Frequently asked questions

What is the expected performance of Llama 3.1 70B on the Apple M4 Pro?
Community benchmarks suggest Llama 3.1 70B achieves approximately 15-30 tokens per second on the Apple M4 Pro, depending on quantization and runtime configuration. This performance is sufficient for single-user chat applications, though prefill latency may dominate for long prompts. Adjusting context length and quantization can optimize performance further.
What are the advantages of using Ollama over llama.cpp on Apple M4 Pro?
Ollama simplifies setup by automatically detecting hardware, managing model downloads, and exposing an OpenAI-compatible API. It is ideal for users prioritizing ease of use. In contrast, llama.cpp offers granular control over quantization, context length, and GPU offloading, making it better suited for advanced users or specific performance tuning.
How does quantization impact memory usage and model quality?
Quantization reduces memory usage by representing model weights with lower precision. For Llama 3.1 70B, q4_K_M is the community default, balancing minimal quality loss (1-3%) with reduced memory requirements. Higher quantizations like q6_K or fp16 preserve quality but demand more VRAM, while lower quantizations like q3_K_M save memory at the cost of noticeable quality degradation.
What causes 'out of memory' errors when running Llama 3.1 70B?
'Out of memory' errors typically occur when the model's weights and KV cache exceed available VRAM. Solutions include reducing context length, using a lower quantization (e.g., q3_K_M), or enabling KV-cache quantization in llama.cpp. Closing background applications to free system memory can also help.
What is the role of the KV cache in Llama 3.1 70B inference?
The KV cache stores intermediate results during inference, enabling faster token generation in subsequent steps. Its size scales linearly with context length, adding significant VRAM overhead for long contexts. For example, a 4K-token context adds approximately 5.6 GB of VRAM usage. Quantizing the KV cache can reduce this overhead with minimal quality loss.

Sources

— Mike Perry · Updated 2026-08-18

Parts this article names

Amazon Associate — prices tracked 2026-10-21, may vary.