From 7fb102fcb12f2761cc9da3481a34d5cc6a085b77 Mon Sep 17 00:00:00 2001 From: Eric Tsai Date: Thu, 30 Jul 2026 19:34:11 -0700 Subject: [PATCH 1/2] [None][test] Enable warmup request for gen_only perf sanity lanes Signed-off-by: Eric Tsai --- tests/integration/defs/perf/test_perf_sanity.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/integration/defs/perf/test_perf_sanity.py b/tests/integration/defs/perf/test_perf_sanity.py index 4e86d5a34eba..8494688ece8c 100644 --- a/tests/integration/defs/perf/test_perf_sanity.py +++ b/tests/integration/defs/perf/test_perf_sanity.py @@ -894,6 +894,7 @@ def __init__( self.model_path = "" self.dataset_file = client_config_data.get("dataset_file", "") self.use_nv_sa_benchmark = client_config_data.get("use_nv_sa_benchmark", False) + self.warmup = client_config_data.get("warmup", False) self.env_vars = env_vars # spec_decoding flag is retained for DB matching (b_eos column). --ignore-eos # is now always passed; output-length stability with spec decoding comes from @@ -972,11 +973,14 @@ def _to_default_benchmark_cmd(self) -> List[str]: str(self.concurrency * self.iterations), "--max-concurrency", str(self.concurrency), - "--no-test-input", "--percentile-metrics", "ttft,tpot,itl,e2el", "--ignore-eos", ] + # benchmark_serving's initial single-prompt test run doubles as a warmup + # request; keep it disabled unless the lane asks for a warmup. + if not self.warmup: + benchmark_cmd.append("--no-test-input") if dataset_path: benchmark_cmd.append("--dataset-name") benchmark_cmd.append("trtllm_custom") @@ -2003,6 +2007,10 @@ def _parse_disagg_config_file(self, config_file_path: str, config_file: str): "use_nv_sa_benchmark": use_nv_sa_benchmark, "accuracy_config": accuracy_data, "only_run_accuracy": only_run_accuracy, + # gen_only measures a single round (iterations forced to 1 above), + # so one-time costs like the cache transceiver's lazy connection + # setup would land entirely on the measured TTFT without a warmup. + "warmup": benchmark_mode == "gen_only", } client_config = ClientConfig( client_config_data, From 0b3f3df42ab2416845b437fa77c32406c2963e7f Mon Sep 17 00:00:00 2001 From: Eric Tsai Date: Fri, 31 Jul 2026 01:04:12 -0700 Subject: [PATCH 2/2] [None][test] Restrict gen_only warmup to concurrency=1 and record warmup flag in perf DB Signed-off-by: Eric Tsai --- .../integration/defs/perf/test_perf_sanity.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/tests/integration/defs/perf/test_perf_sanity.py b/tests/integration/defs/perf/test_perf_sanity.py index 8494688ece8c..3c27caa0761c 100644 --- a/tests/integration/defs/perf/test_perf_sanity.py +++ b/tests/integration/defs/perf/test_perf_sanity.py @@ -894,6 +894,10 @@ def __init__( self.model_path = "" self.dataset_file = client_config_data.get("dataset_file", "") self.use_nv_sa_benchmark = client_config_data.get("use_nv_sa_benchmark", False) + # Derived from lane identity only (gen_only + concurrency == 1); do not + # set this from lane YAML. warmup is intentionally not a baseline match + # key, which is only sound while its value stays fully determined by + # benchmark_mode and concurrency. self.warmup = client_config_data.get("warmup", False) self.env_vars = env_vars # spec_decoding flag is retained for DB matching (b_eos column). --ignore-eos @@ -977,8 +981,9 @@ def _to_default_benchmark_cmd(self) -> List[str]: "ttft,tpot,itl,e2el", "--ignore-eos", ] - # benchmark_serving's initial single-prompt test run doubles as a warmup - # request; keep it disabled unless the lane asks for a warmup. + # benchmark_serving's initial single-prompt test run (excluded from + # metrics) doubles as a warmup request; keep it disabled unless the + # lane requests one. if not self.warmup: benchmark_cmd.append("--no-test-input") if dataset_path: @@ -1049,6 +1054,7 @@ def to_db_data(self) -> dict: "b_trust_remote_code": self.trust_remote_code, "b_use_nv_sa_benchmark": self.use_nv_sa_benchmark, "b_eos": self.spec_decoding, + "b_warmup": self.warmup, "s_client_log_link": "", "s_client_env_vars": self.env_vars, } @@ -2007,10 +2013,15 @@ def _parse_disagg_config_file(self, config_file_path: str, config_file: str): "use_nv_sa_benchmark": use_nv_sa_benchmark, "accuracy_config": accuracy_data, "only_run_accuracy": only_run_accuracy, - # gen_only measures a single round (iterations forced to 1 above), - # so one-time costs like the cache transceiver's lazy connection - # setup would land entirely on the measured TTFT without a warmup. - "warmup": benchmark_mode == "gen_only", + # gen_only measures a single round (iterations forced to 1 + # above), so one-time costs like the cache transceiver's lazy + # connection setup would otherwise land entirely on the + # measured TTFT. Scoped to concurrency == 1: the gen executor's + # fill gate (TLLM_BENCHMARK_REQ_QUEUES_SIZE) only opens once + # `concurrency` requests are queued, so a lone warmup request + # would deadlock higher-concurrency lanes — which amortize the + # cold start anyway. + "warmup": benchmark_mode == "gen_only" and concurrency == 1, } client_config = ClientConfig( client_config_data,