190 Commits

Author SHA1 Message Date
sora
f6ee6c7a8b Fix config auto-load silently disabled by the sample-counts manifest
Adding config/sample_counts.yaml made TWO yamls in config/, and the
auto-load rule was 'exactly one yaml' -- so every bench silently lost
its repeats/temperature/max_tokens (humaneval ran once instead of 3).
Manifest renamed to .json, and the rule hardened: a lone yaml still
wins, otherwise default.yaml wins explicitly. Verified: aime 12x +
humaneval 3x repeats active again.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 09:23:41 +00:00
sora
7921688149 Run plan: concrete sample counts + 'auto' concurrency display/alias
- sample-counts manifest (config/sample_counts.yaml, harvested from
  real runs): uncached benches still show exact numbers in the plan
  instead of 'counts when datasets load' -- 'cache+est.' marks the mix
- '--concurrency auto' is now an alias for --auto-concurrency
- Concurrency row shows 'auto (start 8, gate decides)' when the gate
  drives, instead of a bare misleading 8

Also verified end-to-end: thinking-mode humaneval rep1/rep2 both
pass 98.8%, matching the es reference runs (98.17/98.78/98.78) on the
same model -- framework alignment holds on the thinking path too.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 09:11:07 +00:00
sora
acb94e3e20 humaneval/gpqa_diamond: repeats 3 (align with the es reference runs)
syy's es runs: humaneval x3, gpqa x2, aime25/26 x12 (already aligned),
mmlu_pro/longbench_v2 x1 (temp=0 deterministic -- repeats are noise,
and 3x 12k samples is pure cost). temp=1 benches get 3.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 07:39:55 +00:00
sora
77d2c4569a JSON-tolerant report/checkpoint saves (default=str)
A finished 12-minute humaneval bench died at the save line: some scorer
detail carried a non-JSON object (Ellipsis) and report.save's json.dumps
had no default. Every dumps on the save path now stringifies exotic
objects instead of killing the run; verified by replaying the exact
crashed checkpoint end-to-end (pass 82.3%, 15s, no crash).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 07:15:50 +00:00
sora
652c13db36 Scores bound to predictions in the checkpoint; --resume controls both
User feedback: the out-dir report-reuse layer was one concept too many.
Now each checkpoint line carries {key, ts, pred, score}:

- --resume restores predictions AND their scores; when every sample's
  cached score matches the scoring-setup fingerprint (recipe/extract/
  scorers/judge), the report is replayed with NO scorer, extractor or
  docker container touching anything
- fingerprint mismatch (recipe or judge changed) -> automatic re-eval
  and backfill of the fresh scores
- no --resume -> nothing read, nothing written (full fresh run)
- --rescore = ignore cached scores, re-evaluate, refresh the cache
- aggregation always recomputed from cached per-sample scores (cheap,
  survives aggregator changes without invalidating)
- legacy checkpoints without a score field backfill on first evaluation

Removed: the out-dir report-reuse block (superseded; also the source of
the UnboundLocalError path).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 06:38:22 +00:00
sora
6f19719df2 Fix UnboundLocalError on the report-reuse path
The progress-reporter setup lived inside the generation branch; reuse
skipped it but the success path still advanced the overall bar ->
'cannot access local variable progress_reporter'. Setup now runs for
every path (reuse included).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 06:24:10 +00:00
sora
7eb7b26786 Summary time = this run's wall clock; n counts repeat generations
time_s/time_h summed per-prediction latency_s, which includes RESTORED
predictions' original generation time -- days old and from a slower
setup, it once reported 15.9h for a one-hour aime25 run. All rows now
report the bench's actual wall clock; token totals stay as the true
cost of the predictions used.

n for repeats>1 is num_samples x repeats (12 runs over 30 problems is
360 generations, not 30).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 06:15:51 +00:00
sora
f272146b54 Report reuse: skip re-scoring when all predictions are checkpointed
The checkpoint stores predictions, not scores -- reruns re-executed the
whole docker scoring pass even when nothing could change. When the
saved report matches (same model, same sample count) and every
prediction is checkpointed, reuse it; --rescore forces evaluation
(recipe/judge changed).

