A high-throughput and memory-efficient inference and serving engine for LLMs
[feature] MiniMax-M3-MXFP4 support added (#45896)
Signed-off-by: Qiang Li <qiang.li2@amd.com>
qli88 committed
Jun 17, 2026 at 13:50 UTC
d112eb1ac78ede18c60ad98f65da238ca3e052b4
4 files changed
+44
-3
vllm/model_executor/layers/fused_moe/experts/gpt_oss_triton_kernels_moe.py
+14
@@ -755,6 +755,7 @@ class UnfusedOAITritonExperts(LoRAExpertsMixin, BaseOAITritonExperts):
755
MoEActivation.GELU,
756
MoEActivation.SWIGLUOAI,
757
MoEActivation.SWIGLUSTEP,
758
+ MoEActivation.SWIGLUOAI_UNINTERLEAVE,
759
]
760
761
@staticmethod
@@ -811,6 +812,19 @@ class UnfusedOAITritonExperts(LoRAExpertsMixin, BaseOAITritonExperts):
812
input,
813
quant_config.gemm1_clamp_limit,
814
)
815
+ elif activation == MoEActivation.SWIGLUOAI_UNINTERLEAVE:
816
+ assert quant_config.gemm1_clamp_limit is not None
817
+ alpha = (
818
+ quant_config.gemm1_alpha
819
+ if quant_config.gemm1_alpha is not None
820
+ else 1.0
821
+ )
822
+ beta = (
823
+ quant_config.gemm1_beta if quant_config.gemm1_beta is not None else 0.0
824
+ )
825
+ torch.ops._C.silu_and_mul_with_clamp(
826
+ output, input, quant_config.gemm1_clamp_limit, alpha, beta
827
+ )
828
else:
829
super().activation(activation, output, input)
830
vllm/model_executor/layers/fused_moe/oracle/mxfp4.py
+12
-1
@@ -503,7 +503,18 @@ def select_mxfp4_moe_backend(
503
activation_format,
504
)
505
506
- if current_platform.is_cuda() or current_platform.is_rocm():
506
+ if current_platform.is_rocm():
507
+ backend = Mxfp4MoeBackend.TRITON_UNFUSED
508
+ logger.info_once(_make_log_backend(backend))
509
+ return _return_or_raise(
510
+ Mxfp4MoeBackend.TRITON_UNFUSED,
511
+ config,
512
+ kMxfp4Static,
513
+ None,
514
+ activation_format,
515
+ )
516
+
517
+ if current_platform.is_cuda():
518
raise NotImplementedError(
519
"No MXFP4 MoE backend supports the deployment configuration. "
520
f"weight_key=kMxfp4Static, activation_key={activation_key}. "
vllm/model_executor/layers/quantization/quark/quark_moe.py
+6
@@ -1303,6 +1303,9 @@ class QuarkOCP_MX_MoEMethod(QuarkMoEMethod):
1303
w2_bias=getattr(layer, "w2_bias", None),
1304
a1_scale=getattr(layer, "w13_input_scale", None),
1305
a2_scale=getattr(layer, "w2_input_scale", None),
1306
+ gemm1_alpha=getattr(layer, "swiglu_alpha", None),
1307
+ gemm1_beta=getattr(layer, "swiglu_beta", None),
1308
+ swiglu_limit=getattr(layer, "swiglu_limit", None),
1309
)
1310
1311
# Emulation and other schemes
@@ -1339,6 +1342,9 @@ class QuarkOCP_MX_MoEMethod(QuarkMoEMethod):
1342
a1_scale=None,
1343
a2_scale=None,
1344
block_shape=None,
1345
+ gemm1_alpha=getattr(layer, "swiglu_alpha", None),
1346
+ gemm1_beta=getattr(layer, "swiglu_beta", None),
1347
+ gemm1_clamp_limit=getattr(layer, "swiglu_limit", None),
1348
)
1349
1350
@property
vllm/models/minimax_m3/amd/model.py
+12
-2
@@ -924,6 +924,11 @@ class MiniMaxM3Model(nn.Module, EagleModelMixin):
924
class MiniMaxM3SparseForCausalLM(nn.Module, SupportsEagle3):
925
"""MiniMax M3 (sparse/dense backbone) for causal language modeling."""
926
927
+ packed_modules_mapping = {
928
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
929
+ "gate_up_proj": ["gate_proj", "up_proj"],
930
+ }
931
+
932
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
933
super().__init__()
934
config = vllm_config.model_config.hf_text_config
@@ -987,14 +992,19 @@ class MiniMaxM3SparseForConditionalGeneration(
992
# ranks (see ``_process_image_input`` / ``_process_video_input``).
993
supports_encoder_tp_data = True
994
995
+ packed_modules_mapping = {
996
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
997
+ "gate_up_proj": ["gate_proj", "up_proj"],
998
+ }
999
+
1000
hf_to_vllm_mapper = WeightsMapper(
1001
orig_to_new_prefix={
1002
"multi_modal_projector.": "vision_tower.multi_modal_projector.",
1003
"patch_merge_mlp.": "vision_tower.patch_merge_mlp.",
1004
},
1005
orig_to_new_substr={
996
- ".mlp.fc1.": ".fc1.",
997
- ".mlp.fc2.": ".fc2.",
1006
+ ".mlp.fc1": ".fc1",
1007
+ ".mlp.fc2": ".fc2",
1008
},
1009
)
1010