Skip to content

[None][fix] Align perf launcher with pytest shard - #17134

Open
chienchunhung wants to merge 2 commits into
NVIDIA:mainfrom
chienchunhung:codex/perf-pytest-shard-alignment
Open

[None][fix] Align perf launcher with pytest shard#17134
chienchunhung wants to merge 2 commits into
NVIDIA:mainfrom
chienchunhung:codex/perf-pytest-shard-alignment

Conversation

@chienchunhung

@chienchunhung chienchunhung commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • make the multi-node perf launcher select the same duration-balanced test as pytest-split
  • use that selected test consistently for its YAML configuration and artifact output directory
  • add focused regression coverage using the GB300 Kimi/DeepSeek stage ordering and durations

Root cause

The launcher interpreted --split-group N as the Nth line in the test list. Pytest instead applies pytest-split's least_duration algorithm using .test_durations, so a shard can select a different test from the raw Nth line.

That allowed the launcher to configure servers and the output directory for one test while pytest executed another test. During the NVBUG#6481034 investigation, this caused the targeted Kimi shard to write and collect artifacts under a different test identity.

Fix

Parse the pytest-split options from the generated pytestCommand, load the same duration data, and mirror pytest-split 0.10.0's LeastDurationAlgorithm. The launcher now validates that its group matches pytest's group and requires one selected test for each multi-node perf shard.

This PR contains no transfer tracing, runtime product changes, KV-cache fraction changes, timeout changes, test configuration changes, or waiver changes.

