Skip to content

[None][test] Pair gen_only with gen_only_no_context as a control group in QA multinode perf list - #19324

Open
fredricz-20070104 wants to merge 3 commits into
NVIDIA:mainfrom
fredricz-20070104:user/fredricz/qa-multinode-gen-only-no-context-pair
Open

fredricz-20070104 wants to merge 3 commits into
NVIDIA:mainfrom
fredricz-20070104:user/fredricz/qa-multinode-gen-only-no-context-pair

Conversation

@fredricz-20070104

@fredricz-20070104 fredricz-20070104 commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Description

perf-sanity gained a gen_only_no_context benchmark mode in #19107: the gen worker
fabricates its own KV blocks, so no ctx fleet is allocated and the decode loop is
measured on the gen worker alone. This adds four aggr-gen_only_no_context- ids to
the QA weekly multi-node perf list (tests/integration/test_lists/qa/llm_perf_multinode.txt)
as a control group for the gen_only ids already there — not as a replacement.

Nothing is removed. All nine disagg-gen_only- ids stay exactly as they are;
each new id pairs with one of them over the same config yaml, two per GPU:

disagg-gen_only- aggr-gen_only_no_context-
9 (unchanged) 0 → 4, one per pair
config stem GPU gen_only history points
gb200_gpt-oss-120b-fp4_8k1k_con4_ctx1_tp1_gen1_tp4_eplb0_mtp0_ccb GB200 16
gb200_deepseek-r1-fp4_8k1k_con1_ctx1_dep4_gen1_tep8_eplb0_mtp3_ccb GB200 12
gb300_glm-5-fp4_8k1k_con1024_ctx1_dep2_gen1_dep8_eplb256_mtp1_ccb GB300 11
gb300_kimi-k25-thinking-fp4_8k1k_con4_ctx1_dep4_gen1_tep8_eplb0_mtp3_ccb GB300 12

Why a pair, not a substitution. #19107 measured a per-case gap between the two
modes spanning -37%..+13%. Until the two decode metrics are shown to track each
other per case, neither can stand in for the other — and a case moved from
gen_only to gen_only_no_context has one arm, not two, so it produces no
correlation data at all: it stops reporting the very metric you would correlate
against. Each config's supported_gpus routes it to exactly one GPU chain, so the
paired run is 4 cases on GB200-LYRIS and 4 on GB300-LYRIS.

Why these four. Each one's disagg-gen_only- twin already has decode-metric
(prev_device_step_time) history in the multi-node perf DB, so the paired series
starts against a measured baseline instead of against nothing — point counts over
1.3.0rc1..rc27 above. Two of the four (gpt-oss, deepseek-r1) were characterised in
both arms by #19107 (-8.58% with 1.26% spread, -6.21% with 1.12%), which anchors the
comparison; the other two were not (glm-5 measured but 12.68% peak-to-peak, kimi
never measured in the no-context arm), which is why a longer paired run is needed at
all. Deliberately excluded: the con1024 kimi ids on both GPUs (0 history points —
nothing to pair against) and gb200_wideep, whose 8-node gen worker is the regime
where #19107 saw a 20.4% Slurm-startup retry rate against 0% single-node.

No config yaml change, by design. The mode reads the existing disaggregated yaml
and overrides num_ctx_servers / num_gen_servers to (0, 1) itself
(gen_only_no_context_server_counts), which is what keeps each pair two ids over one
file rather than two files that silently drift. aggr-, not disagg-: the prefix
names the launch path, not the topology — this mode runs one pytest owning the gen
worker, proxy and client, the same single-pytest path ctx_only already takes out of
a disaggregated yaml.

Baselines do not carry over between modes. s_benchmark_mode is an OpenSearch
match key, so each new id starts its own baseline lineage and its decode metric is
un-gated until history accumulates. That is a cost of adding an arm, not of moving
a case — nothing above loses its lineage, because nothing was removed.

⚠️ Depends on #19107

Please do not merge this before #19107. That PR is what teaches the perf-sanity
system the gen_only_no_context mode; without it these four ids do not resolve to a
runnable benchmark mode. The rationale numbers quoted above are also from #19107's
measurements.

Test Coverage

This PR is test-list content — it adds four perf-sanity test ids and changes no
product or test code:

