Generated 19 August 2026 at 10:39 am ยท V100 run: bakeoff-v100-round2 ยท Titan V run: 2026-08-18
This report benchmarks the performance of large language model (LLM) inference on local NVIDIA GPUs. We're running open-source AI models locally โ no cloud, no API fees, full privacy โ and measuring how fast each GPU and model combination can generate text responses.
The goal: select the best AI brain for our Librarian agent โ a local AI that organises knowledge, writes documentation, and synthesises information across our projects. The Librarian needs to be fast enough to feel interactive, smart enough to do complex reasoning, and small enough to fit in a single GPU's memory alongside its working context.
Our hardware: Two GPUs across two machines โ a Tesla V100 SXM2 (16GB HBM2) on the Unraid server (the Librarian's home), and a NVIDIA Titan V (12GB HBM2) on a laptop eGPU dock (the Titan Brain's home). Both are NVIDIA Volta architecture (2017โ2018 vintage server silicon) โ still highly capable for LLM inference thanks to their fast HBM2 memory.
Token generation speed โ how many tokens (โยพ of a word) the model outputs per second during a conversation. This is the number you feel as a user. At 80 tok/s, a 400-word response streams in ~5 seconds. At 30 tok/s, it takes ~13 seconds.
tg128 = generating 128 tokens. tg512 = generating 512 tokens. For a well-optimised dense model, these should be nearly identical โ the GPU reads weights at constant bandwidth regardless of output length.
Prompt processing speed โ how fast the model reads your input and the entire conversation history before generating the first word. pp512 = processing 512 tokens at once, pp4096 = 4096 tokens.
At the start of every response, the model must process the full context window (up to 131,000 tokens for our Librarian). Higher pp = faster time-to-first-token. Especially important for long documents or large conversation histories.
Context scaling test. Dense models (Qwen, Ornith) often get faster at larger batch sizes โ the GPU's 5120 CUDA cores are better utilised when processing more tokens simultaneously.
MoE models (Gemma4-26B with ~4B active parameters out of 25B) show a drop at pp4096 โ the sparse expert routing doesn't parallelise as efficiently at large batches.
GPU memory used during the benchmark. Whatever VRAM the model doesn't occupy becomes available for the KV cache โ the memory buffer storing the conversation history.
More VRAM headroom = longer conversations before slowdown. The current Librarian (13.4 GiB) leaves only ~2.7 GiB for KV cache. The 9B candidates (6.9 GiB) leave ~9 GiB โ enabling much longer conversations at full speed.
GPU wattage during inference. The V100 SXM2 has a 300W TDP; the Titan V is 250W. High power during tg confirms the GPU is compute-saturated โ fully utilised, which is ideal.
Very low power during tg (e.g. the Qwen3.8-27B IQ4_XS at ~39W) indicates CPU offload is occurring โ most layers are on RAM, not GPU, and the GPU is nearly idle while waiting for data.
GPU core temperature at peak load. The V100 SXM2 HBM2 memory has an 85ยฐC thermal limit โ our benches peaked at 64โ66ยฐC, giving 19โ21ยฐC of thermal headroom.
Running 24/7 as the Librarian under sustained load will be warmer than a short benchmark. If temperatures approach 80ยฐC consistently, better airflow or reduced clock speeds may be needed. No throttling was observed in any of our runs.
Shader processor clock speed during inference. The V100 SXM2 boosts to 1530 MHz under full load; the Titan V reaches 1335 MHz.
A consistently high SM clock during tg confirms no thermal or power throttling. If the clock drops significantly mid-bench, the GPU is protecting itself from overheating โ a signal that cooling needs attention.
HBM2 bandwidth utilisation โ the fraction of the GPU's memory bus being used. LLM token generation is memory-bandwidth-bound: for each output token, the GPU must read the entire set of model weights from HBM2 memory.
80โ99% memory utilisation during tg is expected and healthy โ it means the GPU is spending its time moving weight data as fast as the HBM2 bus allows. Low utilisation suggests a bottleneck elsewhere (e.g. CPU-side data starvation).
Wall-clock time for the complete benchmark of one model โ including Docker container startup (V100) or process launch (Titan V), model weight loading into VRAM, and all test repetitions.
The 9B models take 47โ105s per run; the 26B baseline takes 124โ152s (larger model = longer load). Docker adds ~35โ40s overhead vs the native binary on Calcifer โ which explains why the Titan V bench (3m55s) was faster than the V100 bench (8m48s) despite the V100 being the faster GPU.
Measurement stability across 3 repetitions. A low ยฑ (e.g. ยฑ0.30) means the GPU is running at a stable, predictable speed โ good for a 24/7 production workload.
A high ยฑ (e.g. Gemma4-26B tg512: ยฑ15.78) means significant run-to-run variation โ in this case caused by the MoE model's non-deterministic expert routing at longer sequences. Not shown in bar charts but visible in the raw bench logs.
Each bar is scaled relative to the highest value in that column. The number next to the bar is the actual value. Wider bar = better performance relative to other models in this run. The bars are a quick visual ranking โ always check the numbers for exact comparisons.
The benchmark uses short contexts (pp512 = 512 input tokens, tg128 = 128 output tokens). Production runs at up to 131,072 tokens of context. The KV cache grows with context length, consuming VRAM and increasing memory pressure. Our current Gemma4-26B drops from 106 tok/s (bench) to ~77 tok/s (production 131K context) โ a 28% real-world reduction. The 9B models are expected to hold their speed better at full context due to their much larger VRAM headroom.
All llama-bench figures use short-context conditions โ these favour MoE (Mixture-of-Experts) architectures.
The current Gemma4-26B baseline drops 106โ77 tok/s at 131K production context (~โ28%).
Apply a similar correction factor when comparing candidates. Rankings are valid for comparison; absolute numbers are not directly operational.
* VRAM column: measured peak from GPU stats where captured; falls back to model file size (marked *).
To understand the bakeoff results, we first need a controlled baseline: the same model on different GPU hardware. Using Qwen2.5-Coder 7B Q5_K_M (a fixed 5.1 GB reference model) lets us isolate pure GPU performance differences โ the same code, same weights, only the silicon changes. This is how we measured the V100's real-world advantage over the Titan V, and confirmed the Thunderbolt 3 eGPU connection adds only a ~4% tg penalty (well within noise for an inference workload).
| GPU | Location | Date | tg128 tok/s โผ | tg512 | pp512 tok/s | pp128 | pp1024 | Notes |
|---|---|---|---|---|---|---|---|---|
| Titan V 12GB (direct PCIe) NVIDIA Titan V GV100 |
Unraid โ direct PCIe x16 | 2026-06-11 | 95.2 | 1066 | 3084 | PCIe at Gen1 (no perf impact for inference). Pre-relocation baseline. | ||
| V100 SXM2 16GB (direct PCIe) Tesla V100-SXM2-16GB |
Unraid โ direct PCIe x16 Gen3 | 2026-06-11 | 118.2 | 1410 | 3637 | +24.7% tg vs Titan V. Current Librarian GPU. | ||
| Titan V 12GB (TB3 eGPU) NVIDIA Titan V GV100 |
Calcifer โ Thunderbolt 3 eGPU | 2026-07-08 | 91.4 | 1115 | 3077 | TB3 tax: โ3.9% tg vs direct PCIe. Titan Brain GPU. |
Suite: pp128,512,1024,4096 + tg128,512 ยท r=3 ยท full-cuda b10450 ยท ngl=99 ยท -ctk q8_0 -fa auto
| Model | Status | tg128 tok/s โผ | tg512 | pp512 tok/s | pp128 | pp1024 | pp4096 | Peak VRAM | Power | Temp | SM MHz | Mem Util | Elapsed โฑ | Other GPU tg128 / ฮ | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Gemma4-26B A4B Q4_0 (current Librarian) 25.23B ยท ngl=99 |
๐ Baseline | 96.5 | 932 | 1794 | 1740 | 14.6 GiB | 201 W | 60 ยฐC | 1530 | 39 % | 2m32s | โ | Current Librarian. Production tg ~76-77 tok/s at 131K context. | ||
| Qwen3.5-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 81.6 | 1329 | 2942 | 2862 | 7.3 GiB | 299 W | 83 ยฐC | 1530 | 83 % | 1m45s | 63.1 / 30% | |||
| Ornith-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 80.8 | 1277 | 2879 | 2839 | 7.2 GiB | 302 W | 83 ยฐC | 1530 | 82 % | 1m45s | 63.5 / 28% | |||
| Gemma4-12B QAT Q4_0 11.91B ยท ngl=99 |
๐ฏ Shortlist | 65.0 | 678 | 1893 | 1767 | 7.8 GiB | 287 W | 76 ยฐC | 1530 | 74 % | 2m4s | 50.2 / 39% | Same Gemma4 architecture as current Librarian. |
Suite: pp128,512,1024,4096 + tg128,512 ยท r=3 ยท native CUDA build ยท ngl=99 ยท -ctk q8_0 -fa auto
| Model | Status | tg128 tok/s โผ | tg512 | pp512 tok/s | pp128 | pp1024 | pp4096 | Peak VRAM | Power | Temp | SM MHz | Mem Util | Elapsed โฑ | Other GPU tg128 / ฮ | Notes |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Qwopus3.5-9B v3 Q6_K (Titan Brain) 8.95B ยท ngl=99 |
๐ Baseline | 63.7 | 1048 | 2453 | 2468 | 7.1 GiB | 197 W | 71 ยฐC | 1335 | 85 % | 47s | โ | Current Titan Brain. Same model as Jul 2026 bakeoff winner. | ||
| Ornith-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 63.3 | 1047 | 2446 | 2466 | 7.1 GiB | 210 W | 79 ยฐC | 1335 | 85 % | 49s | 81.4 / -22% | |||
| Qwen3.5-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 63.0 | 1060 | 2457 | 2463 | 7.2 GiB | 205 W | 77 ยฐC | 1335 | 86 % | 48s | 81.8 / -23% | |||
| Gemma4-12B QAT Q4_0 11.91B ยท ngl=99 |
๐ฏ Shortlist | 49.7 | 537 | 1509 | 1409 | 7.8 GiB | 195 W | 78 ยฐC | 1335 | 70 % | 1m3s | 69.7 / -28% |
First model selection bakeoff on the Titan V. 5-test suite (pp128/512/1024 + tg128/512). Selected Qwopus3.5-9B-v3 as Titan Brain. pp4096 not measured (added in round 2).
| Model | Status | tg128 tok/s โผ | tg512 | pp512 | pp128 | pp1024 | pp4096 | Size | Notes |
|---|---|---|---|---|---|---|---|---|---|
| Qwopus3.5-9B v3 Q6_K (Titan Brain) 8.95B ยท ngl=99 |
๐ Baseline | 65.1 | 1061 | 2556 | โ | 6.84 GiB | Selected as Titan Brain. Deployed on Calcifer. | ||
| Ornith-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 65.1 | 1063 | 2564 | โ | 6.84 GiB | |||
| Qwen3.5-9B Q6_K 8.95B ยท ngl=99 |
๐ฏ Shortlist | 64.7 | 1072 | 2567 | โ | 6.94 GiB | |||
| Gemma4-12B QAT Q4_0 11.91B ยท ngl=99 |
๐ฏ Shortlist | 56.1 | 549 | 1565 | โ | 6.48 GiB | MBCS Jul 2026 unreliable (worker-busy on 12GB). Re-run on V100. | ||
| Phi-4 14B Q4_K_M 14.66B ยท ngl=99 |
โ Eliminated | 56.9 | 490 | 1556 | โ | 8.43 GiB | Dominated by 9B models on tg while being larger. | ||
| Gemma4-12B v2 Agentic Q4_K_M 11.91B ยท ngl=99 |
โ Eliminated | 53.4 | 554 | 1580 | โ | 6.86 GiB | Superseded by QAT variant. | ||
| Mistral-Nemo-12B Q6_K 12.25B ยท ngl=99 |
โ Eliminated | 50.0 | 666 | 1948 | โ | 9.36 GiB | Dominated by 9B models on tg and VRAM. | ||
| Qwen3.6-35B A3B IQ3_S (MoE stretch) 34.66B ยท ngl=99 |
โ Eliminated | 9.9 | 53 | 139 | โ | 12.73 GiB | Expert layers on CPU. 10 tok/s unusable. Experts forced to CPU on 12GB VRAM. |
Models appearing in multiple bakeoffs. Different llama.cpp builds โ directional only. V100 vs Titan V round-2 results shown.
| Model | Titan V Jul '26 (b9891) | Titan V Round 2 | V100 Round 2 (b10450) | V100 vs Titan V Jul ฮ | Status |
|---|---|---|---|---|---|
| Qwen3.5-9B Q6_K | 64.4 tok/s | 63.1 tok/s | 81.8 tok/s | +27% | ๐ฏ Shortlist |
| Ornith-9B Q6_K | 65.1 tok/s | 63.5 tok/s | 81.4 tok/s | +25% | ๐ฏ Shortlist |
| Gemma4-12B QAT Q4_0 | 56.4 tok/s | 50.2 tok/s | 69.7 tok/s | +24% | ๐ฏ Shortlist |
Three candidates for Librarian 5-task quality evaluation (runbook Step 3). VRAM headroom is a structural advantage: the current Gemma4-26B leaves ~2.7 GiB for KV cache at 131K context. 9B candidates leave ~9 GiB โ likely sustaining closer to bench-speed tg under production load.
| Model | V100 tg128 | VRAM headroom (16GB) | MBCS | Key risk |
|---|---|---|---|---|
| Ornith-9B Q6_K | 81.4 tok/s | ~9.2 GiB free | 1P/5N/4F (behavioural fingerprint) | New model โ quality unknown for Librarian tasks |
| Qwen3.5-9B Q6_K | 81.8 tok/s | ~9.2 GiB free | 3P/3N/4F (better injection resistance) | Established Qwen lineage |
| Gemma4-12B QAT Q4_0 | 69.7 tok/s | ~8.8 GiB free | 1P/9F โ ๏ธ instrument failure (12GB OOM Jul '26) | Re-run MBCS mandatory on V100 |
Download the standalone bench script below to run the same test suite on your GPU and compare results directly against the ParisiPlace baselines above. No special setup required beyond a llama.cpp CUDA build and a model file.
Self-contained bash script โ works on any Linux system with a CUDA GPU and llama.cpp.
โฌ bench-standalone.sh# 1. Build llama.cpp with CUDA git clone https://github.com/ggml-org/llama.cpp cd llama.cpp cmake -B build -DGGML_CUDA=ON cmake --build build --config Release -j$(nproc) # 2. Download the reference model (5.1 GB โ matches ParisiPlace hardware baselines) huggingface-cli download Qwen/Qwen2.5-Coder-7B-Instruct-GGUF \ qwen2.5-coder-7b-instruct-q5_k_m.gguf --local-dir ./models # 3. Run the benchmark bash bench-standalone.sh \ --llama-bench ./build/bin/llama-bench \ --model ./models/qwen2.5-coder-7b-instruct-q5_k_m.gguf \ --label "Your GPU Name" \ --output-dir ./my-results # Results: my-results/bench-*.log + my-results/summary.txt
| GPU | Config | tg128 tok/s | pp512 tok/s | Date |
|---|---|---|---|---|
| Titan V 12GB (direct PCIe) | Unraid โ direct PCIe x16 | 95.54 | 3092 | 2026-06-11 |
| V100 SXM2 16GB (direct PCIe) | Unraid โ direct PCIe x16 Gen3 | 119.06 | 3684 | 2026-06-11 |
| Titan V 12GB (TB3 eGPU) | Calcifer โ Thunderbolt 3 eGPU | 91.85 | 3122 | 2026-07-08 |
Share your summary.txt or bench-*.log output alongside your GPU model, VRAM, and driver version.