The precision ladder — and the memory ceiling each step lifts
On a Mac Studio with 192–512 GB unified memory, the question 'will my model fit?' is almost always answered by precision, not by FP32 raw weight count. The ladder:
| Precision | tok/s (typical 7B) | Memory footprint | Bottleneck | When to pick |
|---|---|---|---|---|
| FP32 | 4–6 | 26 GB (7B) | Memory | Debugging, parity checks against numpy reference |
| BF16 / FP16 | 8–12 | 13 GB | Compute | Fine-tune, serve medium models |
| Q8_0 (Int8) | 12–18 | 7 GB | L2 hits + DRAM BW | Default deployment |
| Q4_K (Int4) | 17–25 | 4 GB | Compute (dequant) | Large models, single-node serving |
Three things to internalize:
- Each step roughly halves memory. A 70B FP32 model needs 280 GB; FP16 brings it to 140 GB; Int4 brings it to 40 GB — Mac Studio 192 GB territory.
- Speed gains aren't free. FP16 → Int8 is faster mostly because there's less data to fetch from DRAM. Int8 → Int4 is faster and compute-bounded again because dequant is FLOPs.
- Quality degrades non-linearly. Going FP32 → BF16 is essentially free for inference. BF16 → Int8 is small. Int8 → Int4 starts to hurt some models more than others; benchmark your specific workload.
The memory hierarchy that backs each precision
Quantized weights live in unified DRAM. Hot tiles get pulled into L2 / threadgroup memory during a kernel — and that's the cache that decides whether your kernel hits its precision's compute ceiling or stalls on misses.