github ↗

Measured, losses included.

How Raven compares with the fastest stacks we know, on the workloads the road to 1.0 is judged by. Each section names its machine, the versions compared and the commit measured, and the benchmark code is in the repository.

01 — the goal post

JIT-compiled gpt-oss, at least as fast as four baselines.

Beta 1's goal post, JIT compilation on GPU, is met. The next goal post on the road to 1.0: gpt-oss-20b, compiled by Rune.jit, at least as fast as tinygrad, JAX, llama.cpp and vLLM on NVIDIA (through CUDA and through NVIDIA's kernel driver directly) and on AMD. We are not there yet, and this table is where we track it.

Goal post: gpt-oss-20b decode against each baseline
as fast asNVIDIA · CUDANVIDIA · NV (no CUDA runtime)AMD
llama.cppbehinddecode 10.2 against 6.83 ms (b12032)behinddecode 12.0 against 6.83 ms (bench median; 10.7 ms of GPU time)behinddecode 12.7 against 10.38 ms (b12048, Vulkan)
tinygradnot measured—not measured—blockedtinygrad needs Resizable BAR on this machine
JAXnot measured—not measured—not measured—
vLLMnot measured—not measured—not measured—

gpt-oss-20b, decode at position 512. Every cell is behind or not yet measured; the goal is met when the whole table reads “as fast or faster”.

02 — measured · 2026-11

gpt-oss-20b on an NVIDIA RTX 5000 Ada.

  • Decode, position 512 of a 1,024 cacheraven 1.5× slower
    raven10.2 ms
    llama.cpp6.83 ms
  • Decode, with Q8_0 attention and headraven 1.2× slower
    raven8.1–8.3 ms
    llama.cpp6.83 ms
  • Prefill, 512 tokensraven 2.2× slower
    raven122 ms
    llama.cpp56.0 ms
  • First call (kernels cached)raven 5.1× slower
    raven0.37–0.39 s
    llama.cpp75 ms
gpt-oss-20b on an RTX 5000 Ada
measurementraven · CUDAraven · NVllama.cpp · CUDA
Decode, position 512 of a 1,024 cache10.2 ms12.0 ms (bench median; 10.7 ms GPU time)6.83 ms
Decode, Q8_0 attention and head8.1–8.3 msnot measured—
Prefill, 512 tokens122 msnot measured again56.0 ms
First call, kernels cached0.37–0.39 s0.37–0.54 s75 ms

Machine “fudge”, under load. raven at 8ef1902f3 (decode), f2af3251b (Q8_0), 4e23903949 (prefill, least of 4 rounds), c29acaee3 (first call); NV at 31aa4521b. llama.cpp's first call has no warmup (59–151 ms).

03 — measured · 2026-11

gpt-oss-20b on an AMD Radeon AI PRO R9700.

  • Decode, position 512raven 1.2× slower
    raven12.7 ms
    llama.cpp10.38 ms
  • Prefill, 512 tokensraven 1.4× slower
    raven0.418 s
    llama.cpp0.308 s
  • First call (kernels cached)raven 2.4× slower
    raven0.30–0.34 s
    llama.cpp0.136 s

where decode's time goes

Expert products take 5.4 ms at 212–254 GB/s, against llama.cpp's 3.0. Top-k's 20-kernel sort and about 37 small kernels a layer take about 1.5 ms; the argmax over the logits 0.63 ms.

where prefill's time goes

Expert products take 326 ms on WMMA at 7–8 TFLOPS, against 177. The out projection takes no WMMA: 52 ms, against q's 10.

Machine “nonnormal” (gfx1201) at 502431b668; attention on WMMA. First call: 1.03 s when compiling kernels, of which lowering and linking the first block take 69–131 ms on the host; llama.cpp 2.19 s without Mesa's shader cache. llama.cpp's ROCm build needs HIP libraries this machine lacks.

04 — measured · 2026-10-11

The GPU runtime: rig against PyTorch, JAX and tinygrad.

rig against PyTorch, JAX and tinygrad
measurementrig: own driver / CUDAPyTorchJAXtinygrad: own driver / CUDA
Install size, NVIDIA7.6 / 115 MiB5,458 MiB5,774 MiB461 / 496 MiB
Install size, AMD7.6 MiB15,045 MiB——
Time to first result, NVIDIA70 / 134 ms720 ms538 ms336 / 279 ms
Time to first result, AMD53 ms1,106 ms——
Time per launch, NVIDIA2.1 / 3.2 µs7.7 µs28.9 µs511 / 447 µs
Time per launch, AMD4.9 µs8.1 µs——
Load a 256 MiB file, NVIDIA (a loss to PyTorch)46.0 / 49.3 ms32.9 ms169.4 ms62.0 / 99.9 ms
Load a 256 MiB file, AMD38.9 ms215.9 ms——

Medians of release builds, 2026-10-11. NVIDIA: an RTX 5000 Ada, where rig and tinygrad run through their own driver and through CUDA. AMD: a Radeon AI PRO R9700, where PyTorch is the only framework run. Kernels precompiled: compiling them at run time loads NVRTC or comgr. “—”: not run on that machine.

05 — measured · 2026-11-03

Tokenization: brot against gigatoken and HF tokenizers.

brot tokenization throughput
OpenWebText, one threadbrotreference
GPT-2 (a loss)474.4 MB/s816.6 MB/s · gigatoken
LLaMA190.1 MB/s71.4 MB/s · gigatoken
Mistral203.5 MB/s145.4 MB/s · gigatoken
BERT-base62.7 MB/s2.7 MB/s · HF tokenizers

Machine “fudge” (Intel Core Ultra 5 235), shared. brot at f988690df; gigatoken at cd5ee648c6 (0.11.0); tokenizers 0.23.3. gigatoken refuses WordPiece, so BERT-base runs against HF tokenizers.

06 — measured · 2026-11

Dataframes: talon against DuckDB and Polars.

talon against the faster of DuckDB and Polars
workloadtalon, against the faster baseline
Decision support, SF1 (22 queries)6.6× slower (geomean)
H2O group-by, 10⁷ rows2.1× slower
H2O joins2.0× slower

Against the faster of DuckDB 1.5.6 and Polars 1.44.2, at 9b82c5b57a, under load. talon uses 3–10× the CPU.

from doc/performance.mdedit ↗