// ai
Demerzel
Demerzel RC5
Inference Engine · NVIDIA · AMD · CPU
One engine for NVIDIA, AMD and plain CPUs. Measured head to head against llama.cpp, llama‑server, vLLM and Lemonade Server on the same machines, with the same model files and the same client.
Three stacks to tune — or one engine that tunes itself
The engines in these benchmarks are not used the same way. Each alternative needs extra pieces and hand‑set parameters that change with the model and the load. Demerzel is one server that measures the machine it lands on and adapts.
llama.cpp
- The engine is a library and command‑line tools; for a friendly experience people put Ollama on top.
- Serving many users at once is a separate program, llama‑server, sized by hand: slots, context, GPU layers, flash attention, batch sizes, threads.
- Several models: its router mode starts a separate child server per model, each with its own hand‑set preset.
- The right values differ per model, per machine and per expected load.
vLLM
- One model per server: several models means several instances, each given a fixed share of GPU memory.
- Serves only the model architectures and file formats it supports; in these tests it could not use the GGUF files the other engines read and ran the publishers’ own 4‑bit checkpoints instead.
- Memory share, sequence count and context length are set per deployment, and change with the model and the traffic.
- Minutes to start: 2–4.5 min on the DGX Spark, 6.4 min on the laptop CPU in these runs.
Demerzel
- One binary:
demerzel serve --model <file>. Single user or many, batching is built in. - At load it times its own kernels on the machine and model and keeps the fastest, then caches the choices; under traffic it adapts batching to the users arriving.
- NVIDIA, AMD and plain CPUs from the same engine; serving in seconds (3–26 s on the DGX Spark).
So Demerzel — the intelligent machine behind the Empire in Asimov’s novels — proves worthy of the name, adjusting live and immediately to the hardware, the load conditions and the model requested.
Real Hardware. Real Numbers.
Demerzel against llama.cpp, llama‑server, vLLM and AMD’s Lemonade Server on the same machines, the same model files and the same client. NVIDIA DGX Spark (GB10), a Ryzen 7 laptop CPU and two AMD RX 470 cards. Measured 30–31 October 2026; every figure is the mean of interleaved rounds. Demerzel’s DGX Spark figures re‑measured 2 November 2026 on the same harness as the engine improves; the other engines’ figures are from 30–31 October.
Serving 8 users on a DGX Spark, Demerzel delivers 35% to 67% more throughput than llama‑server on every model tested; against vLLM it is faster for a single user on 3 of 4 models and at 16 users on 2 of 4, compared on equal‑size 4‑bit files.
Serving on an NVIDIA DGX Spark (GB10, 128 GB)
Each engine serves the same OpenAI‑compatible streaming requests: distinct 82‑token prompts, 128 tokens generated greedily, no prompt cache. Bars show throughput for all users together, relative to llama‑server on the same file (1.0). vLLM cannot load GGUF files, so it runs the model maker’s own 4‑bit checkpoint (BF16 for Llama‑3.2‑1B); models with no vLLM bar have no vLLM checkpoint in this set.
Lemonade Server 2026.44.1 (AMD’s llama.cpp‑based server; its CUDA build, llama.cpp b11395) was measured on 3 of these files, tuned to 16 parallel slots, a 65,536‑token context and flash attention; its ratio is against Demerzel measured the same night. At 8 and 16 users Demerzel is 24%–67% ahead; for one user the two are within a few percent (108%, 96%, 99%). As shipped, Lemonade serves one request at a time (--parallel 1), so its throughput stays at the one‑user figure however many users wait.
| Model file | Prompt tok / users | vs Lemonade | Demerzel tok/s | Lemonade tuned | Lemonade as shipped | First token, ms Demerzel / Lemonade |
|---|---|---|---|---|---|---|
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 1 | 108% | 48.5 | 45.0 | 44.7 | 42 / 49 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 4 | 111% | 172.8 | 155.6 | 44.0 | 116 / 137 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 8 | 167% | 330.1 | 198.0 | 44.0 | 197 / 267 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 16 | 146% | 602.0 | 411.6 | 43.8 | 347 / 507 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 1 | 111% | 45.5 | 41.0 | 41.4 | 153 / 202 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 8 | 156% | 242.4 | 155.6 | 41.2 | 850 / 1,320 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 16 | 139% | 361.2 | 260.5 | 41.2 | 1,476 / 2,121 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 1 | 99% | 89.0 | 89.5 | 90.2 | 60 / 81 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 4 | 102% | 250.1 | 244.4 | 89.0 | 109 / 137 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 8 | 156% | 431.0 | 276.5 | 89.3 | 204 / 277 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 16 | 142% | 748.8 | 526.7 | 88.7 | 309 / 475 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 1 | 102% | 80.8 | 79.4 | 78.8 | 150 / 233 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 8 | 149% | 297.4 | 199.3 | 79.2 | 713 / 1,264 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 16 | 157% | 418.2 | 266.5 | 78.9 | 1,067 / 2,093 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 1 | 96% | 11.9 | 12.4 | 12.4 | 180 / 161 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 4 | 101% | 45.2 | 44.8 | 12.3 | 500 / 510 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 8 | 147% | 84.7 | 57.7 | 12.4 | 939 / 996 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 16 | 124% | 154.6 | 125.0 | 12.3 | 1,592 / 1,965 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 556 / 1 | 97% | 11.2 | 11.5 | 11.6 | 724 / 771 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 556 / 8 | 136% | 60.1 | 44.3 | 11.6 | 3,872 / 5,275 |
Aggregate tokens per second; green where Demerzel is ahead, red where it is behind. Time to first token is the median over requests. Lemonade columns: see the table above.
| Model file | Prompt tok / users | vs llama‑ server | vs vLLM | vs Lemonade | Demerzel tok/s | llama‑ server | vLLM | Lemonade | First token, ms Demerzel / llama / vLLM / Lemonade |
|---|---|---|---|---|---|---|---|---|---|
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 82 / 1 | 109% | 115% | — | 52.5 | 48.0 | 45.8 | — | 44 / 41 / 51 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 82 / 4 | 104% | 100% | — | 191.1 | 183.9 | 190.1 | — | 126 / 113 / 119 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 82 / 8 | 160% | 96% | — | 351.9 | 219.6 | 364.9 | — | 204 / 194 / 197 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 82 / 16 | 160% | 96% | — | 647.8 | 403.5 | 671.6 | — | 341 / 394 / 357 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 556 / 1 | 107% | 113% | — | 49.4 | 46.2 | 43.8 | — | 154 / 156 / 158 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 556 / 8 | 146% | 97% | — | 261.0 | 178.9 | 269.2 | — | 768 / 1,030 / 810 / — |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 556 / 16 | 138% | 96% | — | 387.4 | 280.1 | 403.0 | — | 1,349 / 1,592 / 1,360 / — |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 1 | 108% | 106% | 108% | 48.2 | 44.5 | 45.4 | 45.0 | 42 / 45 / 53 / 49 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 4 | 109% | 92% | 111% | 172.6 | 158.8 | 188.2 | 155.6 | 118 / 113 / 121 / 137 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 8 | 167% | 92% | 167% | 332.4 | 199.1 | 361.1 | 198.0 | 197 / 234 / 199 / 267 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 82 / 16 | 144% | 91% | 146% | 605.3 | 419.4 | 662.5 | 411.6 | 346 / 445 / 353 / 507 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 1 | 108% | 104% | 111% | 45.2 | 41.8 | 43.5 | 41.0 | 152 / 175 / 158 / 202 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 8 | 151% | 92% | 156% | 243.3 | 160.9 | 265.0 | 155.6 | 771 / 1,160 / 855 / 1,320 |
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 556 / 16 | 131% | 91% | 139% | 360.8 | 275.3 | 395.6 | 260.5 | 1,494 / 1,848 / 1,364 / 2,121 |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 82 / 1 | 114% | 329% | — | 237.8 | 208.2 | 72.2 | — | 9 / 13 / 20 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 82 / 4 | 101% | 203% | — | 693.2 | 683.8 | 341.5 | — | 23 / 29 / 38 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 82 / 8 | 151% | 175% | — | 1,176.3 | 778.4 | 672.5 | — | 39 / 69 / 43 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 82 / 16 | 146% | 148% | — | 1,947.5 | 1,333.5 | 1,314.8 | — | 66 / 124 / 57 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 556 / 1 | 117% | 311% | — | 222.3 | 190.1 | 71.5 | — | 30 / 38 / 29 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 556 / 8 | 132% | 143% | — | 861.5 | 654.0 | 603.0 | — | 138 / 204 / 125 / — |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 556 / 16 | 125% | 114% | — | 1,196.0 | 954.7 | 1,053.7 | — | 246 / 376 / 193 / — |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 1 | 106% | 109% | 99% | 89.7 | 84.3 | 82.2 | 89.5 | 60 / 82 / 56 / 81 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 4 | 97% | 112% | 102% | 249.4 | 256.1 | 222.5 | 244.4 | 120 / 142 / 97 / 137 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 8 | 148% | 107% | 156% | 419.8 | 283.6 | 391.4 | 276.5 | 255 / 272 / 147 / 277 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 82 / 16 | 131% | 111% | 142% | 722.0 | 550.8 | 651.5 | 526.7 | 383 / 442 / 212 / 475 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 1 | 106% | 102% | 102% | 80.0 | 75.2 | 78.2 | 79.4 | 173 / 221 / 102 / 233 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 8 | 135% | 90% | 149% | 273.8 | 202.8 | 304.6 | 199.3 | 927 / 1,169 / 457 / 1,264 |
| Qwen3‑30B‑A3BIQ4_XS GGUF (16.5 GB, bartowski) | 556 / 16 | 136% | 88% | 157% | 374.1 | 275.1 | 425.4 | 266.5 | 1,392 / 1,978 / 703 / 2,093 |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 82 / 1 | 106% | 107% | — | 88.0 | 82.7 | 82.2 | — | 79 / 85 / 56 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 82 / 4 | 120% | 108% | — | 241.2 | 200.5 | 222.5 | — | 133 / 137 / 97 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 82 / 8 | 135% | 91% | — | 356.6 | 264.5 | 391.4 | — | 223 / 266 / 147 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 82 / 16 | 104% | 77% | — | 500.9 | 481.1 | 651.5 | — | 350 / 438 / 212 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 556 / 1 | 107% | 99% | — | 77.7 | 72.5 | 78.2 | — | 191 / 235 / 102 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 556 / 8 | 151% | 88% | — | 267.6 | 177.4 | 304.6 | — | 803 / 1,264 / 457 / — |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 556 / 16 | 133% | 77% | — | 327.5 | 245.6 | 425.4 | — | 1,201 / 2,038 / 703 / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 82 / 1 | 102% | — | — | 67.3 | 66.2 | — | — | 88 / 105 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 82 / 4 | 102% | — | — | 200.1 | 196.1 | — | — | 145 / 167 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 82 / 8 | 155% | — | — | 348.1 | 224.9 | — | — | 229 / 310 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 82 / 16 | 110% | — | — | 529.9 | 480.1 | — | — | 357 / 512 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 556 / 1 | 102% | — | — | 60.5 | 59.2 | — | — | 207 / 277 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 556 / 8 | 141% | — | — | 208.5 | 147.7 | — | — | 859 / 1,514 / — / — |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 556 / 16 | 137% | — | — | 276.9 | 202.7 | — | — | 1,291 / 2,467 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 82 / 1 | 112% | — | — | 91.8 | 82.0 | — | — | 110 / 126 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 82 / 4 | 103% | — | — | 224.4 | 216.8 | — | — | 165 / 219 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 82 / 8 | 149% | — | — | 345.9 | 232.3 | — | — | 218 / 384 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 82 / 16 | 108% | — | — | 410.4 | 378.6 | — | — | 357 / 558 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 556 / 1 | 113% | — | — | 82.8 | 73.2 | — | — | 206 / 303 / — / — |
| Flint 40B‑A2.5BQ4_1 GGUF | 556 / 8 | 144% | — | — | 250.7 | 173.8 | — | — | 862 / 1,907 / — / — |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 1 | 100% | 100% | 96% | 12.0 | 12.0 | 12.0 | 12.4 | 198 / 147 / 179 / 161 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 4 | 98% | 95% | 101% | 45.3 | 46.2 | 47.5 | 44.8 | 504 / 455 / 473 / 510 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 8 | 147% | 93% | 147% | 84.8 | 57.6 | 91.0 | 57.7 | 941 / 988 / 815 / 996 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 82 / 16 | 120% | 93% | 124% | 154.6 | 129.2 | 165.8 | 125.0 | 1,590 / 1,818 / 1,524 / 1,965 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 556 / 1 | 102% | 99% | 97% | 11.3 | 11.1 | 11.4 | 11.5 | 725 / 714 / 605 / 771 |
| Qwen3‑32BIQ4_XS GGUF (17.7 GB, bartowski) | 556 / 8 | 134% | 90% | 136% | 60.2 | 45.0 | 66.5 | 44.3 | 3,832 / 4,775 / 3,046 / 5,275 |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 82 / 1 | 106% | 92% | — | 11.0 | 10.4 | 12.0 | — | 168 / 167 / 179 / — |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 82 / 4 | 104% | 85% | — | 40.2 | 38.5 | 47.5 | — | 508 / 460 / 473 / — |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 82 / 8 | 156% | 85% | — | 77.2 | 49.5 | 91.0 | — | 904 / 1,118 / 815 / — |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 82 / 16 | 123% | 84% | — | 138.8 | 113.3 | 165.8 | — | 1,889 / 2,082 / 1,524 / — |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 556 / 1 | 105% | 90% | — | 10.3 | 9.8 | 11.4 | — | 718 / 814 / 605 / — |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 556 / 8 | 138% | 81% | — | 53.7 | 39.0 | 66.5 | — | 4,417 / 5,397 / 3,046 / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 82 / 1 | 108% | — | — | 5.2 | 4.8 | — | — | 323 / 353 / — / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 82 / 4 | 103% | — | — | 19.4 | 18.9 | — | — | 1,093 / 834 / — / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 82 / 8 | 144% | — | — | 35.2 | 24.4 | — | — | 1,692 / 1,945 / — / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 82 / 16 | 107% | — | — | 60.0 | 56.0 | — | — | 3,350 / 3,835 / — / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 556 / 1 | 111% | — | — | 5.0 | 4.5 | — | — | 1,474 / 1,725 / — / — |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 556 / 8 | 132% | — | — | 25.4 | 19.2 | — | — | 8,955 / 11,324 / — / — |
One user, raw engine speed
Demerzel’s CUDA engine on a 540‑token prompt and a 128‑token generation, against llama‑bench pp512 / tg128 on the same GGUF file (flash attention on, all layers on the GPU).
| Model file | Prompt vs llama.cpp | Generate vs llama.cpp | Demerzel prompt tok/s | llama.cpp prompt | Demerzel generate tok/s | llama.cpp generate |
|---|---|---|---|---|---|---|
| Qwen2.5‑7BQ4_K_M GGUF (4.7 GB) | 110% | 106% | 4,297 | 3,903 | 49.2 | 46.4 |
| Qwen2.5‑7BIQ4_XS GGUF (4.2 GB) | 97% | 105% | 4,315 | 4,446 | 53.5 | 51.1 |
| Llama‑3.2‑1BQ4_K_M GGUF (0.8 GB) | 97% | 107% | 21,154 | 21,835 | 241.1 | 224.6 |
| Qwen3‑30B‑A3BQ4_K GGUF (18.6 GB) | 97% | 100% | 3,251 | 3,354 | 92.5 | 92.2 |
| Qwen3‑Coder‑30B‑A3BQ4_K_M GGUF | 111% | 97% | 2,908 | 2,619 | 70.8 | 72.8 |
| Flint 40B‑A2.5BQ4_1 GGUF | 113% | 104% | 2,857 | 2,524 | 102.1 | 98.3 |
| Qwen3‑32BQ4_K_M GGUF (19.8 GB, official) | 106% | 107% | 900 | 845 | 11.3 | 10.6 |
| Qwen3‑32BQ5_K_M GGUF (23.2 GB) | 93% | 102% | 724 | 780 | 9.4 | 9.2 |
| Hermes‑70BQ4_K_M GGUF (42.5 GB) | 96% | 108% | 371 | 385 | 5.3 | 4.9 |
CPU and AMD
Demerzel against llama.cpp with the GPU disabled on both sides, 8 threads, 2 interleaved rounds. Generation on this one‑memory‑channel laptop is bound by memory bandwidth for both engines.
| Model format | Prompt vs llama.cpp | Generate vs llama.cpp | Demerzel pp512 | llama.cpp pp512 | Demerzel tg128 | llama.cpp tg128 |
|---|---|---|---|---|---|---|
| Llama‑3.2‑3BQ4_K_M | 126% | 99% | 101.9 | 81.1 | 9.0 | 9.1 |
| Qwen2.5‑7BQ4_K_M | 132% | 100% | 46.0 | 34.8 | 4.2 | 4.2 |
| Llama‑3.2‑3BQ8_0 | 103% | 96% | 65.1 | 62.9 | 5.2 | 5.4 |
| Llama‑3.2‑3BF16 | 111% | 97% | 41.6 | 37.6 | 2.8 | 2.9 |
Same streaming client for every engine: a 553‑token prompt, 128 tokens generated, 1 user and 4 users. vLLM 0.32’s CPU build runs the BF16 weights, so the half‑precision rows compare like with like.
| Engine format | First token, s | Per token, ms | 4 users tok/s | Start‑ up, s |
|---|---|---|---|---|
| Demerzel Q4_K_M | 5.9 | 116 | 11.9 | 2 |
| llama‑server Q4_K_M | 7.4 | 117 | 10.8 | 4 |
| Demerzel Q8_0 | 9.9 | 192 | 7.8 | 2 |
| Demerzel F16 | 12.8 | 365 | 5.0 | 2 |
| llama‑server F16 | 14.9 | 350 | 4.7 | 4 |
| vLLM 0.32 CPU BF16 | 49.8 | 364 | 2.0 | 383 |
An eight‑year‑old GPU pair on a 2012 FX‑4300 host, model split across both cards. Demerzel against llama.cpp’s Vulkan build, 3 interleaved rounds.
| Model format | Prompt vs llama.cpp | Generate vs llama.cpp | Demerzel pp512 | llama.cpp pp512 | Demerzel tg128 | llama.cpp tg128 |
|---|---|---|---|---|---|---|
| Qwen2.5‑Coder‑7BQ4_K_M | 96% | 108% | 147.5 | 153.4 | 27.1 | 25.0 |
Many models, one server
20 users on Llama‑3.2‑1B and 2 users on Qwen3‑30B‑A3B at the same time, on one DGX Spark: the same streaming client and prompts for every engine (50‑word prompts, 256 tokens, greedy), both models warmed first, means of 2 interleaved rounds (31 October 2026). Demerzel serves both from one process and keeps tuning each model to the load and to the other model sharing the GPU; llama‑server’s router runs a child server per model; vLLM serves one model per instance.
| Engine | Demerzel is faster by (small / big model) | Llama‑1B 20 users tok/s | Qwen3‑30B‑A3B 2 users tok/s | First token, ms (small / big) | Ready s | Processes |
|---|---|---|---|---|---|---|
| Demerzelone server, both models | baseline | 903 | 102.7 | 101 / 100 | 12-31 | 1 |
| llama‑serverrouter mode: a child server per model | 1.57× 1.18× | 575 | 87.3 | 296 / 147 | 4-18 | 3 |
| vLLMtwo instances, one model each | 1.35× 1.40× | 667 | 73.1 | 241 / 120 | 367-390 | 2 |
Vision and video: Qwen3‑VL‑8B
Qwen3‑VL‑8B Instruct reading charts, photos and video clips on one DGX Spark, one user. Same OpenAI‑API requests to every engine (media sent inline, greedy decoding), 200 questions per dataset. Demerzel and llama.cpp run Qwen’s own 4‑bit GGUF (Q4_K_M) with its F16 vision projector; vLLM cannot load those files and runs the 4‑bit AWQ checkpoint. Video clips are 32 frames at 2 frames per second. First token is the median time to the first answer token. Bold marks the best value in each row. Per‑dataset detail for each size below.
| Qwen3‑VL‑8B, 1 user | Demerzel | llama.cpp | vLLM (AWQ 4‑bit) |
|---|---|---|---|
| ChartQA accuracy | 84.0% | 83.5% | 82.0% |
| RealWorldQA accuracy | 70.0% | 70.5% | 68.5% |
| MMMU accuracy | 50.5% | 51.5% | 52.5% |
| MMBench accuracy | 90.0% | 90.5% | 90.0% |
| MVBench (video) accuracy | 65.0% | 65.0% | 65.0% |
| First token, chart | 0.23 s | 0.33 s | 0.21 s |
| First token, photo | 0.62 s | 1.34 s | 0.60 s |
| First token, video | 1.27 s | 2.43 s | 1.03 s |
| Decode speed | — | — | — |
Qwen3‑VL in detail: 30B‑A3B, 8B and 4B
Qwen3‑VL 8B and 4B Instruct reading pictures and video clips on one DGX Spark. Every engine gets the same OpenAI‑API requests (images and clips sent inline, greedy decoding) over 200 questions per dataset. Demerzel, llama‑server and Lemonade Server run Qwen’s own 4‑bit GGUF (Q4_K_M) with its F16 vision projector; vLLM cannot load those files and runs the 4‑bit AWQ checkpoint. Video clips are 32 frames at 2 frames per second; vLLM’s container cannot decode H.264, so it reads near‑lossless MPEG‑4 copies of the same frames (Demerzel scores the same on both). Bold marks the best value in each row.
| Dataset | Demerzel accuracy | llama‑server accuracy | Lemonade accuracy | vLLM accuracy | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| RealWorldQA | 70.0% | 71.0% | — | 70.5% | 0.62 | 1.41 | — | 0.44 |
| MVBench (video) | 67.0% | 65.5% | — | 67.0% | 1.23 | 3.33 | — | 0.77 |
Generated tokens per second for all users together, and the mean time to first token (s), with 1 and 4 users asking at once.
| Input / users | Demerzel tok/s | llama‑server tok/s | Lemonade tok/s | vLLM tok/s | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| Chart / 1 | 83.5 | 72.3 | — | 72.5 | 0.23 | 0.35 | — | 0.18 |
| Chart / 4 | 147.3 | 121.7 | — | 161.4 | 0.58 | 1.36 | — | 0.27 |
| Photo / 1 | 67.9 | 49.9 | — | 64.4 | 0.73 | 1.76 | — | 0.50 |
| Photo / 4 | 120.5 | 82.1 | — | 144.4 | 1.53 | 5.51 | — | 0.92 |
| Video clip / 1 | 49.1 | 34.1 | — | 53.0 | 1.78 | 3.98 | — | 1.10 |
| Video clip / 4 | 84.6 | 51.4 | — | 116.9 | 2.83 | 12.07 | — | 1.26 |
| Dataset | Demerzel accuracy | llama‑server accuracy | Lemonade accuracy | vLLM accuracy | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| ChartQA | 84.0% | 83.5% | 82.0% | 82.0% | 0.23 | 0.33 | 0.35 | 0.21 |
| RealWorldQA | 70.0% | 70.5% | — | 68.5% | 0.62 | 1.34 | — | 0.60 |
| MMMU | 50.5% | 51.5% | — | 52.5% | 0.14 | 0.21 | — | 0.15 |
| MMBench | 90.0% | 90.5% | — | 90.0% | 0.11 | 0.15 | — | 0.11 |
| MVBench (video) | 65.0% | 65.0% | 64.5% | 65.0% | 1.27 | 2.43 | 2.52 | 1.03 |
Generated tokens per second for all users together, and the mean time to first token (s), with 1 and 4 users asking at once.
| Input / users | Demerzel tok/s | llama‑server tok/s | Lemonade tok/s | vLLM tok/s | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| Chart / 1 | 44.1 | 38.9 | 39.5 | 38.7 | 0.23 | 0.34 | 0.41 | 0.19 |
| Chart / 4 | 139.2 | 116.7 | 128.9 | 145.7 | 0.51 | 1.28 | 0.66 | 0.31 |
| Photo / 1 | 39.0 | 31.3 | — | 34.2 | 0.74 | 1.71 | — | 0.70 |
| Photo / 4 | 104.1 | 76.5 | — | 113.9 | 1.59 | 5.32 | — | 1.18 |
| Video clip / 1 | 31.5 | 25.7 | 29.4 | 29.0 | 1.83 | 3.10 | 2.30 | 1.54 |
| Video clip / 4 | 74.3 | 57.5 | 73.1 | 90.7 | 2.99 | 8.25 | 4.24 | 1.93 |
| Dataset | Demerzel accuracy | llama‑server accuracy | Lemonade accuracy | vLLM accuracy | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| ChartQA | 82.0% | 81.5% | 82.5% | 83.0% | 0.15 | 0.20 | 0.22 | 0.12 |
| RealWorldQA | 72.5% | 72.5% | — | 75.0% | 0.46 | 0.74 | — | 0.36 |
| MMMU | 49.5% | 50.0% | — | 48.5% | 0.09 | 0.14 | — | 0.09 |
| MMBench | 90.5% | 89.5% | — | 88.5% | 0.07 | 0.10 | — | 0.07 |
| MVBench (video) | 66.0% | 64.5% | 62.5% | 68.0% | 0.90 | 1.67 | 1.76 | 0.61 |
Generated tokens per second for all users together, and the mean time to first token (s), with 1 and 4 users asking at once.
| Input / users | Demerzel tok/s | llama‑server tok/s | Lemonade tok/s | vLLM tok/s | Demerzel first token | llama‑server first token | Lemonade first token | vLLM first token |
|---|---|---|---|---|---|---|---|---|
| Chart / 1 | 77.4 | 68.1 | 66.6 | 66.2 | 0.14 | 0.20 | 0.26 | 0.12 |
| Chart / 4 | 234.9 | 195.0 | 212.1 | 241.9 | 0.34 | 0.73 | 0.40 | 0.18 |
| Photo / 1 | 65.2 | 54.5 | — | 57.9 | 0.51 | 0.95 | — | 0.41 |
| Photo / 4 | 164.6 | 128.1 | — | 180.2 | 1.06 | 2.83 | — | 0.67 |
| Video clip / 1 | 49.8 | 40.8 | 46.0 | 46.6 | 1.27 | 2.02 | 1.57 | 0.95 |
| Video clip / 4 | 112.2 | 83.2 | 107.7 | 137.1 | 1.98 | 5.40 | 2.93 | 1.12 |
Video generation: Wan2.2
Wan2.2 TI2V‑5B turning text into video on one DGX Spark: the 16 VBench prompts, 832×480, 33 frames, 30 steps, guidance 5, shift 5, seed 42. Demerzel and diffusers use the UniPC sampler; stable‑diffusion.cpp offers Euler at the same 30 steps (the same number of model passes). Demerzel’s output matches the fp32 diffusers reference (cosine 0.99999 at Q8_0; VAE 70.8 dB PSNR). Times are per video with the model loaded. CLIPScore (ViT‑L/14, how well the frames match the prompt; higher is better) is scored on 8 evenly spaced frames of each video and averaged over the 16 videos.
| Engine weights | Seconds per video | Denoise s | VAE decode s | CLIPScore |
|---|---|---|---|---|
| DemerzelQ4_K_M GGUF | 49.5 | 35.2 | 14.2 | 24.14 |
| DemerzelQ8_0 GGUF | 49.5 | 35.2 | 14.2 | 23.68 |
| stable‑diffusion.cppQ4_K_M GGUF | 91.8 | 71.7 | 18.2 | 21.15 |
| stable‑diffusion.cppQ8_0 GGUF | 87.5 | 67.4 | 18.1 | 21.11 |
| diffusersbf16 | 74.2 | 59.8 | 14.5 | 21.71 |
| diffusersQ8_0 GGUF | 83.8 | 69.3 | 14.4 | 21.99 |
| diffusersQ4_K_M GGUF | 98.8 | 84.2 | 14.6 | 21.43 |
We already serve several AI engines in production on Demerzel while we fine‑tune it on new hardware — so this release candidate is actually in production today.
We keep the release candidate label instead of “final” while we tune the engine on new hardware, and keep fine‑tuning it on older hardware too.
Stay tuned.