LexiSuite Docs

Benchmarks: LexiEngine against llama.cpp, and how to reproduce it

LexiEngine is measured against the newest llama.cpp release on the same card, with the same model file and the same settings, every time the engine changes. This page has the current results, the cases where llama.cpp is still ahead, the older results, and the method.

Current results (November 13, 2026)

LexiEngine version 5db82d6 against llama.cpp b12318 (Vulkan, flash attention on the RX 7900 XTX; CUDA on the RTX 2060). One Radeon RX 7900 XTX (24 GB) capped at 291 W and one RTX 2060 (6 GB) in an Intel i7-9700 desktop on Linux 7.3, nothing else running beside any run, one slot, greedy. Generation is tokens per second after the first token.

Qwen3.8 27B Q4_K_M, 262,144-token context, 4-bit K/V cache, draft-head speculation on both engines

This is one fixed configuration, the one the model is served with every day (batch 2048/512, at most 2 drafted tokens). Every engine change is measured in this table before and after.

Prompt tokens Generation, LexiEngine Generation, llama.cpp Prompt processing, LexiEngine Prompt processing, llama.cpp
62 76.5 tok/s 64.9 tok/s
76 (256-token answer) 75.4 tok/s 63.3 tok/s
3,631 71.7 tok/s 57.2 tok/s 905 tok/s 704 tok/s
33,002 70.2 tok/s 55.8 tok/s 769 tok/s 601 tok/s
133,561 50.8 tok/s device lost 491 tok/s
253,291 40.2 tok/s not reachable 336 tok/s

One request per row. llama.cpp b12318 lost its Vulkan device (vk::DeviceLostError) while reading the 133,561-token prompt, at 88,000 tokens in the first attempt and 113,000 in the second. LexiEngine read both deep prompts on every attempt. The version before this one (3db31f8) generated at the same speeds and read these prompts at 660, 581, 404 and 293 tok/s.

Default settings: three models, both cards

4,096-token context, each engine's defaults, no speculation; prompts of about 50, 580 and 3,600 tokens.

Card, model Measure LexiEngine llama.cpp b12318
RX 7900 XTX, Qwythos 9B Q4_K_M Generation 124 / 118 / 115 tok/s 108 / 107 / 105
Prompt processing, 580 / 3,619 tokens 2,311 / 2,877 tok/s 1,374 / 2,338
RX 7900 XTX, DeepSeek-V2-Lite Q4_K_M Generation 219 / 209 / 169 tok/s 194 / 230 / 186
Prompt processing, 547 / 3,586 tokens 3,721 / 4,290 tok/s 1,968 / 4,127
RX 7900 XTX, Gemma 4 E4B Q4_K_M Generation 135 / 129 / 125 tok/s 137 / 133 / 129
Prompt processing, 556 / 3,595 tokens 1,870 / 2,313 tok/s 1,835 / 2,763
RTX 2060, Qwythos 9B Q4_K_M Generation 44.6 / 43.6 / 36.5 tok/s 49.7 / 49.2 / 48.1
Prompt processing, 580 / 3,619 tokens 242 / 220 tok/s 1,007 / 1,199
RTX 2060, Gemma 4 E4B Q4_K_M Generation 67.8 / 64.0 / 62.9 tok/s 69.6 / 70.0 / 67.5
Prompt processing, 556 / 3,595 tokens 1,144 / 1,223 tok/s 2,551 / 2,897

Where llama.cpp is ahead: Gemma 4 on both cards, longer DeepSeek generation, and prompt processing on the RTX 2060, where LexiEngine is at about a quarter of llama.cpp's speed on a 9B model after tripling in this version. After a long prompt LexiEngine also holds more video memory on the default path (Gemma 4 on the RX 7900 XTX: 11.4 GB against 3.2 GB). These are the current engine work.

With the 27B's draft head on and the same settings on both engines at a 4,096-token context, LexiEngine generates at 82.6 / 74.4 / 59.1 tok/s against llama.cpp's 68.2 / 66.0 / 61.0, and its text with the draft head on is identical to its text with it off.

Results of November 10, 2026

LexiEngine as of November 10, 2026 against llama.cpp b12230 (Vulkan, flash attention). One Radeon RX 7900 XTX (24 GB) capped at 291 W in an Intel i7-9700 desktop on Linux 7.3, the host's own install, nothing else running beside any run, one slot. Both engines are started with the same context length, cache type, sampling and speculation settings. Generation is tokens per second after the first token; prompt processing is prompt tokens divided by the time to the first token.

