[https://nvbugs/6275959][fix] In runJITWarmupGridIfRequested, std::min the warmup-only maxBatchSize against… - #15221
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe PR adds compile-time caps for FMHA JIT warmup grid batch and sequence-length dimensions, then updates the warmup grid generation to clamp the runner-provided warmup parameters against those caps. This prevents the generation of unrealizable warmup grids and reduces NVRTC compile overhead. ChangesFMHA JIT Warmup Grid Capping
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
84f1d06 to
00034fc
Compare
f75b6f1 to
aab26e7
Compare
dad8280 to
2eda7da
Compare
2eda7da to
5533832
Compare
|
The PR description and the actual diff describe two different fixes. Flagging before approval. 1. Description vs. code mismatch The description says the fix is in C++ The actual diff does something different: in Python So the description promises "clamped warmup", but the code implements "skip warmup entirely above a threshold". The description (auto-generated by repair-bot) should be rewritten to match the real change before merge, otherwise future readers/bisects will be misled. 2. Issues with the current implementation
What is fine
Suggestion: the description's "clamped warmup" approach would be preferable — it avoids the timeout while keeping warmup coverage for common shapes. At minimum, please fix the description to reflect the skip-based implementation before merge. |
|
Please have a check on the above issues. If it is intended, I will approve this. |
5533832 to
78f11bd
Compare
…ngine configs PR NVIDIA#14851 added a TRTLLM-Gen FMHA JIT warmup that enumerates a cartesian grid of (batchSize, seqLenQ, seqLenKv) sized by the engine maxima, eagerly compiling NVRTC kernels for each combo. PR NVIDIA#15305 then densified the candidate lists to catch missing kernels. For long-context disagg configs such as disagg_config_ctxtp2_gentp2_llama31_8b_ucx.yaml (max_num_requests=2048, max_seq_len=131072), the densified grid contains thousands of points and the NVRTC compilation time exceeds the 600s wait_for_disagg_server_ready timeout in test_disaggregated_logprobs_serving[llama-3.1-8b-instruct]. Skip the warmup at the Python entry point when the engine maxima product would produce a problematic grid. The runtime kernel selection path is unchanged -- any kernel that would have been warmed up will JIT-compile lazily on first request instead. This restores the documented pre-PR NVIDIA#14851 behavior for oversized configs without affecting the warmup benefit for regular configs. Signed-off-by: tensorrt-cicd <90828364+tensorrt-cicd@users.noreply.github.com>
Signed-off-by: trtllm-agent <296075020+trtllm-agent@users.noreply.github.com>
78f11bd to
9d74c00
Compare
fredricz-20070104
left a comment
There was a problem hiding this comment.
Review summary - CONCERNS
Verdict: The code is functionally coherent and avoids the 600s warmup timeout, so it can likely merge — but the shipped implementation does not match the PR description, and I cannot confirm the threshold actually fires for the failing config, so please reconcile before merge.
Concerns
- [MAJOR]
tensorrt_llm/_torch/pyexecutor/model_engine.py:1398- implementation diverges from the described fix, and threshold trigger is unverifiable- What is wrong: The title/description describe a C++ change in
runJITWarmupGridIfRequestedthatstd::min-caps the warmup-onlymaxBatchSizeagainstkJITWarmupMaxBatchCap=256andmaxSeqLenKvagainstkJITWarmupMaxSeqLenKvCap=16384, so a smaller warmup grid still runs. The actual diff instead skips warmup entirely in Python_run_attention_warmupwhenself.batch_size * self.max_seq_len > 256 * 16384. These are different behaviours. - How it fails: (a) For any over-threshold long-context config, no FMHA shapes are pre-warmed, so the first request pays the full lazy-JIT burst rather than the capped-grid cost the description promises — reviewers approved against a description that does not describe this code. (b) The guard only fires if
self.batch_size/self.max_seq_lenare the engine maxima (2048 × 131072). Ifself.batch_sizeis an effective/runtime batch size, the product stays under 4.19M, the branch never executes, and the timeout regression returns for the failing config. - Suggested fix: Update the description to state warmup is skipped wholesale (not capped), and confirm/assert that
self.batch_sizeandself.max_seq_lenare the engine-config maxima that reproduced nvbugs/6275959.
- What is wrong: The title/description describe a C++ change in
Minor notes (non-blocking)
tensorrt_llm/_torch/pyexecutor/model_engine.py:1399- hardcoded256 * 16384; extract named constants (mirroring thekJITWarmupMaxBatchCap/kJITWarmupMaxSeqLenKvCapnames in the description) or derive from a single documented source so it cannot drift from the C++ grid sizing.
QA view
- Test coverage: partial - the only test change un-waives
test_disaggregated_logprobs_serving[llama-3.1-8b-instruct](the reproducing test). No test asserts the new threshold/skip branch, the boundary at256*16384, or that warmup still runs for under-threshold configs. - SM coverage: architecture-independent - the added guard is pure Python arithmetic with no
get_sm_version/arch guards; the un-waived test runs on H100 only. - Test code: no issues - removing the waive (un-waive) is the correct move rather than a suppression; only gap is the absence of a unit test for the threshold branch.
- Test time: small - one disaggregated serving test re-added to the H100 suite.
- Needs
/qa-verify: yes - this is a waive->unwaive bug fix relying solely on an integration test, the implementation diverges from the description, and the threshold trigger is unverified from the diff. QA should re-run on the original GPU/config to confirm the guard fires and server-start stays under 600s.
Does this actually fix nvbugs/6275959?
Partial. If self.batch_size=2048 and self.max_seq_len=131072, the product (268M) exceeds 4.19M, warmup is skipped, and the timeout is avoided — so the reported failure is addressed and the test is correctly un-waived. Still uncovered: (1) confirmation that self.batch_size is the engine maximum rather than a smaller effective value — if it is smaller the guard never fires; (2) whether skipping all warmup shifts the cost to a first-request JIT burst that could itself stall the newly un-waived test.
Possible new issues
- First-request latency spike for over-threshold long-context configs, since warmup is skipped entirely instead of run on a capped grid.
- Regression returns if
self.batch_sizeis not the engine max and the guard never triggers.
What I could not verify
- The runtime semantics of
self.batch_size/self.max_seq_lenat this call site (config maxima vs effective batch) — not shown in the diff. - Whether the C++
runJITWarmupGridIfRequestedchange referenced in the title exists elsewhere or was dropped in favour of this Python skip. - Whether the un-waived integration test passes under the lazy-JIT first-request cost.
Automated review by NVCortex Lite, run by @fredricz-20070104.
…nd config Review follow-up on NVIDIA#16614 (yingguo-trt, fredricz-20070104): the consolidation dropped test_disaggregated_logprobs_serving, which is the resident regression guard for NVBug 5926823 (disagg + streaming + logprobs). Its API-level coverage is unique -- streaming vs. non-streaming logprobs consistency across both the completions and chat APIs, plus chat top_logprobs across the ctx/gen boundary. test_disaggregated_single_gpu.py::test_disaggregated_logprobs only covers the core prefill->decode propagation, so deleting this would be a test escape. The test was never UCX-specific; it only reused the UCX yaml. Restore it on a new DEFAULT-backend config and drop the explicit TRTLLM_USE_UCX_KVCACHE pin, which keeps the de-UCX-specialization goal of this PR intact. UCX_TLS is kept, matching every other non-pinned test in this file. The waive for the open bug (NVBugs 6275959, fix in flight in NVIDIA#15221) is restored with it. Restores the numpy import: np.isclose in this test is its only user. Signed-off-by: Shixiaowei02 <39303645+Shixiaowei02@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
…nd config Review follow-up on NVIDIA#16614 (yingguo-trt, fredricz-20070104): the consolidation dropped test_disaggregated_logprobs_serving, which is the resident regression guard for NVBug 5926823 (disagg + streaming + logprobs). Its API-level coverage is unique -- streaming vs. non-streaming logprobs consistency across both the completions and chat APIs, plus chat top_logprobs across the ctx/gen boundary. test_disaggregated_single_gpu.py::test_disaggregated_logprobs only covers the core prefill->decode propagation, so deleting this would be a test escape. The test was never UCX-specific; it only reused the UCX yaml. Restore it on a new DEFAULT-backend config and drop the explicit TRTLLM_USE_UCX_KVCACHE pin, which keeps the de-UCX-specialization goal of this PR intact. UCX_TLS is kept, matching every other non-pinned test in this file. The waive for the open bug (NVBugs 6275959, fix in flight in NVIDIA#15221) is restored with it. Restores the numpy import: np.isclose in this test is its only user. Signed-off-by: Shixiaowei02 <39303645+Shixiaowei02@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
Summary
Test plan
Links
Summary by CodeRabbit