Skip to content

[None][fix] Bound GEN log sentinel wait - #17140

Merged
chienchunhung merged 6 commits into
NVIDIA:mainfrom
chienchunhung:codex/gen-worker-teardown-sentinel
Aug 6, 2026
Merged

[None][fix] Bound GEN log sentinel wait#17140
chienchunhung merged 6 commits into
NVIDIA:mainfrom
chienchunhung:codex/gen-worker-teardown-sentinel

Conversation

@chienchunhung

@chienchunhung chienchunhung commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • skip GEN log completion-sentinel synchronization for e2e/ctx-only modes, which do not emit the GEN device-step-time metric
  • give the gen-only sentinel wait a dedicated 120-second teardown budget instead of reusing the whole pytest timeout
  • fall back to the existing current-log parse when the enclosing multi-node GEN srun does not reap

Problem

#16717 waits for gen_server_<n>.done before parsing GEN worker logs. The launcher creates that file only after the enclosing GEN srun returns. Recent targeted and main post-merge runs completed the workload and wrote benchmark_status=Done, but the GEN srun did not finish reaping, so the benchmark consumed the pytest timeout waiting for a non-critical log-flush sentinel. The benchmark step then exited nonzero and Slurm's --kill-on-bad-exit=1 cancelled the remaining job.

The sentinel remains the preferred path. This change prevents it from turning a post-workload teardown delay into a one-hour pytest/Slurm cancellation.

Stack dependency

This PR is intentionally stacked on and depends on #17134. Its branch includes #17134's pytest-split shard-alignment commits so the multi-node perf launcher selects the same duration-balanced test node that pytest runs. Without that parent fix, validation can prepare configuration and output paths for a different shard than the one executed by pytest.

Merge order: #17134#17140#16920. Although this PR still targets main in GitHub, reviewers can evaluate the #17140-specific delta relative to #17134. PR #16920 is restacked above this PR for the targeted GB300 validation.

Validation

Dev Engineer Review

  • submit.py adds pytest-split duration-based test selection.
  • Missing duration files fail closed to prevent launcher and pytest shard mismatches.
  • GEN sentinel waits use a bounded 120-second timeout.
  • Current GEN log parsing runs after sentinel timeout.
  • Non-gen_only modes skip GEN metric collection.
  • Existing failure handling remains active when the device-step metric is missing.
  • The implementation preserves the intended API behavior.

QA Engineer Review

  • Added test_ci_submit_selects_same_least_duration_shard_as_pytest_split.
  • Added test_ci_submit_selector_matches_installed_pytest_split.
  • Added test_ci_submit_rejects_invalid_least_duration_groups.
  • Added test_ci_submit_ignores_test_list_comments.
  • Added test_ci_submit_rejects_split_group_disagreement.
  • Added test_ci_submit_rejects_missing_pytest_split_durations.
  • Added test_sentinel_timeout_falls_back_to_current_gen_logs.
  • No test-list files were modified.
  • Existing test-db/ and qa/ lists cover perf/test_perf_sanity.py, but coverage for the new unit tests is not shown.
  • Verdict: needs follow-up.

