81 Commits

Author SHA1 Message Date
sora
b1c88bef25 --thinking: unified switch (off/low/medium/high/max/full)
One flag for the whole ladder: off == --disable-thinking,
low..max map to reasoning_effort, full = plain default. Takes
precedence over the two older flags. Run Plan shows the active mode
('disabled' / 'enabled · effort=low' / 'enabled').

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-16 04:02:34 +00:00
sora
80194e845e --reasoning-effort: control thinking intensity (verified honored)
The adapter dropped reasoning_effort/thinking from the payload, so the
middle rung of the ladder (es reference: full 98.3 / effort_low 94 /
no-think 82.3 on humaneval) was unreachable. Both keys now pass
through; --reasoning-effort {minimal,low,medium,high,max} overrides
the YAML, and config/effort_low.yaml mirrors default.yaml with
reasoning_effort: low for one-command low-thinking runs.

Probe on the endpoint: same question, default = 319 chars reasoning /
262 tok, low = 47 chars / 117 tok -- the server honors it.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-16 03:36:03 +00:00
sora
1e72a553ec Benchmark categories in results (English)
Five categories (Code & Engineering / Reasoning & Math / Knowledge &
Language / Long Context / Agents & Tools) now annotate the console
summary table (new column), summary.csv (new field), and each report's
run_info.category.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-15 10:06:51 +00:00
sora
1fd0dcbdbb Summary table: 'cached' instead of a misleading ~0s time
Tokens are cumulative (they include restored predictions' usage) while
time was this-run wall -- fully replayed benches showed 0s in the same
column, reading as broken. run_info now carries gen_fresh; a bench with
zero fresh generations renders its time cell as 'cached' (tokens keep
showing the true cumulative investment).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-15 10:01:09 +00:00
sora
52547de9a3 Gate: exponential probe + binary search for capacity discovery
Replaces the +1/5s linear ramp: start at 1, double while measured
completions/s keeps improving (>10% over the previous level); the
first plateau opens a bisect [last_good, bad] that narrows to the
knee, then holds steady. Failures still cut x0.7 instantly and
restart probing from the shrunken level; zero completions = hold.

Judging a level needs max(MIN_OK, level) completions -- a
2-completion rate estimate at level 8 is quantization noise (caught
by simulation converging to 1 on a capacity-8 endpoint).

Simulated against throughput curves min(level, capacity):
  capacity 8  -> 1,2,4,8,16 | bisect 12,10,9  -> steady 8
  capacity 16 -> 1,2,4,8,16,32 | bisect ...    -> steady 16
  capacity 4  -> 1,2,4,8 | bisect 6,5         -> steady 4

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-15 02:42:53 +00:00
sora
f8ff19d4a5 --concurrency auto is the only form; gate starts at 2
--auto-concurrency removed as promised; 'auto' now starts the adaptive
gate at 2 (it ramps on its own demand/health signals). Plan displays
'auto (start 2, gate decides)'.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-15 02:14:07 +00:00
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
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
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
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
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
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
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
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
ruoxi_sun
09b2add673 fingerprint: integrate fp_fusion model fingerprint benchmark
New evalharness/fingerprint/ package (from evalstone fp_fusion v1.1,
2026-09-07 pruning final): probe battery -> concurrent collection ->
five scoring views (verify/attribution/variant/adversarial/robustness),
bundled family aliases + 27 reference fingerprints (12 fp_fusion schema).

- CLI: 'evalharness fingerprint run ...' (REMAINDER passthrough, single
  source of arg definitions) + 'fingerprint list' for bundled references
- imports rewritten package-relative; direct 'python3 run_fp_fusion.py'
  execution kept working via package bootstrap
- offline analysis/collection scripts made path-independent (previously
  pinned to a /opt/evalscope path absent on this host)
- shell scripts: hardcoded API key -> FP_API_KEY/OPENAI_API_KEY env vars
- --reference accepts short names resolved against bundled references/
- pyproject: +httpx dependency, package-data references/*.json
- tests/test_fingerprint.py: 10 offline tests (battery definitions,
  assembly counts, normalization, signals, verdict ladder, CLI wiring)
- README: fingerprint section + architecture entry

Verified on H20-1: tests 10/10, installed CLI OK, full-protocol run vs
vectron GLM-5.3 reproduces baseline (score 0.9451, s_idn 0.846).
2026-09-11 03:52:21 +00:00
sora
5af8e2a7fd Pluginize the run shell: @register_progress (rich/plain), @register_theme, @register_hook (on_benchmark_failed/done), @register_prober; CLI gains --progress-plugin/--theme
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 03:26:19 +00:00
sora
98007cccd7 Color scheme: green for facts/phrases/scores, blue for paths
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 03:18:52 +00:00
sora
0ca8aedefe Scoring line: colon restored, full sentence (score over N samples), score keeps solid green with yellow phrase tail; path coloring covers 'to /abs' endings
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 03:16:08 +00:00
sora
d7f06395a0 Highlight whole noun phrases (1319 samples from cache / 4/4 predictions / 0 samples left to run), not bare numbers; score rule runs first so scores keep solid green
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 03:09:15 +00:00
sora
a8c04311c0 Semantic numbers in narration: bold yellow (bold alone was hard to see)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 03:02:03 +00:00
sora
a1fa75bf89 All narration lines as full sentences (Checkpoint: 4/4 predictions already generated, 0 samples left to run / Generation skipped: ... / Scoring complete: acc 100.0% / Writing results to ...)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 02:59:22 +00:00
sora
470496b7ef Probe line carries model/endpoint/instances/probe-latency (ANSI-colored on tty); semantic numbers (counts, checkpoint fractions) bold in narration lines
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 02:43:10 +00:00
sora
b8ff031be7 Scores in narration lines get bold green (the key fact, previously lost in all-white lines); paths stay cyan
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-11 02:35:49 +00:00
sora
9eb1f7e58b Fix KeyError 'cur' regression (new-task branch missed the field); live bars hard-disable unless the real stream is a tty (FORCE_COLOR env made rich claim terminal-ness on pipes -> refresh thread stalled the whole run)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 12:02:27 +00:00
sora
e7792a559c Narration lines get stage icons (⬇ download / 📦 ready / ✳ few-shot / ◷ checkpoint / 🤖 generating / ⏭ skipped / ★ scoring / 📝 writing / 🔗 endpoint) and cyan-highlighted paths
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:29:07 +00:00
sora
3911019315 writing-results line shows the destination directory
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:22:04 +00:00
sora
5b595f3a10 Narration lines all plain white (color scheme toggle kept in _phase_color for quick restore)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:19:58 +00:00
sora
5734f7fbe6 Uniform [i/N] prefix on every narration line (status_callback restores the tag; checkpoint-restored detail routes through status_callback; probe line remains pre-callback)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:15:04 +00:00
sora
392cc8daca Persistent benchmark counter [i/N] on the single progress bar; phase lines all route through the live channel for strict ordering
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:13:34 +00:00
sora
9818515247 Narration colors by stage semantics: start/in-progress events yellow, completion events green (dataset ready / generation complete / scoring complete / checkpoint restored)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:09:38 +00:00
sora
89f950d8a0 Narration lines uniformly uncolored (phase prints drop cyan, rich number auto-highlight off); color reserved for results/errors only
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:06:41 +00:00
sora
8632b2735b Drop the overall benches bar from the CLI (per-benchmark result lines already track progress; reporter keeps the capability for API users)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:04:00 +00:00
sora
b7be2a8df3 Progress bars self-describing: overall bar carries the current benchmark (benches · 1/6 humaneval), sample bar carries the stage tag (humaneval · generating/scoring/writing)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 11:02:41 +00:00
sora
8ea83fea4f Pause the rich live display while datasets materialize so hub tqdm progress (download/generating splits) is visible instead of being erased; reporter gains pause()/resume()
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 10:54:04 +00:00
sora
afe2fb8d28 Progress coverage for minute-scale work: overall bench bar (which benchmark of N, covers loading/scoring), byte-level download bars for dataset fetches (ModelScope/HF raw, tty-only), one shared reporter across benchmarks (caller-owned lifecycle)
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 10:47:21 +00:00
sora
c54207a180 Error panel centered; comma-joined benchmark names get an immediate fix hint
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 10:43:41 +00:00
sora
a3269252fd Closing line simplified to one line (status + result path); tree removed
Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-10 10:42:04 +00:00