[https://nvbugs/6487040][test] Wait for gen-log end-of-write sentinel before parsing per-iter step time - #16717
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThe gen-worker step-time parser now retains usable samples without parseable ChangesGen-worker device step-time parsing
MTP worker entrypoint
Performance waiver cleanup
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant Parser
participant GenWorkerLogs
participant Scanner
participant Aggregator
Parser->>GenWorkerLogs: read gen_server_*.log files
Parser->>Scanner: scan usable rows
Scanner-->>Parser: return per-file scans and total count
Parser->>Aggregator: select settled or timeout result
Aggregator-->>Parser: return bucket mean or all-iteration fallback
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tests/integration/defs/perf/test_gen_worker_device_step_time_parser.py`:
- Around line 30-34: Update the isolated parser loader used by test_perf_sanity
to accurately document that it reads and executes a source slice rather than
using importlib. At the exec call, add a narrowly scoped Ruff S102 suppression
with justification that _TPS_PATH is a fixed, repository-local trusted path;
avoid broad lint disables or unrelated changes.
- Around line 214-229: Strengthen
test_scan_counts_all_usable_rows_regardless_of_ngen by assigning distinct
step-time values to the bucketed and fallback-only row groups, while preserving
their separate num_generation_tokens states. Assert _mean_at_mode_ngen() returns
the mean for the selected ngen bucket rather than all_mean, and update expected
aggregate values accordingly; complete the required coverage review for this
test change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 2b12569b-ab7d-4b3f-8135-ad7d00ad5c39
📒 Files selected for processing (2)
tests/integration/defs/perf/test_gen_worker_device_step_time_parser.pytests/integration/defs/perf/test_perf_sanity.py
|
This is a The 10 cases map to 5 post-merge Disagg-PerfSanity stages (these stages shard
/bot run --stage-list "DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-1,DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU2-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-3,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-4,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-2,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-2" |
|
/bot run --stage-list "DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-1,DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU2-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-3,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-4,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-2,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-2" |
|
PR_Github #60958 [ run ] triggered by Bot. Commit: |
|
PR_Github #60958 [ run ] completed with state
|
|
/bot run --disable-fail-fast --stage-list "DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-1,DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU2-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-3,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-4,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-2,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-2" |
|
PR_Github #60997 [ run ] triggered by Bot. Commit: |
|
PR_Github #60997 [ run ] completed with state |
|
/bot run --disable-fail-fast --stage-list "GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-2,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-2,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-3,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-4,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-5,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-6,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-7,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-8" |
|
PR_Github #61272 [ run ] triggered by Bot. Commit: |
|
PR_Github #61272 [ run ] completed with state
|
|
/bot run --disable-fail-fast --stage-list "GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-4,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-8,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3" |
|
PR_Github #61284 [ run ] triggered by Bot. Commit: |
|
PR_Github #61284 [ run ] completed with state
|
91be512 to
daa4def
Compare
|
/bot run --disable-fail-fast --stage-list "GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-1,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-5,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1" |
|
/bot run --disable-fail-fast --stage-list "GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-3,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-5" |
|
PR_Github #62172 [ run ] triggered by Bot. Commit: |
|
PR_Github #62172 [ run ] completed with state |
4b089a3 to
ca85e9e
Compare
ca85e9e to
1fa1c42
Compare
|
/bot run --disable-fail-fast --stage-list "DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-1,DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-Post-Merge-2,DGX_B200-16_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-FUNCTIONAL-ONLY-CTX1-NODE1-GPU4-GEN1-NODE1-GPU8-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU2-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-3,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-4,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-2,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-3,GB200-20_GPUs-5_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-1,GB200-20_GPUs-5_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-2,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-2,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-3,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-4,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-5,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-6,GB200-16_GPUs-4_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE2-GPU8-Post-Merge-1,GB200-16_GPUs-4_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE2-GPU8-Post-Merge-2,GB200-24_GPUs-6_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE4-GPU16-Post-Merge-1,GB300-56_GPUs-14_Nodes-PyTorch-Disagg-PerfSanity-CTX12-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE2-GPU8-Post-Merge-2,GB300-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU2-GEN1-NODE8-GPU32-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-1,GB300-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-FUNCTIONAL-ONLY-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-1,GB300-20_GPUs-5_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-1,GB300-20_GPUs-5_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-2,GB300-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1,GB300-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN4-NODE2-GPU8-Post-Merge-1,GB300-44_GPUs-11_Nodes-PyTorch-Disagg-PerfSanity-CTX3-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1,GB300-40_GPUs-10_Nodes-PyTorch-Disagg-PerfSanity-CTX6-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-1" |
|
PR_Github #62453 [ run ] triggered by Bot. Commit: |
|
PR_Github #62453 [ run ] completed with state
|
|
The sentinel handshake itself reads correctly — backgrounding the gen My concern is the waiver removal, not the fix. 11 of the 41 unwaived cases are The bug records don't support the rest either. Checked just now:
All still open, and the first three are umbrella "Perf test failures in L0_PostMerge #2850/#2862/#2865" bugs that collect failures from many models — not evidence that a specific case was fixed by this change. Given the description says these go live in pre-merge, and |
… before parsing per-iter step time
The gen_only perf-sanity metric mean_gen_worker_per_iter_device_step_time
was intermittently parsed from a truncated gen_server_{i}.log: the
benchmark srun read the log while the gen srun was still flushing its &>
aggregate across NFS/Lustre, so the mean was computed over a partial
prefix of iterations (nvbugs 6487036 / 6487040). The prior settle-poll
heuristic (row count unchanged across two polls) accepted the first
repeated count and could latch onto a mid-flush prefix.
Fix (no pyexecutor change; no gen-worker -> client push):
- slurm_launch_draft.sh: run each gen srun in the foreground of a
backgrounded subshell and touch gen_server_{i}.done immediately after
the srun returns. The srun owns the aggregate fd, so the sentinel
fires strictly after reap, i.e. after the log is fully flushed. A
stale sentinel from a re-run output dir is removed first.
- test_perf_sanity.py: the BENCHMARK run_cmd branch defers the parse out
of the client loop. It writes benchmark_status in finally (which
releases the gen workers so their srun can exit and the sentinel can
fire -- this handshake is why the wait is not circular), then
wait_for_gen_log_sentinels() blocks (bounded by self.timeout; falls
through on timeout so CI never hangs), then each client's log is
parsed exactly once. Parse + OpenSearch upload stay in the BENCHMARK
srun.
- parse_gen_worker_device_step_time: drops the settle loop and reads the
now-complete log once (settle_timeout / poll_interval kwargs removed).
The all-iter Welford fallback for unbucketable num_generation_tokens
(Mode 1, PR NVIDIA#16298 regression) is retained.
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Chenfei Zhang <chenfeiz@nvidia.com>
…xed by the sentinel handshake The per-iter device_step_time parse failure (nvbugs 6487036 / 6487040) was caused by the benchmark srun reading gen_server_*.log before the gen srun had flushed and been reaped, so a truncated iteration segment was averaged. The end-of-write sentinel handshake in the previous commit makes the benchmark block on gen_server_$i.done before parsing, removing that race. Un-waive the 20 gen_only test_perf_sanity cases whose only failure mode was this parse race. The remaining gen_only cases that still fail for unrelated reasons stay waived. Non-gen_only (aggr_upload / e2e / ctx_only) waivers are left untouched. Signed-off-by: Chenfei Zhang <chenfeiz@nvidia.com> Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Chenfei Zhang <chenfeiz@nvidia.com>
1fa1c42 to
2334bab
Compare
|
Thanks for the careful read, @BowenFu — your concern about the waiver removal is exactly right, and I've narrowed the PR to address it. What changed on the new head: the un-waive set is now scoped to only So the 11 On the umbrella bugs (6490049 / 6517846 / 6530213): I agree the bug records don't show a per-case FixedDate, so I'm not treating "bug closed" as the un-waive signal. Instead I'm keying off the actual per-case post-merge signal: the Net: this PR now lands the sentinel fix plus exactly the |
ZhanruiSunCh
left a comment
There was a problem hiding this comment.
LGTM for infra part.
|
/bot skip --comment "Only fix perf tests, no need to run the whole CI pipeline" |
|
PR_Github #62521 [ skip ] triggered by Bot. Commit: |
|
PR_Github #62521 [ skip ] completed with state |
@coderabbitai summary
Description
The disagg
gen_onlyperf-sanity metricmean_gen_worker_per_iter_device_step_timewas intermittently computed from atruncated
gen_server_{i}.log. That log is the gensrun's&>aggregateof every TP rank; the fd is owned by the
srun, so the file is only completeonce the
srunhas been reaped. The BENCHMARKsrunwas reading it while thegen
srunwas still flushing across NFS/Lustre, and the previous settle-pollheuristic (row count unchanged across two polls) could latch onto a mid-flush
prefix — silently averaging a partial run of iterations
(nvbugs 6487036 / 6487040).
This PR waits for a real end-of-write signal before parsing, so the read
always sees the fully-flushed log.
Constraints honored: no per-iteration step time is computed inside the
PyExecutor, the gen worker does not push per-iteration step time to the client,
and the metric parse + OpenSearch upload stay in the BENCHMARK
srun(only thatsrunowns thetrtllm-benchmark.0.0.logparse + upload).Changes:
jenkins/scripts/perf/disaggregated/slurm_launch_draft.sh— run each gensrunin the foreground of a backgrounded subshell andtouch gen_server_{i}.doneimmediately after thesrunreturns. Because thesrunowns the aggregate fd, the sentinel fires strictly after reap, i.e. after
the log is fully flushed. A stale sentinel from a re-used output dir is
removed first.
tests/integration/defs/perf/test_perf_sanity.py— the BENCHMARKrun_cmdbranch defers the parse out of the client loop. It writesbenchmark_statusinfinally(which releases the gen workers so theirsruncan exit and the sentinel can fire — this handshake is why the wait isnot circular), then blocks in
wait_for_gen_log_sentinels()(bounded byself.timeout; falls through on timeout so CI never hangs), then parses eachclient log exactly once. The
parse_gen_worker_device_step_timesettle loopis removed (
settle_timeout/poll_intervalkwargs dropped) since thesentinel now guarantees completeness. The all-iter Welford fallback for
unbucketable
num_generation_tokens(the PR [None][test] Restrict gen-worker per-iter mean to steady-state iterations #16298 None-metric regression) isretained.
tests/integration/test_lists/waives.txt— un-waive the 20disagg_upload-gen_only-*perf-sanity cases whose only failure mode wasthis gen-log parse race, so the fix is re-validated end-to-end in CI. Scope is
deliberately limited to the disaggregated
gen_onlypath the root causeexplains: aggregated (
aggr_upload-*),disagg_upload-e2e, anddisagg_upload-ctx_onlywaivers are left untouched (aggregated servingproduces no
gen_server_{i}.logand no sentinel, so the truncation racecannot be what they were waived for). The 5
disagg_upload-gen_onlycasesthat still regress independent of the parse race (6478615, 6374872, and three
under the 6490049 umbrella) also stay waived.
Test Coverage
The 20 un-waived
disagg_upload-gen_only-*perf/test_perf_sanity.py::test_e2ecases run end-to-end in CI. They exercise the full disagg launch → gen-log
write → sentinel → BENCHMARK single-parse →
check_test_failurepath that thischange touches, which is the exact path that produced the intermittent failure.
PR Checklist
Please review the following before submitting your PR:
[JIRA/NVBugs/GitHub ID][type] Summary