fix(minimax): use routed TRT-LLM for NVFP4 MoE auto on SM100 (#32229)

Co-authored-by: Mohammad Miadh Angkad <176301910+mmangkad@users.noreply.github.com>
This commit is contained in:
Jan Bernlöhr
2026-08-10 11:45:14 +08:00
committed by GitHub
co-authored by Mohammad Miadh Angkad
parent 410088c91e
commit 5d85f25f75
2 changed files with 58 additions and 1 deletions
+12 -1
View File
@@ -731,10 +731,21 @@ def _mimo_v2_overrides(server_args: Any, hf_config: Any) -> dict:
@_register_for("MiniMaxM2ForCausalLM")
def _minimax_m2_overrides(server_args: Any, hf_config: Any) -> dict:
overrides = {"enable_tf32_matmul": True}
logger.info(
"Enable TF32 matmul for MiniMaxM2ForCausalLM model to improve gate gemm performance."
)
return {"enable_tf32_matmul": True}
if (
is_sm100_supported()
and server_args.moe_runner_backend == "auto"
and server_args.get_model_config().quantization == "modelopt_fp4"
):
overrides["moe_runner_backend"] = "flashinfer_trtllm_routed"
logger.info(
"Use flashinfer_trtllm_routed as MoE runner backend on SM10X "
"for MiniMaxM2ForCausalLM with modelopt_fp4."
)
return overrides
@_register_for("MiniMaxM3SparseForCausalLM", "MiniMaxM3SparseForConditionalGeneration")
@@ -25,6 +25,7 @@ from sglang.srt.arg_groups.overrides import (
from sglang.srt.environ import envs
from sglang.srt.runtime_context import (
get_context,
get_exec,
get_server_args,
reset_context,
)
@@ -346,6 +347,51 @@ class TestGoldenModelOverrides(_IsolatedPublish):
self.assertTrue(flags.enable_tf32_matmul)
self.assertFalse(flags.enable_multi_layer_eagle) # pristine materialize
def test_minimax_m2_sm10x_nvfp4_uses_routed_trtllm(self):
"""MiniMax-M2 NVFP4 auto must avoid the unsupported plain TRT-LLM path."""
with patch.object(overrides_module, "is_sm100_supported", return_value=True):
explicit = self._construct(
"MiniMaxM2ForCausalLM",
"llama",
quantization="modelopt_fp4",
moe_runner_backend="flashinfer_cutlass",
)
non_nvfp4 = self._construct(
"MiniMaxM2ForCausalLM", "llama", quantization="fp8"
)
nvfp4 = self._construct(
"MiniMaxM2ForCausalLM", "llama", quantization="modelopt_fp4"
)
self.assertEqual(explicit.moe_runner_backend, "flashinfer_cutlass")
self.assertEqual(non_nvfp4.moe_runner_backend, "auto")
self.assertEqual(nvfp4.moe_runner_backend, "flashinfer_trtllm_routed")
self.assertTrue(nvfp4.disable_shared_experts_fusion)
self.assertIn(
(
"_minimax_m2_overrides",
{
"enable_tf32_matmul": True,
"moe_runner_backend": "flashinfer_trtllm_routed",
},
),
nvfp4._resolved_overrides,
)
self.assertIn(
("_moe_runner_fusion_disable", {"disable_shared_experts_fusion": True}),
nvfp4._resolved_overrides,
)
# Thor (SM110) and other architectures keep the existing auto behavior.
with patch.object(overrides_module, "is_sm100_supported", return_value=False):
non_sm10x = self._construct(
"MiniMaxM2ForCausalLM", "llama", quantization="modelopt_fp4"
)
self.assertEqual(non_sm10x.moe_runner_backend, "auto")
self._publish(nvfp4)
self.assertEqual(get_exec().moe.moe_runner_backend, "flashinfer_trtllm_routed")
def test_mimo_v2_declarations(self):
# Callable-level golden: MiMoV2 archs are hybrid (config-shape heavy),
# so the declaration is pinned directly for both provider inputs.