Also fixes EvalReport.load: metric_groups declared Dict[str, float]
rejected the None perf values (and the repeats scores list) the file
format actually contains -- every load raised ValidationError, which
is what silently killed reuse in testing.

Repeats>1 benches never reuse: their whole point is fresh sampling.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 06:12:30 +00:00
sora
97c4eef8fb Incremental summary: flush summary.csv/xlsx after every benchmark
Previously both were written only after ALL benches finished -- a
multi-hour mmlu_pro left the summary stale for hours, and a crashed
run left the PREVIOUS run's files in place. Now each completed bench
(including failed ones) rewrites the summaries with everything so far.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 05:56:42 +00:00
sora
0d925fc46f repeats: per-run reports under <out-dir>/<bench>/reps/repNN.report.jsonl
Each file carries that run's own score and samples; the top-level
report.jsonl stays the mean-summary view (mean + repeats group).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 05:51:29 +00:00
sora
9a64896c97 repeats: persist every per-run score, not just the last report
12 repeats each scored on the terminal but the artifacts kept only the
final repeat's report; the run list scrolled away. Now the last report
carries metric_groups['repeats'] = {n_runs, scores[12], mean, min, max,
std} -- lands in report.jsonl's header line, the xlsx categories sheet,
and summary.csv's categories column (numeric entries); the console
summary line also prints the full runs=[...] list.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 05:43:50 +00:00
sora
9049bd683d openai-pool: allow plain-URL members (no port range required)
--auto-concurrency wraps a single endpoint as a 1-member pool; the
spec parser rejected it with 'needs a {start..end} port range' and
killed every benchmark. Range-less comma segments are now plain
members; only a fully empty endpoint list errors.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 04:05:18 +00:00
sora
6ad68bdfc0 --auto-concurrency: let the adaptive gate drive request concurrency
- new flag wraps even a single endpoint as a one-member pool so the
  per-endpoint AdaptiveGate takes over; --concurrency becomes the gate's
  STARTING point (global semaphore lifted to the gate ceiling of 96)
- demand-driven AIMD fallback for endpoints without /metrics (404,
  gateway-stripped, non-sglang): ramp +1 while callers wait on acquire
  and the interval is failure-free; the old code early-returned on
  fetch errors and never adapted at all. Real GLM endpoint verified:
  /metrics is 404, so this fallback is the live path there
- probe fetch moved to a thread: a blocked urlopen parked the whole
  event loop for its 4s timeout
- current limit surfaces on the progress bar as a magenta 'gate N'
  field (pushed on every change)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 04:01:45 +00:00
sora
e1a96f18c0 Scoring phase retargets the same progress bar
The bar kept its stale 100% generation state during scoring with only
the description counter moving. Now set_scoring() refills the bar with
judged samples (0->100%, fresh clock/rate/eta for the phase), clears
the generation '+N new' marker, and the next bench retargets back to
generating cleanly.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:51:25 +00:00
sora
25e51c5b30 Scoring milestones: only when no live bar
The bar's 'scoring N/164' counter and 21 milestone log lines were both
active on terminals -- the lines are noise there. Emit them only for
pipes/redirects where no bar exists (every ~10% now).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:48:01 +00:00
sora
841b7b1ffb Bound the sandbox rm -f cleanup calls (60s)
An unbounded docker rm against a bloated daemon hangs for minutes and
silently eats the worker pool: 7 of 8 scoring workers were observed
stuck in cleanup while only 1 execution ran.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:34:13 +00:00
sora
92b36c5e6c Sandbox: reap timed-out containers, retry daemon-side failures; scoring milestones
- docker exec: named containers; a timed-out/killed 'docker run' only
  kills the CLI client while the container lives on (--rm fires on
  EXIT) -- rm -f the name on timeout/interrupt so runs stop leaking
- exit 125 = daemon-side failure, not model failure: retry up to 2x
  (a bloated daemon was turning healthy samples into pass=0)
- scoring milestones: first completion logs immediately, then every
  ~5% (10% was too sparse when docker is slow: minutes of silence
  right after the 'scoring' phase starts, looks hung)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:26:35 +00:00
