Skip to content

[None][fix] Cherry-pick CBTS-fanout #15592+#15614 onto 2806 HEAD to bisect-confirm 2810 perf-sanity aborts - #15724

Open
chenfeiz0326 wants to merge 1 commit into
NVIDIA:mainfrom
chenfeiz0326:bisect-confirm-add-cbts-fanout
Open

[None][fix] Cherry-pick CBTS-fanout #15592+#15614 onto 2806 HEAD to bisect-confirm 2810 perf-sanity aborts#15724
chenfeiz0326 wants to merge 1 commit into
NVIDIA:mainfrom
chenfeiz0326:bisect-confirm-add-cbts-fanout

Conversation

@chenfeiz0326

@chenfeiz0326 chenfeiz0326 commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

This PR is a bisect-confirmation build only — do not merge.

Context

In post-merge L0_Test-SBSA-Multi-GPU build 2810 (commit c25c23f7), 26 GB200 perf-sanity stages aborted with "Submit Test Result" and "Clean Up Slurm Resource" SKIPPED. The abort rate stepped up between builds 2806 (a51931ad) and 2809 (86bb1f46). The hypothesis is that the CBTS-fanout commit pair 7cc568c4ee (PR #15592) + 86bb1f4612 (PR #15614) is the culprit: it changed CBTS Layer 2.5 from "collapse narrowed stage to 1 shard" to "k = min(count, splits) shards" then to duration-based k, multiplying simultaneous SSH-probe load on OCI HSG head nodes inside uploadResults's fresh withSlurmSshCredentials session.

What this branch does

Branch base: a51931ad2f (2806 HEAD).
Cherry-picks (in merge order):

  1. 7cc568c4ee[None][infra] use default split when CBTS test-db download fails (#15592)
  2. 86bb1f4612[None][infra] take test durations into account to determine cbts splits num (#15614)

The branch is therefore 2806 state + the two suspected CBTS-fanout commits and nothing else from 2807/2808/2809. This isolates the pair's effect.

Expected verification result

Trigger the 2810 aborted stage list on this PR. If the CBTS-fanout pair is the culprit, the abort symptom should appear at 2809-level rate. If aborts stay at 2806-level, the regression involves another commit in the range.

Paired with companion PR #15723 (revert the same two commits on 2809 HEAD) for the bisect-confirmation in the opposite direction.

@chenfeiz0326
chenfeiz0326 requested a review from a team June 29, 2026 15:20
@chenfeiz0326
chenfeiz0326 requested a review from a team as a code owner June 29, 2026 15:20
@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

_cbtsMaybeCollapseSplits is refactored to derive a shard budget k from CBTS-provided affected_stage_test_counts instead of a hard-coded threshold of 20, gating on a test-db artifact path. The CBTS Layer 3 artifact download switches from a bare sh wget to trtllm_utils.llmExecStepWithRetry with wget -nv.

Changes

CBTS Shard Collapse and Artifact Download

Layer / File(s) Summary
Dynamic shard budgeting and artifact retry
jenkins/L0_Test.groovy
_cbtsMaybeCollapseSplits now computes k = min(affected_count, splits) (clamped to 1) from affected_stage_test_counts[stageName], only when a CBTS test-db artifact path is present; skips splitId > k, reduces splits to k, or leaves splits unchanged when k >= splits. The test-db artifact download is switched to trtllm_utils.llmExecStepWithRetry with wget -nv.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 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 accurately summarizes the cherry-pick and its bisect-confirmation goal for the perf-sanity abort regression.
Description check ✅ Passed Mostly complete: it explains the regression, branch contents, and expected verification, even though Test Coverage and PR Checklist sections are missing.
✨ 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

🤖 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/L0_Test.groovy`:
- Around line 1706-1727: _cbtsMaybeCollapseSplits is collapsing shards based
only on CBTS metadata, but renderTestDB may still fall back to the full source
test-db if the narrowed artifact/override is unusable. Update the split-collapse
logic to rely on a success/usable signal from renderTestDB (or another
confirmed-load flag) before skipping extra shards; keep the default splits in
_cbtsMaybeCollapseSplits unless the narrowed DB is actually available. Reference
the CBTS_RESULT lookup and the renderTestDB flow when wiring this check so the
shard count only shrinks after the narrowed test-db is confirmed.
🪄 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: 62de761b-5f0e-47fc-b886-83a01703d54b

📥 Commits

Reviewing files that changed from the base of the PR and between 833ddd2 and 392ff0d.

📒 Files selected for processing (1)
  • jenkins/L0_Test.groovy

Comment thread jenkins/L0_Test.groovy
Comment on lines +1706 to 1727
// CBTS Layer 2.5: a narrowed stage runs K = min(narrowed count, default splits) shards. Returns [skip, splits, splitId].
def _cbtsMaybeCollapseSplits(stageName, splitId, splits) {
def cbts = testFilter[(CBTS_RESULT)]
def counts = cbts?.affected_stage_test_counts
if (!counts) {
// No CBTS or tarball not uploaded (renderTestDB then runs full source) -> keep default splits.
if (cbts == null || !cbts.cbts_test_db_artifact_path) {
return [skip: false, splits: splits, splitId: splitId]
}
def count = counts[stageName]
if (count == null || count >= 20) {
def counts = cbts.affected_stage_test_counts
def count = counts ? counts[stageName] : null
if (count == null) {
return [skip: false, splits: splits, splitId: splitId]
}
if (splitId > 1) {
echo "CBTS [${cbts.scope}]: ${stageName} narrowed to ${count} (< 20), skipping group ${splitId}/${splits}"
return [skip: true, splits: splits, splitId: splitId]
int k = Math.max(1, Math.min(count as int, splits as int))
if (k >= splits) {
return [skip: false, splits: splits, splitId: splitId]
}
if (splits > 1) {
echo "CBTS [${cbts.scope}]: ${stageName} narrowed to ${count} (< 20), collapsing splits=${splits} → 1"
if (splitId > k) {
echo "CBTS [${cbts.scope}]: ${stageName} narrowed to ${count} tests → ${k}/${splits} shards, skipping group ${splitId}"
return [skip: true, splits: splits, splitId: splitId]
}
return [skip: false, splits: 1, splitId: 1]
return [skip: false, splits: k, splitId: splitId]
}

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.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify how affected_stage_test_counts and cbts_test_db_artifact_path are produced,
# and whether they are guaranteed consistent with the narrowed test-db presence.
fd -e groovy | xargs rg -nP -C3 'affected_stage_test_counts|cbts_test_db_artifact_path|test_db_dir_override|getCbtsResult'

Repository: NVIDIA/TensorRT-LLM

Length of output: 8222


Do not reduce shard count until the narrowed test-db is actually used _cbtsMaybeCollapseSplits skips extra shards based on CBTS metadata, but renderTestDB can still fall back to the full source test-db when the artifact download/extraction fails or the override YAML is missing/empty. That can silently drop tests; keep the default split count unless the narrowed DB is confirmed usable, or propagate a success signal back before collapsing.

🤖 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/L0_Test.groovy` around lines 1706 - 1727, _cbtsMaybeCollapseSplits is
collapsing shards based only on CBTS metadata, but renderTestDB may still fall
back to the full source test-db if the narrowed artifact/override is unusable.
Update the split-collapse logic to rely on a success/usable signal from
renderTestDB (or another confirmed-load flag) before skipping extra shards; keep
the default splits in _cbtsMaybeCollapseSplits unless the narrowed DB is
actually available. Reference the CBTS_RESULT lookup and the renderTestDB flow
when wiring this check so the shard count only shrinks after the narrowed
test-db is confirmed.

@chenfeiz0326
chenfeiz0326 force-pushed the bisect-confirm-add-cbts-fanout branch from 392ff0d to a4c64ee Compare June 29, 2026 15:37
@chenfeiz0326 chenfeiz0326 changed the title [DO NOT MERGE][bisect] Cherry-pick CBTS-fanout #15592 onto 2806 HEAD [None][fix] Cherry-pick CBTS-fanout #15592+#15614 onto 2806 HEAD to bisect-confirm 2810 perf-sanity aborts Jun 29, 2026
@chenfeiz0326

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast --stage-list "GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE2-GPU8-Post-Merge-2,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-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-5,GB200-16_GPUs-4_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE2-GPU8-Post-Merge-1,GB200-20_GPUs-5_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE4-GPU16-Post-Merge-4,GB200-24_GPUs-6_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE4-GPU16-Post-Merge-1,GB200-24_GPUs-6_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE2-GPU8-GEN1-NODE4-GPU16-Post-Merge-2,GB200-36_GPUs-9_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE8-GPU32-Post-Merge-1,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-1,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-2,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-3,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-4,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-6,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-7,GB200-4_GPUs-PyTorch-PerfSanity-Post-Merge-8,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-4,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-5,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU1-GEN1-NODE1-GPU4-Post-Merge-7,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU4-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE1-GPU4-Post-Merge-2,GB200-8_GPUs-2_Nodes-PyTorch-PerfSanity-Node2-GPU8-Post-Merge-1,GB200-8_GPUs-2_Nodes-PyTorch-PerfSanity-Node2-GPU8-Post-Merge-7,GB200-8_GPUs-2_Nodes-PyTorch-PerfSanity-Node2-GPU8-Post-Merge-8,GB200-8_GPUs-2_Nodes-PyTorch-Post-Merge-1"

@chenfeiz0326

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast --stage-list "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-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-4,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-6,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-8,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"

@chenfeiz0326
chenfeiz0326 force-pushed the bisect-confirm-add-cbts-fanout branch from a4c64ee to 4ab9bc5 Compare June 30, 2026 02:21
Signed-off-by: Chenfei Zhang <chenfeiz@nvidia.com>
@chenfeiz0326 chenfeiz0326 reopened this Jun 30, 2026
@chenfeiz0326

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast --stage-list "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-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-4,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-5,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-6,GB200-12_GPUs-3_Nodes-PyTorch-Disagg-PerfSanity-CTX1-NODE1-GPU4-GEN1-NODE2-GPU8-Post-Merge-8,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"

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.

1 participant