Hoe ik
de Arena meet.

9 tests · 2 tools · 1 GPU

Elk model in de arena gaat door dezelfde 9 benchmarks op dezelfde DGX Spark. 5 closed-loop voor pure throughput, 4 open-loop voor hoe het voelt onder echte concurrency. Hieronder: het waarom, het hoe, en alle commando's één-op-één. Hoort bij de gids LLMs draaien op de DGX Spark.

Eén benchmark is geen benchmark. Een model dat 120 t/s haalt op een lege loop kan onder 32 gelijktijdige requests zomaar instorten naar 14 t/s per user. En een model met snelle tokens/sec kan een TTFT hebben van 4 seconden. Onbruikbaar voor chat, prima voor batch.

Dus: meet beide. Throughput in isolatie (closed-loop) en gedrag onder druk (open-loop). Korte prompts, lange prompts, korte outputs, lange outputs. Zo zie je waar een model écht voor geschikt is, niet alleen wat de release notes claimen.

9
benchmarks
3
runs · seed 42
±2%
run-to-run
A closed-loop

llama-benchy

Hoe snel kan dit model genereren als er niemand op het kanaal zit?

Closed-loop wil zeggen: zodra een request klaar is, stuur ik direct de volgende. Geen wachttijden tussen requests, geen burst-pieken, alleen pure decode throughput. Resultaat: tokens/sec per stream, met een schone TTFT als referentie.

Ideaal voor: één gebruiker, batch-processing, code completion. Niet representatief voor: een chat-app met veel gelijktijdige sessies.

5 / 9 benchmarks → 01 · 02 · 03 · 04 · 05
B open-loop

vllm bench serve

Hoe houdt het zich onder X gelijktijdige users die niet wachten op elkaar?

Open-loop genereert requests volgens een Poisson-proces, onafhankelijk van wat de server al aan het doen is. Bij rate 0.3 req/s komt er gemiddeld elke ~3 seconden een nieuwe in, of het vorige antwoord nu klaar is of niet. Dat is hoe productie eruit ziet.

Resultaat: p50/p95 TTFT en per-user tokens/sec onder belasting. TTFT-getallen rapporteer ik wel (boven de 2s gaat je app traag voelen), maar ze sluiten geen modellen uit de ranking.

4 / 9 benchmarks → 06 · 07 · 08 · 09

Elke kaart hieronder beschrijft één benchmark: wat het meet, met welke parameters, en waarom die getallen zo gekozen zijn. Klap "view command" uit voor het exacte CLI-commando dat ik draai.

01 · llama-benchy closed-loop

Chat

Korte prompt, lang antwoord. De vorm die als normale chat moet aanvoelen, TTFT bepaalt of het "snappy" is.

pp (prompt) 1024 tg (gen) 1024 depth 0 concurrency 10 runs 3

De maatstaf voor "voelt het snappy aan?". Korte prompt vraagt weinig prefill, lange output stresst decode. Wat een gewone chat-message er voor de gebruiker uit ziet.

meet → tokens/sec · ttft p50
02 · llama-benchy closed-loop

RAG · 8k context

Middelgrote context, een paar documentchunks met antwoord van normale lengte. Toont prefill-kosten zonder de muur te raken.

pp (prompt) 8192 tg (gen) 512 depth 0 concurrency 10 runs 3

8k context is wat een typische RAG-pipeline aanbiedt, 4–8 chunks van een paar honderd tokens elk. Hier wordt prefill voelbaar maar nog niet pijnlijk.

meet → tokens/sec · ttft p50
03 · llama-benchy closed-loop

Lange output / agents

Korte instructie, veel output. Code-generation, rapporten of gestructureerde agent-output. Stress-test voor decode throughput.

pp (prompt) 256 tg (gen) 4096 depth 0 concurrency 10 runs 3

Dit is waar pure decode-throughput telt. Code-generation, JSON-rapporten, agent traces. Korte instructie, urenlange output.

meet → tokens/sec · ttft p50
04 · llama-benchy closed-loop

Grote context · 25k

Stress-test met grote prompts. Niet per se chatmateriaal, wel exact waar de prefill-muur zichtbaar wordt en TTFT instort.

pp (prompt) 25000 tg (gen) 256 depth 0 concurrency 10 runs 3

Bij 25k tokens zie je waar het model zijn prefill-budget opmaakt. TTFT springt vaak van honderden ms naar seconden. Belangrijk om te weten waar de muur staat.