Qwen3.8 27B Q4_K_M, 240,128-token context, draft-head speculation on both engines

Prompt tokens Generation, LexiEngine Generation, llama.cpp Prompt processing, LexiEngine Prompt processing, llama.cpp
78 61.8 tok/s 53.1 tok/s
3,630 74.9 tok/s 63.2 tok/s 878 tok/s 783 tok/s
68,121 56.4 tok/s 44.3 tok/s 637 tok/s 496 tok/s
138,388 48.9 tok/s device lost 476 tok/s
231,290 42.2 tok/s not reachable 353 tok/s

Short and 3,600-token rows are the median of three requests; the deeper rows are one request each. llama.cpp b12230 rows were measured on 11/09/2026 with the same harness and settings.

llama.cpp b12230 lost its Vulkan device (vk::DeviceLostError) on the 138,000-token prompt in three of three attempts, so it has no result at that depth or beyond. LexiEngine completed every case, including a 231,000-token prompt.

A 9B Qwen3.5-family model (Qwythos 9B Q4_K_M), 524,288-token context, no speculation

Prompt tokens Generation, LexiEngine Generation, llama.cpp Prompt processing, LexiEngine Prompt processing, llama.cpp
68 112.6 tok/s 107.5 tok/s
3,617 109.9 tok/s 105.3 tok/s 2,604 tok/s 2,682 tok/s
68,110 93.9 tok/s 82.8 tok/s 1,974 tok/s 1,645 tok/s
138,378 83.2 tok/s 66.9 tok/s 1,497 tok/s 1,035 tok/s
258,510 68.3 tok/s 50.2 tok/s 1,059 tok/s 616 tok/s
508,879 49.9 tok/s 33.8 tok/s 656 tok/s 339 tok/s

Short and 3,600-token rows are the median of three requests; the deeper rows are one request each. llama.cpp b12230 rows were measured earlier on 11/10/2026 with the same harness and settings.

LexiEngine is ahead at every depth, and the lead grows with depth.

DeepSeek-V2-Lite-Chat Q4_K_M, 16,384-token context, greedy

Prompt tokens Generation, LexiEngine Generation, llama.cpp First token, LexiEngine First token, llama.cpp
20 215.6 tok/s 245.6 tok/s 0.05 s 0.05 s
139 213.7 tok/s 241.2 tok/s 0.04 s 0.07 s
802 204.9 tok/s 229.3 tok/s 0.16 s 0.15 s
3,572 168.1 tok/s 187.0 tok/s 0.66 s 0.57 s
8,685 169.5 tok/s 138.1 tok/s 1.58 s 1.31 s
14,243 159.0 tok/s 110.1 tok/s 2.34 s 1.82 s

One run per prompt on each engine, in the order shown; each prompt extends the one before it and both engines keep the shared prefix, so first-token times cover only the new part of each prompt.

On November 9 this model processed prompts at 134 tok/s on LexiEngine. It now runs batched prompt passes on the GPU's matrix cores, keeps the previous request's shared prefix, and from 4,096 tokens of context reads a compact 16-bit latent cache instead of the expanded keys and values. llama.cpp is still about 14% ahead in generation on short prompts.

Where llama.cpp is ahead

Earlier results

These used older engine builds and older llama.cpp releases. They are kept as history and are not the current state.

Qwen3.8 27B at a 131,072-token context (November 6–7, 2026)

The supplied benchmark record uses an earlier LexiEngine build, llama.cpp b12180 (Vulkan, flash attention), Qwen3.8 27B, and a Radeon RX 7900 XTX capped at 291 W. Host: Intel i7-9700, Linux 7.3, running on the host's own install — not the USB image. Both engines use Q4_1 KV cache, 131,072-token context, one slot, idle machine, no cache reuse, and a fresh random prefix per prompt. Values are medians of three runs except the long 68k row, which had one request and should not be treated as a three-run median.

Generation, tokens per second after the first token

Numbers per cell are in short / 3.6k / 21k / 68k context-length order.