sora
a4d4592864 Scoring-phase progress; pool: fix double-release + cross-loop reuse
Scoring progress: docker-exec benches (humaneval etc.) score for
minutes with zero feedback -- the bar sat at 'generating 100%' and
looked hung. evaluate() now takes on_scored(i, n) (atomic counter,
fires from worker threads), run_eval passes it through, and the CLI
shows 'scoring 42/164' on the bar + milestone log lines every 10%
(also fixes the phase match: 'scoring' never matched the capitalized
'Scoring predictions...' status message, so the bar never even
switched its label).

PooledAdapter:
- one release per acquire: the exception path released True (inner
  finally) AND False (except handler), double-decrementing _inflight
  (over-admission) and applying the x0.7 backoff twice
- AdaptiveGate: rebuild the Condition + probe task when the event loop
  changes -- pools are cached across benchmarks and the CLI runs
  asyncio.run() per bench/repeat; a loop-bound Condition from a closed
  loop raises 'bound to a different event loop' under contention

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:14:08 +00:00
sora
f5c2e4c5af Progress bar: fresh-this-run counter; fix KeyError 'success'
- Completed X/Y now carries (+N new): samples generated by THIS run,
  excluding the checkpoint-restored head start (previously 98/164 told
  you nothing about how much work this invocation actually did)
- rate/eta computed over fresh samples only (restored ones counted
  toward 141/6s = 23/s when 1 sample had been generated)
- fix KeyError 'success': advance() still read the success/failed task
  fields after they were dropped from the column set -- first advance
  on a resumed bench killed the whole benchmark
- set_overall: give the overall task the fields the shared columns
  actually read (cur/retries/elapsed/eta); the old field set was from
  a previous column layout

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 03:05:18 +00:00
sora
20d2d5537a Run plan: show real sample/generation counts from local cache
Samples row said 'full dataset (counted when each loads)' -- now it
counts cached samples.jsonl entries (never touches the network, plan
stays instant on cold machines) and multiplies by YAML repeats:

  12,957 samples (cached) → 13,617 generations (repeats)

--limit caps each bench before summing; uncached benches are flagged.
YAML config loading extracted to _load_bench_cfg, shared by the run
loop and the plan so repeats can't disagree between the two.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 02:45:20 +00:00
sora
e9d7e7f4eb README overhaul: features overview, config section, perf stats, FAQ
- accurate output structure (summary.xlsx/csv + per-bench xlsx; drop
  stale detail.md/summary.md mentions)
- dedicated YAML-config section documenting the keys that actually work
  (generation params + repeats + max_input_tokens) and precedence
- perf-stats table: what is always collected vs --perf streaming-only
- FAQ: endpoint probe, context-overflow shrink, thinking-mode notes
  (non-stream chat_template_kwargs vs cloud-API param), auto-stream
- config/README.md rewritten to match the flat-key reality (old file
  documented a directory scheme + judge/env keys that are not consumed)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-14 02:30:38 +00:00