meet → tokens/sec · ttft p50
05 · llama-benchy closed-loop

Multi-turn · kantoorwerk

Vijf beurten per gesprek, tien gesprekken parallel. Dicht bij hoe een team dit echt gebruikt, met groeiende context per turn.

pp (prompt) 2048 tg (gen) 512 depth 4 concurrency 10 runs 3

Realistischer dan single-shot: context groeit per turn, prefix-cache moet werken. Belangrijke check voor agent-flows en conversational apps.

meet → tokens/sec · ttft p50
06 · vllm bench serve open-loop

Realistische kantoor-baseline

Random dataset · 4000 tokens in, 500 tokens uit · request-rate 0.3, burstiness 0.7. Een rustig kantoor.

dataset random rate (req/s) 0,30 burstiness 0,7 prompts 200

Een rustig kantoor: paar mensen tegelijk, gemiddelde lengte. Als dit instort heb je een ander probleem dan welk model. Baseline voor alle open-loop tests.

meet → ttft p50/p95 · per-user tps
07 · vllm bench serve open-loop

Echte gesprekken · ShareGPT

ShareGPT V3 · gemiddeld 228 tokens per turn · natuurlijk variërend per gesprek. Wat real users doen, niet een synthetische random distributie.

dataset sharegpt v3 rate (req/s) 0,30 burstiness 0,7 prompts 250

Synthetische distributies zijn geen vervanging voor echte data. ShareGPT V3 heeft de natuurlijke spreiding van echte gesprekken, kort, lang, code, prozaïsch.

meet → ttft p50/p95 · per-user tps
08 · vllm bench serve open-loop

Maandagochtend-piek

Random · 4000 in / 500 uit · request-rate 1.5 req/s, burstiness 1.0, max 25 parallel. Wanneer iedereen tegelijk inlogt, zien we de queue groeien?

dataset random rate (req/s) 1,50 burstiness 1,0 prompts 300 max parallel 25

De vraag waar iedereen bang voor is: wat als alle 25 gebruikers tegelijk inloggen? Burstiness 1.0 + max-concurrency 25 simuleert dat moment.

meet → ttft p95/p99 · queue depth
09 · vllm bench serve open-loop

Reasoning workload

Lange chain-of-thought outputs · 1k in / 4k uit · trage rate (0.2 req/s) want elke request kost veel decode-budget. Test of TTFT stabiel blijft.

dataset random rate (req/s) 0,20 burstiness 1,0 prompts 50

Lange thinking-traces eten decode-budget. Trage rate (0.2 req/s) klinkt niet veel maar elke request kost 4k tokens output. Test of langlopende requests TTFT van nieuwe requests blijven blokkeren.

meet → ttft p50 · sustained tps
GPU
NVIDIA DGX Spark
128 GB unified · GB10 Blackwell · NVFP4 native
Server
vLLM 0.19 / 0.20
prefix caching uit · async scheduling per profiel-env
Quant
BF16 · FP8 · NVFP4
elk model in beschikbare precisies
OS
Ubuntu 24.04
CUDA 13.0 · Docker container per profiel
Warmup
3 runs / cijfer
gerapporteerd is mean ± stddev · seed 42

Alle commando's hierboven zijn copy-paste-baar. Geen verborgen flags, geen dataset-tweaks, geen seed-shopping.

Voor reproductie heb je nodig: een Spark (of vergelijkbare Blackwell-GPU met genoeg VRAM voor de checkpoints), vLLM 0.19+, en de twee benchmark-tools. De prompt-datasets zijn standaard vLLM-defaults: ShareGPT V3 voor open-loop, synthetic random voor de baselines.

Heb je een afwijkend resultaat? Dat is interessant. Laat het me weten. Vooral als je een ander platform gebruikt: het hele punt is om te zien waar Spark wel/niet matcht met andere setups.

  • Vaste seed (42) over alle runs
  • Identieke vLLM-versie per modelset
  • 3 runs gerapporteerd als mean ± stddev
  • Cijfers bij ±2% run-to-run
  • Geen prefix caching in default profiel
  • Geen latency-gate: alle modellen blijven zichtbaar, ranking op throughput + quality

Een model dat je
graag in de suite ziet?

Stuur een huggingface-link of vLLM-config. Als hij past op Spark draai ik 'm en publiceer ik de cijfers, gewoon, in dezelfde tabel.

Esc