Skip to main content
A benchmark pack answers three questions in YAML, and contains no code: what to run, which numbers to read, and how to run it by default. The thing that actually executes is a runner that ships with the SDK.

Layout

benchmark.yaml

benchmark.yaml

Fields

string
required
Leaf name. A published pack is referenced as <owner>.<name>; built-ins keep the bare name.
lm-eval | evalscope | rtl | judge | safety
required
Which harness executes the evaluation. See the table below.
string[]
required
The suite names the runner understands. For lm-eval these are its task names.
string
default:"general"
Dashboard grouping — math, code, knowledge, chinese, instruction, and so on.
mixed
Defaults for running it. batch_size defaults to auto, limit caps the number of samples. A user can override all of these at submission; what you declare is what happens when they do not.This is the point of the pack: nobody should have to remember that GSM8K wants 5-shot or that HumanEval needs --confirm_run_unsafe_code.
<owner>/<name>
Only read by the judge runner, and for that runner it is the benchmark’s definition. Swap the rubric and it is a different benchmark — which is why it is a declared field rather than a flag buried in extra_args that nobody can see from the catalog.

Metrics

Each entry says which number to pull out of the runner’s report and how to present it.
string
required
The raw metric name the runner emits, verbatim — exact_match,strict-match for lm-eval. This is the machine-facing name and it is not translatable.
string
What the dashboard column says. Defaults to key, which is fine for a machine and poor for a human.
higher | lower | neutral
default:"higher"
Which way is better. The comparison view colours regressions by this.
bool
default:"true"
Whether the value is a 0–1 proportion, so the dashboard renders it as a percentage.
bool
default:"false"
The metric cross-run comparison defaults to. Exactly one should be primary; if none is, the first is used.
Declare more than one metric where the difference between them is diagnostic. GSM8K’s strict and flexible matches are the standard example: a low strict score with a high flexible score means the model can do the arithmetic but is not formatting the answer as asked — a prompt problem, not a capability problem. One number would hide that.

The five runners

lm-eval and evalscope decide correctness with a rule — an exact match, a parsed answer. judge and safety decide it with a rubric your team wrote. The platform supplies neither the suite’s policy nor the rubric’s content for the last two: both belong to the deployment, and a built-in would be the platform declaring a verdict it has no standing to declare.

Bilingual display copy

Write the manifest in English and carry translations in an i18n: block, at the pack level and per metric:
Only display copy is translatable. The id, the suites and the metric keys are the contract and must read the same in every language.

Confirm it worked

Scores land on the console’s Benchmarks page, in the same matrix as every built-in benchmark, so your pack’s numbers are directly comparable with GSM8K and MMLU on the same run.

Externally scored benchmarks

When the scoring happens somewhere the platform cannot reach — a licensed harness, a physical test rig — report the numbers back instead of running them here:
The scores enter the same matrix and are labelled as externally produced. See running benchmarks for the workflow around it.

What ships built in

gsm8k, math, humaneval, mmlu, ceval, ifeval, plus the RTL packs (rtl-repo, rtllm-v2, verilogeval-v2, verilogeval-v2-completion, cvdp). Those axes are chosen deliberately: math, code, knowledge regression, Chinese, and instruction following. Post-training most often improves one thing while quietly breaking another, and the point of running several is to make that visible on one screen.