perf/test_perf_sanity.py::test_e2e[aggr-gen_only_no_context-gb200_gpt-oss-120b-fp4_8k1k_con4_ctx1_tp1_gen1_tp4_eplb0_mtp0_ccb-NIXL]
perf/test_perf_sanity.py::test_e2e[aggr-gen_only_no_context-gb200_deepseek-r1-fp4_8k1k_con1_ctx1_dep4_gen1_tep8_eplb0_mtp3_ccb-NIXL]
perf/test_perf_sanity.py::test_e2e[aggr-gen_only_no_context-gb300_glm-5-fp4_8k1k_con1024_ctx1_dep2_gen1_dep8_eplb256_mtp1_ccb-NIXL]
perf/test_perf_sanity.py::test_e2e[aggr-gen_only_no_context-gb300_kimi-k25-thinking-fp4_8k1k_con4_ctx1_dep4_gen1_tep8_eplb0_mtp3_ccb-NIXL]

Cache-transceiver coverage is unaffected: all four configs also run disagg-e2e- in
this same list, and e2e is what exercises the KV transfer between workers. What
gen_only adds over gen_only_no_context is real KV arriving at the gen worker,
which those e2e ids already cover for these configs.

The correlation data itself is being collected outside the weekly QA pipeline, by a
dedicated daily internal GitLab schedule (dlswqa/trtllm-ci schedule 25592,
"9. TRTLLM Gen-Only No-Context Correlation Pipeline") that carries these 8 ids inline
on both GPUs, so nothing here waits on the QA schedule cadence to reach >10 paired
points per case.

PR Checklist

  • Please check this after reviewing the above items as appropriate for this PR.

🤖 Generated with Claude Code

Dev Engineer Review

The change adds four aggr-gen_only_no_context- benchmark IDs. It leaves existing disagg-gen_only- entries and configuration YAML files unchanged. The new entries use no context fleet configuration and depend on gen_only_no_context support from #19107. No source-code or API changes are included.

QA Engineer Review

tests/integration/test_lists/qa/llm_perf_multinode.txt adds four manual-QA entries for GB200 GPT-OSS-120B, GB200 DeepSeek-R1, GB300 GLM-5, and GB300 Kimi-K2.5-Thinking. The entries pair with existing disagg-gen_only- configurations, while existing disagg-e2e- entries retain KV-transfer coverage. The entries are in the appropriate qa/ manual-QA list. No test execution results are supplied; CI was intentionally skipped. Coverage verdict: sufficient.

Per-File QA Perspective

  • tests/integration/test_lists/qa/llm_perf_multinode.txt: Adds four manual-QA IDs for generation without a context fleet. Verify that each ID resolves to the intended configuration and produces an independent baseline lineage.

