Issues / #1776

#1776 Community benchmark: Tesla V100-32GB, i5-10505 (6-core Comet Lake), 32 GB RAM

open · @xWaLeEdOoOx · 1 commentaires · Sur GitHub

BenchmarksSetup & installMulti-GPUNVIDIA / CUDAModels & quantsDocumentationWindows

Description

I could not believe my eyes with those numbers!! you have done an insane job on this engine!! i really cant think straight so i asked my agent Rush to compile my findings... Feast your eyes!!

# Compiled by Rush:

Measured on 2026-10-10 by **Waleed**. A daily-use agent session on a 6-core Comet Lake
office box with a Volta card, 7 GB of background services resident, and the model
experts mapped in low-RAM mode. Decode reaches 90–100 tok/s steady; the expert cache
climbs 94.6% → 99.2% within a single conversation. Main limitation: one machine, one
session, single runs, no fixed-cap harness — every number comes from the engine's own
log lines.

## Hardware and software

- **GPU:** Tesla V100 (sm_70), 32 GB, in the OptiPlex 3090 MT's full-height **Gen 3 x16**
  slot. Power Around 200-350W. Card model V100-SXM2-32GB in an SXM2 to PCIe adapter card.
- **CPU:** Intel Core i5-10505 (Comet Lake, 6C/12T, 3.2 GHz base / 4.6 GHz turbo,
  12 MB L3, **AVX2 only — no AVX-512**).
- **RAM:** 32 GB DDR4, dual-channel, **DDR4-2666 (41.6 GB/s peak)**.
- **Storage:** Crucial P3 500 GB M.2 2280 NVMe (`CT500P3SSD8`) — QLC, DRAM-less,
  Gen 3 x4, ~500 MB/s sequential read. Model files, PLE table and packs on this drive.
- **OS:** Tiny10 (community-debloat Windows 10 image), a long-running install, not
  freshly imaged.
- **CUDA Toolkit:** 12.9.4 (CUDA 12.x, the required line for sm_70; CUDA 13 dropped Volta).
- **Strata:** `main`, cloned 2026-10-10. HEAD sha not recorded; the tip of `main` at
  clone time was `fb58e0dbc` (2026-10-08, v0.1.41 line) — confirm with `git rev-parse HEAD`.
  Release binary vs source build: not recorded.
- **Background workloads during the runs:** MSI Afterburner (polls the GPU), AnyDesk
  remote session, Chrome with 1–3 tabs, a full Open WebUI install with a PostgreSQL
  server — ~7,300 MB of RAM in total, so the engine had ~24.7 GB of RAM.

## Model and configuration

- **Model:** Swift 1.5 (UkisAI fine-tune of Qwen3.8-Flash-Next), **IQ2_XS**, chosen from
  setup's menu. **Vision off** (no `mmproj`).
- **Config:** `strata-swift-iq2_xs.json`, engine args:

```text
--expert-cache auto --prefill auto --spec 4 --max-context 131072
--kv q4_0 --resident-experts --spec-min-p 0.5
```

- **Context:** 131,072 — confirmed independently: the engine's `max` field equals
  `131072 − prompt tokens` on every turn.
- **`--resident-experts`** (low-RAM mode): IQ2_XS's experts are ~35.5 GB, above the
  ~24.7 GB free after background services, so the experts the 32 GB card does not hold
  are page-locked/mapped from the model files.
- **`--calibrate` was run** and reported changing `--pool-workers`; the final value was
  not recorded. `--pcie-frac` and the resulting `--pool-workers`: not recorded.
- Client: Open WebUI, local server `127.0.0.1:11454`, `gpu 0`.
- MTP draft acceptance, VRAM cache size, memory peak, TTFT: not measured.

## Method

One continuous agent session, 9 turns, multi-turn tool use, thinking on. All
throughput figures are the engine's own timings as printed in the log. Decode tok/s is
read from the per-stage lines (`thinking` / `answering` / `writing a tool call`), never
by dividing generated tokens by total request time. Fresh prompt tokens per turn are
`Y − previous prompt tokens − previous generated tokens`, where `Y` is the total in the
`reading the prompt: X of Y` line — that line reports **cumulative** prompt length, so
`Y` alone overstates fresh work. No state reset between turns; the conversation prefix
and the expert cache carry over.

## Results

