diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 33f53fc0e..9fc6cfd1a 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -900,6 +900,9 @@ jobs: RUNNER_LABELS: 4-gpu-b200 strategy: fail-fast: false + matrix: + part: [0, 1] + steps: - name: Checkout code uses: actions/checkout@v4 @@ -917,10 +920,10 @@ jobs: CUSTOM_BUILD_SGL_KERNEL=${{needs.check-changes.outputs.sgl_kernel}} IS_BLACKWELL=1 bash scripts/ci/ci_install_dependency.sh - name: Run test - timeout-minutes: 45 + timeout-minutes: 30 run: | cd test/srt - python3 run_suite.py --suite per-commit-4-gpu-b200 --auto-partition-id 0 --auto-partition-size 1 --timeout-per-file 3600 + python3 run_suite.py --suite per-commit-4-gpu-b200 --auto-partition-id ${{ matrix.part }} --auto-partition-size 2 --timeout-per-file 1800 unit-test-backend-4-gpu-gb200: needs: [check-changes, unit-test-backend-2-gpu, sgl-kernel-build-wheels-arm] diff --git a/test/srt/run_suite.py b/test/srt/run_suite.py index 678c59abd..2752886e8 100644 --- a/test/srt/run_suite.py +++ b/test/srt/run_suite.py @@ -178,15 +178,16 @@ suites = { TestFile("test_disaggregation_dp_attention.py", 155), ], "per-commit-4-gpu-b200": [ - TestFile("test_deepseek_v3_fp4_4gpu.py", 3600), + TestFile("test_deepseek_v3_fp4_4gpu.py", 1800), TestFile("test_flash_attention_4.py", 300), TestFile("test_gpt_oss_4gpu.py", 600), TestFile("test_llama31_fp4.py", 300), - TestFile("test_eagle_infer_beta_dp_attention.py", 200), + # TODO: Add it back after the bug is fixed + # TestFile("test_eagle_infer_beta_dp_attention.py", 200), ], "per-commit-4-gpu-gb200": [ TestFile("test_cutedsl_moe.py", 300), - TestFile("test_deepseek_v3_fp4_4gpu.py", 3600), + TestFile("test_deepseek_v3_fp4_4gpu.py", 1800), # Disabled temporarily, see https://github.com/sgl-project/sglang/issues/12533 # TestFile("test_deepseek_v3_cutedsl_4gpu.py", 3600), ], @@ -219,9 +220,10 @@ suites = { ], "nightly-4-gpu-b200": [ TestFile("nightly/test_flashinfer_trtllm_gen_moe_backend.py", 300), - TestFile("test_fp4_moe.py", 300), TestFile("nightly/test_gpt_oss_4gpu_perf.py", 600), TestFile("nightly/test_flashinfer_trtllm_gen_attn_backend.py", 300), + TestFile("test_deepseek_v3_fp4_cutlass_moe.py", 900), + TestFile("test_fp4_moe.py", 300), ], "nightly-8-gpu-b200": [], "nightly-4-gpu": [ @@ -299,6 +301,7 @@ suites = { TestFile("test_deepseek_chat_templates.py"), TestFile("test_disaggregation.py"), TestFile("test_double_sparsity.py"), + TestFile("test_eagle_infer_beta_dp_attention.py"), TestFile("test_embedding_openai_server.py"), TestFile("test_enable_thinking.py"), TestFile("test_eplb.py"), diff --git a/test/srt/test_deepseek_v3_fp4_4gpu.py b/test/srt/test_deepseek_v3_fp4_4gpu.py index d92216e7a..2d675f5a0 100644 --- a/test/srt/test_deepseek_v3_fp4_4gpu.py +++ b/test/srt/test_deepseek_v3_fp4_4gpu.py @@ -8,7 +8,6 @@ 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, @@ -17,6 +16,7 @@ from sglang.test.test_utils import ( ) FULL_DEEPSEEK_V3_FP4_MODEL_PATH = "nvidia/DeepSeek-V3-0324-FP4" +SERVER_LAUNCH_TIMEOUT = 1000 class TestDeepseekV3FP4(CustomTestCase): @@ -41,7 +41,7 @@ class TestDeepseekV3FP4(CustomTestCase): cls.process = popen_launch_server( cls.model, cls.base_url, - timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + timeout=SERVER_LAUNCH_TIMEOUT, other_args=other_args, ) @@ -114,7 +114,7 @@ class TestDeepseekV3FP4MTP(CustomTestCase): cls.process = popen_launch_server( cls.model, cls.base_url, - timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + timeout=SERVER_LAUNCH_TIMEOUT, other_args=other_args, ) @@ -172,58 +172,5 @@ class TestDeepseekV3FP4MTP(CustomTestCase): self.assertGreater(speed, 150) -class TestDeepseekV3FP4CutlassMoE(CustomTestCase): - @classmethod - def setUpClass(cls): - cls.model = FULL_DEEPSEEK_V3_FP4_MODEL_PATH - cls.base_url = DEFAULT_URL_FOR_TEST - other_args = [ - "--tp", - "4", - "--ep", - "4", - "--attention-backend", - "trtllm_mla", - "--moe-runner-backend", - "flashinfer_cutlass", - "--quantization", - "modelopt_fp4", - "--model-loader-extra-config", - '{"enable_multithread_load": true}', - ] - 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=1319, - parallel=1319, - 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-fp4-cutlass-moe)\n" - f'{metrics["accuracy"]=:.3f}\n' - ) - self.assertGreater(metrics["accuracy"], 0.935) - - if __name__ == "__main__": unittest.main() diff --git a/test/srt/test_deepseek_v3_fp4_cutlass_moe.py b/test/srt/test_deepseek_v3_fp4_cutlass_moe.py new file mode 100644 index 000000000..02c66fffd --- /dev/null +++ b/test/srt/test_deepseek_v3_fp4_cutlass_moe.py @@ -0,0 +1,72 @@ +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.test_utils import ( + DEFAULT_URL_FOR_TEST, + CustomTestCase, + is_in_ci, + popen_launch_server, + write_github_step_summary, +) + +FULL_DEEPSEEK_V3_FP4_MODEL_PATH = "nvidia/DeepSeek-V3-0324-FP4" +SERVER_LAUNCH_TIMEOUT = 1000 + + +class TestDeepseekV3FP4CutlassMoE(CustomTestCase): + @classmethod + def setUpClass(cls): + cls.model = FULL_DEEPSEEK_V3_FP4_MODEL_PATH + cls.base_url = DEFAULT_URL_FOR_TEST + other_args = [ + "--tp", + "4", + "--ep", + "4", + "--attention-backend", + "trtllm_mla", + "--moe-runner-backend", + "flashinfer_cutlass", + "--quantization", + "modelopt_fp4", + "--model-loader-extra-config", + '{"enable_multithread_load": true}', + ] + cls.process = popen_launch_server( + cls.model, + cls.base_url, + timeout=SERVER_LAUNCH_TIMEOUT, + 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=1319, + parallel=1319, + 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-fp4-cutlass-moe)\n" + f'{metrics["accuracy"]=:.3f}\n' + ) + self.assertGreater(metrics["accuracy"], 0.935) + + +if __name__ == "__main__": + unittest.main()