Post your benchmark here 📊 — datapoints, A/Bs, cold→warm curves #208
Replies: 13 comments 1 reply
A/Bs from the same box, one knob each:
Research row (routing approximation, NOT for the main table): ROUTE_J=2 ROUTE_M=1 cache-aware routing -> 3.09 tok/s @ 92% hit, 15.3% expert substitution, MMLU-200 A/ indistinguishable from true routing (details in #161). Trail: #120 -> #160 -> #215 -> PR #270. Won't catch Zac's 6.84 with two cards and a disk, but per-GPU it's a fight. :) |
DGX Spark / GB10 — stock top-8 vs CACHE_ROUTE (+ O_DIRECT disk)Two-tier discipline: stock full top-8 vs experimental CACHE_ROUTE. Metric is decode tok/s (generation window), not overall wall tok/s. Why two tiers
Quality A/B (limited — not full coli bench)Protocol: SCORE log-likelihood · HellaSwag · n=20 · seed 1234 · same request file · full K=8.
Caveat: n=20 only. Primes multi-turn still produced correct first-20 list (eyeball). Prefer larger greedy-token agreement set for ROUTE_J/M defaults. Supports default off. Vs EXPERT_BUDGET (blind drop): CR is the principled middle path — substitute toward resident experts inside top-M (arXiv:2412.00099), not drop by gate weight alone. Connects to expert-specialization (#207): which experts are safe to swap. Links
Happy to extend with greedy-token agreement on a small reasoning set (not just primes) when the box is free — that should help tune |
Independent repro — thank you (@ebootheee)This is exactly the cross-arch confirmation that was needed.
Quality read: agree 100% — at n=200, ±~3.5 pp noise means no detectable difference, not “CR helps.” That is already a strong statement: ~15% expert substitution did not measurably dent MMLU. Full bench / Discipline: also agree these stay off the main true-routing table (research rows only). Same two-tier rule we use on Spark: stock top-8 vs experimental CACHE_ROUTE; never mix Tier-C CUDA stacks into a “CR alone” row. Upstream status: the routing-side path is already landed as an official opt-in (default off) in PR #199 ( @JustVugg — +1 to “research flag” framing: big README warning, substitution rate on the result line, benchmark rows separated. Happy to help fold any remaining docs/flags with the #215 / #270 stack if useful. Notes updated: https://github.com/VincentMarquez/glm52-gb10-colibri (QUALITY + NUMBERS). |
Windows 11 native — GLM-5.2 744B int4 — RTX 5070 Ti + Core Ultra 9 185H + 32 GB RAMSetup: MinGW-w64 build, NVMe Gen4, CPU-only AVX-VNNI matmul + CUDA dense/attention offload via runtime DLL ( Decode throughput — progressive optimization (32-token decode, DRAFT=0)
Total: 3.2–4.3× over stock. Disk I/O reduced 8× (65.9s → 8.4s). Full configPer-token breakdown (accurate, from non-pipe2 run to avoid overlap artifacts)
Key findings
What didn't work (documented for the record)
Hardware details
Full diagnostic report with raw profiles, memory hierarchy analysis, and ranked optimization recommendations: |
3.6 tok/s on AMD EPYC 7713, 96 cpu avx2, 1 TB RAM for model, 1 TB RAM for full expert loaded
Best run: Ref: #234 Please let me know if you think I can tune this any further. |
6× RTX 5090 full stack, current dev: 5.2 tok/s end-to-end through HTTP/SSE, TTFT 0.43 sThe strictest measurement we've taken of this rig: client-side, streaming over the OpenAI SSE API through an SSH tunnel — every layer of the real serving stack included, nothing engine-side about it. Hardware: dual Xeon Silver 4510 (24C/48T, AVX-512 VNNI, 2 NUMA nodes) · 251 GB DDR5 · 6× RTX 5090 32 GB · NVMe Six consecutive 96-token turns (client-measured SSE chunk timing):
Three things the curve shows:
One bug found while measuring: after the recent telemetry merges, the server's |
Full-residency decode on 6× RTX 5090 is CPU-bound, not GPU-bound — a direct overlap-window measurementFollowing up on the earlier 5.2 tok/s datapoint with a mechanism result that surprised me. I instrumented The GPU side of a token's experts costs ~3.8 s of wall time; the CPU side costs 44.5 s. The six 5090s finish their 9,276-expert share and then idle, waiting on the CPU to grind through the ~90 RAM-tier experts each token routes to (AVX-512 VNNI, 1–4 rows each). Independent confirmation from SM sampling during decode: 1.1% mean utilization. The cards are not the bottleneck and never were — at S=1 there simply isn't enough GPU work, and what work exists is dwarfed by the CPU tail. Consequences for where speed lives on this class of host:
The |
Windows 11 Native + External USB Thumb DriveI ran it on a prompt overnight so I figured I may as well post a benchmark. I'm not using an NVME SSD because I don't have enough room on my main os drive. I'm running it on an EXTERNAL USB DRIVE, results are suprisingly good given that, the overnight run got 0.12 tokens per second. --ngen is 10240. Edit: Ah, I get the impression I did this wrong, you're supposed to run a particular set of settings and scripts for the official benchmarks. |
2.6 tok/s on Xeon W-2265, 512 GB DDR4-2400, RTX 3060 12 GBMedian tok/s of five runs:
Key Takeaways from the Optimization Steps
|
3.5 tok/s on i9-7940X, 256 GB DDR4-3200, 2 x RTX 3090
Step 7 and 8 is to compare the effect of having the same number of resident experts either dispersed over GPU+CPU (Step 7), or only on CPU (Step 8, which allocates no VRAM, but 46 GB more RAM). Having a subset of experts in VRAM is faster as expected, but this comparison provides a value on how much faster. When activating CUDA in step 2, MTP seems to get disabled automatically. |
0.10 tok/s on old cpu/ram/disk over ethernetHardware: Dual Intel(R) Xeon(R) Silver 4208 CPU @ 2.10GHz on host, 8x vcpu in vm / 480 GB DDR4-2400 ECC RDIMM / SAN with 15k rpm drives over gigabit ethernet / no gpu Yes, I knew it would be like this, but I wanted to see. |
|
Kimi K3 thread-configuration and cache-scaling datapoints from three hosts. This builds directly on work already in this project. @MichaelFomenko ran K3 end to end first and posted a Summary: Explicit OpenMP configuration reduced K3 decode time by 3.5× on the 64-core host and 40% on one 16-core host; the third host was inconclusive. On the 256 GB host, increasing the expert cache from 8 to 180 GB improved decode from 2.78 to 1.53 s/token. These are narrow, 32-token performance datapoints, not quality results or universal tuning advice. Scope: one 10-token prompt, 32 greedy output tokens, v1.3.0 source tag ( Hosts
OpenMP thread configurationAll rows: decode only — initialization and prefill excluded.
"Confirmed" here means n=3 per arm with non-overlapping observed ranges — nothing stronger. How this was run, so the comparison can be judged: three OpenMP settings changed together (thread count,
Relevant code context: Scope of the settings above: these were used for Kimi K3 testing only. Explicit affinity is topology-sensitive, and #471 documents a different engine's re-exec interacting badly with user-set Cache scaling (host A, fixed 32-thread configuration)
Accounting caveat: hit rate and streamed bytes are cumulative over prefill plus decode, while decode seconds and s/token cover generation only. Do not divide those columns against each other to infer bandwidth — they cover different windows. Hit rate keeps rising well past the cache sizes reachable on a 64 GB box, at a resident cost worth knowing before trying it: 212.8 GB peak on a 256 GB host. int8 dense residents
An observed 11.4% end-to-end difference and +20.4 GB resident, for this prompt, n=1 per arm. This is the end-to-end effect of the setting including the routing changes it produces — the arms did not generate identical text — so it is neither an established cost nor a quality result. Not tested
No completed runs were discarded from the comparisons reported above. Additional completed storage and diagnostic arms remain documented in the internal report. Raw logs (init curves, per-token traces, |
RTX 5080 16 GB · 128 GB DDR5 · NVMe — int4-g64 vs E8/IQ3 (fmt=6), same FP8 parentContainer swap on one box. colibrì v1.4.0 (
Quality — same harness (
33% smaller, 22–33% faster, no measurable quality loss. The win is residency, not arithmetic. E8's One measurement note that may be more useful than the numbers, for anyone benchmarking a streaming host: The same g64 arm read 1.275 tok/s in the morning and 1.18 in the evening on this box, from nothing but ~20 hours of sustained NVMe load (a 289 GB conversion and two long eval runs). That looked like a v1.4.0 regression. Before reporting one I reinstalled the v1.3.0 binaries and re-ran the same arm in the evening machine state: 1.205. So the version accounted for 0.025 — inside this box's ±0.04 noise band — and the machine accounted for 0.07. No regression. Across all three sessions E8 read 1.56 / 1.56 / 1.57 while g64 slid 1.275 → 1.205 → 1.18. A tiring drive punishes the arm that waits 15 s on disk far more than the arm that waits 2.4 s. Two consequences worth carrying: never compare a number taken today against one taken yesterday without re-measuring both arms in the same session, and expect the disk-bound arm to be the one that drifts. |
Uh oh!
There was an error while loading. Please reload this page.
This is the home for benchmark datapoints (they used to live in Issues — new ones belong here).
Template (same rigor as the README table):
What makes a datapoint great: an A/B (one knob changed), a cold→warm curve, or a config nobody has tried (see the README table for covered ground — first-of-a-kind hardware always gets a row). Negative results are welcome: "X did not help on my box" with numbers has saved this project from wrong turns at least four times.
Current table highlights to beat: 6.84 tok/s (6×5090 full residency) · 2.24 (M5 Max Metal tuned) · 1.23 (Gen5 NVMe + 5090) · 1.10 (Strix Halo) · 0.5 (native Windows warm).
All reactions