diff --git a/python/sglang/test/nightly_bench_utils.py b/python/sglang/test/nightly_bench_utils.py index f6d1024e6..38eb61c2b 100644 --- a/python/sglang/test/nightly_bench_utils.py +++ b/python/sglang/test/nightly_bench_utils.py @@ -87,7 +87,9 @@ Note: To view the traces through perfetto-ui, please: return f"| {self.batch_size} | {self.input_len} | {self.latency:.2f} | {self.input_throughput:.2f} | {self.output_throughput:.2f} | {accept_length} | {itl:.2f} | {input_cost:.2f} | {output_cost:.2f} | {profile_link} |\n" -def generate_markdown_report(trace_dir, results: List[BenchmarkResult]) -> str: +def generate_markdown_report( + trace_dir, results: List[BenchmarkResult], variant: Optional[str] = None +) -> str: """Generate a markdown report from a list of BenchmarkResult object from a single run.""" # Build model header with run_name if it's not "default" model_header = results[0].model_path @@ -99,6 +101,9 @@ def generate_markdown_report(trace_dir, results: List[BenchmarkResult]) -> str: if gpu_config: model_header += f" [{gpu_config}]" + if variant: + model_header += f" ({variant})" + summary = f"### {model_header}\n" summary += "| batch size | input len | latency (s) | input throughput (tok/s) | output throughput (tok/s) | acc length | ITL (ms) | input cost ($/1M) | output cost ($/1M) | profile (extend) | profile (decode)|\n" diff --git a/python/sglang/test/nightly_utils.py b/python/sglang/test/nightly_utils.py index 625e8dd47..a5e854311 100644 --- a/python/sglang/test/nightly_utils.py +++ b/python/sglang/test/nightly_utils.py @@ -309,14 +309,16 @@ class NightlyBenchmarkRunner: print(f" Warning: Could not fetch spec accept length: {e}") return None - def add_report(self, results: List[BenchmarkResult]) -> None: + def add_report( + self, results: List[BenchmarkResult], variant: Optional[str] = None + ) -> None: """Add benchmark results to the full report. Args: results: List of BenchmarkResult objects to add to report """ if results: - report_part = generate_markdown_report(self.profile_dir, results) + report_part = generate_markdown_report(self.profile_dir, results, variant) self.full_report += report_part + "\n" def write_final_report(self) -> None: diff --git a/python/sglang/test/performance_test_runner.py b/python/sglang/test/performance_test_runner.py index 0e76d539d..8871316eb 100644 --- a/python/sglang/test/performance_test_runner.py +++ b/python/sglang/test/performance_test_runner.py @@ -57,6 +57,7 @@ def run_performance_test( print(f"\n{'='*60}") print(f"Running PERFORMANCE test for {model.model_path}") + print(f" Variant: {model.variant}") print(f" Batch sizes: {batch_sizes}") print(f" Input lens: {input_lens}") print(f" Output lens: {output_lens}") @@ -80,7 +81,7 @@ def run_performance_test( ) if success and results: - perf_runner.add_report(results) + perf_runner.add_report(results, variant=model.variant) print(f"✓ Performance test succeeded for {model.model_path}") # Validate speculative decoding accept length if threshold is set diff --git a/python/sglang/test/test_utils.py b/python/sglang/test/test_utils.py index bff4a50ac..2152631fc 100644 --- a/python/sglang/test/test_utils.py +++ b/python/sglang/test/test_utils.py @@ -1767,11 +1767,13 @@ class ModelLaunchSettings: tp_size: int = 1, extra_args: Optional[List[str]] = None, env: Optional[dict] = None, + variant: Optional[str] = None, ): self.model_path = model_path self.tp_size = tp_size self.extra_args = list(extra_args) if extra_args else [] self.env = env + self.variant = variant if self.tp_size > 1 and "--tp" not in self.extra_args: self.extra_args.extend(["--tp", str(self.tp_size)]) diff --git a/test/manual/nightly/test_deepseek_v31_perf.py b/test/manual/nightly/test_deepseek_v31_perf.py index 58614350c..68d57b646 100644 --- a/test/manual/nightly/test_deepseek_v31_perf.py +++ b/test/manual/nightly/test_deepseek_v31_perf.py @@ -72,7 +72,7 @@ class TestNightlyDeepseekV31Performance(unittest.TestCase): if not success: failed_variants.append(variant_config["name"]) - self.runner.add_report(results) + self.runner.add_report(results, variant=variant_config["name"]) finally: self.runner.write_final_report() diff --git a/test/manual/nightly/test_deepseek_v32_perf.py b/test/manual/nightly/test_deepseek_v32_perf.py index d395fdd0a..20ba0c125 100644 --- a/test/manual/nightly/test_deepseek_v32_perf.py +++ b/test/manual/nightly/test_deepseek_v32_perf.py @@ -113,7 +113,7 @@ class TestNightlyDeepseekV32Performance(unittest.TestCase): if not success: failed_variants.append(variant_config["name"]) - self.runner.add_report(results) + self.runner.add_report(results, variant=variant_config["name"]) finally: self.runner.write_final_report() diff --git a/test/registered/8-gpu-models/test_deepseek_v31.py b/test/registered/8-gpu-models/test_deepseek_v31.py index 3dce28c2e..3ab39a185 100644 --- a/test/registered/8-gpu-models/test_deepseek_v31.py +++ b/test/registered/8-gpu-models/test_deepseek_v31.py @@ -48,12 +48,14 @@ class TestDeepseekV31Unified(unittest.TestCase): DEEPSEEK_V31_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), # Variant: "mtp" - TP=8 + EAGLE speculative decoding ModelLaunchSettings( DEEPSEEK_V31_MODEL_PATH, tp_size=8, extra_args=base_args + mtp_args, + 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 72cae80b8..dbdd90bd7 100644 --- a/test/registered/8-gpu-models/test_deepseek_v32.py +++ b/test/registered/8-gpu-models/test_deepseek_v32.py @@ -55,24 +55,28 @@ class TestDeepseekV32Unified(unittest.TestCase): DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + DP_ARGS, + variant="DP8", ), # Variant: "dp+mtp" - DP + EAGLE speculative decoding ModelLaunchSettings( DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + DP_ARGS + MTP_ARGS, + variant="DP8+MTP", ), # Variant: "tp" - Pure TP=8 only ModelLaunchSettings( DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + TP_ARGS, + variant="TP8", ), # Variant: "tp+mtp" - Pure TP=8 + EAGLE speculative decoding ModelLaunchSettings( DEEPSEEK_V32_MODEL_PATH, tp_size=8, extra_args=BASE_ARGS + TP_ARGS + MTP_ARGS, + variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_glm_46.py b/test/registered/8-gpu-models/test_glm_46.py index 2b5481107..7436d6a9e 100644 --- a/test/registered/8-gpu-models/test_glm_46.py +++ b/test/registered/8-gpu-models/test_glm_46.py @@ -34,6 +34,7 @@ class TestGLM46Unified(unittest.TestCase): GLM_4_6_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), ] 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 61f94ac9d..9f529b4a2 100644 --- a/test/registered/8-gpu-models/test_glm_46_fp8.py +++ b/test/registered/8-gpu-models/test_glm_46_fp8.py @@ -39,11 +39,13 @@ class TestGLM46FP8Unified(unittest.TestCase): GLM_4_6_FP8_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), ModelLaunchSettings( GLM_4_6_FP8_MODEL_PATH, tp_size=8, extra_args=base_args + mtp_args, + variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_kimi_k2.py b/test/registered/8-gpu-models/test_kimi_k2.py index 5f818a731..dd873d695 100644 --- a/test/registered/8-gpu-models/test_kimi_k2.py +++ b/test/registered/8-gpu-models/test_kimi_k2.py @@ -35,6 +35,7 @@ class TestKimiK2Unified(unittest.TestCase): KIMI_K2_THINKING_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), ] diff --git a/test/registered/8-gpu-models/test_minimax_m2.py b/test/registered/8-gpu-models/test_minimax_m2.py index 397990952..740ae108a 100644 --- a/test/registered/8-gpu-models/test_minimax_m2.py +++ b/test/registered/8-gpu-models/test_minimax_m2.py @@ -37,6 +37,7 @@ class TestMiniMaxM2Unified(unittest.TestCase): MINIMAX_M2_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8+EP8", ), ] diff --git a/test/registered/8-gpu-models/test_mistral_large3.py b/test/registered/8-gpu-models/test_mistral_large3.py index 45c2c3c85..c55d2f06b 100644 --- a/test/registered/8-gpu-models/test_mistral_large3.py +++ b/test/registered/8-gpu-models/test_mistral_large3.py @@ -63,12 +63,14 @@ class TestMistralLarge3Unified(unittest.TestCase): MISTRAL_LARGE3_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), # Variant: "eagle" - TP=8 + trtllm_mla + EAGLE with draft model ModelLaunchSettings( MISTRAL_LARGE3_MODEL_PATH, tp_size=8, extra_args=base_args + eagle_args, + variant="TP8+MTP", ), ] diff --git a/test/registered/8-gpu-models/test_qwen3_235b.py b/test/registered/8-gpu-models/test_qwen3_235b.py index 4888494bc..6110f3ec1 100644 --- a/test/registered/8-gpu-models/test_qwen3_235b.py +++ b/test/registered/8-gpu-models/test_qwen3_235b.py @@ -34,6 +34,7 @@ class TestQwen3235BUnified(unittest.TestCase): QWEN3_235B_MODEL_PATH, tp_size=8, extra_args=base_args, + variant="TP8", ), ]