sora
a17dd88611 Untrack pip build/ artifacts, restore gen_profiles.yaml
build/lib/* is a local pip-install byproduct, not source.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 13:38:43 +00:00
sora
370953729b Fix perf stats (wrong import path), per-repeat checkpoints, README
- perf_stats aggregator lives in eval/, not model/: the import failed
  silently and EVERY perf column was empty (not just ttft). Now warns
  on stderr instead of swallowing.
- repeats > 1 get their own checkpoint key (:rep2, :rep3, ...): repeat 2
  previously restored repeat 1's predictions and finished instantly with
  identical scores. rep1 keeps the legacy key (existing checkpoints still
  resume).
- repeats summary: report the MEAN score and aggregate time/tokens over
  ALL runs (was: last run only).
- README: six-benchmark command as the primary example.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 13:38:04 +00:00
sora
52872bcbc7 Per-benchmark Excel: each <bench>/<bench>.xlsx (4 sheets) alongside report.jsonl
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:58:57 +00:00
sora
f118f4092b Remove detail.md from per-benchmark output (user preference: report.jsonl + summary.xlsx only)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:51:29 +00:00
sora
ed675e790f Auto-stream threshold 8192→100000 (streaming strips all thinking params on GLM gateway; non-streaming works for 32k); EVALHARNESS_NO_AUTOSTREAM=1 to disable entirely
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:50:03 +00:00
sora
f5aaddb870 Progress bar: colored fields (cur=yellow, elapsed=green, eta=cyan, retries=red, rate=dim)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:45:01 +00:00
sora
624b2fd37e aime/hmmt max_tokens 32768→8192: stays on non-stream path where GLM gateway honors enable_thinking:false (thinking off, 15s/题)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:43:36 +00:00
sora
3f555878b8 Fix: max_input_tokens extracted from YAML config and passed as the separate run_eval param (was going into gen_kwargs where truncation never saw it -> raw 128k text sent to gateway -> 400)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:28:13 +00:00
sora
ff5d40aad5 Read timeout 300→600s base (GLM gateway 30+s startup on 100k+ token inputs)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:24:16 +00:00
sora
7ada0113ad max_input_tokens back to 128000 (user confirmed same behavior as 120k)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:23:43 +00:00
sora
b75fbc1a12 max_input_tokens 128000→120000 (GLM gateway unstable on very long inputs, 30s timeout at 128k)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:22:55 +00:00
sora
ebc51de274 Rename dp4-nothink.yaml → default.yaml (auto-loaded)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:12:41 +00:00
sora
ed345c5ac1 Config auto-loads: single yaml in config/ becomes default generation params
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:04:23 +00:00
sora
fe1852302a --config flag loads evalharness/config/<name>.yaml (per-bench generation params); yaml added to package-data; verified end-to-end
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 09:00:28 +00:00
sora
ebf7a0e7e5 Config: generation params + repeats + max_input_tokens only; judge/env/limit controlled elsewhere
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:47:25 +00:00
sora
60bdef3936 Complete config: all fields included (env, limit, limit_per_task, judge, judge_url, repeats, max_input_tokens, max_turns, concurrency)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:45:35 +00:00
sora
eb6028e8c9 Config simplified: default block + per-bench overrides only (removed env/limit/judge/concurrency; max_input_tokens 128000)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:42:21 +00:00
sora
0815f6e4f8 Config: evalscope generation_config format + our extras (repeats, env) at bench level; parallel_tool_calls noted as unsupported in adapter
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:37:18 +00:00
sora
0ada7d8a0e Config: exact copy of evalscope dpv4-int8_nothinking.yaml (generation_config + dataset_args + agent_config, zero custom fields)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:35:05 +00:00
sora
3a4be917e6 Restored checkpoint predictions' usage counted in totals (was 0 for fully-restored benches); token stats now correct on resume
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:27:55 +00:00
sora
b8ed18771a Config exactly matches evalscope dpv4-int8_nothinking.yaml (verified all match); concurrency removed (CLI controls it)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:25:15 +00:00
sora
787a8a28e9 Standard YAML indentation, no inline braces
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:09:09 +00:00
sora
4d7567adf8 Flatten config: direct key-value per bench, no nested groups
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:05:36 +00:00
sora
d16009d054 Config: single dp4-nothink.yaml with all 28 bench configs (evalscope-style)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 08:02:43 +00:00
sora
c27a22555d Config directory: dp4-nothink/ with 28 per-bench YAMLs (aime repeats=12, judged, agent, long-context) + README
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 07:59:42 +00:00
sora
77b67f8bbc gen_profiles.yaml moved to evalharness/config/ (search path added); /data2/hf_home deleted (8.6G freed)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 07:48:41 +00:00
sora
471e0ca1a9 gen_profiles.yaml: YAML profiles (dp4-nothink, qwen3-es-parity, glm53-nothink, t1-short) — edit file to tune parameters, no code changes needed
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 07:45:51 +00:00
sora
63ffd1b613 Fix NameError _fmt (module-level helper restored); aime/hmmt max_tokens 32768->8192 (non-stream path, gateway honors nothink)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 07:20:02 +00:00
sora
d64b236540 run_one: exactly 1 attempt (adapter handles all retries internally)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 07:07:22 +00:00