Local model performance: what makes an LLM fast or slow
Local model performance depends on the model, its settings and your hardware. Check memory fit, the wait before a reply starts, and how quickly the reply finishes. Evaluate answer quality separately.
Understand the performance metrics
- Generation speed (tokens/s)
- How quickly output tokens are produced. Check whether the figure describes one request or totals across concurrent requests.
- Prompt processing (tokens/s)
- How quickly input tokens are processed. Long documents and repeated agent prompts can spend much of their time here. Cached input can change the result.
- Time to first token and completion time
- The wait for the first visible output and the wait for the whole answer. Loading, queueing and input processing can contribute; generation speed alone does not measure either.
- Memory use and answer quality
- Check weights, KV cache, runtime buffers and available memory. Test usefulness on your own tasks: report counts and speed are not accuracy scores.
Choose hardware for the workload
Start with the model size, quantization and context you need. For a discrete GPU, check both VRAM and any system RAM used for offloading. On a Mac, the OS and other applications share unified memory with the model.
For bandwidth-limited decode, a useful upper-bound intuition is memory bandwidth ÷ bytes moved per output token. Real inference also involves compute, attention, cache access and transfers. This is not a universal speed formula: prompt processing, batching, long context and speculative decoding can behave differently.
- Quantization: fewer bits can reduce weight memory, but speed depends on the runtime and kernels. Halving weight size does not guarantee twice the speed. Compare quant formats.
- Mixture of experts: active parameters affect per-token work, while total parameters still matter for storing the weights. Routing and offloading add costs.
- Context: use the context you actually need when checking fit. A model's advertised maximum is not a promise that your machine can run it at that length.
- Engine: check support for your GPU and quant format. Record the version, backend and settings when comparing results.
The calculator separates estimates from community measurements. Open its breakdown and the underlying setup before treating a speed as a prediction for your workload.
Model-specific VRAM requirements · Mac performance reports · Models people use for coding
Community reports by GPU and Mac
These are separate community setups, not controlled hardware comparisons. Rows are ordered by generation report count, then PP report count. Each median pools different model sizes, quants and engines, so it cannot tell you which GPU is faster for the same workload.
Generation and prompt-processing medians are calculated separately from positive measurements in plain, single-device reports. A device needs at least 3 generation reports or at least that many PP reports to appear; each median uses only reports that include its metric. A recorded single GPU does not establish that the model stayed entirely in VRAM or that only one request ran at a time.
| GPU or Mac | Memory | Gen median (t/s) | PP median (t/s) | Gen n | PP n |
|---|---|---|---|---|---|
| AMD Strix Halo 128GB | 128 GB unified | 40 | 729.3 | 167 | 154 |
| M5 Max 48GB | 48 GB unified | 106 | 2,899.7 | 55 | 55 |
| M4 Max 128GB | 128 GB unified | 57.4 | 856.2 | 41 | 32 |
| M4 Pro 64GB | 64 GB unified | 53.6 | 770.2 | 31 | 29 |
| M1 Max 64GB | 64 GB unified | 46.4 | 469.8 | 31 | 28 |
| NVIDIA RTX 5090 | 32 GB | 81.3 | 6,005 | 28 | 8 |
| NVIDIA RTX 3090 | 24 GB | 50 | 834.8 | 27 | 11 |
| M3 Ultra 512GB | 512 GB unified | 30.5 | 671.7 | 22 | 14 |
| M2 Max 64GB | 64 GB unified | 70.9 | 468.6 | 18 | 15 |
| AMD RX 7900 XTX | 24 GB | 48 | 813.9 | 15 | 12 |
| NVIDIA RTX Pro 6000 Blackwell | 96 GB | 101.9 | 5,567.5 | 15 | 10 |
| NVIDIA DGX Spark | 128 GB unified | 37.2 | 1,294.7 | 14 | 6 |
| NVIDIA RTX 4090 | 24 GB | 60.4 | 1,949.3 | 14 | 4 |
| M5 Max 128GB | 128 GB unified | 55 | 602.2 | 13 | 6 |
| NVIDIA RTX 5060 Ti 16GB | 16 GB | 41.6 | 1,168 | 11 | 5 |
| Intel Arc Pro B70 | 32 GB | 63.3 | 1,012.2 | 10 | 8 |
| M4 16GB | 16 GB unified | 29.6 | 313.2 | 10 | 6 |
| NVIDIA RTX 3060 12GB | 12 GB | 32 | - | 10 | 0 |
| M4 Max 64GB | 64 GB unified | 50.9 | 319.9 | 9 | 9 |
| AMD Radeon AI PRO R9700 32GB | 32 GB | 37.5 | 3,075 | 9 | 5 |
| M1 Ultra 128GB | 128 GB unified | 67.6 | 518 | 8 | 7 |
| NVIDIA RTX 5080 | 16 GB | 151 | 9,825.5 | 8 | 7 |
| M5 Ultra 256GB | 256 GB unified | 61.7 | 1,518.5 | 8 | 6 |
| M3 Ultra 256GB | 256 GB unified | 25.3 | 93.1 | 8 | 3 |
| AMD Gorgon Halo 192GB | 192 GB unified | 30.2 | 463 | 7 | 7 |
| Intel Arc B580 12GB | 12 GB | 31.8 | 1,187.5 | 6 | 4 |
| M2 Ultra 192GB | 192 GB unified | 26.9 | 330.9 | 6 | 4 |
| M4 24GB | 24 GB unified | 15.2 | 189.1 | 6 | 4 |
| NVIDIA V100 32GB | 32 GB | 30.7 | 940.5 | 6 | 4 |
| AMD MI50 32GB | 32 GB | 47.6 | 817 | 6 | 2 |
| M4 32GB | 32 GB unified | 19.7 | 223.8 | 5 | 5 |
| Intel Arc Pro B60 24GB | 24 GB | 18.7 | 245.5 | 4 | 3 |
| M6 32GB | 32 GB unified | 34.2 | 225.1 | 4 | 2 |
| AMD RX 9070 XT 16GB | 16 GB | 80.4 | 4,245 | 4 | 1 |
| NVIDIA RTX 4080 Super | 16 GB | 36.1 | - | 4 | 0 |
| AMD Radeon 780M | 0 GB unified | 21.1 | 248 | 3 | 4 |
| M2 24GB | 24 GB unified | 12.2 | 181.4 | 3 | 3 |
| M2 Pro 32GB | 32 GB unified | 33.6 | 200.7 | 3 | 3 |
| M3 Ultra 96GB | 96 GB unified | 73.4 | 1,770.1 | 3 | 3 |
| AMD RX 6700 XT | 12 GB | 34.6 | 752.5 | 3 | 2 |
| NVIDIA CMP 170HX 64GB (unlocked) | 64 GB | 50 | 2,187.5 | 3 | 2 |
| NVIDIA Tesla P40 24GB | 24 GB | 37.9 | 1,043 | 3 | 2 |
| AMD RX 9070 | 16 GB | 73 | 600 | 3 | 1 |
| M2 Max 32GB | 32 GB unified | 58.6 | 671.4 | 3 | 1 |
| NVIDIA RTX 5070 Ti | 16 GB | 127 | 5,951 | 3 | 1 |
| AMD RX 7800 XT 16GB | 16 GB | 30 | - | 3 | 0 |
| Intel Arc A770 16GB | 16 GB | 14.4 | - | 3 | 0 |
| NVIDIA RTX 5090 Laptop 24GB | 24 GB | 30 | - | 3 | 0 |
See individual measured examples with source links →
This table is generated from the current dataset on each request. Report-added dates describe collection, not necessarily when a benchmark was run. Link to this table; cite the access date and retain the workload caveat.
Measure your own setup
- Fix the model file, quant, engine version, hardware and offload settings. Save the prompt and the intended output length.
- Separate a cold start from warmed-up runs. Keep concurrency explicit and repeat the same workload without changing settings.
- Record actual input/output token counts, generation and prompt timings, and wall-clock completion time. A configured context limit is a separate field.
- Keep the raw output and report variation across runs. Leave unmeasured latency or missing settings unknown.
Follow the measurement workflow and copy the report template →
Submit your report with the source, full setup and measurement conditions.
Diagnose slow local model performance
- Long wait before output starts
- Separate model loading from input processing. Check prompt length, cached input and competing requests before looking only at generation speed.
- Slow generation or sudden slowdown
- Inspect GPU residency, system-memory use, actual context, power/thermal limits and engine backend. Compare a shorter context with otherwise identical settings before buying hardware.
- Another report looks much faster
- Match model size, quant, GPU count, concurrency, offload and speculative decoding. If conditions are missing, treat the comparison as incomplete.
- It fits but gives poor answers
- Test representative tasks and review the model, prompt, quant and runtime settings. Memory fit and token rate do not establish answer quality.
Frequently asked questions
- What does local model performance mean?
- Here it means the speed and memory requirements of running a model on your own hardware. Generation speed, prompt processing and time to first token describe different parts of the experience. Answer quality needs separate evaluation on your tasks.
- What is a good tokens-per-second speed for a local LLM?
- It depends on your task and tolerance for waiting. Measure time to first token and total completion time as well as generation speed. Compare runs with the same model, quantization, input length and concurrency; a high aggregate throughput does not describe one conversation.
- Does a faster GPU always run local models faster?
- No. Memory capacity, bandwidth, compute, engine support and workload all matter. Decode for one request is often bandwidth-limited; prompt processing and concurrent serving can depend more on compute. Offloading and device transfers can change the bottleneck.
- Why does a local model slow down with a long context?
- Long inputs take time to process and can increase attention work and KV-cache memory during generation. The effect depends on the architecture and runtime. Check actual input tokens separately from the configured context limit.
- Does the inference engine change local model performance?
- Yes. Kernel support, quant formats, caching, batching and speculative decoding can all change speed and memory use. Compare the same workload and record the engine version and settings before drawing conclusions.
- Is a model that fits in memory guaranteed to work well?
- No. Fit is a capacity estimate. Runtime allocations and other applications affect available memory, and a model can fit while remaining too slow or inaccurate for your task. Use the calculator to plan, then check measured reports and test your own workload.