Validation

  • pre-commit run --files jenkins/scripts/perf/submit.py tests/unittest/scripts/test_perf_submit.py
  • python -m py_compile jenkins/scripts/perf/submit.py tests/unittest/scripts/test_perf_submit.py
  • python -m pytest -q --confcutdir=tests/unittest/scripts tests/unittest/scripts/test_perf_submit.py — 12 passed
  • PR [https://nvbugs/6481034][test] Trace Kimi gen-only KV transfer timeout #16918 targeted validation selected the intended Kimi shard and collected its dedicated artifacts after this alignment was applied

Related investigation: NVBUG#6481034 and #16918.

Dev Engineer Review

  • submit.py now mirrors pytest-split 0.10.0 duration-balanced shard selection.
  • It validates split-group consistency and requires one selected test per shard.
  • It reuses the selected test line for test-name parsing and artifact directories.
  • The API change remains backward compatible through selected_line=None.
  • pytest-split is pinned to version 0.10.0.
  • No config or test-list files changed.
  • No correctness or consistency issues found.

QA Engineer Review

  • Added test_ci_submit_selects_same_least_duration_shard_as_pytest_split.
  • Added test_ci_submit_rejects_split_group_disagreement.
  • Added test_ci_submit_rejects_missing_pytest_split_durations.
  • These tests are not listed in test-db/ or qa/ files.
  • Verdict: insufficient.

@chienchunhung chienchunhung changed the title [NVBUG-6481034][fix] Align perf launcher with pytest shard [None][fix] Align perf launcher with pytest shard Jul 31, 2026
@chienchunhung

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63099 [ run ] triggered by Bot. Commit: 05880f6 Link to invocation

Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
@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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 156138df-e61c-4552-8814-4cfaa1fc5467

📥 Commits

Reviewing files that changed from the base of the PR and between 7a2e0ec and c018511.

📒 Files selected for processing (3)
  • jenkins/scripts/perf/submit.py
  • requirements-dev.txt
  • tests/unittest/scripts/test_perf_submit.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/unittest/scripts/test_perf_submit.py

Walkthrough

The performance launcher now selects tests with pytest-split duration balancing. It validates split settings, requires one selected test, and reuses that test line for name and output-directory derivation. Tests cover selection, mismatches, and missing duration data.

Changes

Pytest-split test selection

Layer / File(s) Summary
Duration-balanced test selection
jenkins/scripts/perf/submit.py, requirements-dev.txt
The launcher parses pytest options, loads pinned duration data, reproduces least-duration grouping, validates split settings, and selects exactly one test line.
Launcher selection integration
jenkins/scripts/perf/submit.py
main reuses the selected test line for test-name parsing and output-directory derivation. CLI help describes duration-balanced selection.
Selection behavior validation
tests/unittest/scripts/test_perf_submit.py
Tests verify shard selection, reject mismatched split groups, and raise FileNotFoundError for missing duration data.

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

Sequence Diagram(s)

sequenceDiagram
  participant Launcher
  participant select_test_case_line
  participant PytestCommand
  participant DurationData
  participant TestList
  Launcher->>select_test_case_line: provide pytest command and split group
  select_test_case_line->>PytestCommand: parse split configuration
  select_test_case_line->>DurationData: load test durations
  select_test_case_line->>TestList: read candidate test lines
  select_test_case_line-->>Launcher: return selected test line
  Launcher->>parse_test_case_name: pass selected test line
  parse_test_case_name-->>Launcher: return test-case name
Loading

Possibly related PRs

  • NVIDIA/TensorRT-LLM#17140: Both changes modify pytest-split selection and test-name parsing in jenkins/scripts/perf/submit.py.

Suggested reviewers: schetlur-nv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the fix: aligning the performance launcher with pytest shard selection.
Description check ✅ Passed The description explains the cause, fix, scope, and validation, including focused regression tests; the required checklist is omitted.
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.
✨ 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: 2

🧹 Nitpick comments (3)
jenkins/scripts/perf/submit.py (2)

77-86: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider sharing the pytestCommand line lookup.

_pytest_command_tokens and get_pytest_commands (Line 536) each locate the export pytestCommand= line with their own next(...) expression. Extract one helper that returns the line. Both call sites then stay in sync if the prefix format changes.

🤖 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 77 - 86, Extract the shared
pytestCommand export-line lookup from _pytest_command_tokens and
get_pytest_commands into a helper that returns the matching line or an empty
value. Update both functions to use this helper, preserving their existing
parsing and fallback behavior.

211-228: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider removing the second selection path.

main always passes selected_line, so the split_group branch at Lines 221-226 is unused in the CI flow. Two selection paths for one concept can diverge after a later change. Make selected_line required, or have this fallback call select_test_case_line instead of re-implementing positional selection.

🤖 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 211 - 228, The
parse_test_case_name selection logic duplicates positional test selection even
though main always supplies selected_line. Make selected_line required and
remove the test_list_path, split_group, and fallback branch, or delegate
fallback selection to select_test_case_line instead of indexing lines directly;
preserve the existing selected-line parsing behavior.
tests/unittest/scripts/test_perf_submit.py (1)

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

Test coverage summary

Changed test functions:

  1. test_ci_submit_selects_same_least_duration_shard_as_pytest_split (added) — verifies least-duration group selection and the --durations-path fallback to llm_src.
  2. test_ci_submit_rejects_split_group_disagreement (added) — verifies the --group consistency check.

Test list registration: these are unit tests under tests/unittest/scripts/, not integration tests, so no entry under tests/integration/test_lists/test-db/ or tests/integration/test_lists/qa/ is required. Confirm that tests/unittest/scripts/ is already collected by an existing L0 unit-test stage.

Verdict: sufficient for the primary fix, with these gaps worth closing:

  • Equal durations. With --splits 4 and four tests, every group receives one test, so the tie-break order at submit.py Line 155 is not exercised. Add a case with two identical durations.
  • len(selected) != 1. Add a case where one group receives two tests, and assert the "requires exactly one test" ValueError.
  • Missing --splits/--group. Add a case that asserts the positional fallback still returns lines[split_group - 1].

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 - 145, Extend
tests around select_test_case_line and
test_ci_submit_selects_same_least_duration_shard_as_pytest_split to cover
equal-duration tie-breaking, asserting the expected deterministic group
selection. Add a case where one group contains multiple tests and assert the
exact-one-test ValueError. Add a case without --splits or --group and verify
positional fallback returns lines[split_group - 1]. Confirm the existing L0
unit-test collection includes tests/unittest/scripts/.

Source: Path instructions

🤖 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 `@jenkins/scripts/perf/submit.py`:
- Around line 107-131: Update _load_pytest_split_durations so a missing
durations file is not silently converted to an empty dictionary: emit a clear
warning containing durations_path, or propagate an error when split_group > 0.
Preserve normal loading and validation for existing files, and ensure callers
can identify that duration-based selection is unavailable.
- Around line 134-165: Pin pytest-split to exactly version 0.10.0 in
requirements-dev.txt, preserving the existing dependency entry while adding the
explicit version constraint so CI uses the algorithm matched by
_select_least_duration_group.

---

Nitpick comments:
In `@jenkins/scripts/perf/submit.py`:
- Around line 77-86: Extract the shared pytestCommand export-line lookup from
_pytest_command_tokens and get_pytest_commands into a helper that returns the
matching line or an empty value. Update both functions to use this helper,
preserving their existing parsing and fallback behavior.
- Around line 211-228: The parse_test_case_name selection logic duplicates
positional test selection even though main always supplies selected_line. Make
selected_line required and remove the test_list_path, split_group, and fallback
branch, or delegate fallback selection to select_test_case_line instead of
indexing lines directly; preserve the existing selected-line parsing behavior.

In `@tests/unittest/scripts/test_perf_submit.py`:
- Around line 113-145: Extend tests around select_test_case_line and
test_ci_submit_selects_same_least_duration_shard_as_pytest_split to cover
equal-duration tie-breaking, asserting the expected deterministic group
selection. Add a case where one group contains multiple tests and assert the
exact-one-test ValueError. Add a case without --splits or --group and verify
positional fallback returns lines[split_group - 1]. Confirm the existing L0
unit-test collection includes tests/unittest/scripts/.
🪄 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: 272c70dc-8d52-4c8a-aac5-c830373da971

📥 Commits

Reviewing files that changed from the base of the PR and between 376d219 and 7a2e0ec.

📒 Files selected for processing (2)
  • jenkins/scripts/perf/submit.py
  • tests/unittest/scripts/test_perf_submit.py

Comment thread jenkins/scripts/perf/submit.py
Comment thread jenkins/scripts/perf/submit.py
@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #63099 [ run ] completed with state FAILURE. Commit: 05880f6
/LLM/main/L0_MergeRequest_PR pipeline #51190 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

Signed-off-by: Chien-Chun Hung <2679986+chienchunhung@users.noreply.github.com>
@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 #63248 [ run ] triggered by Bot. Commit: c018511 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

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

Link to invocation

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.

2 participants