@chienchunhung
chienchunhung force-pushed the codex/gen-worker-teardown-sentinel branch from 40e3ff1 to 9259db9 Compare July 31, 2026 19:53
@chienchunhung chienchunhung changed the title [https://nvbugs/6487038][fix] Bound GEN log sentinel wait [None][fix] Bound GEN log sentinel wait Jul 31, 2026
@chienchunhung

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@chienchunhung
chienchunhung marked this pull request as ready for review July 31, 2026 23:19
@chienchunhung
chienchunhung requested review from a team as code owners July 31, 2026 23:19
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The PR adds pytest-split duration-balanced test selection to the CI submit flow. It also bounds generation-log sentinel waits and limits device-step timing collection to gen_only performance runs, with tests for both behaviors.

Changes

Pytest split selection

Layer / File(s) Summary
Duration-balanced test selection
jenkins/scripts/perf/submit.py, tests/unittest/scripts/test_perf_submit.py
The submit flow parses pytest settings, loads duration data, reproduces least-duration grouping, validates split settings, selects one test line, and reuses it for test-name parsing. Tests cover selection parity, invalid settings, comments, group mismatches, and missing duration files.

Generation-only timing

Layer / File(s) Summary
Bounded generation-log synchronization
tests/integration/defs/perf/test_perf_sanity.py
Generation-log sentinel waiting uses a 120-second monotonic timeout and permits fallback parsing of current logs after timeout.
gen_only metric collection
tests/integration/defs/perf/test_perf_sanity.py, tests/unittest/scripts/test_perf_sanity_helpers.py
Device-step timing collection, log snapshots, deferred records, teardown parsing, and metric persistence are limited to gen_only runs. Tests verify timeout fallback and persisted output.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CI as CI submit flow
  participant Submit as submit.py
  participant TestList as Test list
  participant Durations as Duration data
  CI->>Submit: Provide pytestCommand and split group
  Submit->>TestList: Read test cases
  Submit->>Durations: Load duration data
  Submit->>Submit: Assign tests to least-duration groups
  Submit-->>CI: Return selected test line and test name
Loading
sequenceDiagram
  participant Teardown as gen_only teardown
  participant Waiter as wait_for_gen_log_sentinels
  participant Logs as Generation logs
  participant Output as Benchmark output
  Teardown->>Waiter: Wait with bounded timeout
  Waiter->>Logs: Check sentinel state
  Waiter-->>Teardown: Return synchronization status
  Teardown->>Logs: Parse pending client segments
  Teardown->>Output: Append available device-step timing
Loading

Possibly related PRs

Suggested reviewers: bowenfu, brnguyen2

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the primary change: bounding the GEN log sentinel wait.
Description check ✅ Passed The description explains the problem, solution, dependency, and validation, but it omits the template's explicit checklist section.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
jenkins/scripts/perf/submit.py (1)

645-667: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Drop the redundant split_group argument.

select_test_case_line always returns a line. parse_test_case_name therefore always takes the selected_line branch, and args.split_group is never used in that call. parse_test_case_name also raises when the line has no bracket, so the "[" in selected_test_line guard at line 666 is always true.

♻️ Proposed simplification
     config_yaml, server_name, benchmark_mode, runtime_mode = parse_test_case_name(
         args.test_list,
         args.llm_src,
-        args.split_group,
         selected_line=selected_test_line,
     )
 
     with open(config_yaml, "r") as f:
         config = yaml.safe_load(f)
 
-    test_case_name = (
-        selected_test_line.split("[")[-1].split("]")[0] if "[" in selected_test_line else ""
-    )
+    test_case_name = selected_test_line.split("[")[-1].split("]")[0]
🤖 Prompt for 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.

In `@jenkins/scripts/perf/submit.py` around lines 645 - 667, Update the
parse_test_case_name call to remove the redundant args.split_group argument and
rely on selected_line. Simplify test_case_name extraction by removing the
unnecessary bracket-presence guard, since select_test_case_line always returns a
valid bracketed line and parse_test_case_name enforces that contract.
tests/unittest/scripts/test_perf_submit.py (3)

113-145: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for the tie-breaking and error paths.

I traced the assertion and it is correct: group 3 of 4 resolves to test_lines[1]. However all four durations are distinct, so the name pre-sort in _select_least_duration_group is never exercised. That pre-sort is the part most likely to diverge from pytest-split. Ties occur whenever tests are missing from .test_durations, because each such test receives the same average_duration.

Add cases for:

  1. Two or more tests with equal or unknown durations, to pin the tie order.
  2. A missing durations file.
  3. A --splitting-algorithm value other than least_duration, which must raise ValueError.
  4. A group that selects more than one test, which must raise ValueError.
🤖 Prompt for 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.

In `@tests/unittest/scripts/test_perf_submit.py` around lines 113 - 145, Extend
test_ci_submit_selects_same_least_duration_shard_as_pytest_split or add focused
tests covering _select_least_duration_group: verify deterministic name-based
ordering for equal durations and missing-duration entries, assert missing
.test_durations handling, assert ValueError for a non-least_duration
--splitting-algorithm, and assert ValueError when the selected group contains
multiple tests.

113-164: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Test coverage summary.

  1. Changed test functions:
    • Added test_ci_submit_selects_same_least_duration_shard_as_pytest_split.
    • Added test_ci_submit_rejects_split_group_disagreement.
    • Added the ci_submit_module fixture.
    • No test functions were modified or removed.
  2. Test list registration: both tests live under tests/unittest/scripts/. Unit tests in this directory are collected by the unit-test stage and are not registered per-function in tests/integration/test_lists/test-db/ or tests/integration/test_lists/qa/. No list file change is required. Confirm that tests/unittest/scripts/ is already inside the collected unit-test scope.
  3. Coverage verdict: insufficient.

The happy path and one validation error are covered. The following behaviours in select_test_case_line and _select_least_duration_group have no test: equal or unknown durations (the tie order that must match pytest-split), a missing .test_durations file, a non-least_duration algorithm, the positional fallback when --splits or --group is absent, and a group that selects more than one test. The tie case is the highest priority, because it determines whether the launcher and pytest agree on the selected test.

As per path instructions "Always produce a test coverage summary, even if no issues are found."

🤖 Prompt for 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.

In `@tests/unittest/scripts/test_perf_submit.py` around lines 113 - 164, Add
coverage for select_test_case_line and _select_least_duration_group beyond the
existing happy path and group validation. Prioritize equal-duration ties and
unknown durations, asserting selection order matches pytest-split; also cover
missing .test_durations, non-least_duration algorithms, positional fallback
without --splits or --group, and groups selecting multiple tests. Keep tests
under the existing tests/unittest/scripts/ unit-test scope without modifying
integration test-list registrations.

Source: Path instructions


66-70: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Select the CI submit module by path, not by list index.

SUBMIT_PATHS[0] depends on list order. Select the path that identifies the CI implementation so reordering cannot load the local implementation.

🤖 Prompt for 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.

In `@tests/unittest/scripts/test_perf_submit.py` around lines 66 - 70, Update the
ci_submit_module fixture to select the CI implementation from SUBMIT_PATHS by
its identifying path or predicate instead of relying on index 0, ensuring list
reordering cannot load the local implementation.
tests/integration/defs/perf/test_perf_sanity.py (1)

1355-1359: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document the new timeout arguments.

Add Google-style Args entries for timeout and poll_interval, and a Returns entry for the boolean result.

As per coding guidelines, public function arguments must be documented in Google-style docstrings.

Suggested docstring update
         """Block until every gen worker signals that its log is fully written.
 
+        Args:
+            timeout: Maximum time to wait for all sentinel files.
+            poll_interval: Delay between sentinel checks.
+
+        Returns:
+            True when all sentinels exist; otherwise False after timeout.
+
🤖 Prompt for 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.

In `@tests/integration/defs/perf/test_perf_sanity.py` around lines 1355 - 1359,
Add a Google-style docstring to the public method wait_for_gen_log_sentinels
documenting the timeout and poll_interval arguments under Args, and the boolean
return value under Returns. Keep the existing behavior and default values
unchanged.

Source: Coding guidelines

🤖 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_perf_sanity.py`:
- Around line 1368-1391: Update run_cmd and the corresponding path around
parse_gen_worker_device_step_time to check the result of
wait_for_gen_log_sentinels before parsing or appending the device-step metric.
When the sentinel wait returns False, skip the metric or mark it unavailable
unless an independent completion check confirms the log is complete; never
report a parsed value as a normal measurement from an unverified log.

---

Nitpick comments:
In `@jenkins/scripts/perf/submit.py`:
- Around line 645-667: Update the parse_test_case_name call to remove the
redundant args.split_group argument and rely on selected_line. Simplify
test_case_name extraction by removing the unnecessary bracket-presence guard,
since select_test_case_line always returns a valid bracketed line and
parse_test_case_name enforces that contract.

In `@tests/integration/defs/perf/test_perf_sanity.py`:
- Around line 1355-1359: Add a Google-style docstring to the public method
wait_for_gen_log_sentinels documenting the timeout and poll_interval arguments
under Args, and the boolean return value under Returns. Keep the existing
behavior and default values unchanged.

In `@tests/unittest/scripts/test_perf_submit.py`:
- Around line 113-145: Extend
test_ci_submit_selects_same_least_duration_shard_as_pytest_split or add focused
tests covering _select_least_duration_group: verify deterministic name-based
ordering for equal durations and missing-duration entries, assert missing
.test_durations handling, assert ValueError for a non-least_duration
--splitting-algorithm, and assert ValueError when the selected group contains
multiple tests.
- Around line 113-164: Add coverage for select_test_case_line and
_select_least_duration_group beyond the existing happy path and group
validation. Prioritize equal-duration ties and unknown durations, asserting
selection order matches pytest-split; also cover missing .test_durations,
non-least_duration algorithms, positional fallback without --splits or --group,
and groups selecting multiple tests. Keep tests under the existing
tests/unittest/scripts/ unit-test scope without modifying integration test-list
registrations.
- Around line 66-70: Update the ci_submit_module fixture to select the CI
implementation from SUBMIT_PATHS by its identifying path or predicate instead of
relying on index 0, ensuring list reordering cannot load the local
implementation.
🪄 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: 1716d257-3da3-4026-b114-4a40031784fe

📥 Commits

Reviewing files that changed from the base of the PR and between 376d219 and 9259db9.

📒 Files selected for processing (3)
  • jenkins/scripts/perf/submit.py
  • tests/integration/defs/perf/test_perf_sanity.py
  • tests/unittest/scripts/test_perf_submit.py

Comment thread tests/integration/defs/perf/test_perf_sanity.py
@chienchunhung
chienchunhung requested a review from a team as a code owner August 2, 2026 01:27
@chienchunhung

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63247 [ run ] triggered by Bot. Commit: a794e69 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63247 [ run ] completed with state DISABLED
Pipeline is freezed and top-1 instance is under maintenance. For urgent request, contact Yiteng Niu

Link to invocation

@BowenFu

BowenFu commented Aug 3, 2026

Copy link
Copy Markdown

Held on one concrete behavior change.

wait_for_gen_log_sentinels returning False no longer means "parse what is on disk" — the caller now skips the parse entirely, and check_test_failure (tests/integration/defs/perf/test_perf_sanity.py:2107-2124) hard-fails any multi_node_disagg_server + gen_only client whose mean_gen_worker_per_iter_device_step_time is missing. So a gen_only run whose sentinels merely arrive slowly — past 120s but well inside the whole-test timeout — now raises RuntimeError where it previously passed on parsed data. That may be exactly the trade you want against the Slurm kill-on-bad-exit cascade, but 120s is carrying a lot of weight for multi-node srun teardown plus log flush on a busy cluster, and the new docstring ("skipping the device-step metric") reads much softer than what actually happens.

Smaller: _load_pytest_split_durations raises FileNotFoundError when the durations file is absent, where pytest-split itself falls back to empty durations. Failing loudly is defensible, but it turns a previously launchable configuration into a launch failure.

The rest checks out. _select_least_duration_group is a faithful port of pytest-split 0.10.0 — name sort, then stable descending duration sort, then greedy least-loaded heap, with the relevant-durations average and the 1.0 fallback — and pinning pytest-split==0.10.0 is the right companion to hand-porting it. configs_for_idx[2].benchmark_mode is safe: this run_cmd is on the disagg class, whose server_configs entries are always (ctx, gen, DisaggConfig) and whose benchmark_mode is e2e or gen_only.

chienchunhung commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

@BowenFu Thanks for catching that; agreed on the sentinel-timeout behavior. I restored the bounded current-log fallback in 66ab918: gen-only still waits up to 120 seconds for the completion sentinels, but a timeout now parses the GEN logs already on disk instead of automatically omitting the metric. If no usable metric is present, the existing check_test_failure path still fails before upload. Also added a CPU-only unit regression test for the timeout/fallback branch.

I’m keeping the missing-durations failure intentionally. submit.py chooses the Slurm configuration before pytest runs, and the launcher and pytest can see different filesystem paths. If the launcher silently used empty durations while pytest later opened a populated container-side file, they could choose different shards — the mismatch this change is intended to prevent. The existing unit test documents that fail-closed contract.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
tests/unittest/scripts/test_perf_sanity_helpers.py (1)

29-61: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add type annotations to both functions.

Annotate test_sentinel_timeout_falls_back_to_current_gen_logs and parse_device_step_time. The Python coding guidelines require annotations on every function.

Proposed change
-def test_sentinel_timeout_falls_back_to_current_gen_logs(monkeypatch, tmp_path):
+def test_sentinel_timeout_falls_back_to_current_gen_logs(
+    monkeypatch: pytest.MonkeyPatch,
+    tmp_path: Path,
+) -> None:
@@
-    parse_calls = []
+    parse_calls: list[tuple[str, int, list[int]]] = []
 
-    def parse_device_step_time(output_dir, num_gen_servers, start_offsets):
+    def parse_device_step_time(
+        output_dir: str,
+        num_gen_servers: int,
+        start_offsets: list[int],
+    ) -> float:
🤖 Prompt for 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.

In `@tests/unittest/scripts/test_perf_sanity_helpers.py` around lines 29 - 61,
添加类型注解到测试函数 test_sentinel_timeout_falls_back_to_current_gen_logs 及其内部函数
parse_device_step_time,涵盖参数和返回值,并遵循项目现有的类型标注风格。

Source: Coding guidelines

🤖 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.

Nitpick comments:
In `@tests/unittest/scripts/test_perf_sanity_helpers.py`:
- Around line 29-61: 添加类型注解到测试函数
test_sentinel_timeout_falls_back_to_current_gen_logs 及其内部函数
parse_device_step_time,涵盖参数和返回值,并遵循项目现有的类型标注风格。

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e446bcbf-e66d-4810-b223-6567b74cde59

📥 Commits

Reviewing files that changed from the base of the PR and between a794e69 and 66ab918.

📒 Files selected for processing (2)
  • tests/integration/defs/perf/test_perf_sanity.py
  • tests/unittest/scripts/test_perf_sanity_helpers.py

@chienchunhung
chienchunhung force-pushed the codex/gen-worker-teardown-sentinel branch from 66ab918 to ee22c04 Compare August 3, 2026 17:59

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tburt-nv
tburt-nv removed their request for review August 4, 2026 16:52

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63815 [ run ] triggered by Bot. Commit: 1cefe9c Link to invocation

Comment thread jenkins/scripts/perf/submit.py
Comment thread jenkins/scripts/perf/submit.py Outdated
Comment thread tests/unittest/scripts/test_perf_submit.py
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63815 [ run ] completed with state SUCCESS. Commit: 1cefe9c
/LLM/main/L0_MergeRequest_PR pipeline #51757 completed with status: 'SUCCESS'

CI Report

Link to invocation

Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
@chienchunhung
chienchunhung force-pushed the codex/gen-worker-teardown-sentinel branch from 1cefe9c to 8733174 Compare August 4, 2026 22:15

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63847 [ run ] triggered by Bot. Commit: 8733174 Link to invocation

@chienchunhung
chienchunhung enabled auto-merge (squash) August 4, 2026 22:30
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63847 [ run ] completed with state SUCCESS. Commit: 8733174
/LLM/main/L0_MergeRequest_PR pipeline #51788 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@chienchunhung

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64084 [ run ] triggered by Bot. Commit: 8733174 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64084 [ run ] completed with state SUCCESS. Commit: 8733174
/LLM/main/L0_MergeRequest_PR pipeline #52011 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@chienchunhung

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64130 [ run ] triggered by Bot. Commit: 8733174 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #64130 [ run ] completed with state SUCCESS. Commit: 8733174
/LLM/main/L0_MergeRequest_PR pipeline #52052 completed with status: 'SUCCESS'

CI Report

Link to invocation

@chienchunhung
chienchunhung merged commit 22184ba into NVIDIA:main Aug 6, 2026
8 checks passed
chenfeiz0326 added a commit to chenfeiz0326/TensorRT-LLM that referenced this pull request Aug 7, 2026
The perf-sanity disagg gen_only cases were waived after builds 2873/2884/2876
recorded "Test terminated unexpectedly" (nvbugs 6541361 / 6542166 / 6561566 /
6550133 / 6551021). Those were not workload failures: the gen_only benchmark
PASSED end-to-end (all ranks exit 0, "N passed", benchmark_status="Done"), then
the GEN slurm step idled ~76-78 min in teardown until the 90-min stage watchdog
killed it, emitting results-timeout.xml with an empty passed_test_list.

Root cause was the gen-log sentinel wait added in 99bdffc (NVIDIA#16717):
wait_for_gen_log_sentinels() polled gen_server_{i}.done under a timeout of
DEFAULT_TIMEOUT (10800s), longer than the 5400s stage watchdog, so a stuck /
un-reaped multi-node gen srun turned an optional log-flush sync into a
stage cancellation. A companion defect derived testOutputDir from a positional
test-list index that could disagree with the pytest-split shard, so the
sentinel was polled in the wrong directory.

Both defects are fixed and merged to main:
  - NVIDIA#17134 (721c46b) aligns the launcher's testOutputDir with the pytest
    shard.
  - NVIDIA#17140 (22184ba) bounds the wait to GEN_LOG_SENTINEL_TIMEOUT (120s, well
    below the watchdog), falls back to parsing the current gen log on timeout,
    and gates the whole path on benchmark_mode == "gen_only".

This removes 15 perf/test_perf_sanity.py disagg gen_only SKIP waivers whose
bugs tracked only the harness defect above, so post-merge re-runs those cases
against the fixed harness.

Four gen_only waivers are deliberately KEPT, because their bugs track genuine
workload failures that the harness fixes do not address:
  - gb200_deepseek-v32-fp4_32k4k_con2048_..._eplb288_mtp1 (nvbugs/6374872)
  - gb200_deepseek-v32-fp4_8k1k_con4096_..._eplb256_mtp0  (nvbugs/6490049)
  - gb200_gpt-oss-120b-fp4_8k1k_con4_..._tp4_eplb0_mtp0   (nvbugs/6490049)
  - gb300_kimi-k25-thinking-fp4_8k1k_con1024_..._mtp3     (nvbugs/6490049)

Non-gen_only perf-sanity waivers (ctx_only, e2e, aggregated) are left
untouched. In particular the e2e gb300_kimi-k25-thinking con4096 waiver that
this branch originally removed is no longer part of this change: NVIDIA#16920
(b21a3b4) already unwaived that exact case on main under nvbugs/6490049.

Signed-off-by: chenfeiz0326 <203214996+chenfeiz0326@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants