diff --git a/python/sglang/test/accuracy_test_runner.py b/python/sglang/test/accuracy_test_runner.py index 6ea30a03b..ebdd0a106 100644 --- a/python/sglang/test/accuracy_test_runner.py +++ b/python/sglang/test/accuracy_test_runner.py @@ -97,6 +97,7 @@ def _run_simple_eval( base_url, other_args=model.extra_args, timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + env=model.env, ) args = SimpleNamespace( @@ -165,6 +166,7 @@ def _run_few_shot_eval( base_url, other_args=model.extra_args, timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + env=model.env, ) args = SimpleNamespace( diff --git a/python/sglang/test/nightly_utils.py b/python/sglang/test/nightly_utils.py index d45de1b69..fbe721d72 100644 --- a/python/sglang/test/nightly_utils.py +++ b/python/sglang/test/nightly_utils.py @@ -229,6 +229,7 @@ class NightlyBenchmarkRunner: extra_bench_args: Optional[List[str]] = None, enable_profile: bool = True, timeout: Optional[int] = None, + env: Optional[dict] = None, ) -> Tuple[List[BenchmarkResult], bool, Optional[float]]: """Run a complete benchmark for a single model with server management. @@ -249,6 +250,7 @@ class NightlyBenchmarkRunner: extra_bench_args: Extra arguments for the benchmark command enable_profile: Whether to enable profiling (default True for NVIDIA) timeout: Optional timeout for server launch (defaults to DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH) + env: Environment dict for subprocess Returns: Tuple of (list of BenchmarkResult objects, success_bool, avg_spec_accept_length or None) @@ -265,6 +267,7 @@ class NightlyBenchmarkRunner: timeout=( timeout if timeout is not None else DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH ), + env=env, ) try: diff --git a/python/sglang/test/performance_test_runner.py b/python/sglang/test/performance_test_runner.py index 4a3700bbc..5985e8692 100644 --- a/python/sglang/test/performance_test_runner.py +++ b/python/sglang/test/performance_test_runner.py @@ -79,6 +79,7 @@ def run_performance_test( other_args=model.extra_args, variant=model.variant or "", extra_bench_args=extra_bench_args, + env=model.env, ) if success and results: diff --git a/python/sglang/test/test_utils.py b/python/sglang/test/test_utils.py index 7be56b378..5c6defeff 100644 --- a/python/sglang/test/test_utils.py +++ b/python/sglang/test/test_utils.py @@ -855,7 +855,9 @@ def popen_launch_server( if env is None: env = os.environ.copy() else: - env = env.copy() + merged = os.environ.copy() + merged.update(env) + env = merged # Store per-run marker path for potential invalidation per_run_marker_path = None diff --git a/test/registered/8-gpu-models/test_deepseek_v31.py b/test/registered/8-gpu-models/test_deepseek_v31.py index 9f3e930cb..b6cc7e5c4 100644 --- a/test/registered/8-gpu-models/test_deepseek_v31.py +++ b/test/registered/8-gpu-models/test_deepseek_v31.py @@ -54,6 +54,7 @@ class TestDeepseekV31(unittest.TestCase): DEEPSEEK_V31_MODEL_PATH, tp_size=8, extra_args=base_args + mtp_args, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_deepseek_v32.py b/test/registered/8-gpu-models/test_deepseek_v32.py index 6bc1d288c..154fea493 100644 --- a/test/registered/8-gpu-models/test_deepseek_v32.py +++ b/test/registered/8-gpu-models/test_deepseek_v32.py @@ -68,6 +68,7 @@ class TestDeepseekV32(unittest.TestCase): DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + DP_ARGS + TOOL_CALL_ARGS + MTP_ARGS, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="DP8+MTP", ), # Variant: "tp" - Pure TP=8 only @@ -82,6 +83,7 @@ class TestDeepseekV32(unittest.TestCase): DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + TP_ARGS + TOOL_CALL_ARGS + MTP_ARGS, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_deepseek_v32_cp_single_node.py b/test/registered/8-gpu-models/test_deepseek_v32_cp_single_node.py index 7c31b028a..95684b63a 100644 --- a/test/registered/8-gpu-models/test_deepseek_v32_cp_single_node.py +++ b/test/registered/8-gpu-models/test_deepseek_v32_cp_single_node.py @@ -65,6 +65,7 @@ class TestDeepseekV32CPSingleNode(unittest.TestCase): DEEPSEEK_V32_EXP_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + DP_ARGS + MTP_ARGS + CP_IN_SEQ_SPLIT_ARGS, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="CP-in-seq-split", ), # Variant: round-robin-split CP mode (TP only, no DP) @@ -72,6 +73,7 @@ class TestDeepseekV32CPSingleNode(unittest.TestCase): DEEPSEEK_V32_EXP_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + MTP_ARGS + CP_ROUND_ROBIN_ARGS, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="CP-round-robin-split", ), ] diff --git a/test/registered/8-gpu-models/test_glm_46_fp8.py b/test/registered/8-gpu-models/test_glm_46_fp8.py index 611912bfa..435763e01 100644 --- a/test/registered/8-gpu-models/test_glm_46_fp8.py +++ b/test/registered/8-gpu-models/test_glm_46_fp8.py @@ -45,6 +45,7 @@ class TestGLM46FP8(unittest.TestCase): GLM_4_6_FP8_MODEL_PATH, tp_size=8, extra_args=base_args + mtp_args, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_mistral_large3.py b/test/registered/8-gpu-models/test_mistral_large3.py index c010d1f62..b7fc0b9d8 100644 --- a/test/registered/8-gpu-models/test_mistral_large3.py +++ b/test/registered/8-gpu-models/test_mistral_large3.py @@ -76,6 +76,7 @@ class TestMistralLarge3(unittest.TestCase): MISTRAL_LARGE3_FP8_MODEL_PATH, tp_size=8, extra_args=base_args + eagle_args, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="TP8+MTP", ), # Variant: "nvfp4" - NVFP4 model + TP=8 + trtllm_mla backend diff --git a/test/registered/8-gpu-models/test_qwen3_235b.py b/test/registered/8-gpu-models/test_qwen3_235b.py index c0e5058c9..0b2213b64 100644 --- a/test/registered/8-gpu-models/test_qwen3_235b.py +++ b/test/registered/8-gpu-models/test_qwen3_235b.py @@ -55,6 +55,7 @@ class TestQwen3235BFP8(unittest.TestCase): QWEN3_235B_FP8_MODEL_PATH, tp_size=8, extra_args=base_args + eagle3_args, + env={"SGLANG_ENABLE_SPEC_V2": "1"}, variant="TP8+EP2+EAGLE3", ), ]