From e2f7e712078dd8effab72003de76a40340635408 Mon Sep 17 00:00:00 2001 From: Lizhi Zhou Date: Tue, 4 Aug 2026 21:39:21 -0700 Subject: [PATCH 1/3] [None][fix] enable DSv4 overlap slot headroom without MTP Signed-off-by: Lizhi Zhou --- tensorrt_llm/_torch/pyexecutor/_util.py | 8 ++--- .../_torch/pyexecutor/model_engine.py | 9 +++--- .../_torch/executor/test_seq_slot_sizing.py | 32 ++++++------------- 3 files changed, 17 insertions(+), 32 deletions(-) diff --git a/tensorrt_llm/_torch/pyexecutor/_util.py b/tensorrt_llm/_torch/pyexecutor/_util.py index ec26f5a22855..35627f34f835 100644 --- a/tensorrt_llm/_torch/pyexecutor/_util.py +++ b/tensorrt_llm/_torch/pyexecutor/_util.py @@ -2526,12 +2526,10 @@ def should_enable_dsv4_adp_dummy_fixes(model_type: Optional[str], def should_enable_dsv4_overlap_headroom( - model_type: Optional[str], spec_config: Optional[SpeculativeConfig], - mapping: Mapping, disable_overlap_scheduler: bool) -> bool: - """Gate extra sequence slots to the validated DSv4 MTP overlap path.""" + model_type: Optional[str], mapping: Mapping, + disable_overlap_scheduler: bool) -> bool: + """Gate extra sequence slots to the non-PP DSv4 overlap path.""" return (should_enable_dsv4_adp_dummy_fixes(model_type, mapping) - and spec_config is not None - and spec_config.spec_dec_mode.is_mtp_eagle_one_model() and not disable_overlap_scheduler) diff --git a/tensorrt_llm/_torch/pyexecutor/model_engine.py b/tensorrt_llm/_torch/pyexecutor/model_engine.py index 02dc5da52e6a..b6da0726ba49 100644 --- a/tensorrt_llm/_torch/pyexecutor/model_engine.py +++ b/tensorrt_llm/_torch/pyexecutor/model_engine.py @@ -446,15 +446,14 @@ def __init__( self.model = model pretrained_config = self.model.model_config.pretrained_config model_type = getattr(pretrained_config, "model_type", None) - # Keep the scheduler/dummy fix model-scoped, while the larger slot pool - # is restricted to the validated MTP overlap configuration. PP remains - # on its established path for follow-up changes. + # Keep the scheduler/dummy fix and larger slot pool model-scoped. The + # overlap lifetime requires headroom with or without speculative + # decoding. PP remains on its established path. self._enable_dsv4_adp_dummy_fixes = (should_enable_dsv4_adp_dummy_fixes( model_type, mapping)) self._enable_dsv4_overlap_headroom = ( should_enable_dsv4_overlap_headroom( - model_type, spec_config, mapping, - llm_args.disable_overlap_scheduler)) + model_type, mapping, llm_args.disable_overlap_scheduler)) self.max_num_seq_slots = compute_max_num_sequences( mapping, self.batch_size, diff --git a/tests/unittest/_torch/executor/test_seq_slot_sizing.py b/tests/unittest/_torch/executor/test_seq_slot_sizing.py index d42e6f4483c9..dcef1acd0fb9 100644 --- a/tests/unittest/_torch/executor/test_seq_slot_sizing.py +++ b/tests/unittest/_torch/executor/test_seq_slot_sizing.py @@ -7,16 +7,15 @@ prepare_resources runs, while the V2 scheduler has already dropped them from its budget (no_schedule_after_state=GENERATION_TO_COMPLETE) and backfilled their seats. Transient slot demand is therefore -2 * max_batch_size. The headroom is intentionally limited to DeepSeek-V4; -other models preserve their established sizing pending separate validation. +2 * max_batch_size, regardless of whether speculative decoding is enabled. +The headroom is intentionally limited to DeepSeek-V4; other models preserve +their established sizing pending separate validation. compute_max_num_sequences is the single sizing implementation used both for the executor's SeqSlotManager pool (create_py_executor_instance) and for the sampler state (create_torch_sampler_args). """ -from unittest.mock import Mock - import pytest from tensorrt_llm._torch.pyexecutor._util import ( @@ -40,29 +39,18 @@ @pytest.mark.parametrize( - "model_type,has_spec,is_mtp_one_model,pp_size,disable_overlap,expected", + "model_type,pp_size,disable_overlap,expected", [ - ("deepseek_v4", True, True, 1, False, True), - ("deepseek_v3", True, True, 1, False, False), - ("deepseek_v4", False, False, 1, False, False), - ("deepseek_v4", True, False, 1, False, False), - ("deepseek_v4", True, True, 2, False, False), - ("deepseek_v4", True, True, 1, True, False), + ("deepseek_v4", 1, False, True), + ("deepseek_v3", 1, False, False), + ("deepseek_v4", 2, False, False), + ("deepseek_v4", 1, True, False), ], ) -def test_dsv4_overlap_headroom_gate( - model_type, has_spec, is_mtp_one_model, pp_size, disable_overlap, expected -): - spec_config = None - if has_spec: - spec_config = Mock() - spec_config.spec_dec_mode.is_mtp_eagle_one_model.return_value = is_mtp_one_model +def test_dsv4_overlap_headroom_gate(model_type, pp_size, disable_overlap, expected): mapping = Mapping(world_size=pp_size, tp_size=1, pp_size=pp_size) - assert ( - should_enable_dsv4_overlap_headroom(model_type, spec_config, mapping, disable_overlap) - is expected - ) + assert should_enable_dsv4_overlap_headroom(model_type, mapping, disable_overlap) is expected @pytest.mark.parametrize( From ef4aa87e66acda66e82985b36b9469bcf9d49a9b Mon Sep 17 00:00:00 2001 From: Lizhi Zhou <1432185+reasonsolo@users.noreply.github.com> Date: Thu, 6 Aug 2026 00:20:01 -0700 Subject: [PATCH 2/3] [None][fix] generalize disagg ADP overlap slot headroom Signed-off-by: Lizhi Zhou <1432185+reasonsolo@users.noreply.github.com> --- tensorrt_llm/_torch/pyexecutor/_util.py | 22 +++++----- .../_torch/pyexecutor/model_engine.py | 40 +++++++++---------- .../_torch/pyexecutor/py_executor_creator.py | 9 +++-- ...pseek_v3_lite_v2_attention_dp_overlap.yaml | 31 ++++++++++++++ .../defs/disaggregated/test_disaggregated.py | 27 ++++++++++++- .../test_lists/qa/llm_function_core.txt | 1 + .../test_lists/test-db/l0_dgx_h100.yml | 1 + .../_torch/executor/test_seq_slot_sizing.py | 36 +++++++++++------ 8 files changed, 117 insertions(+), 50 deletions(-) create mode 100644 tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml diff --git a/tensorrt_llm/_torch/pyexecutor/_util.py b/tensorrt_llm/_torch/pyexecutor/_util.py index 35627f34f835..3ece531b2d82 100644 --- a/tensorrt_llm/_torch/pyexecutor/_util.py +++ b/tensorrt_llm/_torch/pyexecutor/_util.py @@ -2504,12 +2504,11 @@ def compute_max_num_sequences(mapping: Mapping, enable_overlap_headroom: bool = False) -> int: """Size the sequence-slot pool (and the sampler state it indexes). - ``enable_overlap_headroom`` is intentionally opt-in. DeepSeek-V4 needs a - second non-PP slot set because the V2 scheduler can backfill seats before - the overlap scheduler releases the previous iteration's terminal slots. - Other models retain their established sizing until that behavior is - validated independently. Pipeline parallelism already sizes the pool by - ``pp_size``. + ``enable_overlap_headroom`` is intentionally opt-in. Disaggregated + attention-DP needs a second non-PP slot set because the V2 scheduler can + backfill seats before the overlap scheduler releases the previous + iteration's terminal slots. Pipeline parallelism already sizes the pool + by ``pp_size``. """ if mapping.has_pp(): num_micro_batches = mapping.pp_size @@ -2525,11 +2524,14 @@ def should_enable_dsv4_adp_dummy_fixes(model_type: Optional[str], return model_type == "deepseek_v4" and not mapping.has_pp() -def should_enable_dsv4_overlap_headroom( - model_type: Optional[str], mapping: Mapping, +def should_enable_disagg_adp_overlap_headroom( + mapping: Mapping, + cache_transceiver_config: Optional[CacheTransceiverConfig], disable_overlap_scheduler: bool) -> bool: - """Gate extra sequence slots to the non-PP DSv4 overlap path.""" - return (should_enable_dsv4_adp_dummy_fixes(model_type, mapping) + """Gate extra sequence slots to non-PP disaggregated attention-DP.""" + is_disagg = (cache_transceiver_config is not None + and cache_transceiver_config.backend is not None) + return (mapping.enable_attention_dp and is_disagg and not mapping.has_pp() and not disable_overlap_scheduler) diff --git a/tensorrt_llm/_torch/pyexecutor/model_engine.py b/tensorrt_llm/_torch/pyexecutor/model_engine.py index b6da0726ba49..65e4b02ce3a1 100644 --- a/tensorrt_llm/_torch/pyexecutor/model_engine.py +++ b/tensorrt_llm/_torch/pyexecutor/model_engine.py @@ -356,13 +356,21 @@ def __init__( self.mapping = mapping if mapping.has_pp(): init_pp_comm(mapping) - # Start with the established pool size. Once the model is loaded we - # selectively enable headroom for the non-PP DeepSeek-V4 overlap path. + # Disaggregated attention-DP can backfill a batch before the overlap + # scheduler releases the previous batch's terminal sequence slots. from ._util import (compute_max_num_sequences, - should_enable_dsv4_adp_dummy_fixes, - should_enable_dsv4_overlap_headroom) + should_enable_disagg_adp_overlap_headroom, + should_enable_dsv4_adp_dummy_fixes) + self._enable_disagg_adp_overlap_headroom = ( + should_enable_disagg_adp_overlap_headroom( + mapping, llm_args.cache_transceiver_config, + llm_args.disable_overlap_scheduler)) self.max_num_seq_slots = compute_max_num_sequences( - mapping, self.batch_size, llm_args.disable_overlap_scheduler) + mapping, + self.batch_size, + llm_args.disable_overlap_scheduler, + enable_overlap_headroom=self._enable_disagg_adp_overlap_headroom, + ) self.dist = dist if dist is not None: ExpertStatistic.create(self.dist.rank) @@ -446,20 +454,8 @@ def __init__( self.model = model pretrained_config = self.model.model_config.pretrained_config model_type = getattr(pretrained_config, "model_type", None) - # Keep the scheduler/dummy fix and larger slot pool model-scoped. The - # overlap lifetime requires headroom with or without speculative - # decoding. PP remains on its established path. - self._enable_dsv4_adp_dummy_fixes = (should_enable_dsv4_adp_dummy_fixes( - model_type, mapping)) - self._enable_dsv4_overlap_headroom = ( - should_enable_dsv4_overlap_headroom( - model_type, mapping, llm_args.disable_overlap_scheduler)) - self.max_num_seq_slots = compute_max_num_sequences( - mapping, - self.batch_size, - llm_args.disable_overlap_scheduler, - enable_overlap_headroom=self._enable_dsv4_overlap_headroom, - ) + self._enable_dsv4_adp_dummy_fixes = should_enable_dsv4_adp_dummy_fixes( + model_type, mapping) if drafting_loop_wrapper is not None: self.model = drafting_loop_wrapper(self.model) self.model_is_wrapped = True @@ -2658,11 +2654,11 @@ def _set_up_spec_metadata( spec_resource_manager: Optional[BaseResourceManager], no_cache=False): spec_config = self.spec_config if self.enable_spec_decode else None - # Only the scoped DeepSeek-V4 overlap path opts into larger metadata + # The disaggregated attention-DP overlap path opts into larger metadata # buffers. Passing None preserves the established max_num_requests - # fallback for every other model, including MTP-Eagle with PP. + # fallback for other configurations, including PP. num_seq_slots = (self.max_num_seq_slots - if self._enable_dsv4_overlap_headroom else None) + if self._enable_disagg_adp_overlap_headroom else None) if no_cache: return get_spec_metadata( spec_config, diff --git a/tensorrt_llm/_torch/pyexecutor/py_executor_creator.py b/tensorrt_llm/_torch/pyexecutor/py_executor_creator.py index 35f3ef5e6a42..680d607efeb5 100644 --- a/tensorrt_llm/_torch/pyexecutor/py_executor_creator.py +++ b/tensorrt_llm/_torch/pyexecutor/py_executor_creator.py @@ -785,12 +785,13 @@ def drafting_loop_wrapper(model): with allocation_scope(ExecutorMemoryType.GUIDED_DECODER): if mapping.is_last_pp_rank(): guided_decoder_slots = (max_num_seq_slots if getattr( - model_engine, "_enable_dsv4_overlap_headroom", False) else - max_batch_size) + model_engine, "_enable_disagg_adp_overlap_headroom", False) + else max_batch_size) kwargs = { "guided_decoding_config": guided_decoding_config, - # The scoped DeepSeek-V4 path follows the expanded slot - # pool. Other configurations retain max_batch_size. + # The disaggregated attention-DP overlap path follows the + # expanded slot pool. Other configurations retain + # max_batch_size. "max_num_sequences": guided_decoder_slots, "vocab_size_padded": model_engine.model.vocab_size_padded, "rank": mapping.rank, diff --git a/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml b/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml new file mode 100644 index 000000000000..16baa1d2f775 --- /dev/null +++ b/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +hostname: localhost +model: DeepSeek-V3-Lite/fp8 +backend: pytorch +cuda_graph_config: null +free_gpu_memory_fraction: 0.2 +max_batch_size: 1 +context_servers: + num_instances: 1 + tensor_parallel_size: 2 + pipeline_parallel_size: 1 + enable_attention_dp: true + disable_overlap_scheduler: true + kv_cache_config: + use_kv_cache_manager_v2: true + cache_transceiver_config: + backend: NIXL + transceiver_runtime: PYTHON +generation_servers: + num_instances: 1 + tensor_parallel_size: 2 + pipeline_parallel_size: 1 + enable_attention_dp: true + disable_overlap_scheduler: false + kv_cache_config: + use_kv_cache_manager_v2: true + cache_transceiver_config: + backend: NIXL + transceiver_runtime: PYTHON diff --git a/tests/integration/defs/disaggregated/test_disaggregated.py b/tests/integration/defs/disaggregated/test_disaggregated.py index c0147c8423b4..b3bfb0a130c9 100644 --- a/tests/integration/defs/disaggregated/test_disaggregated.py +++ b/tests/integration/defs/disaggregated/test_disaggregated.py @@ -303,6 +303,8 @@ def get_test_config(test_desc, example_dir, test_root): f"{test_configs_root}/disagg_config_gentp2_deepseek_v3_lite_attention_dp_gen_only.yaml", "deepseek_v3_lite_fp_8_attention_dp_overlap": f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml", + "deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure": + f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml", "deepseek_v3_lite_fp8_attention_dp_overlap_cuda_graph": f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap_cuda_graph.yaml", "deepseek_v3_lite_fp8_overlap_cuda_graph": @@ -936,7 +938,8 @@ def run_disaggregated_test(example_dir, disagg_schedule_style=None, post_client_test=None, assert_gen_log_contains=None, - perf_metrics_output_dir=None): + perf_metrics_output_dir=None, + server_start_timeout=300): """Run disaggregated test using service discovery instead of MPI. If assert_gen_log_contains is set, the generation-worker logs are captured and, after the @@ -957,7 +960,8 @@ def run_disaggregated_test(example_dir, setup_disagg_cluster(config_file, model_name=model_path, env=run_env, cwd=cwd, schedule_style=disagg_schedule_style, save_log=assert_gen_log_contains is not None, - perf_metrics_output_dir=perf_metrics_output_dir) + perf_metrics_output_dir=perf_metrics_output_dir, + server_start_timeout=server_start_timeout) server_host = config.get("hostname", "localhost") @@ -1995,6 +1999,25 @@ def test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap( cwd=llm_venv.get_working_directory()) +@pytest.mark.skip_less_device(4) +@pytest.mark.parametrize("deepseek_v3_model_root", ['DeepSeek-V3-Lite-fp8'], + indirect=True) +def test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure( + llm_venv, disaggregated_example_root, deepseek_v3_model_root): + """Exercise V2 overlap slot pressure without DeepSeek-V4 or MTP.""" + setup_model_symlink(llm_venv, deepseek_v3_model_root, + "DeepSeek-V3-Lite/fp8") + + run_disaggregated_test( + disaggregated_example_root, + "deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure", + num_iters=1, + env=llm_venv._new_env, + model_path=deepseek_v3_model_root, + cwd=llm_venv.get_working_directory(), + server_start_timeout=1200) + + @skip_no_hopper @pytest.mark.skip_less_device(4) @pytest.mark.parametrize("deepseek_v3_model_root", ['DeepSeek-V3-Lite-fp8'], diff --git a/tests/integration/test_lists/qa/llm_function_core.txt b/tests/integration/test_lists/qa/llm_function_core.txt index bfae8338be28..5c0925ab8f72 100644 --- a/tests/integration/test_lists/qa/llm_function_core.txt +++ b/tests/integration/test_lists/qa/llm_function_core.txt @@ -861,6 +861,7 @@ disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_att disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one_mtp[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap[DeepSeek-V3-Lite-fp8] +disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap_cuda_graph[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxpp2_gentp2_one_mtp[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxtp2ep2pp2_gentp4_one_mtp_block_reuse[DeepSeek-V3-Lite-fp8] diff --git a/tests/integration/test_lists/test-db/l0_dgx_h100.yml b/tests/integration/test_lists/test-db/l0_dgx_h100.yml index ff1642f5e1e4..37d86cd18a04 100644 --- a/tests/integration/test_lists/test-db/l0_dgx_h100.yml +++ b/tests/integration/test_lists/test-db/l0_dgx_h100.yml @@ -219,6 +219,7 @@ l0_dgx_h100: - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_transceiver_runtime_python[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap[DeepSeek-V3-Lite-fp8] + - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one_mtp[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_gen_only[DeepSeek-V3-Lite-fp8] diff --git a/tests/unittest/_torch/executor/test_seq_slot_sizing.py b/tests/unittest/_torch/executor/test_seq_slot_sizing.py index dcef1acd0fb9..47dfd48fb160 100644 --- a/tests/unittest/_torch/executor/test_seq_slot_sizing.py +++ b/tests/unittest/_torch/executor/test_seq_slot_sizing.py @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -"""DeepSeek-V4 seq-slot sizing includes overlap headroom. +"""Disaggregated attention-DP seq-slot sizing includes overlap headroom. Under the overlap scheduler, requests finished in the previous iteration still hold their sequence slots when the next iteration's @@ -8,8 +8,7 @@ from its budget (no_schedule_after_state=GENERATION_TO_COMPLETE) and backfilled their seats. Transient slot demand is therefore 2 * max_batch_size, regardless of whether speculative decoding is enabled. -The headroom is intentionally limited to DeepSeek-V4; other models preserve -their established sizing pending separate validation. +The headroom is selected from runtime topology rather than model architecture. compute_max_num_sequences is the single sizing implementation used both for the executor's SeqSlotManager pool (create_py_executor_instance) and @@ -21,9 +20,10 @@ from tensorrt_llm._torch.pyexecutor._util import ( compute_max_num_sequences, create_torch_sampler_args, + should_enable_disagg_adp_overlap_headroom, should_enable_dsv4_adp_dummy_fixes, - should_enable_dsv4_overlap_headroom, ) +from tensorrt_llm.llmapi.llm_args import CacheTransceiverConfig from tensorrt_llm.mapping import Mapping SIZING_CASES = [ @@ -39,18 +39,30 @@ @pytest.mark.parametrize( - "model_type,pp_size,disable_overlap,expected", + "enable_attention_dp,is_disagg,pp_size,disable_overlap,expected", [ - ("deepseek_v4", 1, False, True), - ("deepseek_v3", 1, False, False), - ("deepseek_v4", 2, False, False), - ("deepseek_v4", 1, True, False), + (True, True, 1, False, True), + (False, True, 1, False, False), + (True, False, 1, False, False), + (True, True, 2, False, False), + (True, True, 1, True, False), ], ) -def test_dsv4_overlap_headroom_gate(model_type, pp_size, disable_overlap, expected): - mapping = Mapping(world_size=pp_size, tp_size=1, pp_size=pp_size) +def test_disagg_adp_overlap_headroom_gate( + enable_attention_dp, is_disagg, pp_size, disable_overlap, expected +): + mapping = Mapping( + world_size=pp_size, + tp_size=1, + pp_size=pp_size, + enable_attention_dp=enable_attention_dp, + ) + cache_config = CacheTransceiverConfig(backend="NIXL") if is_disagg else None - assert should_enable_dsv4_overlap_headroom(model_type, mapping, disable_overlap) is expected + assert ( + should_enable_disagg_adp_overlap_headroom(mapping, cache_config, disable_overlap) + is expected + ) @pytest.mark.parametrize( From 474df5cde1797a0685708dad1c9a9823264280c0 Mon Sep 17 00:00:00 2001 From: Lizhi Zhou <1432185+reasonsolo@users.noreply.github.com> Date: Thu, 6 Aug 2026 01:09:01 -0700 Subject: [PATCH 3/3] [None][test] reuse DSV3 overlap regression Signed-off-by: Lizhi Zhou <1432185+reasonsolo@users.noreply.github.com> --- ...deepseek_v3_lite_attention_dp_overlap.yaml | 14 +++++++-- ...pseek_v3_lite_v2_attention_dp_overlap.yaml | 31 ------------------- .../defs/disaggregated/test_disaggregated.py | 26 ++-------------- .../test_lists/qa/llm_function_core.txt | 1 - .../test_lists/test-db/l0_dgx_h100.yml | 1 - tests/integration/test_lists/waives.txt | 1 - 6 files changed, 15 insertions(+), 59 deletions(-) delete mode 100644 tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml diff --git a/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml b/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml index af8f62e920e1..16baa1d2f775 100644 --- a/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml +++ b/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml @@ -1,21 +1,31 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + hostname: localhost model: DeepSeek-V3-Lite/fp8 backend: pytorch cuda_graph_config: null free_gpu_memory_fraction: 0.2 +max_batch_size: 1 context_servers: num_instances: 1 tensor_parallel_size: 2 pipeline_parallel_size: 1 enable_attention_dp: true disable_overlap_scheduler: true + kv_cache_config: + use_kv_cache_manager_v2: true cache_transceiver_config: - backend: DEFAULT + backend: NIXL + transceiver_runtime: PYTHON generation_servers: num_instances: 1 tensor_parallel_size: 2 pipeline_parallel_size: 1 enable_attention_dp: true disable_overlap_scheduler: false + kv_cache_config: + use_kv_cache_manager_v2: true cache_transceiver_config: - backend: DEFAULT + backend: NIXL + transceiver_runtime: PYTHON diff --git a/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml b/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml deleted file mode 100644 index 16baa1d2f775..000000000000 --- a/tests/integration/defs/disaggregated/test_configs/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -hostname: localhost -model: DeepSeek-V3-Lite/fp8 -backend: pytorch -cuda_graph_config: null -free_gpu_memory_fraction: 0.2 -max_batch_size: 1 -context_servers: - num_instances: 1 - tensor_parallel_size: 2 - pipeline_parallel_size: 1 - enable_attention_dp: true - disable_overlap_scheduler: true - kv_cache_config: - use_kv_cache_manager_v2: true - cache_transceiver_config: - backend: NIXL - transceiver_runtime: PYTHON -generation_servers: - num_instances: 1 - tensor_parallel_size: 2 - pipeline_parallel_size: 1 - enable_attention_dp: true - disable_overlap_scheduler: false - kv_cache_config: - use_kv_cache_manager_v2: true - cache_transceiver_config: - backend: NIXL - transceiver_runtime: PYTHON diff --git a/tests/integration/defs/disaggregated/test_disaggregated.py b/tests/integration/defs/disaggregated/test_disaggregated.py index b3bfb0a130c9..60bac5aa1700 100644 --- a/tests/integration/defs/disaggregated/test_disaggregated.py +++ b/tests/integration/defs/disaggregated/test_disaggregated.py @@ -303,8 +303,6 @@ def get_test_config(test_desc, example_dir, test_root): f"{test_configs_root}/disagg_config_gentp2_deepseek_v3_lite_attention_dp_gen_only.yaml", "deepseek_v3_lite_fp_8_attention_dp_overlap": f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap.yaml", - "deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure": - f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_v2_attention_dp_overlap.yaml", "deepseek_v3_lite_fp8_attention_dp_overlap_cuda_graph": f"{test_configs_root}/disagg_config_ctxtp2_gentp2_deepseek_v3_lite_attention_dp_overlap_cuda_graph.yaml", "deepseek_v3_lite_fp8_overlap_cuda_graph": @@ -1982,7 +1980,6 @@ def test_disaggregated_deepseek_v3_lite_fp8_attention_dp_gen_only( cwd=llm_venv.get_working_directory()) -@skip_no_hopper @pytest.mark.skip_less_device(4) @pytest.mark.parametrize("deepseek_v3_model_root", ['DeepSeek-V3-Lite-fp8'], indirect=True) @@ -1994,28 +1991,11 @@ def test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap( run_disaggregated_test(disaggregated_example_root, "deepseek_v3_lite_fp_8_attention_dp_overlap", + num_iters=1, env=llm_venv._new_env, model_path=deepseek_v3_model_root, - cwd=llm_venv.get_working_directory()) - - -@pytest.mark.skip_less_device(4) -@pytest.mark.parametrize("deepseek_v3_model_root", ['DeepSeek-V3-Lite-fp8'], - indirect=True) -def test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure( - llm_venv, disaggregated_example_root, deepseek_v3_model_root): - """Exercise V2 overlap slot pressure without DeepSeek-V4 or MTP.""" - setup_model_symlink(llm_venv, deepseek_v3_model_root, - "DeepSeek-V3-Lite/fp8") - - run_disaggregated_test( - disaggregated_example_root, - "deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure", - num_iters=1, - env=llm_venv._new_env, - model_path=deepseek_v3_model_root, - cwd=llm_venv.get_working_directory(), - server_start_timeout=1200) + cwd=llm_venv.get_working_directory(), + server_start_timeout=1200) @skip_no_hopper diff --git a/tests/integration/test_lists/qa/llm_function_core.txt b/tests/integration/test_lists/qa/llm_function_core.txt index 5c0925ab8f72..bfae8338be28 100644 --- a/tests/integration/test_lists/qa/llm_function_core.txt +++ b/tests/integration/test_lists/qa/llm_function_core.txt @@ -861,7 +861,6 @@ disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_att disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one_mtp[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap[DeepSeek-V3-Lite-fp8] -disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap_cuda_graph[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxpp2_gentp2_one_mtp[DeepSeek-V3-Lite-fp8] disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxtp2ep2pp2_gentp4_one_mtp_block_reuse[DeepSeek-V3-Lite-fp8] diff --git a/tests/integration/test_lists/test-db/l0_dgx_h100.yml b/tests/integration/test_lists/test-db/l0_dgx_h100.yml index 37d86cd18a04..ff1642f5e1e4 100644 --- a/tests/integration/test_lists/test-db/l0_dgx_h100.yml +++ b/tests/integration/test_lists/test-db/l0_dgx_h100.yml @@ -219,7 +219,6 @@ l0_dgx_h100: - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_transceiver_runtime_python[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap[DeepSeek-V3-Lite-fp8] - - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_v2_attention_dp_overlap_slot_pressure[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one_mtp[DeepSeek-V3-Lite-fp8] - disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_gen_only[DeepSeek-V3-Lite-fp8] diff --git a/tests/integration/test_lists/waives.txt b/tests/integration/test_lists/waives.txt index b36de05b58ea..2785a6531179 100644 --- a/tests/integration/test_lists/waives.txt +++ b/tests/integration/test_lists/waives.txt @@ -113,7 +113,6 @@ disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_bf16_co disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_gen_only[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_one_mtp[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) -disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_attention_dp_overlap_cuda_graph[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxpp2_gentp2_one_mtp[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322) disaggregated/test_disaggregated.py::test_disaggregated_deepseek_v3_lite_fp8_ctxtp2ep2pp2_gentp4_one_mtp_block_reuse[DeepSeek-V3-Lite-fp8] SKIP (https://nvbugs/6162322)