ci: run Phoenix GPU benchmarks in one single-node job (backfill + same-hardware) - #1833
Conversation
|
Claude Code Review Head SHA: bbe6d6e Files changed:
Findings:
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #1833 +/- ##
==========================================
+ Coverage 62.30% 62.35% +0.04%
==========================================
Files 84 84
Lines 21583 21621 +38
Branches 3195 3199 +4
==========================================
+ Hits 13448 13482 +34
- Misses 5937 5939 +2
- Partials 2198 2200 +2 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Conflict in submit-slurm-job.sh: master (#1832) split partition selection by job_type, keeping the single-partition bench selector behind BENCH_GPU_PARTITION. This branch removes that selector entirely (bench-pair.sh benches master and PR in one job on the same GPUs), so the job_type branch is dead code here. Took this branch's unconditional partition list; select-gpu-partition.sh stays deleted. Claude-Session: https://claude.ai/code/session_01G77jhrA4JPDz5TqJzt8ACC
There was a problem hiding this comment.
Warning
Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.
Pull request overview
This PR updates Phoenix GPU benchmarking to run both master and PR builds/benches inside a single SLURM allocation to improve scheduling (backfill) and ensure same-hardware comparisons.
Changes:
- Add
bench-pair.shto build+bench master and PR sequentially on one node/GPU allocation. - Update Phoenix GPU benchmark submission to use the single-job path and rely on shared partition lists.
- Remove the now-obsolete GPU partition selector and broaden log-collection patterns.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| .github/workflows/common/bench-pair.sh | New single-allocation script to build+bench master and PR back-to-back on the same Phoenix GPU node. |
| .github/workflows/bench.yml | Adjust log collection globs to include the new bench-pair job log naming. |
| .github/scripts/submit-slurm-job.sh | Simplify Phoenix GPU partition selection to always use the partition list for both tests and benchmarks. |
| .github/scripts/select-gpu-partition.sh | Remove obsolete partition selection helper no longer needed with single-node bench-pair. |
| .github/scripts/run_parallel_benchmarks.sh | Route Phoenix GPU to the one-job bench-pair path; keep other clusters on the existing two-job flow. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
run_parallel_benchmarks.sh: submit-slurm-job.sh derives the SLURM log basename from the submitted script, so the single-node path writes bench-pair-<d>-<i>.out while this script assumed bench-<d>-<i>.out. The YAML-missing fallbacks then tailed a file that does not exist and printed 'Could not read PR log'. Split log_slug (SLURM .out/.slurm_job_id) from job_slug (the YAML name bench_diff requires); they are equal on the two-job path. bench-pair.sh: clean scratch dirs from an EXIT trap rather than trailing commands, which set -e skipped on any failed build or bench -- exactly when the dirs pile up. Matches bench.sh. submit-slurm-job.sh: the node-fault comment claimed preflight runs before any real work; bench-pair.sh probes after building both trees. Claude-Session: https://claude.ai/code/session_01G77jhrA4JPDz5TqJzt8ACC
What
Phoenix GPU benchmarks now build and bench both the master and PR trees in one single-node SLURM job (new
bench-pair.sh), instead of two separate jobs pinned to one partition. The single job needs only-G2on one node, so it submits to a partition list and backfills.Frontier and Phoenix-CPU benchmarks are untouched — they keep the existing two-job concurrent path.
Why
The old bench model selected one partition requiring two idle nodes in that same partition at once (
GPU_PARTITION_MIN_NODES=2) and pinned both PR and master jobs to it. That is the single hardest scheduling condition on Phoenix, so bench routinely starved in the queue (recent bench GitHub jobs were 3.5–4.2h wall-clock, almost entirely queue wait).Running both trees on one node inverts the tradeoff:
-G2means SLURM can start on whichever partition frees first (gpu-h200,gpu-h100,gpu-a100,gpu-v100), instead of waiting for two idle nodes in one partition.How it's structured
common/bench-pair.sh(new): builds master, builds pr, runs preflight once, then benches master and pr back-to-back. Writesbench-<device>-<interface>.yamlin each tree (same paths downstream already expects). Build/bench commands mirrorcommon/bench.sh.run_parallel_benchmarks.sh: for Phoenix GPU, submits the one pair job and letssubmit-slurm-job.shmonitor it (so bench now also gets preemption-resubmit and node-exclude-on-fault, exit 77 — which the old two-job bench path never had). All other clusters keep the two-job path byte-for-byte.submit-slurm-job.sh: the GPU partition block collapses to the shared partition list for both tests and benchmarks (the bench-specificBENCH_GPU_PARTITION/selector branch added in ci: submit Phoenix GPU test jobs to a partition list for backfill #1832 is no longer needed).select-gpu-partition.shis now unused and can be removed in a follow-up.Timing (from real Phoenix runs)
Per-tree build+bench decomposes into build ~14 min + bench ~6 min (SLURM accounting + a real bench log). Sequential single-node total ≈ ~40 min (builds sequential, benches back-to-back), vs the
bench_time=04:00:00budget — ~6× headroom.Verification done
bash -non all three scripts.--test-onlyconfirms the-G2+ partition-list shape schedules; a real-G2probe backfilled onto idle v100 in ~1s and saw exactly 2 GPUs as indices0,1(so-g 0 1 -n 2is unchanged).bench-pair.shwith stubbed trees: correct order (build master → build pr → preflight once → bench master → bench pr),../masterresolution, and both YAMLs written to the right paths.Not yet verified
An actual end-to-end 2×(build+bench) inside one allocation — needs a real ~40-min allocation. Each run is identical to today's working bench, so the residual risk is orchestration (dry-run-checked) and time budget (measured, ample). Best confirmed by a live bench CI run on this branch.