Disable Hopper GLM shared-expert fusion for modelopt_fp4 Marlin (#37325)
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user