**Decode, per turn (tok/s, engine's stage lines)**

| Turn | First stage | Last stage | Expert cache hit |
| --- | ---: | ---: | ---: |
| 1 | 51.7 | 55.0 | 94.6% |
| 2 | 68.7 | 66.9 | 97.6% |
| 3 | 66.4 | 80.4 | 98.1% |
| 4 | 79.4 | 93.9 | 98.6% |
| 5 | 86.8 | 96.0 | 98.6% |
| 6 | 80.6 | 88.4 | 99.0% |
| 7 | 98.1 | 98.5 | 99.2% |
| 8 | 83.5 | 99.0 | 98.5% |
| 9 | 77.7 | 91.8 | 99.2% |

Steady-state decode once the cache warms: **90–100 tok/s**; peak stage reading 99.0.

**Prompt ingestion, fresh tokens only**

| Turn | Cumulative `Y` | Fresh tokens | Time | Fresh tok/s |
| --- | ---: | ---: | ---: | ---: |
| 1 | 7,771 | 7,771 | 6 s | 1,295 |
| 2 | 23,355 | 15,477 | 19 s | 814 |
| 3 | 23,612 | 32 | — (no prefill line; prefix cached) | — |
| 4 | 41,878 | 17,629 | 16 s | 1,102 |
| 5 | 43,236 | 1,124 | 2 s | 562 |
| 6 | 45,722 | 2,250 | 3 s | 750 |
| 7 | 50,119 | 3,967 | 5 s | 793 |
| 8 | 56,524 | 6,105 | 6 s | 1,018 |
| 9 | 63,107 | 6,398 | 7 s | 914 |

Aggregate `done` rate (includes prompt reading, so it is not a decode number): 56.9,
67.5, 83.6, 95.6, 98.1, 88.3, 100.7, 95.5, 95.5 tok/s.

## Findings

- **Decode is host-bound, as reported on other Volta boxes, and a 6-core Comet Lake is
  enough.** 90–100 tok/s on a V100 is above every published V100 figure (54–75 tok/s on
  Xeon Gold 6130 and dual E5-2696 v3 rigs), on a box with **AVX2 only** and DDR4-2666.
- **Prefill throughput scales strongly with chunk size.** Tool results of 1–4k tokens
  ingest at 562–793 tok/s; chunks of 6k+ reach 1,018–1,295. In an agent loop, batching
  tool calls so results arrive as one large chunk is worth real wall-clock.
- **`--kv q4_0` appears to cost prefill on sm_70.** `docs/NVIDIA_V100.md` states that QSA
  prompt attention uses `prompt_attn_v70_kernel` for int8 / FP16 / K8V4 KV, and **the
  decode kernel (one query at a time) for Q4_0 KV**. Published V100 prefill numbers
  (1,123–1,251 tok/s) were measured with int8 KV. A `--kv int8` A/B on this box is the
  obvious test.
- **`--spec-min-p 0.5` is below what both published V100 sweeps kept.** The E5-2696v3
  box measured 0.50: 73.5 vs **0.70: 79.2**; the other V100 report also kept 0.70. This
  box sits at setup's 0.5 default.
- **Expert cache hit rate is the dominant decode lever on a 6-core CPU.** Turn 1 printed
  `+0.1% of the routed experts over PCIe`, i.e. 5.4% of routed experts were computed on
  the CPU pool; by turn 7 the share is ~0.8%. Hit rate rose 94.6% → 99.2% inside one
  conversation, and decode rose with it. With no AVX-512, every CPU-computed expert
  costs more per token.
- **Prefix caching carries agent loops.** Turn 3 had 32 fresh tokens and no prefill line
  at all.
- **`--resident-experts` on 32 GB RAM with 7.3 GB of services running** is the fit
  answer for IQ2_XS on a 32 GB card; the runs completed with no paging and no OOM.
- **Swift 1.5 with vision off**: the `max` values (123,293 / 107,709 / 89,186 …) are
  reasoning budgets, not thinking lengths; thinking stages were 1–397 tokens, so answers
  dominate the decode measured here.

## Correctness and limitations

- Not tested: needle recall, HumanEval, quant comparisons, MTP acceptance, memory peak,
  TTFT, vision, long-context behaviour, the `--calibrate` sweep output, PCIe utilization
  (`nvidia-smi dmon -s t`), model-file read counters.
- Single run per turn; no repeats, no median/range. Numbers are engine timings, not
  client-measured.
- One machine, one model size, one session, no fixed-cap `benchmark.py` harness.
- MSI Afterburner polls the GPU during runs; clock jitter is a plausible contributor to
  the 25–30% stage-to-stage decode swings seen on other Volta rigs.

Sur le site

Liens install, modèles, releases.