You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(power): measured-power multinode support (workers[] + per-stage joules) (#405)
* feat(inference): plumb multinode measured-power fields through transform layer
The multinode runner emits per-role power scalars (prefill_avg_power_w,
decode_avg_power_w, joules_per_input_token, joules_per_output_token_decode)
and a per-worker breakdown array on disagg runs. Surface them on
BenchmarkRow -> AggDataEntry -> InferenceData so chart features can consume
them without further transform changes. Workers ride as a sibling of the
scalar metrics dict to keep the existing Record<string, number> index intact.
* feat(power): measured-power multinode support in the app
App-side support for the InferenceX runner's multinode measured-power
telemetry: per-worker power breakdown (workers[] with role / num_gpus /
hosts), per-stage joules (input = prefill energy, output = decode energy),
and cluster-wide temp / util / mem.
- db: migration 006_benchmark_results_workers.sql; ETL mapper + ingest +
queries + json-provider carry workers[] and the new metric scalars
- constants: metric-keys lists the measured-power fields; joules_per_output_token
is per-stage decode on disagg (no separate _decode key)
- app: benchmark-transform + inference types surface the fields; unofficial-run
route passes them through; cypress measured-power-overlay e2e
- drop joules_per_output_token_decode (folded into joules_per_output_token) to
match the runner's per-stage change
Validated: app 60 + db 223 unit tests pass; tsc --noEmit clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(test): scroll measured-power dropdown options into view before asserting visibility
The measured-power-overlay e2e asserted `.should('be.visible')` on the gated
"Measured Energy" group + its options right after opening the Y-axis dropdown.
That list is a scroll container (searchable-select: max-h-72 overflow-y-auto)
and the group sits below the fold, so the items are in the DOM but clipped by
the overflow ancestor. Cypress `be.visible` does not auto-scroll, so it failed
deterministically on both the chrome and firefox e2e shard-2 jobs. The sibling
test passed only because `.click()` auto-scrolls its target into view.
Add `.scrollIntoView()` before each visibility assertion.
Verified locally: measured-power-overlay.cy.ts 2/2 passing against the real
run 26312107787 artifact with E2E_FIXTURES=1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* refactor(db): alias BenchmarkWorkerRow to WorkerPower to drop in-package dup
The read-side BenchmarkWorkerRow interface in queries/benchmarks.ts was a
verbatim redeclaration of the ingest-side WorkerPower in etl/benchmark-mapper.ts.
Alias it to the canonical definition so the per-worker shape can't drift within
the package, keeping the BenchmarkWorkerRow name its consumers reference.
Addresses the Cursor Bugbot "triplicate WorkerPower interface" finding on #405.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
0 commit comments