Local LLM Benchmarks: Open Dataset
Every number on this page was measured on a machine sitting in my house. No vendor slides, no extrapolation from a card I’ve never touched, no averaging of Reddit comments. Two rigs, a handful of models, and the exact flags each run used.
The whole thing is also a JSON file you can pull down and use however you want.
License and citation
This dataset is licensed CC BY 4.0. Use it in a paper, a blog post, a model card, a spreadsheet, a training set. Sell something built on top of it. The only thing I ask is attribution.
Bartlett, Mark. “InsiderLLM Local LLM Benchmark Dataset.” InsiderLLM, 2026. Licensed CC BY 4.0. https://insiderllm.com/benchmarks.json
If you’re citing a single row rather than the dataset, each row carries a source_article URL pointing at the write-up where that measurement first appeared, with the reasoning and caveats around it.
How we bench
Everything here is batch=1 single-user inference, because that’s how people actually run models at home. Nothing is served, nothing is batched across concurrent requests.
Rows come from two harness families, and they don’t mix:
llama-benchrows report generation and prompt-processing rates at fixed context depths. Good for isolating a flag.- Nine-prompt harness rows (am17an’s gist,
bench_llm.py) report an aggregate plus a per-prompt breakdown, kept in the JSON. On this class of workload throughput swings more between prompts than between backends, so an aggregate on its own hides the story.
A number from one family is not comparable to a number from the other. The same RTX 3090 running the same Qwen 3.6-27B at the same quant clocks about 33 tok/s under bench_llm.py and about 42 tok/s under the gist, purely because the prompts are shaped differently. Both are honest; neither is the model’s “real” speed.
What we exclude
The rule is narrow on purpose: a row exists only if I measured it on my own hardware and published it in an article first.
That means a lot of perfectly reasonable numbers are not here. Community reports, vendor benchmarks, figures extrapolated from a similar card, anything I read in a thread and found plausible. Several of my own articles carry those figures where they’re useful, clearly labeled as someone else’s work. They stay out of this file, because the point of the file is that every row has one person standing behind it.
If you want the wider picture including community numbers, the individual articles are the place to look.
Why the rig spec matters
There’s a full hardware block on every row — CPU, system RAM type and speed, PCIe generation, whether a display was attached — and it’s not padding.
The moment any part of a model lives in system RAM, memory bandwidth becomes the thing you’re measuring. Rushuna runs DDR4-2133, roughly 34 GB/s, which is slow by current standards. Every expert-offload number from that box would be higher on a DDR5 machine. Quoting “38 tok/s on a 3060” without the RAM spec attached is close to meaningless.
Same for the display. Rushuna is headless, so all 12 GB of VRAM is available. A 3060 also driving a monitor gives up somewhere around 0.5-1 GB, which is enough to turn a config that fits into a config that throws an out-of-memory error.
The data
| GPU | Model | Quant | Config | Ctx | Gen tok/s | PP tok/s | VRAM | Engine | Measured | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 40 -fa 1 | — | 28.1 | — | 2.5 GB | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 32 -fa 1 | — | 31.8 | — | 6.1 GB | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 24 -fa 1 | — | 38.9 | 413 | 9.8 GB | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 24 -fa 1 | 4096 | 38.5 | 394 | — | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 24 -fa 1 | 8192 | 38.2 | 386 | — | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 20 -fa 1 | — | 42.6 | — | 11.7 GB | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | draft model (conventional speculative decoding) | — | 11 0.28x | — | — | llama.cpp | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3-14B (14B dense) | Q4_K_M 8.4 GB | -ngl 41 | — | 35.9 | — | — | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3-14B (14B dense) | Q4_K_M 8.4 GB | half of 41 layers offloaded to system RAM | — | 5.7 | — | — | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3060 12GB (headless) | Qwen3-14B (14B dense) | Q4_K_M 8.4 GB | all layers offloaded to system RAM | — | 3.05 | — | — | llama.cpp b10088 | 2026-07 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedy | — | 32.95 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedy | — | 32.86 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedy | — | 32.84 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 92.62 2.81x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 73.9 2.25x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q4_K_M 16 GB | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 85.86 2.61x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedy | — | 33.65 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedy | — | 33.66 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedy | — | 33.69 | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 92.74 2.76x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 83.33 2.48x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.5-27B (27B dense) | Q4_K_M | bench_llm.py defaults, batch=1, greedyDFlash + DDTree | — | 85.08 2.53x | — | — | Luce-Org lucebox-hub (DFlash fork) | 2026-04-30 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B-MTP (27B dense) | Q4_K_M 15.35 GiB | -fa on -c 10000 -np 1 -ngl 99 --no-mmap --no-cache-prompt | — | 42.44 | — | — | llama.cpp (am17an mtp-clean branch) b9030 | 2026-05-06 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B-MTP (27B dense) | Q4_K_M 15.35 GiB | --spec-type mtp --spec-draft-n-max 3 -fa on -c 10000 -np 1 -ngl 99 --no-mmap --no-cache-promptMTP (PR #22673), draft 3 | — | 63.47 1.5x | — | — | llama.cpp (am17an mtp-clean branch) b9030 | 2026-05-06 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B-MTP (27B dense) | Q4_K_M 15.35 GiB | -ngl 99 -c 10000 --no-mmap --no-cache-prompt -fa on -np 1 | — | 38.3 | — | — | llama.cpp (am17an mtp-clean branch) | 2026-05-19 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B-MTP (27B dense) | Q4_K_M 15.35 GiB | --spec-type draft-mtp --spec-draft-n-max 3 -ngl 99 -c 10000 --no-mmap --no-cache-prompt -fa on -np 1MTP (PR #22673), draft 3 | — | 61.4 1.6x | — | — | llama.cpp (am17an mtp-clean branch) | 2026-05-19 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B-MTP (27B dense) | Q4_K_M 15.35 GiB | --spec-type draft-mtp --spec-draft-n-max 2 -ngl 99 -c 10000 --no-mmap --no-cache-prompt -fa on -np 1MTP (PR #22673), draft 2 | — | 63.8 1.67x | — | — | llama.cpp (am17an mtp-clean branch) | 2026-05-19 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | UD-Q4_K_XL 17 GB | -ngl 99 -c 10000 --no-mmap -fa on -np 1 | — | 40.16 | — | — | llama.cpp (mainline) b9079 | 2026-05-22 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | IQ4_KS-MTP 16 GB | --spec-stage mtp --draft 3 -ngl 99 -c 10000 --no-mmap -fa on -np 1MTP, draft 3 | — | 74.08 1.66x | — | — | ik_llama.cpp 4530 | 2026-05-22 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q5_K_S 18 GB | -md <draft> -ctk turbo4 -ctv turbo3_tcq -ub 256 -ngl 99 -c 10000 --no-mmap -fa on -np 1DFlash, draft adaptive (controller auto-scales during the run) | — | 73.31 1.62x | — | — | BeeLlama b9353 | 2026-05-22 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-27B (27B dense) | Q5_K_S 18 GB | -md <draft> -ctk turbo4 -ctv turbo3_tcq -ub 256 -ngl 99 -c 10000 --no-mmap -fa on -np 1DFlash, draft adaptive (controller auto-scales during the run) | — | 75.42 1.56x | — | — | BeeLlama v0.2.0 | 2026-05-25 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -fa 1 | — | 157.66 | 3674.27 | 22.7 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -fa 1 | 4096 | 156.25 | 3469.25 | 22.7 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -fa 1 | 8192 | 153.24 | 3340.47 | 22.7 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 1 -fa 1 | — | 146.45 | 2766.34 | 22.25 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 2 -fa 1 | — | 136.03 | 2221.43 | 21.76 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 3 -fa 1 | — | 127.25 | 1844.76 | 21.28 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 4 -fa 1 | — | 118.9 | 1581.93 | 20.79 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 6 -fa 1 | — | 106.56 | 1272.87 | 19.82 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 8 -fa 1 | — | 94.54 | 1061.75 | 18.84 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 16 -fa 1 | — | 66.96 | 679.5 | 14.95 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 24 -fa 1 | — | 52.76 | 502.29 | 11.06 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 32 -fa 1 | — | 43.9 | 412.29 | 7.17 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (headless) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 40 -fa 1 | — | 36.11 | 340.67 | 3.17 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -fa 1 | — | did not load failed to load model | — | — | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 2 -fa 1 | — | did not load failed to create context | — | — | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 4 -fa 1 | — | 107.12 | 1525.93 | 24.94 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 6 -fa 1 | — | 95.56 | 1132.32 | 24.22 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 8 -fa 1 | — | 90.88 | 839.64 | 23.2 GB | llama.cpp b10088 | 2026-07-28 | article |
| NVIDIA GeForce RTX 3090 24GB (display attached) | Qwen3.6-35B-A3B (35B total / 3B active) | UD-Q4_K_M 20.6 GiB | -ngl 99 -ncmoe 16 -fa 1 | — | 61.48 | 613.51 | 19.39 GB | llama.cpp b10088 | 2026-07-28 | article |
Reading the table
A few things worth knowing before you use these:
Speedup figures compare against a baseline in this same dataset. Speculative-decoding rows carry a baseline_ref in the JSON pointing at the autoregressive run they were measured against, on the same box, same day. No cross-referencing someone else’s baseline.
The -ncmoe 20 row is a trap and it’s in here deliberately. It’s the fastest 3060 config that loads, at 42.6 tok/s, and it falls over as soon as real context arrives. A sweep that only shows the settings that worked isn’t a sweep.
Some fields are null and stay null. I didn’t instrument host memory during these runs, so system_ram_used_gb is empty on all 50 rows. driver is empty on 17 of them — every Miu row measured before 2026-05-21, when that box moved to 580.159.03. The version it ran before that was never written down, and a null is worth more than a plausible guess backfilled from memory. repetitions is null wherever the repetition count wasn’t recorded at the time; where it was, it’s there, and the two sweeps don’t match (-r 5 on the Miu rows, -r 3 on the 3060 rows). A couple of rows record a flag as published prose because the exact value wasn’t written down either. Guessing would make the file look more complete and be worth less.
Engine builds move fast. Every row pins an engine build or commit hash. Speculative decoding in particular changes behavior commit to commit: the MTP flag got renamed on merge, and a bad default value made some configs slower for three days in May before anyone caught it. A number from a specific build is a fact about that build and nothing more.
Corrections
If you reproduce something here and get a materially different result, I want to hear it. Numbers that don’t replicate are more useful to me than numbers that do. hello@insiderllm.com.
The dataset carries a version and a last_updated field. New rows get appended as new benches run; existing rows change only to fix an error, and the version moves when they do.