What runs on what
A ladder of hardware for running open-weight models locally, from a 12 GB gaming card to a 512 GB workstation. Memory capacity decides which models fit; memory bandwidth decides how fast one conversation runs. Each rung lists both, what fits, public decode measurements with their sources, and where this notebook measured something itself.
Part of the Local Host Lab notebook. To try a specific model and machine, use the calculator; for prices, the cost-performance table; for every source and date, the sources page.
Two labels are used throughout. measured here marks a number measured in this notebook, linked to the entry it came from. public marks a number someone else measured and published, cited with its source and the date of the result.
Two numbers decide most of it
To produce one token, a model reads every weight that token uses and the attention cache built so far. For one conversation at a time this reading is the bottleneck, so single-stream decode speed is close to memory bandwidth divided by the bytes read per token. Measured runs in this notebook reached 75 to 82% of that ceiling for dense models (see the calibration table). Capacity is a hard limit instead: a model either fits in fast memory or spills to something an order of magnitude slower.
Mixture-of-experts models change the trade. They need memory for all their parameters but read only the active ones per token, so a 117B model with 5.1B active parameters can decode faster than a dense 27B. That is why large-memory, modest-bandwidth machines (a DGX Spark, a Ryzen AI Max, a Mac) are useful at all.
The ladder
Each rung lists the memory and bandwidth from the vendor's specification, two derived columns, and measured decode speeds. The derived columns use the calculator's arithmetic: the largest dense model whose 4.9-bit weights (Q4_K_M) fit after reserving 5% of memory (more on unified-memory machines) and 2 GiB for cache and buffers, and the bandwidth ceiling for a 27B dense model at Q4_K_M (a 16.5 GB file). Both are estimates; the measured columns are not.
| Hardware | MemoryGiB | BandwidthGB/s | Dense at Q4fits, est. | 27B Q4 ceilingtok/s, est. | Measured decode |
|---|---|---|---|---|---|
| 12 GB | |||||
| RTX 3060 12GB | 12 | 360 | about 16B | does not fit | publicLlama 2 7B Q4_0: 75.6 tok/s · llama.cpp CUDA scoreboard |
| 16 GB | |||||
| RTX 5060 Ti 16GB | 16 | 448 | about 23B | does not fit | publicgpt-oss-20b MXFP4: 111.5 tok/s · llama.cpp gpt-oss guide |
| RTX 5080 16GB | 16 | 960 | about 23B | does not fit | measured hereQwen3.6-27B IQ4_XS, 48K context, 4-bit KV: about 49 tok/s · entry 13 publicgpt-oss-20b MXFP4: 204.9 tok/s · llama.cpp gpt-oss guide |
| 20 to 24 GB | |||||
| RTX 3080, modified to 20 GBbandwidth assumed equal to the stock card | 20 | 760 | about 30B | 46 | measured hereQwen3.6-27B IQ4_XS, 64K: 39 tok/s; with MTP at 128K: 72.3 tok/s · entry 12 |
| RTX 3090 24GB | 24 | 936 | about 36B | 57 | publicgpt-oss-20b MXFP4: 162.0 tok/s · llama.cpp gpt-oss guide |
| RTX 4090 24GB | 24 | 1008 | about 36B | 61 | publicgpt-oss-20b MXFP4: 225.2 tok/s · llama.cpp gpt-oss guide |
| Radeon RX 7900 XTX 24GB | 24 | 960 | about 36B | 58 | publicLlama 2 7B Q4_0: 167.1 tok/s (ROCm), 182.6 (Vulkan) · llama.cpp ROCm and Vulkan scoreboards |
| Intel Arc Pro B60 24GB | 24 | 456 | about 36B | 28 | |
| 32 GB | |||||
| RTX 5090 32GB | 32 | 1792 | about 50B | 109 | publicgpt-oss-20b MXFP4: 282.5 tok/s · llama.cpp gpt-oss guide |
| Tesla V100 32GB PCIe (2017)used datacenter card; needs server airflow | 32 | 900 | about 50B | 55 | measured heretwo cards, layer split, Qwen3.8-27B Q8_0: 23.6 tok/s · V100 note 02 publicLlama 2 7B Q4_0: 129.1 tok/s · llama.cpp CUDA scoreboard |
| Instinct MI50 32GB (2018)used datacenter card; needs server airflow | 32 | 1000 | about 50B | 61 | publicLlama 2 7B Q4_0: 99.0 tok/s (ROCm), 108.5 (Vulkan) · llama.cpp ROCm scoreboard |
| Radeon AI PRO R9700 32GB | 32 | 640 | about 50B | 39 | publicLlama 2 7B Q4_0: 93.8 tok/s · llama.cpp ROCm scoreboard |
| 64 GB, two cards | |||||
| 2 × Tesla V100 32GB PCIe, tensor parallelno NVLink | 2 × 32 | 2 × 900 | about 103B | 109 | measured hereQwen3.8-27B Q4_1 with MTP: 66 tok/s; Q8_0 with MTP: about 53 · entry 03 measured hereQwen3.8-Flash-Next Q8_0 (188 GB), second card as expert cache: 55 to 58 tok/s · V100 note 05 |
| 80 to 96 GB | |||||
| A100 80GB PCIe (2020)used datacenter card | 80 | 1935 | about 130B | 118 | publicLlama 2 7B Q4_0: 190.9 tok/s (A100 80GB, form factor not stated) · llama.cpp CUDA scoreboard |
| RTX PRO 6000 Blackwell 96GB | 96 | 1792 | about 156B | 109 | publicgpt-oss-120b MXFP4: 196.3 tok/s · llama.cpp gpt-oss guide |
| 128 GB unified | |||||
| NVIDIA DGX Spark 128GBabout 119 GiB usable | 128 | 273 | about 205B | 17 | measured hereQwen3.8-27B Q8_0: 7.87 tok/s; DeepSeek-V4-Flash IQ3_XXS: 19.2; Flash-Next with MTP: 43.2 · entries 08 to 10 publicgpt-oss-120b MXFP4: 58.7 tok/s (tg32) · llama.cpp DGX Spark benchmarks |
| AMD Ryzen AI Max+ 395, 128GB (Framework Desktop)bandwidth derived from a 256-bit LPDDR5X-8000 bus | 128 | 256 | about 205B | 16 | publicgpt-oss-120b MXFP4: 56.6 tok/s; Qwen3.6-27B Q8_K_XL: 6.5 · kyuz0 Strix Halo results, May 2026 |
| 64 to 128 GB unified | |||||
| Mac Studio M4 Max 64GB (2025)16-core CPU, 40-core GPU | 64 | 546 | about 81B | 33 | measured hereMiniMax-H3 33B video, bf16: 19 min per 5 s clip (no language model measured) · entry 14 publicLlama 2 7B Q4_0: 83.1 tok/s · llama.cpp Apple Silicon scoreboard |
| Mac Studio M5 Max 128GB (2026)18-core CPU, 40-core GPU | 128 | 614 | about 165B | 37 | publicLlama 2 7B Q4_0: 119.9 tok/s (August 2026 build) · llama.cpp Apple Silicon scoreboard |
| Mac mini M5 Pro 64GB (2026)18-core CPU, 20-core GPU | 64 | 307 | about 81B | 19 | publicLlama 2 7B Q4_0: 66.3 tok/s (20-core GPU, August 2026 build) · llama.cpp Apple Silicon scoreboard |
| 256 to 512 GB unified | |||||
| Mac Studio M3 Ultra 512GB (2025)previous generation | 512 | 819 | about 670B | 50 | publicgpt-oss-20b MXFP4: 115.5 tok/s · llama.cpp gpt-oss guide |
| Mac Studio M5 Ultra 256GB (2026)30-core CPU, 64-core GPU; 512GB only with the 80-core GPU | 256 | 1200 | about 333B | 73 | publicLlama 2 7B Q4_0: 179.1 tok/s (80-core GPU) · llama.cpp Apple Silicon scoreboard |
| pooled across machines | |||||
| 8 × Tesla V100 32GB, four nodes joined over 25 GbEllama.cpp RPC, layer split | 8 × 32 | 8 × 900 | about 423B | 55 | measured here744B MoE at 1 bit (202 GB): 12 to 14 tok/s · V100 note 01 |
Multi-device rows show memory and bandwidth per device. Under layer split only one device reads at a time, so the ceiling uses one device's bandwidth; under tensor parallelism all devices read at once. On two V100s in this notebook, switching from layer split to tensor parallel roughly doubled decode (entry 03). Apple and AMD unified-memory rows show total memory; the GPU can address most but not all of it, so their "fits" column assumes 93% (DGX Spark, Ryzen AI Max) or 75% (Macs, the macOS default) is usable. A 16 GB card misses the 27B at Q4_K_M by a small margin; with the slightly smaller IQ4_XS file and a 4-bit KV cache it fits, as entry 13 shows.
One model, many machines
The llama.cpp project keeps three community scoreboards (CUDA, ROCm, and Apple Metal) that run the same small model with the same command: Llama 2 7B at Q4_0, a 3.56 GiB file, generating 128 tokens from an empty context. It is an old model and a small one, so the absolute numbers are higher than anything useful today, but it is the only probe run the same way on all of this hardware. The ratio column shows what fraction of the bandwidth ceiling each result reached.
A modern MoE on large-memory machines
gpt-oss-120b in its released MXFP4 format is a 59.02 GiB file with 5.1B active parameters per token. It fits on one 96 GB workstation card and on every 128 GB unified-memory machine, which makes it a useful common probe for that class.
| Hardware | BandwidthGB/s | Decodetok/s | Test | Source |
|---|---|---|---|---|
| RTX PRO 6000 Blackwell 96GB | 1,792 | 196.31 | tg128 | llama.cpp gpt-oss guide (discussion 15396), August 2025 |
| Mac Studio M2 Ultra 192GB, 76-core GPU | 800 | 79.68 | tg128 | llama.cpp gpt-oss guide (discussion 15396), August 2025 |
| NVIDIA DGX Spark 128GB | 273 | 58.72 | tg32, empty context | llama.cpp benches/dgx-spark, 2026-02-05 |
| Ryzen AI Max+ 395 128GB | 256 | 56.61 | tg128, Vulkan (RADV) | kyuz0 Strix Halo toolbox results, 2026-05-16 |
On the 128 GB machines decode falls with context: on the DGX Spark from 58.7 tok/s at an empty context to 42.8 at 32K tokens, and on the Ryzen AI Max+ 395 from 56.6 to 35.0 at 64K, in the same sources. In this notebook the DGX Spark ran larger MoE models than this one: DeepSeek-V4-Flash (284B, 13B active) at 19.2 tok/s and Qwen3.8-Flash-Next (180B, 6B active) at 43.2 tok/s with speculative decoding (entries 08 and 10).
Where this notebook sits
The machines measured here are a narrow slice of the ladder: datacenter cards from 2017, one unified-memory desktop, two gaming cards and a laptop-class chip. The table repeats their headline decode numbers next to the bandwidth ceiling, so they can be read against the public figures above.
| Hardware | Model and setup | Decodetok/s | Entry |
|---|---|---|---|
| RTX 3080, modified to 20 GB | Qwen3.6-27B IQ4_XS + MTP, 128K context | 72.3 | entry 12 |
| 2 × V100 PCIe | Qwen3.8-27B Q4_1, tensor parallel, MTP | 66 | entry 03 |
| 2 × V100 PCIe | Qwen3.8-Flash-Next Q8_0 (188 GB), second card as expert cache | 55 to 58 | V100 note 05 |
| RTX 5080 16GB | Qwen3.6-27B IQ4_XS, no MTP | about 49 | entry 13 |
| DGX Spark | Qwen3.8-Flash-Next 180B UD-Q4_K_XL + MTP | 43.2 | entry 10 |
| RTX 3080, modified to 20 GB | Qwen3.6-27B IQ4_XS, no MTP | 39 | entry 12 |
| 2 × V100 PCIe, layer split | Qwen3.8-27B Q8_0, no MTP | 23.6 | V100 note 02 |
| 5 × V100, three nodes | DeepSeek-V4-Flash IQ3_XXS, llama.cpp RPC | 21.2 | entry 02 |
| DGX Spark | DeepSeek-V4-Flash UD-IQ3_XXS | 19.2 | entry 08 |
| 8 × V100, four nodes | 744B MoE at 1 bit, llama.cpp RPC | 12 to 14 | V100 note 01 |
| DGX Spark | Qwen3.8-27B Q8_0, no MTP | 7.87 | entry 09 |
Reading these numbers
- Builds differ between rows. Scoreboard entries are single runs submitted by different people with whatever llama.cpp commit they had. The Apple M1 to M4 rows were all run at a November 2023 build and the M5 rows at an August 2026 build; the same M2 Ultra rose from 94.3 to 125.2 tok/s on that model between those two builds.
- Backends differ by more than hardware generations. On the same Radeon RX 7900 XTX the Vulkan backend beat ROCm. On a DGX Spark, gpt-oss-20b decoded at 49.7 tok/s under Ollama at launch and 83.4 under llama.cpp four months later.
- Empty-context numbers are the best case. Every public number on this page is at or near an empty context. In this notebook a dense 27B fell to 38% of its short-context speed at 224K tokens.
- Speculative decoding is left out of public rows. The scoreboards measure plain decoding. With a draft head (MTP), measured speed here rose 1.5 to 2.3 times on every machine, so a measured-here number with MTP is not comparable to a public number without it; those rows say so.