From 3594815a8b299d7baf202668aeef2288905ed577 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Nov 2025 12:17:43 +0800 Subject: [PATCH] Re-enable Flashinfer TRTLLM GEN MHA and Add Unit Test (#12885) --- .../layers/attention/attention_registry.py | 3 +- ...test_flashinfer_trtllm_gen_attn_backend.py | 62 +++++++++++++++++++ test/srt/run_suite.py | 1 + 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 test/srt/nightly/test_flashinfer_trtllm_gen_attn_backend.py diff --git a/python/sglang/srt/layers/attention/attention_registry.py b/python/sglang/srt/layers/attention/attention_registry.py index 67a7343f2..41b37f08d 100644 --- a/python/sglang/srt/layers/attention/attention_registry.py +++ b/python/sglang/srt/layers/attention/attention_registry.py @@ -199,7 +199,8 @@ def attn_backend_wrapper(runner: "ModelRunner", full_attn_backend: "AttentionBac if is_blackwell(): assert ( runner.server_args.attention_backend == "triton" - ), "triton backend is the only supported backend on Blackwell GPUs for hybrid GDN models, use --attention-backend triton to specify the backend." + or runner.server_args.attention_backend == "trtllm_mha" + ), "triton or trtllm_mha backend are the only supported backends on Blackwell GPUs for hybrid GDN models, use --attention-backend triton or --attention-backend trtllm_mha to specify the backend." if is_npu(): assert ( runner.server_args.attention_backend == "ascend" diff --git a/test/srt/nightly/test_flashinfer_trtllm_gen_attn_backend.py b/test/srt/nightly/test_flashinfer_trtllm_gen_attn_backend.py new file mode 100644 index 000000000..3328c164f --- /dev/null +++ b/test/srt/nightly/test_flashinfer_trtllm_gen_attn_backend.py @@ -0,0 +1,62 @@ +import os +import unittest +from types import SimpleNamespace + +from sglang.srt.utils import kill_process_tree +from sglang.test.few_shot_gsm8k import run_eval +from sglang.test.test_utils import ( + DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + DEFAULT_URL_FOR_TEST, + CustomTestCase, + popen_launch_server, +) + + +class TestFlashinferTrtllmGenAttnBackend(CustomTestCase): + @classmethod + def setUpClass(cls): + cls.model = "Qwen/Qwen3-Next-80B-A3B-Instruct" + cls.base_url = DEFAULT_URL_FOR_TEST + cls.process = popen_launch_server( + cls.model, + cls.base_url, + timeout=DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH, + env={**os.environ, "SGLANG_ENABLE_JIT_DEEPGEMM": "False"}, + other_args=[ + "--attention-backend", + "trtllm_mha", + "--cuda-graph-max-bs", + "512", + "--tp-size", + "4", + "--ep-size", + "4", + "--mem-fraction-static", + "0.7", + "--mamba-ssm-dtype", + "bfloat16", + "--disable-radix-cache", + ], + ) + + @classmethod + def tearDownClass(cls): + kill_process_tree(cls.process.pid) + + def test_gsm8k(self): + args = SimpleNamespace( + num_shots=5, + data_path=None, + num_questions=200, + max_new_tokens=512, + parallel=128, + host="http://127.0.0.1", + port=int(self.base_url.split(":")[-1]), + ) + metrics = run_eval(args) + print(f"{metrics=}") + self.assertGreater(metrics["accuracy"], 0.93) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/srt/run_suite.py b/test/srt/run_suite.py index f980f8003..e64760f58 100644 --- a/test/srt/run_suite.py +++ b/test/srt/run_suite.py @@ -221,6 +221,7 @@ suites = { "nightly-4-gpu-b200": [ 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), ], "nightly-8-gpu-b200": [], "nightly-4-gpu": [],