From b72f9f08c11a4655f283b4d2b72f75fdce2ec5f6 Mon Sep 17 00:00:00 2001 From: Johnsonms Date: Sat, 25 Oct 2025 17:07:37 -0700 Subject: [PATCH] [Test] Add dsv3.2 nsa backend testing (#11936) --- test/srt/run_suite.py | 1 + test/srt/test_deepseek_v32_nsabackend.py | 124 +++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 test/srt/test_deepseek_v32_nsabackend.py diff --git a/test/srt/run_suite.py b/test/srt/run_suite.py index ec0dd6018..29073e15d 100644 --- a/test/srt/run_suite.py +++ b/test/srt/run_suite.py @@ -191,6 +191,7 @@ suites = { "per-commit-8-gpu-h200-deepseek-v32": [ TestFile("test_deepseek_v32_basic.py", 275), TestFile("test_deepseek_v32_mtp.py", 275), + TestFile("test_deepseek_v32_nsabackend.py", 600), ], "vllm_dependency_test": [ TestFile("quant/test_awq.py", 163), diff --git a/test/srt/test_deepseek_v32_nsabackend.py b/test/srt/test_deepseek_v32_nsabackend.py new file mode 100644 index 000000000..1f9975f45 --- /dev/null +++ b/test/srt/test_deepseek_v32_nsabackend.py @@ -0,0 +1,124 @@ +import unittest +from types import SimpleNamespace + +from sglang.srt.utils import kill_process_tree +from sglang.test.few_shot_gsm8k import run_eval as run_eval_few_shot_gsm8k +from sglang.test.send_one import BenchArgs, send_one_prompt +from sglang.test.test_utils import ( + DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + DEFAULT_URL_FOR_TEST, + CustomTestCase, + is_in_ci, + popen_launch_server, + write_github_step_summary, +) + +DEEPSEEK_V32_MODEL_PATH = "deepseek-ai/DeepSeek-V3.2-Exp" + + +class TestDeepseekV32NasBackend_flashmla(CustomTestCase): + @classmethod + def setUpClass(cls): + cls.model = DEEPSEEK_V32_MODEL_PATH + cls.base_url = DEFAULT_URL_FOR_TEST + other_args = [ + "--trust-remote-code", + "--attention-backend", + "nsa", + "--nsa-prefill-backend", + "flashmla_sparse", + "--nsa-decode-backend", + "flashmla_kv", + "--tp", + "8", + "--dp", + "8", + "--enable-dp-attention", + ] + cls.process = popen_launch_server( + cls.model, + cls.base_url, + timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + other_args=other_args, + ) + + @classmethod + def tearDownClass(cls): + kill_process_tree(cls.process.pid) + + def test_a_gsm8k( + self, + ): # Append an "a" to make this test run first (alphabetically) to warm up the server + args = SimpleNamespace( + num_shots=8, + data_path=None, + num_questions=1400, + parallel=1400, + max_new_tokens=512, + host="http://127.0.0.1", + port=int(self.base_url.split(":")[-1]), + ) + metrics = run_eval_few_shot_gsm8k(args) + print(f"{metrics=}") + + if is_in_ci(): + write_github_step_summary( + f"### test_gsm8k (deepseek-v3)\n" f'{metrics["accuracy"]=:.3f}\n' + ) + self.assertGreater(metrics["accuracy"], 0.935) + + +class TestDeepseekV32NasBackend_fa3(CustomTestCase): + @classmethod + def setUpClass(cls): + cls.model = DEEPSEEK_V32_MODEL_PATH + cls.base_url = DEFAULT_URL_FOR_TEST + other_args = [ + "--trust-remote-code", + "--attention-backend", + "nsa", + "--nsa-prefill-backend", + "fa3", + "--nsa-decode-backend", + "fa3", + "--tp", + "8", + "--dp", + "8", + "--enable-dp-attention", + ] + cls.process = popen_launch_server( + cls.model, + cls.base_url, + timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + other_args=other_args, + ) + + @classmethod + def tearDownClass(cls): + kill_process_tree(cls.process.pid) + + def test_a_gsm8k( + self, + ): # Append an "a" to make this test run first (alphabetically) to warm up the server + args = SimpleNamespace( + num_shots=8, + data_path=None, + num_questions=1400, + parallel=1400, + max_new_tokens=512, + host="http://127.0.0.1", + port=int(self.base_url.split(":")[-1]), + ) + metrics = run_eval_few_shot_gsm8k(args) + print(f"{metrics=}") + + if is_in_ci(): + write_github_step_summary( + f"### test_gsm8k (deepseek-v3)\n" f'{metrics["accuracy"]=:.3f}\n' + ) + self.assertGreater(metrics["accuracy"], 0.935) + + +if __name__ == "__main__": + unittest.main()