@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 5e584ce9ec
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 4, 21:15 UTC

[MoE Refactor] Remove SharedFusedMoE class (#35782)

Signed-off-by: Bill Nell <bnell@redhat.com>

bnellnm committed Apr 21, 2026 at 18:12 UTC 5e584ce9ecb3cce63f1caab86177aef5c831690f
33 files changed +112 -141
tests/kernels/moe/test_moe_layer.py
+3 -7
@@ -37,7 +37,7 @@ from vllm.distributed.parallel_state import (
37 get_eplb_group,
38 )
39 from vllm.forward_context import set_forward_context
40 -from vllm.model_executor.layers.fused_moe import FusedMoE, SharedFusedMoE, fused_experts
40 +from vllm.model_executor.layers.fused_moe import FusedMoE, fused_experts
41 from vllm.model_executor.layers.fused_moe.activation import MoEActivation
42 from vllm.model_executor.layers.fused_moe.config import FusedMoEQuantConfig
43 from vllm.model_executor.layers.fused_moe.router.router_factory import (
@@ -858,11 +858,7 @@ def make_fused_moe_layer(
858 quant_config, qw = make_quant_config(quantization, w1, w2, global_num_experts)
859
860 kwargs = dict()
861 - if shared_experts is None:
862 - builder = FusedMoE
863 - else:
864 - builder = SharedFusedMoE
865 - kwargs["shared_experts"] = shared_experts
861 + kwargs["shared_experts"] = shared_experts
862
863 # Add gate and routed_input_transform if provided
864 if gate is not None:
@@ -872,7 +868,7 @@ def make_fused_moe_layer(
868 kwargs["routed_input_transform"] = routed_input_transform
869 kwargs["routed_output_transform"] = routed_output_transform
870
875 - layer = builder(
871 + layer = FusedMoE(
872 num_experts=global_num_experts,
873 top_k=top_k,
874 hidden_size=hidden_size,
tests/kernels/moe/test_shared_fused_moe_routed_transform.py
+10 -10
@@ -1,9 +1,9 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 """
4 -Tests for SharedFusedMoE with routed_input_transform.
4 +Tests for FusedMoE with routed_input_transform.
5
6 -Verifies that applying routed_input_transform inside SharedFusedMoE
6 +Verifies that applying routed_input_transform inside FusedMoE
7 produces the same results as applying the transform manually outside.
8 """
9
@@ -13,7 +13,7 @@ import torch.nn as nn
13
14 from vllm.config import VllmConfig, set_current_vllm_config
15 from vllm.forward_context import set_forward_context
16 -from vllm.model_executor.layers.fused_moe.shared_fused_moe import SharedFusedMoE
16 +from vllm.model_executor.layers.fused_moe import FusedMoE
17 from vllm.platforms import current_platform
18 from vllm.utils.torch_utils import is_torch_equal_or_newer, set_random_seed
19
@@ -133,9 +133,9 @@ def test_routed_input_transform_inside_vs_outside(
133 workspace_init,
134 monkeypatch,
135 ):
136 - """Compare SharedFusedMoE with transform inside vs manually applying outside.
137 - Method A (inside): SharedFusedMoE with routed_input_transform
138 - Method B (outside): Manually transform, then SharedFusedMoE without transform
136 + """Compare FusedMoE with transform inside vs manually applying outside.
137 + Method A (inside): FusedMoE with routed_input_transform
138 + Method B (outside): Manually transform, then FusedMoE without transform
139 """
140 if current_platform.is_rocm():
141 monkeypatch.setenv("VLLM_ROCM_USE_AITER", "1" if use_rocm_aiter else "0")
@@ -157,8 +157,8 @@ def test_routed_input_transform_inside_vs_outside(
157 routed_transform = SimpleLinear(hidden_size, latent_size, dtype)
158
159 with set_current_vllm_config(vllm_config):
160 - # Method A: SharedFusedMoE WITH routed_input_transform
161 - moe_with_transform = SharedFusedMoE(
160 + # Method A: FusedMoE WITH routed_input_transform
161 + moe_with_transform = FusedMoE(
162 shared_experts=shared_experts,
163 routed_input_transform=routed_transform,
164 num_experts=num_experts,
@@ -173,9 +173,9 @@ def test_routed_input_transform_inside_vs_outside(
173 prefix="moe_with_transform",
174 )
175
176 - # Method B: SharedFusedMoE WITHOUT routed_input_transform
176 + # Method B: FusedMoE WITHOUT routed_input_transform
177 # Note: shared_experts=None because when transform is done outside,
178 - moe_without_transform = SharedFusedMoE(
178 + moe_without_transform = FusedMoE(
179 shared_experts=None,
180 routed_input_transform=None,
181 num_experts=num_experts,
vllm/distributed/device_communicators/base_device_communicator.py
+3 -10
@@ -7,6 +7,8 @@ import torch
7 import torch.distributed as dist
8 from torch.distributed import ProcessGroup
9
10 +from vllm.utils import is_moe_layer
11 +
12
13 class Cache:
14 def __init__(self):
@@ -317,16 +319,7 @@ class DeviceCommunicatorBase:
319 if not self.is_ep_communicator:
320 return
321
320 - moe_modules = [
321 - module
322 - for module in model.modules()
323 - # TODO(bnell): Should use isinstance but can't. Maybe search for
324 - # presence of quant_method.maybe_init_modular_kernel?
325 - if (
326 - module.__class__.__name__ == "FusedMoE"
327 - or module.__class__.__name__ == "SharedFusedMoE"
328 - )
329 - ]
322 + moe_modules = [module for module in model.modules() if is_moe_layer(module)]
323 for module in moe_modules:
324 module.maybe_init_modular_kernel()
325
vllm/distributed/elastic_ep/elastic_execute.py
+2 -4
@@ -38,6 +38,7 @@ from vllm.distributed.parallel_state import (
38 from vllm.distributed.stateless_coordinator import StatelessGroupCoordinator
39 from vllm.logger import init_logger
40 from vllm.model_executor.layers.fused_moe.layer import FusedMoEParallelConfig
41 +from vllm.utils import is_moe_layer
42 from vllm.v1.engine import ReconfigureDistributedRequest, ReconfigureRankType
43 from vllm.v1.worker.gpu_ubatch_wrapper import UBatchWrapper
44 from vllm.v1.worker.workspace import lock_workspace, unlock_workspace
@@ -319,10 +320,7 @@ class ElasticEPScalingExecutor:
320 moe_modules = [
321 module
322 for module in self.worker.model_runner.model.modules()
322 - if (
323 - module.__class__.__name__ == "FusedMoE"
324 - or module.__class__.__name__ == "SharedFusedMoE"
325 - )
323 + if is_moe_layer(module)
324 ]
325 num_local_experts = moe_modules[0].moe_config.num_local_experts
326 assert all(
vllm/lora/layers/fused_moe.py
+2 -2
@@ -610,7 +610,7 @@ class FusedMoEWithLoRA(BaseLayerWithLoRA):
610 ) -> bool:
611 """Returns True if the layer can be replaced by this LoRA layer."""
612
613 - # source_layer is FusedMoE or SharedFusedMoE
613 + # source_layer is FusedMoE
614 return isinstance(source_layer, FusedMoE) and len(packed_modules_list) == 2
615
616
@@ -772,5 +772,5 @@ class FusedMoE3DWithLoRA(FusedMoEWithLoRA):
772 model_config: PretrainedConfig | None = None,
773 ) -> bool:
774 """Returns True if the layer can be replaced by this LoRA layer."""
775 - # source_layer is FusedMoE or SharedFusedMoE
775 + # source_layer is FusedMoE
776 return isinstance(source_layer, FusedMoE) and len(packed_modules_list) == 1
vllm/model_executor/layers/fused_moe/__init__.py
-2
@@ -29,7 +29,6 @@ from vllm.model_executor.layers.fused_moe.router.fused_moe_router import (
29 FusedMoERouter,
30 )
31 from vllm.model_executor.layers.fused_moe.router.gate_linear import GateLinear
32 -from vllm.model_executor.layers.fused_moe.shared_fused_moe import SharedFusedMoE
32 from vllm.model_executor.layers.fused_moe.unquantized_fused_moe_method import (
33 UnquantizedFusedMoEMethod,
34 )
@@ -64,7 +63,6 @@ __all__ = [
63 "FusedMoEPrepareAndFinalizeModular",
64 "GateLinear",
65 "RoutingMethodType",
67 - "SharedFusedMoE",
66 "activation_without_mul",
67 "apply_moe_activation",
68 "override_config",
vllm/model_executor/layers/fused_moe/shared_fused_moe.py deleted
-25
@@ -1,25 +0,0 @@
1 -# SPDX-License-Identifier: Apache-2.0
2 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 -
4 -import torch
5 -
6 -from vllm.model_executor.layers.fused_moe.layer import FusedMoE
7 -
8 -
9 -# TODO(bnell): Remove this entirely
10 -class SharedFusedMoE(FusedMoE):
11 - """
12 - A FusedMoE operation that also computes the results of shared experts.
13 - If an all2all communicator is being used the shared expert computation
14 - can be interleaved with the fused all2all dispatch communication step.
15 - """
16 -
17 - def forward(
18 - self,
19 - hidden_states: torch.Tensor,
20 - router_logits: torch.Tensor,
21 - ) -> torch.Tensor:
22 - return super().forward(
23 - hidden_states=hidden_states,
24 - router_logits=router_logits,
25 - )
vllm/model_executor/models/AXK1.py
+4 -4
@@ -42,7 +42,7 @@ from vllm.distributed import (
42 )
43 from vllm.logger import init_logger
44 from vllm.model_executor.layers.attention import Attention
45 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
45 +from vllm.model_executor.layers.fused_moe import FusedMoE
46 from vllm.model_executor.layers.layernorm import RMSNorm
47 from vllm.model_executor.layers.linear import (
48 ColumnParallelLinear,
@@ -163,7 +163,7 @@ class AXK1MoE(nn.Module):
163 prefix=f"{prefix}.shared_experts",
164 )
165
166 - self.experts = SharedFusedMoE(
166 + self.experts = FusedMoE(
167 shared_experts=self.shared_experts,
168 gate=self.gate,
169 num_experts=config.n_routed_experts,
@@ -916,7 +916,7 @@ class AXK1ForCausalLM(
916 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
917 # Params for weights, fp8 weight scales, fp8 activation scales
918 # (param_name, weight_name, expert_id, shard_id)
919 - return SharedFusedMoE.make_expert_params_mapping(
919 + return FusedMoE.make_expert_params_mapping(
920 self,
921 ckpt_gate_proj_name="gate_proj",
922 ckpt_down_proj_name="down_proj",
@@ -950,7 +950,7 @@ class AXK1ForCausalLM(
950
951 # Params for weights, fp8 weight scales, fp8 activation scales
952 # (param_name, weight_name, expert_id, shard_id)
953 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
953 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
954 self,
955 ckpt_gate_proj_name="gate_proj",
956 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/afmoe.py
+5 -5
@@ -18,7 +18,7 @@ from vllm.distributed import (
18 )
19 from vllm.logger import init_logger
20 from vllm.model_executor.layers.attention import Attention
21 -from vllm.model_executor.layers.fused_moe.shared_fused_moe import SharedFusedMoE
21 +from vllm.model_executor.layers.fused_moe import FusedMoE
22 from vllm.model_executor.layers.layernorm import RMSNorm
23 from vllm.model_executor.layers.linear import (
24 ColumnParallelLinear,
@@ -124,8 +124,8 @@ class AfmoeMoE(nn.Module):
124 prefix=f"{prefix}.shared_experts",
125 )
126
127 - # Routed experts using SharedFusedMoE
128 - self.experts = SharedFusedMoE(
127 + # Routed experts using FusedMoE
128 + self.experts = FusedMoE(
129 shared_experts=self.shared_experts,
130 num_experts=config.num_experts,
131 top_k=config.num_experts_per_tok,
@@ -479,7 +479,7 @@ class AfmoeModel(nn.Module, EagleModelMixin):
479 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
480 # Params for weights, fp8 weight scales, fp8 activation scales
481 # (param_name, weight_name, expert_id, shard_id)
482 - return SharedFusedMoE.make_expert_params_mapping(
482 + return FusedMoE.make_expert_params_mapping(
483 self,
484 ckpt_gate_proj_name="gate_proj",
485 ckpt_down_proj_name="down_proj",
@@ -637,7 +637,7 @@ class AfmoeForCausalLM(nn.Module, SupportsPP, SupportsEagle3, SupportsLoRA):
637 self.num_moe_layers = config.num_hidden_layers - config.num_dense_layers
638 self.num_expert_groups = config.n_group
639
640 - self.moe_layers: list[SharedFusedMoE] = []
640 + self.moe_layers: list[FusedMoE] = []
641 example_moe = None
642 for layer in self.model.layers:
643 if isinstance(layer, PPMissingLayer):
vllm/model_executor/models/aria.py
+2 -2
@@ -14,7 +14,7 @@ from vllm.config.multimodal import BaseDummyOptions
14 from vllm.distributed import get_tensor_model_parallel_rank
15 from vllm.inputs import MultiModalDataDict
16 from vllm.model_executor.layers.activation import get_act_fn
17 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
17 +from vllm.model_executor.layers.fused_moe import FusedMoE
18 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
19 from vllm.model_executor.layers.logits_processor import LogitsProcessor
20 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -214,7 +214,7 @@ class AriaProjector(nn.Module):
214 return out
215
216
217 -class AriaFusedMoE(SharedFusedMoE):
217 +class AriaFusedMoE(FusedMoE):
218 def weight_loader(
219 self, param: nn.Parameter, loaded_weight: torch.Tensor, shard_id: str
220 ) -> None:
vllm/model_executor/models/bailing_moe.py
+3 -3
@@ -41,7 +41,7 @@ from vllm.distributed import (
41 )
42 from vllm.model_executor.layers.activation import SiluAndMul
43 from vllm.model_executor.layers.attention import Attention
44 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
44 +from vllm.model_executor.layers.fused_moe import FusedMoE
45 from vllm.model_executor.layers.layernorm import RMSNorm
46 from vllm.model_executor.layers.linear import (
47 MergedColumnParallelLinear,
@@ -285,7 +285,7 @@ class BailingMoE(nn.Module):
285 else:
286 self.shared_experts = None
287
288 - self.experts = SharedFusedMoE(
288 + self.experts = FusedMoE(
289 shared_experts=self.shared_experts,
290 num_experts=self.num_experts,
291 top_k=self.top_k,
@@ -461,7 +461,7 @@ class BailingMoeModel(nn.Module):
461 return hidden_states
462
463 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
464 - return SharedFusedMoE.make_expert_params_mapping(
464 + return FusedMoE.make_expert_params_mapping(
465 self,
466 ckpt_gate_proj_name="gate_proj",
467 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/bailing_moe_linear.py
+3 -3
@@ -21,7 +21,7 @@ from vllm.model_executor.layers.fla.ops.layernorm_guard import (
21 RMSNormGated,
22 layernorm_fn,
23 )
24 -from vllm.model_executor.layers.fused_moe import FusedMoE, SharedFusedMoE
24 +from vllm.model_executor.layers.fused_moe import FusedMoE
25 from vllm.model_executor.layers.layernorm import RMSNorm
26 from vllm.model_executor.layers.linear import (
27 ColumnParallelLinear,
@@ -351,8 +351,8 @@ class BailingMoeV25(nn.Module):
351 else:
352 self.shared_experts = None
353
354 - # Routed experts using SharedFusedMoE
355 - self.experts = SharedFusedMoE(
354 + # Routed experts using FusedMoE
355 + self.experts = FusedMoE(
356 shared_experts=self.shared_experts,
357 num_experts=self.num_experts,
358 top_k=self.top_k,
vllm/model_executor/models/deepseek_mtp.py
+2 -2
@@ -11,7 +11,7 @@ from vllm._aiter_ops import rocm_aiter_ops
11 from vllm.compilation.decorators import support_torch_compile
12 from vllm.config import VllmConfig
13 from vllm.logger import init_logger
14 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
14 +from vllm.model_executor.layers.fused_moe import FusedMoE
15 from vllm.model_executor.layers.layernorm import RMSNorm
16 from vllm.model_executor.layers.logits_processor import LogitsProcessor
17 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -252,7 +252,7 @@ class DeepSeekMTP(nn.Module, DeepseekV2MixtureOfExperts):
252 ]
253 stacked_params_mapping.extend(indexer_fused_mapping)
254
255 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
255 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
256 self,
257 ckpt_gate_proj_name="gate_proj",
258 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/deepseek_v2.py
+4 -4
@@ -48,9 +48,9 @@ from vllm.model_executor.layers.activation import SiluAndMul
48 from vllm.model_executor.layers.attention import Attention
49 from vllm.model_executor.layers.attention_layer_base import AttentionLayerBase
50 from vllm.model_executor.layers.fused_moe import (
51 + FusedMoE,
52 GateLinear,
53 RoutingMethodType,
53 - SharedFusedMoE,
54 )
55 from vllm.model_executor.layers.layernorm import LayerNorm, RMSNorm
56 from vllm.model_executor.layers.linear import (
@@ -311,7 +311,7 @@ class DeepseekV2MoE(nn.Module):
311 prefix=f"{prefix}.shared_experts",
312 )
313
314 - self.experts = SharedFusedMoE(
314 + self.experts = FusedMoE(
315 shared_experts=self.shared_experts,
316 gate=self.gate,
317 num_experts=config.n_routed_experts,
@@ -1432,7 +1432,7 @@ class DeepseekV2ForCausalLM(
1432 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
1433 # Params for weights, fp8 weight scales, fp8 activation scales
1434 # (param_name, weight_name, expert_id, shard_id)
1435 - return SharedFusedMoE.make_expert_params_mapping(
1435 + return FusedMoE.make_expert_params_mapping(
1436 self,
1437 ckpt_gate_proj_name="gate_proj",
1438 ckpt_down_proj_name="down_proj",
@@ -1474,7 +1474,7 @@ class DeepseekV2ForCausalLM(
1474
1475 # Params for weights, fp8 weight scales, fp8 activation scales
1476 # (param_name, weight_name, expert_id, shard_id)
1477 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
1477 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
1478 self,
1479 ckpt_gate_proj_name="gate_proj",
1480 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/dots1.py
+3 -3
@@ -40,7 +40,7 @@ from vllm.distributed import (
40 )
41 from vllm.model_executor.layers.activation import SiluAndMul
42 from vllm.model_executor.layers.attention import Attention
43 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
43 +from vllm.model_executor.layers.fused_moe import FusedMoE
44 from vllm.model_executor.layers.layernorm import RMSNorm
45 from vllm.model_executor.layers.linear import (
46 MergedColumnParallelLinear,
@@ -155,7 +155,7 @@ class Dots1MoE(nn.Module):
155 else:
156 self.shared_experts = None
157
158 - self.experts = SharedFusedMoE(
158 + self.experts = FusedMoE(
159 shared_experts=self.shared_experts,
160 num_experts=config.n_routed_experts,
161 top_k=config.num_experts_per_tok,
@@ -413,7 +413,7 @@ class Dots1Model(nn.Module):
413 return hidden_states
414
415 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
416 - return SharedFusedMoE.make_expert_params_mapping(
416 + return FusedMoE.make_expert_params_mapping(
417 self,
418 ckpt_gate_proj_name="gate_proj",
419 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/ernie45_moe.py
+4 -4
@@ -42,7 +42,7 @@ from vllm.distributed import (
42 from vllm.logger import init_logger
43 from vllm.model_executor.layers.activation import SiluAndMul
44 from vllm.model_executor.layers.attention import Attention
45 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
45 +from vllm.model_executor.layers.fused_moe import FusedMoE
46 from vllm.model_executor.layers.layernorm import RMSNorm
47 from vllm.model_executor.layers.linear import (
48 MergedColumnParallelLinear,
@@ -188,7 +188,7 @@ class Ernie4_5_MoeMoE(nn.Module):
188 else:
189 self.shared_experts = None
190
191 - self.experts = SharedFusedMoE(
191 + self.experts = FusedMoE(
192 shared_experts=self.shared_experts,
193 num_experts=config.moe_num_experts,
194 top_k=config.moe_k,
@@ -485,7 +485,7 @@ class Ernie4_5_MoeModel(nn.Module):
485 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
486 # Params for weights, fp8 weight scales, fp8 activation scales
487 # (param_name, weight_name, expert_id, shard_id)
488 - return SharedFusedMoE.make_expert_params_mapping(
488 + return FusedMoE.make_expert_params_mapping(
489 self,
490 ckpt_gate_proj_name="gate_proj",
491 ckpt_down_proj_name="down_proj",
@@ -667,7 +667,7 @@ class Ernie4_5_MoeForCausalLM(nn.Module, SupportsPP, SupportsLoRA, MixtureOfExpe
667 self.num_moe_layers = len(moe_layers_indices)
668 self.num_expert_groups = 1
669
670 - self.moe_layers: list[SharedFusedMoE] = []
670 + self.moe_layers: list[FusedMoE] = []
671 example_moe = None
672 for layer in self.model.layers:
673 if isinstance(layer, PPMissingLayer):
vllm/model_executor/models/ernie45_vl_moe.py
+4 -4
@@ -36,7 +36,7 @@ from vllm.config import CacheConfig, VllmConfig
36 from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
37 from vllm.logger import init_logger
38 from vllm.model_executor.layers.attention import Attention
39 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
39 +from vllm.model_executor.layers.fused_moe import FusedMoE
40 from vllm.model_executor.layers.layernorm import RMSNorm
41 from vllm.model_executor.layers.linear import (
42 QKVParallelLinear,
@@ -257,7 +257,7 @@ class Ernie4_5_VLMoeMoE(nn.Module):
257 prefix=f"{prefix}.text_experts_gate",
258 )
259
260 - self.text_experts = SharedFusedMoE(
260 + self.text_experts = FusedMoE(
261 shared_experts=self.shared_experts,
262 num_experts=config.moe_num_experts[0],
263 top_k=config.moe_k,
@@ -294,7 +294,7 @@ class Ernie4_5_VLMoeMoE(nn.Module):
294 prefix=f"{prefix}.vision_experts_gate",
295 )
296
297 - self.vision_experts = SharedFusedMoE(
297 + self.vision_experts = FusedMoE(
298 shared_experts=self.shared_experts,
299 num_experts=config.moe_num_experts[1],
300 top_k=config.moe_k,
@@ -649,7 +649,7 @@ class Ernie4_5_VLMoeForCausalLM(nn.Module, SupportsPP):
649
650 # Params for weights, fp8 weight scales, fp8 activation scales
651 # (param_name, weight_name, expert_id, shard_id)
652 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
652 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
653 self,
654 ckpt_gate_proj_name="gate_proj",
655 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/exaone_moe.py
+1 -2
@@ -31,7 +31,6 @@ from vllm.distributed import (
31 get_tensor_model_parallel_world_size,
32 )
33 from vllm.model_executor.layers.fused_moe import FusedMoE
34 -from vllm.model_executor.layers.fused_moe.shared_fused_moe import SharedFusedMoE
34 from vllm.model_executor.layers.layernorm import RMSNorm
35 from vllm.model_executor.layers.linear import ReplicatedLinear
36 from vllm.model_executor.layers.logits_processor import LogitsProcessor
@@ -130,7 +129,7 @@ class ExaoneMoe(nn.Module):
129 else:
130 self.shared_experts = None
131
133 - self.experts = SharedFusedMoE(
132 + self.experts = FusedMoE(
133 shared_experts=self.shared_experts,
134 gate=self.gate,
135 num_experts=self.n_routed_experts,
vllm/model_executor/models/glm4_moe.py
+3 -3
@@ -42,7 +42,7 @@ from vllm.distributed import (
42 from vllm.logger import init_logger
43 from vllm.model_executor.layers.activation import SiluAndMul
44 from vllm.model_executor.layers.attention import Attention
45 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
45 +from vllm.model_executor.layers.fused_moe import FusedMoE
46 from vllm.model_executor.layers.layernorm import RMSNorm
47 from vllm.model_executor.layers.linear import (
48 MergedColumnParallelLinear,
@@ -178,7 +178,7 @@ class Glm4MoE(nn.Module):
178 else:
179 self.shared_experts = None
180
181 - self.experts = SharedFusedMoE(
181 + self.experts = FusedMoE(
182 shared_experts=self.shared_experts,
183 num_experts=config.n_routed_experts,
184 top_k=config.num_experts_per_tok,
@@ -466,7 +466,7 @@ class Glm4MoeModel(nn.Module):
466 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
467 # Params for weights, fp8 weight scales, fp8 activation scales
468 # (param_name, weight_name, expert_id, shard_id)
469 - return SharedFusedMoE.make_expert_params_mapping(
469 + return FusedMoE.make_expert_params_mapping(
470 self,
471 ckpt_gate_proj_name="gate_proj",
472 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/glm4_moe_lite.py
+4 -4
@@ -41,7 +41,7 @@ from vllm.distributed import (
41 get_pp_group,
42 )
43 from vllm.logger import init_logger
44 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
44 +from vllm.model_executor.layers.fused_moe import FusedMoE
45 from vllm.model_executor.layers.layernorm import RMSNorm
46 from vllm.model_executor.layers.logits_processor import LogitsProcessor
47 from vllm.model_executor.layers.vocab_parallel_embedding import (
@@ -308,7 +308,7 @@ class Glm4MoeLiteModel(nn.Module):
308 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
309 # Params for weights, fp8 weight scales, fp8 activation scales
310 # (param_name, weight_name, expert_id, shard_id)
311 - return SharedFusedMoE.make_expert_params_mapping(
311 + return FusedMoE.make_expert_params_mapping(
312 self,
313 ckpt_gate_proj_name="gate_proj",
314 ckpt_down_proj_name="down_proj",
@@ -334,7 +334,7 @@ class Glm4MoeLiteModel(nn.Module):
334
335 # Params for weights, fp8 weight scales, fp8 activation scales
336 # (param_name, weight_name, expert_id, shard_id)
337 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
337 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
338 self,
339 ckpt_gate_proj_name="gate_proj",
340 ckpt_down_proj_name="down_proj",
@@ -616,7 +616,7 @@ class Glm4MoeLiteForCausalLM(
616 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
617 # Params for weights, fp8 weight scales, fp8 activation scales
618 # (param_name, weight_name, expert_id, shard_id)
619 - return SharedFusedMoE.make_expert_params_mapping(
619 + return FusedMoE.make_expert_params_mapping(
620 self,
621 ckpt_gate_proj_name="gate_proj",
622 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/glm4_moe_lite_mtp.py
+2 -2
@@ -32,7 +32,7 @@ from transformers import PretrainedConfig
32
33 from vllm._aiter_ops import rocm_aiter_ops
34 from vllm.config import VllmConfig
35 -from vllm.model_executor.layers.fused_moe import FusedMoE, SharedFusedMoE
35 +from vllm.model_executor.layers.fused_moe import FusedMoE
36 from vllm.model_executor.layers.layernorm import RMSNorm
37 from vllm.model_executor.layers.logits_processor import LogitsProcessor
38 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -260,7 +260,7 @@ class Glm4MoeLiteMTP(nn.Module, SupportsPP, Glm4MixtureOfExperts):
260 ("fused_qkv_a_proj", "kv_a_proj_with_mqa", 1),
261 ]
262
263 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
263 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
264 self,
265 ckpt_gate_proj_name="gate_proj",
266 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/hunyuan_v1.py
+3 -3
@@ -42,7 +42,7 @@ from vllm.distributed import (
42 )
43 from vllm.model_executor.layers.activation import SiluAndMul
44 from vllm.model_executor.layers.attention import Attention
45 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
45 +from vllm.model_executor.layers.fused_moe import FusedMoE
46 from vllm.model_executor.layers.layernorm import RMSNorm
47 from vllm.model_executor.layers.linear import (
48 ColumnParallelLinear,
@@ -438,7 +438,7 @@ class HunYuanSparseMoeBlock(nn.Module):
438 else:
439 self.shared_mlp = None
440
441 - self.experts = SharedFusedMoE(
441 + self.experts = FusedMoE(
442 shared_experts=self.shared_mlp,
443 num_experts=self.n_routed_experts,
444 top_k=top_k,
@@ -712,7 +712,7 @@ class HunYuanModel(nn.Module, EagleModelMixin):
712 if _is_moe(self.config):
713 # Params for weights, fp8 weight scales, fp8 activation scales
714 # (param_name, weight_name, expert_id, shard_id)
715 - return SharedFusedMoE.make_expert_params_mapping(
715 + return FusedMoE.make_expert_params_mapping(
716 self,
717 ckpt_gate_proj_name="gate_proj",
718 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/kimi_linear.py
+3 -3
@@ -14,7 +14,7 @@ from vllm.distributed import (
14 )
15 from vllm.logger import init_logger
16 from vllm.model_executor.layers.activation import SiluAndMul
17 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
17 +from vllm.model_executor.layers.fused_moe import FusedMoE
18 from vllm.model_executor.layers.kda import KimiDeltaAttention
19 from vllm.model_executor.layers.layernorm import RMSNorm
20 from vllm.model_executor.layers.linear import (
@@ -144,7 +144,7 @@ class KimiMoE(nn.Module):
144 else:
145 self.shared_experts = None
146
147 - self.experts = SharedFusedMoE(
147 + self.experts = FusedMoE(
148 shared_experts=self.shared_experts,
149 num_experts=num_experts,
150 top_k=config.num_experts_per_token,
@@ -476,7 +476,7 @@ class KimiLinearModel(nn.Module):
476 if self.config.is_moe:
477 # Params for weights, fp8 weight scales, fp8 activation scales
478 # (param_name, weight_name, expert_id, shard_id)
479 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
479 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
480 self,
481 ckpt_gate_proj_name="w1",
482 ckpt_down_proj_name="w2",
vllm/model_executor/models/llama4.py
+5 -5
@@ -36,7 +36,7 @@ from vllm.model_executor.layers.attention import (
36 Attention,
37 ChunkedLocalAttention,
38 )
39 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
39 +from vllm.model_executor.layers.fused_moe import FusedMoE
40 from vllm.model_executor.layers.layernorm import RMSNorm
41 from vllm.model_executor.layers.linear import (
42 QKVParallelLinear,
@@ -127,7 +127,7 @@ class Llama4MoE(nn.Module):
127 self.n_physical_experts = self.n_local_experts + self.n_redundant_experts
128 self.n_local_physical_experts = self.n_physical_experts // self.ep_size
129
130 - self.experts = SharedFusedMoE(
130 + self.experts = FusedMoE(
131 shared_experts=self.shared_expert,
132 num_experts=config.num_local_experts,
133 top_k=config.num_experts_per_tok,
@@ -414,7 +414,7 @@ class Llama4Model(LlamaModel):
414 params_dict: The dictionary of module parameters.
415 loaded_params: The set of already loaded parameters.
416 expert_params_mapping: The mapping of expert parameters. Must be
417 - generated by SharedFusedMoE.make_expert_params_mapping().
417 + generated by FusedMoE.make_expert_params_mapping().
418 fused: Whether the expert weights are fused into a single weight
419 tensor or are separate weight tensors for each expert.
420 When fused is True, loaded_weight should have shape of:
@@ -554,7 +554,7 @@ class Llama4Model(LlamaModel):
554 fused_experts_params = False
555 # Expert parameter mapping for the case where the expert weights are
556 # not fused into a single weight tensor.
557 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
557 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
558 self,
559 ckpt_gate_proj_name="gate_proj",
560 ckpt_down_proj_name="down_proj",
@@ -564,7 +564,7 @@ class Llama4Model(LlamaModel):
564 )
565 # Expert parameter mapping for the case where the expert weights are
566 # fused into a single weight tensor.
567 - expert_params_mapping_fused = SharedFusedMoE.make_expert_params_mapping(
567 + expert_params_mapping_fused = FusedMoE.make_expert_params_mapping(
568 self,
569 ckpt_gate_proj_name="gate_up_proj",
570 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/nemotron_h.py
+3 -3
@@ -34,8 +34,8 @@ from vllm.distributed.parallel_state import get_pp_group
34 from vllm.model_executor.layers.activation import ReLUSquaredActivation
35 from vllm.model_executor.layers.attention import Attention
36 from vllm.model_executor.layers.fused_moe import (
37 + FusedMoE,
38 GateLinear,
38 - SharedFusedMoE,
39 activation_without_mul,
40 )
41 from vllm.model_executor.layers.layernorm import RMSNorm
@@ -210,7 +210,7 @@ class NemotronHMoE(nn.Module):
210 self.fc1_latent_proj = None
211 self.fc2_latent_proj = None
212
213 - self.experts = SharedFusedMoE(
213 + self.experts = FusedMoE(
214 shared_experts=self.shared_experts,
215 num_experts=config.n_routed_experts,
216 top_k=config.num_experts_per_tok,
@@ -652,7 +652,7 @@ class NemotronHModel(nn.Module):
652 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
653 if self.has_moe:
654 # (param_name, weight_name, expert_id, shard_id)
655 - expert_params_mapping = SharedFusedMoE.make_expert_params_mapping(
655 + expert_params_mapping = FusedMoE.make_expert_params_mapping(
656 # - FusedMoe.w1 (aka gate_proj) should be up_proj since that's
657 # what the activation is applied to
658 # - FusedMoe.w3 (aka up_proj) should be ignored since we're
vllm/model_executor/models/openpangu.py
+3 -3
@@ -44,7 +44,7 @@ from vllm.model_executor.layers.attention import (
44 Attention,
45 StaticSinkAttention,
46 )
47 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
47 +from vllm.model_executor.layers.fused_moe import FusedMoE
48 from vllm.model_executor.layers.layernorm import RMSNorm
49 from vllm.model_executor.layers.linear import (
50 ColumnParallelLinear,
@@ -200,7 +200,7 @@ class OpenPanguMoE(nn.Module):
200 else:
201 self.shared_experts = None
202
203 - self.experts = SharedFusedMoE(
203 + self.experts = FusedMoE(
204 shared_experts=self.shared_experts,
205 num_experts=config.n_routed_experts,
206 top_k=config.num_experts_per_tok,
@@ -1149,7 +1149,7 @@ class OpenPanguModel(nn.Module):
1149 ]
1150 has_experts = hasattr(self.config, "n_routed_experts")
1151 if has_experts:
1152 - expert_merge_mapping = SharedFusedMoE.make_expert_params_mapping(
1152 + expert_merge_mapping = FusedMoE.make_expert_params_mapping(
1153 self,
1154 ckpt_gate_proj_name="gate_proj",
1155 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/param2moe.py
+4 -4
@@ -32,7 +32,7 @@ from vllm.distributed import (
32 )
33 from vllm.model_executor.layers.activation import SiluAndMul
34 from vllm.model_executor.layers.attention import Attention
35 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
35 +from vllm.model_executor.layers.fused_moe import FusedMoE
36 from vllm.model_executor.layers.layernorm import RMSNorm
37 from vllm.model_executor.layers.linear import (
38 MergedColumnParallelLinear,
@@ -353,7 +353,7 @@ class Param2MoEMoEBlock(nn.Module):
353 else:
354 self.shared_experts = None # type: ignore[assignment]
355
356 - self.experts = SharedFusedMoE(
356 + self.experts = FusedMoE(
357 shared_experts=self.shared_experts,
358 num_experts=self.num_experts,
359 top_k=self.top_k,
@@ -370,7 +370,7 @@ class Param2MoEMoEBlock(nn.Module):
370 routed_scaling_factor=self.routed_scaling_factor,
371 )
372
373 - def maybe_get_fused_moe(self) -> SharedFusedMoE:
373 + def maybe_get_fused_moe(self) -> FusedMoE:
374 return self.experts
375
376 def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
@@ -690,7 +690,7 @@ class Param2MoEModel(nn.Module):
690 return loaded_params
691
692 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
693 - return SharedFusedMoE.make_expert_params_mapping(
693 + return FusedMoE.make_expert_params_mapping(
694 self,
695 ckpt_gate_proj_name="gate_proj",
696 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/qwen2_moe.py
+3 -3
@@ -40,7 +40,7 @@ from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
40 from vllm.logger import init_logger
41 from vllm.model_executor.layers.activation import SiluAndMul
42 from vllm.model_executor.layers.attention import Attention
43 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
43 +from vllm.model_executor.layers.fused_moe import FusedMoE
44 from vllm.model_executor.layers.layernorm import RMSNorm
45 from vllm.model_executor.layers.linear import (
46 MergedColumnParallelLinear,
@@ -164,7 +164,7 @@ class Qwen2MoeSparseMoeBlock(nn.Module):
164 else:
165 self.shared_expert = None
166
167 - self.experts = SharedFusedMoE(
167 + self.experts = FusedMoE(
168 shared_experts=self.shared_expert,
169 num_experts=config.num_experts,
170 top_k=config.num_experts_per_tok,
@@ -418,7 +418,7 @@ class Qwen2MoeModel(nn.Module):
418 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
419 # Params for weights, fp8 weight scales, fp8 activation scales
420 # (param_name, weight_name, expert_id, shard_id)
421 - return SharedFusedMoE.make_expert_params_mapping(
421 + return FusedMoE.make_expert_params_mapping(
422 self,
423 ckpt_gate_proj_name="gate_proj",
424 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/qwen3_moe.py
+3 -3
@@ -43,7 +43,7 @@ from vllm.distributed import (
43 from vllm.logger import init_logger
44 from vllm.model_executor.layers.activation import SiluAndMul
45 from vllm.model_executor.layers.attention import Attention
46 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
46 +from vllm.model_executor.layers.fused_moe import FusedMoE
47 from vllm.model_executor.layers.layernorm import RMSNorm
48 from vllm.model_executor.layers.linear import (
49 MergedColumnParallelLinear,
@@ -205,7 +205,7 @@ class Qwen3MoeSparseMoeBlock(nn.Module):
205 self.shared_expert_gate = None
206 self.shared_expert = None
207
208 - self.experts = SharedFusedMoE(
208 + self.experts = FusedMoE(
209 shared_experts=self.shared_expert,
210 gate=self.gate,
211 num_experts=self.n_routed_experts,
@@ -508,7 +508,7 @@ class Qwen3MoeModel(nn.Module, EagleModelMixin):
508 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
509 # Params for weights, fp8 weight scales, fp8 activation scales
510 # (param_name, weight_name, expert_id, shard_id)
511 - return SharedFusedMoE.make_expert_params_mapping(
511 + return FusedMoE.make_expert_params_mapping(
512 self,
513 ckpt_gate_proj_name="gate_proj",
514 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/qwen3_next.py
+3 -3
@@ -23,7 +23,7 @@ from vllm.distributed import (
23 )
24 from vllm.logger import init_logger
25 from vllm.model_executor.layers.attention import Attention
26 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
26 +from vllm.model_executor.layers.fused_moe import FusedMoE
27 from vllm.model_executor.layers.layernorm import (
28 GemmaRMSNorm as Qwen3NextRMSNorm,
29 )
@@ -146,7 +146,7 @@ class Qwen3NextSparseMoeBlock(nn.Module):
146 else:
147 self.shared_expert = None
148
149 - self.experts = SharedFusedMoE(
149 + self.experts = FusedMoE(
150 shared_experts=self.shared_expert,
151 gate=self.gate,
152 num_experts=self.n_routed_experts,
@@ -533,7 +533,7 @@ class Qwen3NextModel(nn.Module, EagleModelMixin):
533 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
534 # Params for weights, fp8 weight scales, fp8 activation scales
535 # (param_name, weight_name, expert_id, shard_id)
536 - return SharedFusedMoE.make_expert_params_mapping(
536 + return FusedMoE.make_expert_params_mapping(
537 self,
538 ckpt_gate_proj_name="gate_proj",
539 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/sarvam.py
+4 -4
@@ -35,7 +35,7 @@ from vllm.distributed import (
35 get_tensor_model_parallel_world_size,
36 )
37 from vllm.model_executor.layers.activation import SiluAndMul
38 -from vllm.model_executor.layers.fused_moe import SharedFusedMoE
38 +from vllm.model_executor.layers.fused_moe import FusedMoE
39 from vllm.model_executor.layers.layernorm import RMSNorm
40 from vllm.model_executor.layers.linear import (
41 ColumnParallelLinear,
@@ -335,7 +335,7 @@ class SarvamMLAMoE(nn.Module):
335 else:
336 self.shared_experts = None
337
338 - self.experts = SharedFusedMoE(
338 + self.experts = FusedMoE(
339 shared_experts=self.shared_experts,
340 num_experts=self.num_experts,
341 top_k=self.top_k,
@@ -352,7 +352,7 @@ class SarvamMLAMoE(nn.Module):
352 routed_scaling_factor=self.routed_scaling_factor,
353 )
354
355 - def maybe_get_fused_moe(self) -> SharedFusedMoE:
355 + def maybe_get_fused_moe(self) -> FusedMoE:
356 return self.experts
357
358 def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
@@ -529,7 +529,7 @@ class SarvamMLAModel(nn.Module):
529 return hidden_states
530
531 def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
532 - return SharedFusedMoE.make_expert_params_mapping(
532 + return FusedMoE.make_expert_params_mapping(
533 self,
534 ckpt_gate_proj_name="gate_proj",
535 ckpt_down_proj_name="down_proj",
vllm/model_executor/models/step3p5.py
+1 -2
@@ -24,7 +24,6 @@ from vllm.logger import init_logger
24 from vllm.model_executor.layers.activation import SiluAndMul, SwigluStepAndMul
25 from vllm.model_executor.layers.attention import Attention
26 from vllm.model_executor.layers.fused_moe import FusedMoE
27 -from vllm.model_executor.layers.fused_moe.shared_fused_moe import SharedFusedMoE
27 from vllm.model_executor.layers.layernorm import GemmaRMSNorm
28 from vllm.model_executor.layers.linear import (
29 ColumnParallelLinear,
@@ -372,7 +371,7 @@ class FusedMoEBlock(nn.Module):
371 quant_config=quant_config,
372 prefix=f"{prefix}.share_expert",
373 )
375 - self.experts = SharedFusedMoE(
374 + self.experts = FusedMoE(
375 shared_experts=self.share_expert,
376 gate=self.gate,
377 num_experts=config.moe_num_experts,
vllm/utils/__init__.py
+13
@@ -34,3 +34,16 @@ def length_from_prompt_token_ids_or_embeds(
34 f" prompt_embeds={prompt_embeds_len}"
35 )
36 return prompt_token_len
37 +
38 +
39 +def is_moe_layer(module: torch.nn.Module) -> bool:
40 + # TODO(bnell): Should use isinstance but can't due to circular dependencies.
41 + def _check_bases(cls):
42 + if cls.__name__ == "FusedMoE":
43 + return True
44 +
45 + for b in cls.__bases__:
46 + if _check_bases(b):
47 + return True
48 +
49 + return _check_bases(module.__class__)