Disable Hopper GLM shared-expert fusion for modelopt_fp4 Marlin (#37325)

This commit is contained in:
Po-Han Huang (NVIDIA)
2026-09-08 06:16:36 -07:00
committed by GitHub
parent 2d339ddef1
commit 5097f9ac95
2 changed files with 61 additions and 0 deletions
+12
View File
@@ -200,6 +200,7 @@ from sglang.srt.utils import (
LazyValue, LazyValue,
add_prefix, add_prefix,
is_non_idle_and_non_empty, is_non_idle_and_non_empty,
is_sm90_supported,
make_layers, make_layers,
use_intel_amx_backend, use_intel_amx_backend,
) )
@@ -2973,6 +2974,17 @@ class DeepseekV2ForCausalLM(nn.Module, DeepseekV2WeightLoaderMixin):
) )
if get_exec().moe.enforce_shared_experts_fusion: if get_exec().moe.enforce_shared_experts_fusion:
return None return None
if (
quant_config is not None
and quant_config.get_name() == "modelopt_fp4"
and is_sm90_supported()
and get_moe_runner_backend().is_marlin()
):
return (
"Hopper modelopt_fp4 with moe_runner_backend=marlin: "
"fusion off by default until the shared-expert fused load path "
"is validated."
)
if is_sbo_enabled() or is_tbo_enabled(): if is_sbo_enabled() or is_tbo_enabled():
return "SBO/TBO enabled: incompatible with fusing shared expert into MoE kernel." return "SBO/TBO enabled: incompatible with fusing shared expert into MoE kernel."
if is_deepep_class_backend(): if is_deepep_class_backend():
@@ -159,6 +159,55 @@ class TestDeepseekV2Gate(_FusionGateCase):
) )
self.assertIsNone(self._reason(DeepseekV2ForCausalLM, self._config(), matched)) self.assertIsNone(self._reason(DeepseekV2ForCausalLM, self._config(), matched))
def test_hopper_modelopt_fp4_marlin_disables_fusion_by_default(self):
import sglang.srt.models.deepseek_v2 as deepseek_v2
from sglang.srt.layers.moe.utils import MoeRunnerBackend
from sglang.srt.models.deepseek_v2 import DeepseekV2ForCausalLM
self._seed()
with (
unittest.mock.patch.object(
deepseek_v2, "is_sm90_supported", return_value=True
),
unittest.mock.patch.object(
deepseek_v2,
"get_moe_runner_backend",
return_value=MoeRunnerBackend.MARLIN,
),
):
self.assertIn(
"fusion off by default",
self._reason(
DeepseekV2ForCausalLM,
self._config(),
_quant("modelopt_fp4"),
),
)
def test_hopper_modelopt_fp4_marlin_can_still_be_forced(self):
import sglang.srt.models.deepseek_v2 as deepseek_v2
from sglang.srt.layers.moe.utils import MoeRunnerBackend
from sglang.srt.models.deepseek_v2 import DeepseekV2ForCausalLM
self._seed(enforce_shared_experts_fusion=True)
with (
unittest.mock.patch.object(
deepseek_v2, "is_sm90_supported", return_value=True
),
unittest.mock.patch.object(
deepseek_v2,
"get_moe_runner_backend",
return_value=MoeRunnerBackend.MARLIN,
),
):
self.assertIsNone(
self._reason(
DeepseekV2ForCausalLM,
self._config(),
_quant("modelopt_fp4"),
)
)
class TestGlmMoeLiteGate(_FusionGateCase): class TestGlmMoeLiteGate(_FusionGateCase):
def _config(self, **kw): def _config(self, **kw):