Skip to main content
一个 benchmark 包用 YAML 回答三个问题,且不含任何代码:跑什么读哪些数默认怎么跑。 真正执行的是随 SDK 发版的 runner。

目录结构

benchmark.yaml

benchmark.yaml

字段

string
必填
叶子名。已发布的包引用形式是 <owner>.<name>;内置的保持裸名。
lm-eval | evalscope | rtl | judge | safety
必填
哪个 harness 执行评测。见下表。
string[]
必填
runner 认识的 suite 名。对 lm-eval 来说就是它的 task 名。
string
默认值:"general"
看板分区——mathcodeknowledgechineseinstruction 等。
mixed
跑它的默认参数。batch_size 默认 autolimit 限制样本数。用户提交时都能覆盖; 你声明的是「不加任何参数时该是什么」。这正是包存在的意义:不该有人需要记住 GSM8K 要 5-shot,或者 HumanEval 需要 --confirm_run_unsafe_code
<owner>/<name>
只有 judge runner 读它,而对那个 runner 来说它就是这个 benchmark 的定义。 换个 rubric 就是另一个 benchmark——所以它是一个声明字段, 而不是埋在 extra_args 里、从 catalog 上看不见的一个 flag。

指标

每一条说明从 runner 的报告里取哪个数、怎么呈现它。
string
必填
runner 产出的原始 metric 名,一字不差——lm-eval 的 exact_match,strict-match。 这是给机器看的名字,不可翻译。
string
看板列头显示什么。默认取 key——那对机器够用,对人不够。
higher | lower | neutral
默认值:"higher"
哪个方向算好。对比视图据此给回退上色。
bool
默认值:"true"
值是不是 0–1 的占比,决定看板按不按百分比渲染。
bool
默认值:"false"
跨 run 对比默认看的那个指标。应当恰好有一个是 primary;一个都没有时取第一个。
当两个指标之间的差本身有诊断价值时,就都声明出来。GSM8K 的严格与宽松匹配是标准例子: 严格分低而宽松分高,说明模型会算,但输出格式没按要求来——那是 prompt 问题,不是能力问题。 只留一个数就把这件事藏起来了。

五个 runner

lm-evalevalscope 用规则判对错——精确匹配、解析答案。judgesafety 用你的团队写的 rubric 判。后两者的 suite 策略和 rubric 内容平台都不提供: 它们属于部署方,平台内置任何一个都等于替别人下了一个它没资格下的结论。

双语展示文案

manifest 用英文写,翻译放 i18n: 块——包级和每个 metric 上都可以:
只有展示文案可翻译。id、suites 和 metric key 是契约,任何语言下都必须一致。

确认成功

分数落在控制台的 Benchmarks 页,和所有内置基准在同一个矩阵里, 所以同一个 run 上你的分数可以和 GSM8K、MMLU 直接比较。

在外部打分的基准

打分发生在平台够不到的地方时——有授权限制的 harness、真实的测试台架—— 不要在这里跑,把分数报回来:
分数进同一个矩阵,并标记为外部产生。围绕它的完整流程见运行评测

内置了哪些

gsm8kmathhumanevalmmlucevalifeval,以及 RTL 系列 (rtl-reportllm-v2verilogeval-v2verilogeval-v2-completioncvdp)。 这几个轴是刻意挑的:数学、代码、知识回退、中文、指令遵循。 后训练最常见的情况是「改好了一个,悄悄弄坏了另一个」, 同时跑好几个的意义就是让这件事在一屏之内可见。