perf-sanity gained a gen_only_no_context benchmark mode (NVIDIA#19107): the gen
worker fabricates its own KV blocks, so no ctx fleet is allocated and the
decode loop is measured on the gen worker alone. Add four such ids to the QA
weekly multi-node perf list as a CONTROL GROUP for the gen_only ids that are
already there -- not as a replacement for them.

Nothing is removed. All nine disagg-gen_only- ids stay exactly as they are;
each of the four new aggr-gen_only_no_context- ids pairs with one of them over
the SAME config yaml, two per GPU:

  gb200_gpt-oss-120b  con4_ctx1_tp1_gen1_tp4
  gb200_deepseek-r1   con1_ctx1_dep4_gen1_tep8
  gb300_glm-5         con1024_ctx1_dep2_gen1_dep8
  gb300_kimi-k25      con4_ctx1_dep4_gen1_tep8

Why a pair and not a substitution: NVIDIA#19107 measured a per-case gap between the
two modes spanning -37%..+13%, so until the two decode metrics are shown to
track each other per case, neither can stand in for the other. A case moved
from gen_only to gen_only_no_context has one arm, not two, and produces no
correlation data at all -- it stops reporting the very metric you would
correlate against.

Why these four: each one's disagg-gen_only- twin already has decode-metric
history in the multi-node perf DB, so the paired series starts against a
measured baseline instead of against nothing. Point counts over
1.3.0rc1..rc27, on the GPU each config's prefix names: 16, 12, 11 and 12. Two
of the four (gpt-oss, deepseek-r1) were characterised in both arms by NVIDIA#19107
(-8.58% with 1.26% spread, -6.21% with 1.12%), which anchors the comparison;
the other two were not (glm-5 measured but 12.68% peak-to-peak, kimi never
measured in the no-context arm), which is why a longer paired run is needed.

Deliberately excluded: the con1024 kimi ids on both GPUs, which have 0 history
points -- nothing to pair against -- and gb200_wideep, whose 8-node gen worker
is the regime where NVIDIA#19107 saw a 20.4% Slurm-startup retry rate against 0%
single-node.

No config yaml change, by design: the mode reads the existing disaggregated
yaml and overrides num_ctx_servers / num_gen_servers to (0, 1) itself, which is
what keeps each pair two ids over one file rather than two files that silently
drift. aggr-, not disagg-: the prefix names the launch path, and this mode runs
one pytest owning the gen worker, proxy and client, the same single-pytest path
ctx_only already takes out of a disaggregated yaml.

Cache-transceiver coverage is unaffected. All four configs also run
disagg-e2e- in this same list, and e2e is what exercises the KV transfer
between workers; what gen_only adds over gen_only_no_context is real KV
arriving at the gen worker, which those e2e ids already cover.

The new ids start their own baseline lineage -- s_benchmark_mode is an
OpenSearch match key -- so their decode metric is un-gated until history
accumulates. That is a cost of adding an arm, not of moving a case: nothing
above loses its lineage, because nothing above was removed.

Depends on NVIDIA#19107, which adds the mode to the perf-sanity system. Do not merge
this before it: without NVIDIA#19107 these four ids do not resolve to a runnable
benchmark mode.

Signed-off-by: FredricZ-2007 <226039983+fredricz-20070104@users.noreply.github.com>
Co-Authored-By: Claude <noreply@anthropic.com>
@fredricz-20070104
fredricz-20070104 force-pushed the user/fredricz/qa-multinode-gen-only-no-context-pair branch from e5deca6 to 97ab10e Compare September 17, 2026 05:36
@fredricz-20070104

Copy link
Copy Markdown
Collaborator Author

/bot skip --comment "skip test as just modify some test configs, only run in qa side"

@coderabbitai

coderabbitai Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview 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: dfd48c5a-a5a4-402b-b2e9-20700cc1d873

📥 Commits

Reviewing files that changed from the base of the PR and between 9704dfd and 93ddffc.

📒 Files selected for processing (1)
  • tests/integration/test_lists/qa/llm_perf_multinode.txt

Included review availability: Your plan provides up to 12 included reviews per hour; 9 remain after this review.


Walkthrough

The multi-node test list documents gen_only_no_context and adds four aggregated cases. The cases use no context servers, one generation server, fabricated KV blocks, and separate baseline lineages.

Changes

Multi-node performance coverage

Layer / File(s) Summary
Add gen_only_no_context cases
tests/integration/test_lists/qa/llm_perf_multinode.txt
The aggregated multi-node description includes gen_only_no_context. The documentation defines its control-group behavior and launch parameters. Four GB200 and GB300 cases use disaggregated YAMLs with zero context servers and one generation server. The cases retain separate baseline lineages.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Other

Merge Risk: ⚪ Minimal · up to 93ddf

The PR adds documented QA control cases without an identified production or test-harness failure risk.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title follows the required format and clearly identifies the main change: pairing gen_only with gen_only_no_context in the QA multinode performance list.
Description check ✅ Passed The description clearly explains the motivation, scope, dependency on #19107, unchanged entries, test coverage, and checklist status. It provides sufficient technical and validation details.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
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.

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #74022 [ skip ] triggered by Bot. Commit: 9704dfd Link to invocation

@github-actions

Copy link
Copy Markdown

Automatically added "ci: full pre-merge approved" because this PR has satisfied the required GitHub review approvals. Unresolved review conversations and other required checks remain independent merge requirements.

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #74022 [ skip ] completed with state SUCCESS. Commit: 9704dfd
Skipping testing for commit 9704dfd

Link to invocation

@yufeiwu-nv
yufeiwu-nv removed their request for review September 17, 2026 23:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants