40722.diff 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. diff --git a/python/sglang/srt/arg_groups/model_overrides/mimo_v2.py b/python/sglang/srt/arg_groups/model_overrides/mimo_v2.py
  2. index bef9a36304ae..504f0dc34b8b 100644
  3. --- a/python/sglang/srt/arg_groups/model_overrides/mimo_v2.py
  4. +++ b/python/sglang/srt/arg_groups/model_overrides/mimo_v2.py
  5. @@ -8,6 +8,7 @@
  6. from sglang.srt.arg_groups.model_override_base import (
  7. _register_for,
  8. + model_config_of,
  9. resolving_view,
  10. )
  11. from sglang.srt.runtime_context import get_platform
  12. @@ -34,4 +35,16 @@ def _mimo_v2_overrides(server_args: Any, hf_config: Any) -> dict:
  13. ):
  14. overrides["moe_runner_backend"] = "flashinfer_trtllm"
  15. logger.info("MiMoV2 FP8 on SM100: moe_runner_backend=flashinfer_trtllm.")
  16. +
  17. + if (
  18. + get_platform().is_sm120
  19. + and cfg.device == "cuda"
  20. + and cfg.moe_runner_backend == "auto"
  21. + and cfg.moe_a2a_backend == "none"
  22. + ):
  23. + model_config = model_config_of(server_args)
  24. + if model_config.quantization == "fp8" and model_config.is_fp4_experts:
  25. + # The default FP8 Triton runner cannot consume packed MXFP4 experts.
  26. + overrides["moe_runner_backend"] = "flashinfer_mxfp4"
  27. + logger.info("MiMoV2 MXFP4 on SM120: moe_runner_backend=flashinfer_mxfp4.")
  28. return overrides
  29. diff --git a/test/registered/unit/test_model_overrides.py b/test/registered/unit/test_model_overrides.py
  30. index 594096c16921..ffbfac2675ca 100644
  31. --- a/test/registered/unit/test_model_overrides.py
  32. +++ b/test/registered/unit/test_model_overrides.py
  33. @@ -908,6 +908,69 @@ def _args(**kw):
  34. # pinned to flashinfer_trtllm.
  35. self.assertEqual(_mimo_v2_overrides(_args(), _hf("mxfp4")), {})
  36. + def test_mimo_v2_sm120_mxfp4_selects_native_runner(self):
  37. + """Packed MXFP4 experts must not fall through to the FP8 Triton runner."""
  38. + with override_platform(is_sm100=False, is_sm120=True, is_hip=False):
  39. + for architecture in ("MiMoV2ForCausalLM", "MiMoV2FlashForCausalLM"):
  40. + with self.subTest(architecture=architecture):
  41. + args = SimpleNamespace(
  42. + speculative_algorithm=None,
  43. + device="cuda",
  44. + moe_a2a_backend="none",
  45. + moe_runner_backend="auto",
  46. + _model_config=SimpleNamespace(
  47. + quantization="fp8", is_fp4_experts=True
  48. + ),
  49. + )
  50. + self.assertEqual(
  51. + collect_model_override_declarations(
  52. + architecture,
  53. + args,
  54. + SimpleNamespace(architectures=[architecture]),
  55. + ),
  56. + [
  57. + (
  58. + "_mimo_v2_overrides",
  59. + {"moe_runner_backend": "flashinfer_mxfp4"},
  60. + )
  61. + ],
  62. + )
  63. +
  64. + def test_mimo_v2_sm120_mxfp4_preserves_other_configurations(self):
  65. + from sglang.srt.arg_groups.model_overrides.mimo_v2 import _mimo_v2_overrides
  66. +
  67. + with override_platform(is_sm100=False, is_sm120=True, is_hip=False):
  68. + for override in (
  69. + {"moe_runner_backend": "marlin"},
  70. + {"moe_a2a_backend": "deepep"},
  71. + {"device": "cpu"},
  72. + {
  73. + "_model_config": SimpleNamespace(
  74. + quantization="fp8", is_fp4_experts=False
  75. + )
  76. + },
  77. + {
  78. + "_model_config": SimpleNamespace(
  79. + quantization=None, is_fp4_experts=False
  80. + )
  81. + },
  82. + ):
  83. + with self.subTest(override=override):
  84. + values = dict(
  85. + speculative_algorithm="EAGLE",
  86. + device="cuda",
  87. + moe_a2a_backend="none",
  88. + moe_runner_backend="auto",
  89. + _model_config=SimpleNamespace(
  90. + quantization="fp8", is_fp4_experts=True
  91. + ),
  92. + )
  93. + values.update(override)
  94. + self.assertEqual(
  95. + _mimo_v2_overrides(SimpleNamespace(**values), _hf("fp8")),
  96. + {"enable_multi_layer_eagle": True},
  97. + )
  98. +
  99. def test_mimo_v2_family_is_registered(self):
  100. with override_platform(is_sm100=False):
  101. self.assertEqual(