README rewritten in evalscope style (numbered flow, code-first, 289->190 lines); config entry points: --hf-endpoint flag, ckpt follows cache root, EVALHARNESS_DOCKER_MIRRORS override

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
sora 2026-09-10 07:27:19 +00:00
parent 07bc56f423
commit 9991c15816
3 changed files with 111 additions and 200 deletions

298
README.md
View File

@ -1,35 +1,30 @@
# EvalHarness # EvalHarness
**插件式 LLM / Agent 评测框架。** 28 个主流 benchmark 开箱即用:官方口径的 prompt 模板与判分器、 插件式 LLM/Agent 评测框架28 个 benchmark 开箱即用,官方口径 prompt 与判分,任意 OpenAI 兼容端点,断点续跑。
任意 OpenAI 兼容推理端点、断点续跑、沙箱化代码执行 —— 每一层都可以用单文件插件扩展。
``` ```
你只需提供: 一个 OpenAI 兼容端点vLLM / SGLang / lmdeploy / ollama / 云 API 提供端点 → 拉数据 → 渲染官方 prompt → 并发生成 → 官方判分 → 报告
框架完成: 拉取数据 → 渲染官方 prompt → 并发生成 → 官方口径判分 → 产出报告
``` ```
## 核心特性 ## 0. Benchmarks
- **28 个内置 benchmark** —— 数学、知识/选择题、问答、长上下文、代码执行、agent 工具调用, | 族 | benchmark |
全部对接官方数据源注册。 |---|---|
- **官方口径评测** —— prompt 模板、few-shot 范例渲染(含按科目域匹配选范例)、判分器全部复刻 | 数学 | `gsm8k` `competition_math` `aime24/25/26` `hmmt26` `imo_answerbench` |
官方实现:数学用 PRM800K sympy 等价、DROP 用匈牙利对齐、SimpleQA 用官方 A/B/C judge 协议、 | 知识/选择题 | `mmlu` `mmlu_pro` `cmmlu` `gpqa_diamond` `arc` `hellaswag` `winogrande` `bbh` |
BFCL 用官方 AST 判定、代码题在 docker 沙箱执行。已在 Qwen3-8B 与 DeepSeek-V4-Flash 上 | 问答 | `trivia_qa` `drop` `simple_qa` `hle` |
与 evalscope 逐题对齐[验证](#对齐验证)。 | 长上下文 | `longbench_v2` `openai_mrcr` |
- **任意推理栈** —— 单端点或端点池轮询分发、自适应并发AIMD、坏端点冷却、自动 failover。 | 代码Docker 沙箱) | `humaneval` `bigcodebench` `live_code_bench` |
- **可断点、抗抖动** —— 每条预测完成即落盘,中断重跑只补缺失样本;分钟级断网靠分层重试扛过 | Agent/工具 | `bfcl_v3` `general_fc` `tau2_bench` `swe_bench_verified` |
而不丢批次。
- **换判分器不用重新生成** —— 原始预测是不可变 artifact改 recipe、换 grader 直接对存量输出
重新判分,模型永不被重复调用。
- **万物皆插件** —— 数据集、prompt 渲染器、抽取器、判分器、聚合器、recipe、模型适配器、沙箱、
agent 环境,全部 `@register_*` 单文件注册,没有需要修改的中央清单。
- **评测 agent 而非扮演 agent** —— 被测模型负责思考;框架只把它的 tool_calls 交给 `Environment`
插件执行并回灌观察,全程记录轨迹。
## 安装 ```bash
evalharness data list # 28 个数据集:源/子集/few-shot/split
evalharness eval list # 28 个判分 recipe
```
要求 Python ≥ 3.10,一条命令装完即可跑全部 28 个 benchmark无任何可选依赖 ## 1. 安装
(代码执行类需要宿主机有 Docker镜像判分时自动拉取
Python ≥ 3.10;代码执行类 benchmark 需宿主机 Docker镜像判分时自动拉取
```bash ```bash
git clone https://git.meta-stone.net/sora/EvalHarness.git git clone https://git.meta-stone.net/sora/EvalHarness.git
@ -39,74 +34,26 @@ conda activate evalharness
pip install . pip install .
``` ```
离线验证安装(不需要模型、不联网 离线自检(不联网、不接模型,应得 acc 100%
```bash ```bash
evalharness eval run gsm8k --model mock-boxed --limit 8 evalharness eval run gsm8k --model mock-boxed --limit 8
# acc 100% —— mock 适配器直接输出金标答案,证明
# 数据 → prompt → 生成 → 判分 → 报告 全链路可用
``` ```
## 2. 运行命令
## 快速开始 单端点:
### 跑一个 benchmarkCLI
```bash ```bash
evalharness eval run gsm8k \ evalharness eval run gsm8k \
--api-url http://localhost:8000/v1 \ --api-url http://localhost:8000/v1 \
--model qwen3-8b \ --model qwen3-8b \
--limit 200 --resume --disable-thinking \
--limit 200 --resume \
--out-dir results/run1
``` ```
**完整参数表**`evalharness eval run --help` 的整理版): 多端点池(轮询 + 自适应并发 + failover
**模型接入**
| 参数 | 作用 |
|---|---|
| `--api-url URL` | OpenAI 兼容端点;与 `--model` 搭配使用(不用手拼 spec 字符串) |
| `--model NAME` | 服务端模型名(配合 `--api-url`);或直接给完整 spec`openai/http://h:8000/v1?qwen3-8b` |
| `--provider {openai-chat,openai-pool}` | 协议/提供方,默认 `openai-chat`;端点池用 `openai-pool` |
| `--judge-model NAME` + `--judge-api-url URL` | LLM-judge 模型hle / simple_qa / imo 需要);也可单给完整 spec `--judge openai/http://...?m` |
| `--api-key KEY` | 显式指定主模型端点的 key优先于环境变量推断只进请求头不写入 spec/报告) |
| `--judge-provider {openai-chat,openai-pool}` | judge 协议;多 judge 端点负载均衡用 `openai-pool` |
| `--judge-api-key KEY` | 显式指定 judge 端点的 key |
| `--profile NAME` | 命名生成参数集(内置 `dp4-nothink``qwen3-es-parity``t1-short`,或任意 `@register_gen_profile` 名);优先级:插件默认 < profile 默认 < profile bench 覆盖 < 显式参数 |
| `--disable-thinking` | 发送 `enable_thinking=false`Qwen3 类思考模型推荐;带 tools 的请求自动退回模板安全的软开关) |
| `--textools` | 工具以文本形式随 prompt 下发,而非原生 tool_calls |
| `--perf` | 采集流式 TTFT / ITL / 重试率,写入报告 `perf` 组 |
**采样与选样**
| 参数 | 作用 |
|---|---|
| `--limit N` | 只跑全局前 N 条 |
| `--limit-per-task N` | 每个 subset / 科目取前 N 条(多科目 bench 的语义;可与 `--limit` 组合取交集) |
| `--subset NAME` | 覆盖子集(如 mmlu 的 `anatomy`、bbh 的 `word_sorting` |
| `--split NAME` | 覆盖 split |
| `--source PATH` | 覆盖数据源(指向本地目录/文件,离线可用) |
| `--cache-dir DIR` | 缓存根目录(默认 `$EVALHARNESS_CACHE``~/.cache/evalharness` |
**运行控制**
| 参数 | 作用 |
|---|---|
| `--concurrency N` | 并发请求数(默认 32长输出 bench 建议 8-16 |
| `--resume [PATH]` | 断点续跑(默认路径自动推导;可显式给路径) |
| `--env NAME` | agent 环境(如 `bfcl_mock`)→ 走多轮消息泵 |
| `--progress` / `--no-progress` | Rich 每样本进度条(默认开;重定向日志时建议 `--no-progress`,未装 rich 自动降级纯文本) |
**输出**
| 参数 | 作用 |
|---|---|
| `--out FILE` | 单 benchmark 时把 EvalReport JSON 存到此处 |
| `--out-dir DIR` | 多 benchmark 运行落盘:`reports/<name>.json` + `viz/<name>.txt` + `summary.md` |
| `--style {text,md,radar,errors}` | 结果渲染样式 |
| `--verbose` | 多 benchmark 时也打印每个 bench 的完整渲染 |
端点池跨机器跨端口,自带 failover 与自适应并发:
```bash ```bash
evalharness eval run mmlu \ evalharness eval run mmlu \
@ -115,172 +62,127 @@ evalharness eval run mmlu \
--model qwen3-8b --disable-thinking --model qwen3-8b --disable-thinking
``` ```
### 用 Python 跑 需要 judge 的 benchhle / simple_qa / imo
```bash
evalharness eval run hle \
--api-url http://localhost:8000/v1 --model qwen3-8b --disable-thinking \
--judge-model dp4-flash \
--judge-api-url http://judge-host:30000/v1 \
--limit-per-task 25
```
Agent bench多轮工具调用
```bash
evalharness eval run bfcl_v3 --api-url http://localhost:8000/v1 --model qwen3-8b \
--env bfcl_mock
```
Python API
```python ```python
import evalharness import evalharness
rep = evalharness.run('gsm8k', 'openai/http://localhost:8000/v1?qwen3-8b', limit=200) rep = evalharness.run('gsm8k', 'openai/http://localhost:8000/v1?qwen3-8b', limit=200)
print(rep.metrics['acc'])
rep.save('gsm8k.report.json') rep.save('gsm8k.report.json')
# 已在事件循环里notebook用 await 版: # notebook / async 环境用 await evalharness.arun(...)
rep = await evalharness.arun('mmlu', '...', subset='anatomy')
``` ```
也可以分阶段自己驱动 —— 数据集是一等公民,判分永远不会重新调模型: ## 3. 参数速查
```python | 参数 | 作用 |
from evalharness import get_dataset |---|---|
from evalharness.eval import evaluate | `--api-url` `--model` `--provider` | 端点、模型名(纯名字,无需拼 spec、协议`openai-chat`/`openai-pool` |
| `--api-key` | 显式 key优先于环境变量只进请求头不写入 spec/报告) |
| `--disable-thinking` | `enable_thinking=false`Qwen3 类模型推荐;带 tools 的请求自动退回兼容软开关) |
| `--judge-model` `--judge-api-url` `--judge-api-key` `--judge-provider` | judge 端四件套,语义与主模型对称 |
| `--limit N` / `--limit-per-task N` | 全局前 N / 每子集前 N多科目 bench 用后者;可组合取交集) |
| `--subset` `--split` `--source` | 覆盖子集 / split / 数据源(可指本地路径离线跑) |
| `--concurrency N` | 并发(默认 32长输出 bench 建议 8-16 |
| `--resume [PATH]` | 断点续跑;默认 `<cache-dir>/ckpt/<bench>.jsonl` |
| `--profile NAME` | 命名生成参数集(`dp4-nothink` / `qwen3-es-parity` / `t1-short` 或自定义) |
| `--env NAME` | agent 环境(`bfcl_mock` 等) |
| `--perf` | 采集流式 TTFT / ITL / 重试率入报告 |
| `--hf-endpoint URL` | 数据下载端点(如 `https://hf-mirror.com`,免手动 export |
| `--cache-dir DIR` | 缓存根(数据缓存 + 断点同根) |
| `--out FILE` / `--out-dir DIR` | 报告落盘;多 bench 时写 `reports/` + `viz/` + `summary.md` |
| `--style text\|md\|md_compare\|excel\|radar\|errors` | 结果渲染样式 |
| `--no-progress` | 关闭 Rich 进度条(重定向日志时用) |
ds = get_dataset('mmlu', subset='anatomy') # 惰性句柄;首次使用才物化 API key 解析顺序:`--api-key` > 按端点域名的环境变量(`api.openai.com``OPENAI_API_KEY``anthropic.com``ANTHROPIC_API_KEY``dashscope``DASHSCOPE_API_KEY``bigmodel``ZAI_API_KEY`> `OPENAI_API_KEY`。自建端点无鉴权可不管。
preds = [json.loads(l)['raw'] for l in open('preds.jsonl')]
rep = evaluate(ds, preds) # recipe 按 bench 名自动解析
```
### 查看与渲染结果 ## 4. 评测结果
```bash ```bash
evalharness viz show gsm8k.report.json # 控制台表格 evalharness viz show gsm8k.report.json # 控制台表格
evalharness viz show a.json b.json --style md_compare # 多模型对照 evalharness viz show a.json b.json --style md_compare # 多模型对照(含差值标记)
evalharness viz show report.json --style excel # 4-sheet 仪表盘 evalharness viz show report.json --style excel # 4-sheet 仪表盘
evalharness viz show report.json --style errors # 失败样本下钻 evalharness viz show report.json --style errors # 失败样本下钻
``` ```
每样本结果保留原始预测、抽取说明、分数明细、token 用量agent bench 另有完整轨迹。 `--out-dir` 自动产出:`reports/<bench>.report.json`每样本原始预测、分数明细、token 用量、agent 轨迹)、`viz/<bench>.txt``summary.md`(全 bench 一张表)与 `summary.csv`(含 perf 列)。
`extraction_failure_rate` 作为健康指标上报 —— 抽取失败不会被静默记零分。
## 模型接入 ## 5. 缓存与断点
任意 OpenAI 兼容端点。模型用一条 spec 字符串描述(或用等价的 `--provider/--api-url/--model` 参数):
| spec | 含义 |
|---|---|
| `openai/<base_url>?<model_id>` | 单端点vLLM、SGLang、lmdeploy、ollama、云 API |
| `openai-pool/<base{8000..8007}/v1,...>?<model_id>` | 端点池:轮询 + 自适应并发 + failover |
| `deploy:<engine>/<model>` | 经 Deployer 解析(钉版本的推理环境) |
| `mock` / `mock-boxed` / `mock-fc` | 离线适配器(管线自检:回声 / 回放金标 / 回放工具调用) |
| `!nothink` `!perf` `!textools` 后缀 | spec 内联开关(与 CLI 参数等价) |
API key含 judge按端点域名自动从环境变量读取`api.openai.com``OPENAI_API_KEY`
`anthropic.com``ANTHROPIC_API_KEY``dashscope``DASHSCOPE_API_KEY``bigmodel``ZAI_API_KEY`
其余域名回退 `OPENAI_API_KEY`。自建端点无鉴权时无需设置。
同一服务有多个 key 时用 `--api-key` 显式指定(跑两次各用一个 key 即可对比key 只进请求头,
不会出现在 spec、报告或日志里
## 内置 benchmark
| 族 | benchmark |
|---|---|
| 数学 | `gsm8k``competition_math``aime24/25/26``hmmt26``imo_answerbench` |
| 知识 / 选择题 | `mmlu``mmlu_pro``cmmlu``gpqa_diamond``arc``hellaswag``winogrande``bbh` |
| 问答 | `trivia_qa``drop``simple_qa``hle` |
| 长上下文 | `longbench_v2``openai_mrcr` |
| 代码(沙箱执行) | `humaneval``bigcodebench``live_code_bench` |
| Agent / 工具 | `bfcl_v3``general_fc``tau2_bench``swe_bench_verified` |
```bash ```bash
evalharness data list # 全部数据集:数据源、子集、默认 few-shot、split evalharness data fetch gsm8k mmlu --workers 8 # 预取(首次运行也会自动下载)
evalharness eval list # 全部判分 recipe evalharness data stats cmmlu # 条数/长度/答案分布
evalharness data show gsm8k -n 2 # 看前 2 条样本
evalharness data unload gsm8k # 删缓存
``` ```
各族注意事项: - 数据缓存内容寻址subset/split/source 变更自动新条目),位置 `<cache-dir>/datasets/`
- 断点每条预测即写盘;**改了 prompt 模板须删旧断点**`rm <cache-dir>/ckpt/<bench>*.jsonl`),否则复用旧预测
- 网络抖动三层防护15s 连接超时快速失败 → 池内换端点 → 分钟级退避重试,断网不丢批次
- 判分与生成解耦:换 recipe / grader 对存量预测直接重判(`evaluate(ds, preds)`),模型不被重复调用
- Docker 镜像源回退链可用 `EVALHARNESS_DOCKER_MIRRORS` 覆盖(逗号分隔模板,`{img}` 占位)
- **LLM-judge 类**`hle``simple_qa``imo_answerbench`):传 `--judge-model <模型名> --judge-api-url <端点>`与主模型同款分离参数风格judge 走官方协议 ## 6. 扩展
(如 SimpleQA 的分级正确性 + NOT_ATTEMPTED 兜底)。
- **代码执行类**:模型生成的代码在硬隔离 Docker 中运行(`--network none`、cgroup 上限、只读 rootfs
swe 的逐实例 `sweb.eval.*` 镜像用 `evalharness sandbox prefetch swe_bench_verified` 预取。
- **Agent 类**`--env bfcl_mock` 驱动多轮消息泵 + 官方 call-sequence 判分;`tau2_bench` /
`swe_bench_verified` 走官方引擎 bundle自跑环境路径
- **长上下文**`gen_kwargs={'max_input_tokens': ...}` 做 token 预算中位截断(保头尾),与 evalscope 同构。
- **小样本高方差集**aime/hmmt`temperature=1.0` 跑多次取均值 —— 用 `evalharness.run` 五行循环。
## 可靠性模型 加数据集(单文件放入 `evalharness/data/datasets/`,自动注册):
- **断点** —— 每条预测完成即追加进当次运行的 checkpoint`--resume`。key 含 prompt 语义;
改了模板要删旧断点(`rm ~/.cache/evalharness/ckpt/<bench>*.jsonl`),否则会复用旧预测。
- **分层重试** —— 连接超时 15 秒快速失败;池内换端点(自适应闸门自动降载、病端点冷却);
单样本分钟级退避重试 6 次,路由抖动不会杀死批次。
- **预测不可变** —— 判分是对存量输出的确定性计算;随便换 grader / recipe。
## 扩展
**加数据集** —— 单文件丢进 `evalharness/data/datasets/`,自动发现注册:
```python ```python
@register_dataset(DatasetSpec( @register_dataset(DatasetSpec(name='mybench', source='org/mybench',
name='mybench', split='test', task_type='mcq'))
source='org/mybench', # HF id / ModelScope id / 本地路径
split='test',
task_type='mcq', # 决定默认判分 recipe 的大类路由
))
def mybench(): def mybench():
return FieldSpec(input='question', choices='options', target='answer_key') return FieldSpec(input='question', choices='options', target='answer_key')
# 需要清洗/重排时改为返回 record -> Sample 函数
``` ```
**绑定判分** —— recipe 是注册原语的声明式组合 绑定判分recipe = 注册原语的声明式组合):
```python ```python
@register_eval('mybench') @register_eval('mybench')
def mybench(): def mybench():
return EvalRecipe( return EvalRecipe(
name='mybench', extract=['my_answer', 'answer_phrase'], # 级联,首个成功者胜
extract=['my_answer', 'answer_phrase'], # 级联:首个成功者胜 scorers={'acc': 'exact'}, # math_equal/em_f1/execution/env_reward/llm_judge
scorers={'acc': 'exact'}, # 或 math_equal / em_f1 / execution / env_reward / llm_judge aggregators={'acc': 'mean'}, # pass_at_k/grouped_avg/binned_avg
aggregators={'acc': 'mean'}, # 或 pass_at_k / grouped_avg / binned_avg
) )
``` ```
同一模式覆盖全部扩展点 —— `@register_prompt_renderer`(题面如何渲染,含 system 契约)、 其余插件点同构:`@register_prompt_renderer``@register_extractor/scorer/aggregator``@register_adapter``@register_sandbox``@register_env``@register_renderer`
`@register_extractor` / `@register_scorer` / `@register_aggregator``@register_adapter`(模型协议)、
`@register_sandbox`(执行环境)、`@register_env`agent 世界)、`@register_renderer`(报告呈现)。
生成参数预设注册为 profile`--profile`)。
数据插件还可以导出 `<name>_few_shot(split, subset, n)` 钩子注入官方手写范例BBH CoT 即此实现); ## 7. 架构
DatasetSpec 声明每 bench 的默认值few-shot 数量/split、`gen_config`、prompt 风格),
常见场景零配置。
## 架构
``` ```
evalharness/ data/ 统一 Sample schema惰性物化内容寻址缓存28 个单文件插件)
├── cli.py data | eval | sandbox | viz 子命令 model/ adapter协议+ pool端点池/AIMD/failover+ prompt_renderers + gen_profiles
├── progress/ Rich 每样本终端进度(无 rich 自动降级) eval/ extract → score → aggregate 流水线 + recipes
├── data/ 统一 Sample schema、惰性物化、内容寻址缓存 sandbox/ docker 硬隔离执行 / local镜像引用计数
│ └── datasets/ 28 个单文件插件 agent/ 消息泵 + Environment 插件bfcl/tau2/swe
├── model/ adapter怎么调+ deployer怎么部署 viz/ text/md/md_compare/excel/radar/errors
│ ├── pool.py 端点池、自适应闸门、failover progress/ Rich 每样本进度(缺 rich 自动降级)
│ ├── prompt_renderers 逐 bench 官方 prompt 模板
│ ├── gen_profiles.py 命名生成参数预设
│ └── runner.py 异步生成 → 同步判分;断点、重试、进度钩子
├── eval/ extract → score → aggregate 流水线 + recipes
├── sandbox/ docker硬隔离执行/ local镜像引用计数
├── agent/ 消息泵 + Environment 插件bfcl / tau2 / swe
└── viz/ text / md / md_compare / radar / excel / errors
``` ```
设计原则: 层间严格分离:数据层只回答"题目与金标",判分层只回答"如何评判",模型层只回答"如何触达";预测是不可变 artifact。
- **层间严格分离** —— 数据层回答"题目与金标是什么";判分层回答"如何评判一个回复";模型层回答 ## 8. 对齐验证
"如何触达模型"。下游只见 `Sample`,不见原始数据格式。
- **声明优先于执行** —— 样本携带沙箱/工具声明,由执行层物化;数据层永不执行任何东西。
- **注册表而非配置文件** —— 插件 import 即注册;`list` 命令枚举不触网。
## 对齐验证 prompt 与判分器经双层验证(字符串级:同一记录双侧渲染逐字节一致;分数级:同题同参数对比 evalscope
prompt 模板与判分器在两个层面与 evalscope 对齐过字符串级同一条记录过两侧管线prompt 逐字节 - Qwen3-8B23/28 分差 < 0.05
一致)与分数级(同题同生成参数): - DeepSeek-V4-Flash20+/25 分差 < 0.05mmlu_pro 0.0000
- **Qwen3-8B**28 个 benchmark 中 23 个同题分差 < 0.05 残差均已定性(金标集差异 / 排列敏感 / benchmark 侧缺陷),见各 recipe 注释。
- **DeepSeek-V4-Flash**25 个中 20+ 个分差 < 0.05mmlu_pro 分差 0.0000)。
残差分歧是定性而非掩盖已知原因包括金标集差异DROP 的 validated answers、排列敏感性GPQA
以及 benchmark 侧缺陷evalscope 的 bigcodebench 执行器空跑、BFCL 单轮格式提示被剥 —— 均有
代码级证据记录,我方侧已规避且未改动 evalscope
## License
尚未声明 —— 公开发布前请添加 `LICENSE`。第三方 benchmark 数据与内置的官方判分片段
(如 BBH CoT 范例、SimpleQA judge prompt保留上游许可各数据集插件头部记录了数据来源。

View File

@ -1,6 +1,7 @@
"""EvalHarness CLI. Zero third-party deps beyond the data layer (pydantic).""" """EvalHarness CLI. Zero third-party deps beyond the data layer (pydantic)."""
import argparse import argparse
import os
import time import time
import json import json
import sys import sys
@ -9,6 +10,8 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
def _overrides(args): def _overrides(args):
"""Optional DatasetSpec field overrides shared by fetch/stats/show.""" """Optional DatasetSpec field overrides shared by fetch/stats/show."""
if getattr(args, 'hf_endpoint', None):
os.environ['HF_ENDPOINT'] = args.hf_endpoint
if getattr(args, 'cache_dir', None): if getattr(args, 'cache_dir', None):
from evalharness.data.dataset import set_cache_root from evalharness.data.dataset import set_cache_root
@ -109,6 +112,9 @@ def _cmd_sandbox_prefetch(args) -> int:
def _add_override_flags(p: argparse.ArgumentParser) -> None: def _add_override_flags(p: argparse.ArgumentParser) -> None:
p.add_argument('--hf-endpoint', default='',
help='HuggingFace endpoint override, e.g. https://hf-mirror.com '
'(sets HF_ENDPOINT before any dataset download)')
p.add_argument('--source', help='override DatasetSpec.source (e.g. a local dir)') p.add_argument('--source', help='override DatasetSpec.source (e.g. a local dir)')
p.add_argument('--split', help='override DatasetSpec.split') p.add_argument('--split', help='override DatasetSpec.split')
p.add_argument('--subset', help='override DatasetSpec.subset') p.add_argument('--subset', help='override DatasetSpec.subset')

View File

@ -373,8 +373,11 @@ async def generate_predictions(
# include subset in the checkpoint key: same dataset under # include subset in the checkpoint key: same dataset under
# different subsets (bbh tasks, lb2 lengths) must not share state # different subsets (bbh tasks, lb2 lengths) must not share state
sub = getattr(dataset_spec, 'subset', '') or '' sub = getattr(dataset_spec, 'subset', '') or ''
ckpt = checkpoint_path(os.environ.get('EVALHARNESS_CACHE') from ..data.dataset import get_cache_root
or os.path.expanduser('~/.cache/evalharness'),
# one root for everything: --cache-dir > $EVALHARNESS_CACHE >
# ~/.cache/evalharness (data cache and checkpoints stay together)
ckpt = checkpoint_path(str(get_cache_root()),
f'{dataset_name}:{sub}' if sub else dataset_name, f'{dataset_name}:{sub}' if sub else dataset_name,
adapter.model or str(adapter)) adapter.model or str(adapter))
ckpt_store = CheckpointStore(ckpt, model=adapter.model or str(adapter)) ckpt_store = CheckpointStore(ckpt, model=adapter.model or str(adapter))