Local Inference

← Benchmarks

How it's measured

Every number on this site comes from a scripted run on one machine. This page explains what each run does, what the numbers mean, and what they don't cover.

The machine

Chat benchmark (all engines)

Every config, on every engine, answers the same chat requests through its own HTTP API, the way a chat client talks to it. These are the numbers to compare across engines.

Protocol and prompts adapted from syv-ai/qwen38-27b-rtx3090 (Apache-2.0).

Speed by context depth (llama-bench)

llama.cpp configs also run llama.cpp's own benchmark tool, llama-bench, directly on the GPU with no server in the loop. It shows how speed changes as the context fills, which the chat benchmark doesn't. By default each config is tested with:

Every setting is explicit

Each config's exact launch command is on its model page. Settings that an engine would otherwise pick for itself are always pinned. For llama.cpp: --fit off, parallel slots (-np), --cache-ram 0, flash attention, KV-cache precision, batch and micro-batch size, CPU threads, MoE expert offload (-ncmoe) and how weights are loaded. For vLLM: context length, KV-cache pool size, request slots, speculative decoding and prefix caching, with the serving scripts pinned to one commit.

A benchmark never chooses how a model samples: those fields are stripped from every request, so what runs is what the config was launched with. Each run records that setting as the server reports it. llama.cpp is asked directly; vLLM does not expose it, so its record comes from the model's own generation config plus any override in the launch.

Configs are hash-locked: changing any setting creates a new config instead of quietly rewriting published results.

A clean GPU for every run

Before a run starts, the lab takes an exclusive lock on the GPU, stops the chat model this machine hosts, and waits until less than 300 MiB of VRAM is in use and the GPU has cooled to 45 °C or below. The chat model restarts when the run ends, even if the run fails.

Power and efficiency

Capability evals

Speed alone doesn't say whether a model can do the work, so each config is also scored on what it solves. Every benchmark runs against the config's own server, with its own settings, and reports the percent of tasks solved with a standard error.

The thinking allowance

Speed matters here because it buys reasoning, not because a fast answer is worth more. Each task gives a config a token budget instead of a stopwatch: what it could generate within the time limit at its own measured speed, after reading the prompt.

The coding-work score

Throttling

A run is flagged as throttled if the GPU reports hardware slowdown, thermal slowdown or a hardware power brake at any point. Running into the card's configured power limit is expected and doesn't count. Throttled runs stay visible with a tag, but they never feed the headline numbers.

Reproducibility

Every run records a hardware snapshot (GPU, driver, CUDA, power limit, CPU, RAM and kernel), the engine build (the llama.cpp commit, or the vLLM version with the serving scripts' commit and patches), and the exact command. Each run has its own page with everything that was published, including the benchmark settings and a telemetry summary.

What these numbers don't show