Model quantization and mode LexiEngine llama.cpp b12180 Reported advantage
IQ4_XS, no MTP 50.4 / 48.1 / 46.6 / 42.0 42.8 / 41.2 / 38.7 / 33.8 17%–24%
IQ4_XS, MTP 79.2 / 82.4 / 77.1 / 65.0 68.6 / 78.6 / 65.7 / 55.7 5%–17%
Q4_K_M, no MTP 42.9 / 41.4 / 39.9 / 36.5 38.2 / 36.6 / 34.8 / 30.8 12%–18%
Q4_K_M, MTP 71.1 / 75.3 / 70.7 / 56.9 66.1 / 70.3 / 56.9 / 45.6 7%–25%

MTP is draft-head speculative decoding. Do not compare an MTP-on row with MTP-off, even on the same model. In the later source README, an alternative Q4_K_M MTP short-prompt table reflects a different engine build. The table here follows the supplied current benchmark record (context/BENCHMARKS.md) rather than merging runs from different builds.

Prompt processing, tokens per second

Each cell lists 3.6k / 21k / 68k prompt-length results.

Quantization LexiEngine llama.cpp b12180
IQ4_XS 920 / 854 / 661 872 / 782 / 542
Q4_K_M 875 / 814 / 638 817 / 741 / 522

These prompt-throughput values are not generation rates and should not be presented as such. Performance under a different driver, accelerator, processor, thermal state or model quantization is unmeasured by this table.

Smaller model on the USB appliance (November 4, 2026)

A second RX 7900 XTX with Ryzen 9 5900X, LexiOS on Linux 7.3 booted from USB, ran Qwen3 1.7B Q4_K_M on both engines: 8,192-token context, f16 KV cache, one slot, 256 generated tokens, three repetitions, llama.cpp b12090. The range below is the observed variation, not an uncertainty interval.

Metric LexiEngine llama.cpp b12090
Short-prompt generation 257–264 tok/s 342–344 tok/s
3,586-token-prompt generation 236–237 tok/s 294–295 tok/s
Time to first token, 3,586-token prompt 0.84–0.90 s 0.59–0.63 s
Time to first token, short prompt 0.04 s 0.16–0.20 s

On this small-model generation workload, llama.cpp was 25%–30% faster. A different first-token result does not erase that generation gap. Results cannot be extrapolated from 1.7B to 27B.

Method to reproduce a fair measurement

  1. Record provenance first. Save model identity and content hash, GGUF quantization, engine build, backend and driver, kernel, CPU/GPU, power cap, free memory, KV-cache type, context, batch/slot count, sampling, MTP state and installed settings. If any differ, treat it as a different experiment.
  2. Keep the machine idle and let thermal conditions stabilize. Close other GPU or CPU loads; note power and thermal policy. Do not mix benchmarks during maintenance, updates or background model downloads.
  3. Use identical requests and generated-token limits. Test short, approximately 3.6k, 21k and — if memory supports it — 68k-context inputs. Use a new random prompt prefix for each request to prevent cache reuse; label approximate lengths with their actual token counts. Align draft-head speculation on both sides before comparison.
  4. Repeat at least three times per routine test and record each run. Use the median, not the best result. For a one-run long-context measurement, label the result single-run instead of implying statistical confidence.
  5. Separate metrics: (a) time to first token in seconds, (b) prompt processing in tok/s, (c) generation in tok/s excluding the first-token delay. Never compare incompatible denominators.
  6. Assess noise and stability. Track per-run values, warm/cold behavior, variance, memory/power state and failure count. Calculate noise bands/confidence intervals from replicates where possible; do not claim statistical significance with three or fewer observations by default. Reproduce any changed result before accepting an optimization.
  7. Check output quality with matched prompts, held-out evaluations, perplexity/KLD where supported, and deterministic sampling where possible. Speed gained by changing output or truncating work is not a like-for-like win.
  8. Export a complete evidence record and compare through Bench and Evaluate, including device/context depth curves and quality gates; never substitute self-reported peaks for representative median trials.

Bench/Panel workflow

Controls and interpretation

Control / measurement What it does
Bench / Evaluate Runs or reviews performance and held-out quality checks; compare only matching model and hardware conditions.
Optimizer Searches parameters with measured noise margins; candidate improvements require repeatability.
Power cap Limits device power; altering it invalidates direct comparison with results recorded under another cap.
MTP on/off Enables/disables draft-head token proposals; changing it changes the workload and measurement.
KV-cache / context / slots Changes memory use and compute depth; keep all three fixed when comparing engines.
TTFT / prefill / decode rates Measure distinct phases; do not combine or conflate their units.

See Hardware, Security and Release Notes.