What to measure
Three numbers per (model, hardware) pair. Adding more makes the table heavier without making the decision faster.
- Tokens / second (decode). The headline number. Streaming responsiveness depends on it. Comfortable reading sits somewhere around 10 tok/s, so once you fall below that the waiting becomes visible.
- Time to first token (TTFT). Includes model load + prompt eval. Drops to ~0 when the model is warm and climbs into the tens of seconds when it's cold. This is why the same model feels fast one day and sluggish the next — it's usually TTFT that moved, not decode speed.
- Memory cost. What
ollama psreports under SIZE. This is what ultimately decides what you can keep loaded side by side on one machine.
Document, don't trust memory
Six months later you won't remember whether a 32B model was viable on this Mac. Write down: hardware, model, quant, num_ctx, env vars, the three numbers. A simple Markdown table is fine. Once that table has a few rows, your next hardware decision gets made against your own measurements instead of somebody's spec sheet.
Fair benchmarks
- Run with the model already warm (one warmup prompt before timing). Otherwise model load time bleeds into your decode number.
- Use a fixed seed so the response length is roughly stable. When length wobbles, tok/s wobbles with it.
- Use a fixed prompt across runs. Change the prompt and you change how much prompt eval happens, which makes TTFT incomparable.
- Run three times and take the median. The callout below is why.