Skip to content

Commit 212a8e7

Browse files
committed
fix(evals): install YAML score dependency
1 parent 8602020 commit 212a8e7

5 files changed

Lines changed: 33 additions & 41 deletions

File tree

.github/workflows/benchmark-tmpl.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,10 @@ jobs:
337337

338338
- name: Verify eval scores
339339
if: ${{ (success() || failure()) && inputs.eval-only && (inputs.eval-limit == '' || inputs.eval-limit == 'full' || inputs.eval-limit == '0') }}
340-
run: python3 utils/evals/validate_scores.py
340+
run: |
341+
python3 -m venv "$RUNNER_TEMP/eval-validation-venv"
342+
"$RUNNER_TEMP/eval-validation-venv/bin/pip" install 'PyYAML==6.0.3'
343+
"$RUNNER_TEMP/eval-validation-venv/bin/python" utils/evals/validate_scores.py
341344
342345
- name: Cleanup eval outputs (post-upload)
343346
if: ${{ always() && (env.RUN_EVAL == 'true' || inputs.eval-only) }}

utils/evals/EVALS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ cat ./evals/agg_eval_all.json | jq '[.[] | select(.hw == "B200")]'
156156
| `EVAL_LIMIT` | empty | Limit eval to first N instances (smoke tests); empty = full set |
157157

158158
### Score validation
159-
`utils/evals/validate_scores.py` checks full-split eval results against thresholds in `utils/evals/thresholds.json`. The JSON format keeps validation independent of optional PyYAML installations on runner hosts. First-N smoke slices skip the quality gate because their scores are not statistically representative. Validation runs after artifact upload so full-run results are preserved even if the gate fails.
159+
`utils/evals/validate_scores.py` checks full-split eval results against thresholds in `utils/evals/thresholds.yaml`. The workflow installs the pinned PyYAML dependency before validation. First-N smoke slices skip the quality gate because their scores are not statistically representative. Validation runs after artifact upload so full-run results are preserved even if the gate fails.
160160

161161
### Adding a new eval task
162162

@@ -214,7 +214,7 @@ append_lm_eval_summary
214214
is derived from the YAML's `dataset_path` so generation and scoring can't diverge;
215215
`SWEBENCH_DATASET`, if set, must match it (mismatch fails fast).
216216
- Scoring runs on Modal remote sandboxes in CI (`SWEBENCH_USE_MODAL=true`, no Docker on the GPU
217-
nodes); local Docker scoring needs ~120 GB disk. The `thresholds.json` gate is `0.50`, calibrated
217+
nodes); local Docker scoring needs ~120 GB disk. The `thresholds.yaml` gate is `0.50`, calibrated
218218
from full-split runs (54%); historical 50-instance slices scored 62–76%.
219219

220220
## Task files

utils/evals/thresholds.json

Lines changed: 0 additions & 36 deletions
This file was deleted.

utils/evals/thresholds.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Model thresholds override task defaults.
2+
default:
3+
aime26: 0.30
4+
gsm8k: 0.90
5+
gpqa_diamond_cot_n_shot: 0.30
6+
swebench_lite: 0.50
7+
models:
8+
dsr1:
9+
gsm8k: 0.91
10+
dsv4:
11+
aime26: 0.30
12+
gpqa_diamond_cot_n_shot: 0.65
13+
gsm8k: 0.91
14+
glm5:
15+
gsm8k: 0.94
16+
glm5.1:
17+
gsm8k: 0.93
18+
gptoss:
19+
gsm8k: 0.91
20+
kimik2.5:
21+
gsm8k: 0.90
22+
minimaxm2.5:
23+
gsm8k: 0.92
24+
qwen3.5:
25+
gsm8k: 0.94

utils/evals/validate_scores.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def main() -> int:
186186
)
187187
parser.add_argument(
188188
"--thresholds", default=None,
189-
help="Path to thresholds config, YAML or JSON (default: utils/evals/thresholds.json)",
189+
help="Path to thresholds config, YAML or JSON (default: utils/evals/thresholds.yaml)",
190190
)
191191
parser.add_argument(
192192
"--meta-env", default="meta_env.json",
@@ -229,7 +229,7 @@ def main() -> int:
229229
config = {"default": {}, "models": {}}
230230
thresholds_path = args.thresholds
231231
if thresholds_path is None:
232-
default_path = Path(__file__).parent / "thresholds.json"
232+
default_path = Path(__file__).parent / "thresholds.yaml"
233233
if default_path.exists():
234234
thresholds_path = str(default_path)
235235
if thresholds_path:

0 commit comments

Comments
 (0)