[MoE Refactor] Rename FusedMoE to FusedMoEFactory (#44941)
Signed-off-by: Bill Nell <bnell@redhat.com> Signed-off-by: bnellnm <49004751+bnellnm@users.noreply.github.com> Co-authored-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>
bnellnm committed
Jul 31, 2026 at 06:28 UTC
6e311c6e2014a54868e2cbedf944a6873d06228b
80 files changed
+243
-234
tests/distributed/test_eplb_fused_moe_layer.py
+4
-4
@@ -1,7 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
-# Test that the interaction between EPLB and FusedMoE Layer is okay
4
+# Test that the interaction between EPLB and FusedMoEFactory Layer is okay
5
6
from dataclasses import dataclass
7
@@ -16,7 +16,7 @@ from vllm.distributed.parallel_state import (
16
get_eplb_group,
17
get_tp_group,
18
)
19
-from vllm.model_executor.layers.fused_moe.layer import FusedMoE
19
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory, MoERunner
20
21
from .eplb_utils import distributed_run, set_env_vars_and_device
22
@@ -69,8 +69,8 @@ def make_fused_moe_layer(
69
rank: int,
70
layer_idx: int,
71
test_config: TestConfig,
72
-) -> FusedMoE:
73
- fml = FusedMoE(
72
+) -> MoERunner:
73
+ fml = FusedMoEFactory(
74
num_experts=test_config.num_experts,
75
top_k=test_config.num_topk,
76
hidden_size=test_config.hidden_size,
tests/distributed/test_eplb_fused_moe_layer_dep_nvfp4.py
+4
-4
@@ -1,7 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
-# Test that the interaction between EPLB and FusedMoE Layer is okay for DP w/ NVFP4
4
+# Test that the interaction between EPLB and MoERunner Layer is okay for DP w/ NVFP4
5
6
from dataclasses import dataclass
7
@@ -19,7 +19,7 @@ from vllm.distributed.parallel_state import (
19
get_eplb_group,
20
)
21
from vllm.forward_context import set_forward_context
22
-from vllm.model_executor.layers.fused_moe.layer import FusedMoE
22
+from vllm.model_executor.layers.fused_moe.layer import FusedMoEFactory, MoERunner
23
from vllm.model_executor.layers.quantization.modelopt import (
24
ModelOptNvFp4Config,
25
ModelOptNvFp4FusedMoE,
@@ -44,7 +44,7 @@ def make_fused_moe_layer(
44
rank: int,
45
layer_idx: int,
46
test_config: TestConfig,
47
-) -> FusedMoE:
47
+) -> MoERunner:
48
quant_config = None
49
50
device = torch.device(f"cuda:{rank}")
@@ -55,7 +55,7 @@ def make_fused_moe_layer(
55
exclude_modules=[],
56
)
57
58
- fml = FusedMoE(
58
+ fml = FusedMoEFactory(
59
num_experts=test_config.num_experts,
60
top_k=test_config.num_topk,
61
hidden_size=test_config.hidden_size,
tests/kernels/moe/test_deepep_v2_moe.py
+1
-1
@@ -409,7 +409,7 @@ def _deep_ep_v2_moe_cudagraph(
409
vllm_cfg.kernel_config = KernelConfig(moe_backend="flashinfer_trtllm")
410
411
with set_current_vllm_config(vllm_cfg):
412
- # Initialize vLLM parallel state (needed by FusedMoE layer)
412
+ # Initialize vLLM parallel state (needed by MoERunner layer)
413
temp_file = tempfile.mktemp()
414
init_distributed_environment(
415
world_size=pgi.world_size,
tests/kernels/moe/test_moe_layer.py
+12
-7
@@ -42,7 +42,11 @@ from vllm.distributed.device_communicators.all_reduce_utils import (
42
from vllm.distributed.eplb.eplb_communicator import create_eplb_communicator
43
from vllm.distributed.eplb.rebalance_execute import rearrange_expert_weights_inplace
44
from vllm.forward_context import set_forward_context
45
-from vllm.model_executor.layers.fused_moe import FusedMoE, MoERunner, fused_experts
45
+from vllm.model_executor.layers.fused_moe import (
46
+ FusedMoEFactory,
47
+ MoERunner,
48
+ fused_experts,
49
+)
50
from vllm.model_executor.layers.fused_moe.activation import MoEActivation
51
from vllm.model_executor.layers.fused_moe.config import FusedMoEQuantConfig
52
from vllm.model_executor.layers.fused_moe.router.router_factory import (
@@ -80,7 +84,7 @@ NUM_EXPERTS = [8, 64]
84
TOP_KS = [2, 6]
85
86
# dp_size, tp_size, use_ep
83
-# Note: DP+TP is not yet supported in the FusedMoE layer.
87
+# Note: DP+TP is not yet supported in the FusedMoEFactory layer.
88
PARALLEL_COMBOS = [
89
[1, 2, False],
90
[1, 4, False],
@@ -1023,7 +1027,7 @@ def make_fused_moe_layer(
1027
kwargs["routed_input_transform"] = routed_input_transform
1028
kwargs["routed_output_transform"] = routed_output_transform
1029
1026
- layer = FusedMoE(
1030
+ layer = FusedMoEFactory(
1031
num_experts=global_num_experts,
1032
top_k=top_k,
1033
hidden_size=hidden_size,
@@ -1267,7 +1271,7 @@ def _test_body_eplb(
1271
):
1272
output_before = sp_wrapper(moe_layer)(hidden_states, router_logits)
1273
1270
- # Create a fresh FusedMoE layer with enable_eplb=True
1274
+ # Create a fresh MoERunner layer with enable_eplb=True
1275
# Delete the original layer's registration so the constructor can
1276
# re-use the same "from_forward_context" prefix
1277
cc = vllm_config.compilation_config
@@ -1401,7 +1405,8 @@ def _run_one_config(
1405
1406
- When is_sequence_parallel=True (EP + sequence splitting):
1407
* ep_size: Number of expert parallel ranks (equals dp_size * tp_size)
1404
- * tp_size: Number of ranks to split sequence across (becomes sp_size in FusedMoE)
1408
+ * tp_size: Number of ranks to split sequence across (becomes sp_size in
1409
+ MoERunner)
1410
* Weights are chunked by ep_size (experts) but NOT by tp_size
1411
* Input sequences are chunked by tp_size (via sp_wrapper)
1412
"""
@@ -1476,8 +1481,8 @@ def _run_one_config(
1481
torch.accelerator.empty_cache()
1482
1483
with set_current_vllm_config(vllm_config):
1479
- # Chunk weights for EP BEFORE creating FusedMoE
1480
- # FusedMoE uses EP-chunked weights and handles reductions internally
1484
+ # Chunk weights for EP BEFORE creating MoERunner.
1485
+ # MoERunner uses EP-chunked weights and handles reductions internally.
1486
if ep_size > 1:
1487
# Split experts across ranks (dimension 0 is the expert dimension)
1488
# When EP is enabled, use EP group rank and ep_size for chunking
tests/kernels/moe/test_moe_weight_loading_padded.py
+1
-1
@@ -1,6 +1,6 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
-"""Tests for FusedMoE weight loading with padded hidden dimensions.
3
+"""Tests for FusedMoEFactory weight loading with padded hidden dimensions.
4
5
When using DeepEP backends or NIXL EP with models like nemotron_h,
6
hidden_size may be rounded up (e.g., 2688 -> 3072) for backend requirements.
tests/kernels/moe/test_routing_simulator.py
+4
-4
@@ -6,7 +6,7 @@ Test script for the token-to-expert routing simulator.
6
7
This script demonstrates how to use the routing simulator to test
8
different routing strategies and analyze their performance, including
9
-integration tests with FusedMoE layer.
9
+integration tests with FusedMoEFactory layer.
10
"""
11
12
import tempfile
@@ -77,11 +77,11 @@ def test_basic_functionality(
77
78
def test_routing_strategy_integration(monkeypatch, device):
79
"""Test that the routing strategy environment variable works with
80
- FusedMoE."""
80
+ FusedMoEFactory."""
81
pytest.importorskip("vllm.model_executor.layers.fused_moe.layer")
82
83
import vllm.envs as envs
84
- from vllm.model_executor.layers.fused_moe.layer import FusedMoE
84
+ from vllm.model_executor.layers.fused_moe.layer import FusedMoEFactory
85
86
# Test parameters
87
num_tokens = 32
@@ -111,7 +111,7 @@ def test_routing_strategy_integration(monkeypatch, device):
111
)
112
113
for strategy in strategies:
114
- fused_moe = FusedMoE(
114
+ fused_moe = FusedMoEFactory(
115
num_experts=num_experts,
116
top_k=top_k,
117
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 FusedMoE with routed_input_transform.
4
+Tests for FusedMoEFactory with routed_input_transform.
5
6
-Verifies that applying routed_input_transform inside FusedMoE
6
+Verifies that applying routed_input_transform inside FusedMoEFactory
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 import FusedMoE
16
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
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 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
136
+ """Compare FusedMoEFactory with transform inside vs manually applying outside.
137
+ Method A (inside): FusedMoEFactory with routed_input_transform
138
+ Method B (outside): Manually transform, then FusedMoEFactory 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: FusedMoE WITH routed_input_transform
161
- moe_with_transform = FusedMoE(
160
+ # Method A: FusedMoEFactory WITH routed_input_transform
161
+ moe_with_transform = FusedMoEFactory(
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: FusedMoE WITHOUT routed_input_transform
176
+ # Method B: FusedMoEFactory WITHOUT routed_input_transform
177
# Note: shared_experts=None because when transform is done outside,
178
- moe_without_transform = FusedMoE(
178
+ moe_without_transform = FusedMoEFactory(
179
shared_experts=None,
180
routed_input_transform=None,
181
num_experts=num_experts,
tests/kernels/moe/test_zero_expert_moe.py
+16
-13
@@ -1,10 +1,10 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
-"""Tests for FusedMoE with zero experts.
3
+"""Tests for FusedMoEFactory with zero experts.
4
5
Verifies that:
6
- The ZeroExpertRouter is properly created and used as the layer router.
7
-- A forward pass through FusedMoE with zero experts produces correct output.
7
+- A forward pass through FusedMoEFactory with zero experts produces correct output.
8
- The output decomposes correctly into real expert + zero expert contributions.
9
10
Note: tests generated with Claude.
@@ -15,7 +15,7 @@ import torch
15
16
from vllm.config import VllmConfig, set_current_vllm_config
17
from vllm.forward_context import get_forward_context, set_forward_context
18
-from vllm.model_executor.layers.fused_moe.layer import FusedMoE
18
+from vllm.model_executor.layers.fused_moe.layer import FusedMoEFactory
19
from vllm.model_executor.layers.fused_moe.router.zero_expert_router import (
20
ZeroExpertRouter,
21
)
@@ -24,7 +24,7 @@ from vllm.v1.worker.workspace import init_workspace_manager
24
25
@pytest.fixture
26
def zero_expert_moe(dist_init, default_vllm_config):
27
- """Create a FusedMoE layer with zero experts."""
27
+ """Create a FusedMoEFactory layer with zero experts."""
28
num_experts = 4
29
top_k = 2
30
# hidden_size must be >= 256 for the zero expert identity kernel to
@@ -45,7 +45,7 @@ def zero_expert_moe(dist_init, default_vllm_config):
45
with set_current_vllm_config(vllm_config), set_forward_context(None, vllm_config):
46
init_workspace_manager(torch.accelerator.current_device_index())
47
48
- layer = FusedMoE(
48
+ layer = FusedMoEFactory(
49
zero_expert_type="identity",
50
e_score_correction_bias=e_score_correction_bias,
51
num_experts=num_experts,
@@ -66,7 +66,7 @@ def zero_expert_moe(dist_init, default_vllm_config):
66
67
@pytest.mark.parametrize("num_tokens", [1, 32])
68
def test_zero_expert_moe_router_is_zero_expert_router(zero_expert_moe, num_tokens):
69
- """Verify that FusedMoE with zero_expert_type creates a ZeroExpertRouter."""
69
+ """Verify that FusedMoEFactory with zero_expert_type creates a ZeroExpertRouter."""
70
layer, _ = zero_expert_moe
71
assert isinstance(layer.router, ZeroExpertRouter), (
72
f"Expected ZeroExpertRouter but got {type(layer.router).__name__}."
@@ -83,7 +83,10 @@ def test_zero_expert_moe_router_is_zero_expert_router(zero_expert_moe, num_token
83
84
@pytest.mark.parametrize("num_tokens", [1, 32])
85
def test_zero_expert_moe_forward(zero_expert_moe, num_tokens):
86
- """Run a forward pass through FusedMoE with zero experts and verify output shape."""
86
+ """
87
+ Run a forward pass through FusedMoEFactory with zero experts
88
+ and verify output shape.
89
+ """
90
layer, vllm_config = zero_expert_moe
91
92
hidden_size = layer.routed_experts.hidden_size
@@ -118,16 +121,16 @@ def test_zero_expert_moe_forward(zero_expert_moe, num_tokens):
121
122
@pytest.mark.parametrize("num_tokens", [1, 32])
123
def test_zero_expert_moe_output_decomposition(zero_expert_moe, num_tokens):
121
- """Validate that the FusedMoE output equals a plain FusedMoE
124
+ """Validate that the FusedMoEFactory output equals a plain FusedMoEFactory
125
output (real experts only) plus the zero expert contribution.
126
127
The key invariant is:
128
zero_layer.forward(h, r_full) == plain_layer.forward(h, r_real)
129
+ zero_expert_output
130
128
- We create a plain FusedMoE layer with the same weights and real-expert-only
131
+ We create a plain FusedMoEFactory layer with the same weights and real-expert-only
132
router logits, compute the zero expert output via the ZeroExpertRouter, and
130
- verify the sum matches the FusedMoE output.
133
+ verify the sum matches the FusedMoEFactory output.
134
"""
135
layer, vllm_config = zero_expert_moe
136
num_experts = 4
@@ -152,9 +155,9 @@ def test_zero_expert_moe_output_decomposition(zero_expert_moe, num_tokens):
155
with set_current_vllm_config(vllm_config), set_forward_context(None, vllm_config):
156
get_forward_context().all_moe_layers = None
157
155
- # Create a plain FusedMoE layer with the same config but no zero
158
+ # Create a plain FusedMoEFactory layer with the same config but no zero
159
# experts. Use a separate prefix to avoid collision.
157
- plain_layer = FusedMoE(
160
+ plain_layer = FusedMoEFactory(
161
num_experts=num_experts,
162
top_k=layer.routed_experts.top_k,
163
hidden_size=layer.routed_experts.hidden_size,
@@ -210,7 +213,7 @@ def test_zero_expert_moe_output_decomposition(zero_expert_moe, num_tokens):
213
expected,
214
atol=4e-3,
215
rtol=4e-3,
213
- msg="FusedMoE output should equal plain FusedMoE output "
216
+ msg="FusedMoEFactory output should equal plain FusedMoEFactory output "
217
"plus zero expert contribution",
218
)
219
tests/lora/test_lora_manager.py
+1
-1
@@ -198,7 +198,7 @@ def test_dedup_shared_module_across_paths(default_vllm_config, dist_init, dummy_
198
self.gate = gate # canonical path: "moe.gate"
199
200
# Inner submodule holding the SAME gate instance under another
201
- # path. This mirrors how FusedMoE.runner.gate references the
201
+ # path. This mirrors how MoERunner.runner.gate references the
202
# block's gate in qwen3_moe.
203
class _Runner(nn.Module):
204
def __init__(self, g):
tests/quantization/test_fp8.py
+2
-2
@@ -21,7 +21,7 @@ from vllm.model_executor.layers.attention.attention import (
21
Attention,
22
set_default_quant_scales,
23
)
24
-from vllm.model_executor.layers.fused_moe import FusedMoE
24
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
25
from vllm.model_executor.layers.quantization.fp8 import (
26
Fp8Config,
27
Fp8KVCacheMethod,
@@ -393,7 +393,7 @@ def test_fp8_reloading(
393
method.use_marlin = use_marlin
394
395
else:
396
- layer = FusedMoE(
396
+ layer = FusedMoEFactory(
397
num_experts=1,
398
top_k=1,
399
hidden_size=1,
vllm/_custom_ops.py
+1
-1
@@ -1022,7 +1022,7 @@ def cutlass_fp4_moe_mm(
1022
An FP4 Blockscaled Group Gemm that takes in a_tensors, b_tensors and runs
1023
the gemms for each combination based on the specified problem sizes.
1024
1025
- This is used as the MoE gemm during NVFP4 Quantized FusedMoE forward.
1025
+ This is used as the MoE gemm during NVFP4 Quantized MoERunner forward.
1026
- a/b_tensors: the NVFP4 a_ptrs and b_ptrs tensors which are quantized
1027
input and expert weights.
1028
- a_/b_scales: The blockscales in FP8-E4M3 precision
vllm/config/quantization.py
+1
-1
@@ -88,7 +88,7 @@ class QuantizationConfigArgs:
88
"""Spec applied to ``LinearBase`` layers."""
89
90
moe: QuantSpec | None = None
91
- """Spec applied to ``FusedMoE`` layers."""
91
+ """Spec applied to ``FusedMoEFactory`` layers."""
92
93
ignore: list[str] = Field(default_factory=list)
94
"""Layers to skip quantization for."""
vllm/distributed/kv_transfer/kv_connector/v1/example_connector.py
+1
-1
@@ -170,7 +170,7 @@ class ExampleConnector(KVConnectorBase_V1):
170
171
# Only process layers that have kv_cache
172
# attribute (attention layers) Skip non-attention
173
- # layers like FusedMoE/MLP etc.
173
+ # layers like FusedMoEFactory/MLP etc.
174
kv_cache_layer = getattr(layer, "kv_cache", None)
175
if kv_cache_layer is None:
176
continue
vllm/lora/layers/fused_moe.py
+1
-1
@@ -44,7 +44,7 @@ class FusedMoEWithLoRA(BaseLayerWithLoRA):
44
"Monolithic kernels are not supported for Fused MoE LoRA."
45
)
46
47
- # Use the MoE-aware TP rank/size: when EP is active, FusedMoE collapses
47
+ # Use the MoE-aware TP rank/size: when EP is active, MoERunner collapses
48
# moe_parallel_config.tp_size to 1 (experts are sharded across the
49
# TP group instead).
50
moe_parallel_config = self.moe_config.moe_parallel_config
vllm/lora/lora_model.py
+2
-2
@@ -24,7 +24,7 @@ logger = init_logger(__name__)
24
25
@dataclass(frozen=True)
26
class MoEEPLoadSpec:
27
- """Per-expert-parallel slicing metadata for one FusedMoE LoRA module.
27
+ """Per-expert-parallel slicing metadata for one FusedMoEFactory LoRA module.
28
29
Threaded into the LoRA loader so per-expert weights from EP ranks
30
other than this one can be skipped before they ever hit CPU memory.
@@ -193,7 +193,7 @@ class LoRAModel:
193
skip_prefixes: List of module name prefixes to skip during loading.
194
Models can define this to skip modules not used in inference
195
(e.g., MTP layers). Format: ["mtp."]
196
- moe_ep_spec: When 2D FusedMoE LoRA modules are present with
196
+ moe_ep_spec: When 2D FusedMoEFactory LoRA modules are present with
197
expert parallelism enabled, the (ep_rank, local, global)
198
slicing metadata shared across all MoE layers. Non-local
199
expert weights are skipped at read time instead of being
vllm/lora/model_manager.py
+2
-2
@@ -739,7 +739,7 @@ class LoRAModelManager:
739
740
def _create_merged_loras_inplace(self, lora_model: LoRAModel) -> None:
741
for module_name, new_module_names in self.packed_modules.items():
742
- # For 2D FusedMoE modules with EP, narrow the per-expert
742
+ # For 2D RoutedExperts modules with EP, narrow the per-expert
743
# sub-module list to this rank's owned experts so pack_moe
744
# produces a tensor sized to local_num_experts directly.
745
packed_module_names = new_module_names
@@ -1096,7 +1096,7 @@ class LoRAModelManager:
1096
1097
def _build_moe_ep_load_spec(self) -> MoEEPLoadSpec | None:
1098
"""
1099
- Per-rank slicing metadata for 2D FusedMoE LoRA modules.
1099
+ Per-rank slicing metadata for 2D RoutedEXperts LoRA modules.
1100
"""
1101
if not self._use_ep or not self._is_moe:
1102
return None
vllm/model_executor/layers/fused_moe/__init__.py
+2
-2
@@ -19,7 +19,7 @@ from vllm.model_executor.layers.fused_moe.fused_moe_method_base import (
19
FusedMoEMethodBase,
20
)
21
from vllm.model_executor.layers.fused_moe.layer import (
22
- FusedMoE,
22
+ FusedMoEFactory,
23
fused_moe_make_expert_params_mapping,
24
)
25
from vllm.model_executor.layers.fused_moe.modular_kernel import (
@@ -63,7 +63,7 @@ def get_config() -> dict[str, Any] | None:
63
64
65
__all__ = [
66
- "FusedMoE",
66
+ "FusedMoEFactory",
67
"FusedMoERouter",
68
"FusedMoEConfig",
69
"FusedMoEQuantConfig",
vllm/model_executor/layers/fused_moe/config.py
+3
-3
@@ -1134,9 +1134,9 @@ class FusedMoEParallelConfig:
1134
level's of parallelism to use in the fused moe layer.
1135
1136
Args:
1137
- tp_size_ (int): `tp_size` passed into the FusedMoE constructor.
1138
- pcp_size_ (int): `pcp_size` passed into the FusedMoE constructor.
1139
- dp_size_ (int): `dp_size` passed into the FusedMoE constructor.
1137
+ tp_size_ (int): `tp_size` passed into the FusedMoEFactory constructor.
1138
+ pcp_size_ (int): `pcp_size` passed into the FusedMoEFactory constructor.
1139
+ dp_size_ (int): `dp_size` passed into the FusedMoEFactory constructor.
1140
vllm_parallel_config (ParallelConfig): vLLM's parallel config
1141
object which contains the `enable_expert_parallel` flag.
1142
vllm/model_executor/layers/fused_moe/layer.py
+1
-2
@@ -96,8 +96,7 @@ def determine_expert_counts(
96
return global_num_experts, logical_num_experts, num_fused_shared_experts
97
98
99
-# TODO: rename this
100
-def FusedMoE(
99
+def FusedMoEFactory(
100
num_experts: int, # Global number of experts
101
top_k: int,
102
hidden_size: int,
vllm/model_executor/layers/fused_moe/oracle/int_wna16.py
+2
-2
@@ -1016,7 +1016,7 @@ def _process_weights_xpu(
1016
w2: [E, K, N] int4 (uint8 storage [E, K, N // 2])
1017
w2_scales: [E, K, N // group_size] params_dtype
1018
1019
- Input GPTQ layout from FusedMoE.weight_loader:
1019
+ Input GPTQ layout from MoERunner.weight_loader:
1020
w13: [E, K // 8, 2*N] int32 (8 nibbles per int32 along the input dim)
1021
w13_scales: [E, K // group_size, 2*N] params_dtype
1022
w2: [E, N // 8, K] int32
@@ -1419,7 +1419,7 @@ def convert_to_wna16_moe_kernel_format(
1419
1420
Args:
1421
backend: the selected ``WNA16MoEBackend``.
1422
- layer: the ``FusedMoE`` layer whose parameters are being prepared.
1422
+ layer: the ``MoERunner`` layer whose parameters are being prepared.
1423
quant_config: the ``QuantizationConfig`` for this layer.
1424
input_dtype: optional activation dtype, usually should be 16 bit.
1425
"""
vllm/model_executor/layers/fused_moe/routed_experts_capturer.py
+1
-1
@@ -180,7 +180,7 @@ class RoutedExpertsCapturer:
180
# (trailing rows are SP ceil-div padding). The TP group
181
# is always initialized on real rollout workers, and
182
# every rank in the group reaches this branch in
183
- # lockstep (bind is per-FusedMoE layer, SP is a global
183
+ # lockstep (bind is per-FusedMoEFactory layer, SP is a global
184
# condition), so a bare all_gather here will not
185
# deadlock -- let it raise if the precondition is
186
# violated rather than skip silently.
vllm/model_executor/layers/fused_moe/runner/moe_runner.py
+2
-2
@@ -353,7 +353,7 @@ class MoERunner(MoERunnerInterface):
353
) -> tuple[torch.Tensor, torch.Tensor | None]:
354
"""Apply transform for routed experts (e.g., latent projection).
355
356
- This is called by FusedMoE.forward_native. The original hidden_states
356
+ This is called by MoERunner.forward_native. The original hidden_states
357
is saved separately so shared experts get [S, hidden_size] while
358
routed experts get the transformed [S, moe_latent_size].
359
@@ -646,7 +646,7 @@ class MoERunner(MoERunnerInterface):
646
):
647
# If router/gate provided, then apply it here.
648
# (Note: This code runs only when "overlapped mode" is on to allow
649
- # parallel execution of shared experts with the FusedMoE via
649
+ # parallel execution of shared experts with the RoutedExperts via
650
# separate cuda stream)
651
if self._shared_experts is not None:
652
assert shared_experts_input is not None
vllm/model_executor/layers/fused_moe/runner/moe_runner_interface.py
+1
-1
@@ -62,7 +62,7 @@ class MoERunnerInterface(PluggableLayer, ABC):
62
63
########################################################################
64
#
65
- # FusedMoE layer methods
65
+ # FusedMoEFactory layer methods
66
#
67
########################################################################
68
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors.py
+1
-1
@@ -215,7 +215,7 @@ class CompressedTensorsConfig(QuantizationConfig):
215
def _add_fused_moe_to_target_scheme_map(self): # XXXXXXXXXXXXXXXXXXXXXX
216
"""
217
Helper function to update target_scheme_map
218
- since linear layers get fused into FusedMoE
218
+ since linear layers get fused into RoutedExperts
219
targeting 'Linear' needs to also match
220
RoutedExperts modules.
221
"""
vllm/model_executor/layers/quantization/modelopt.py
+1
-1
@@ -2363,7 +2363,7 @@ class ModelOptMixedPrecisionConfig(ModelOptQuantConfigBase):
2363
if key.startswith(prefix_dot):
2364
return info["quant_algo"].upper()
2365
2366
- # FusedMoE expert prefix is e.g. "...moe.experts", while ModelOpt's
2366
+ # RoutedExperts expert prefix is e.g. "...moe.experts", while ModelOpt's
2367
# quantized_layers entries use "...moe.gate_proj" / "...moe.up_proj".
2368
if prefix.endswith(".experts"):
2369
parent_dot = prefix.rsplit(".experts", 1)[0] + "."
vllm/model_executor/model_loader/bitsandbytes_loader.py
+1
-1
@@ -467,7 +467,7 @@ class BitsAndBytesModelLoader(BaseModelLoader):
467
elif isinstance(module, RoutedExperts) and hasattr(
468
module.quant_method, "quant_config"
469
):
470
- # TODO: support FusedMoE with prequant and 8bit.
470
+ # TODO: support RoutedExperts with prequant and 8bit.
471
if self.pre_quant and self.load_8bit:
472
raise ValueError(
473
"Prequant BitsAndBytes 8bit models with RoutedExperts "
vllm/model_executor/models/AXK1.py
+2
-2
@@ -43,7 +43,7 @@ from vllm.distributed import (
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 (
46
- FusedMoE,
46
+ FusedMoEFactory,
47
fused_moe_make_expert_params_mapping,
48
)
49
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -168,7 +168,7 @@ class AXK1MoE(nn.Module):
168
prefix=f"{prefix}.shared_experts",
169
)
170
171
- self.experts = FusedMoE(
171
+ self.experts = FusedMoEFactory(
172
shared_experts=self.shared_experts,
173
gate=self.gate,
174
num_experts=config.n_routed_experts,
vllm/model_executor/models/afmoe.py
+3
-3
@@ -18,7 +18,7 @@ from vllm.distributed import (
18
from vllm.logger import init_logger
19
from vllm.model_executor.layers.attention import Attention
20
from vllm.model_executor.layers.fused_moe import (
21
- FusedMoE,
21
+ FusedMoEFactory,
22
MoERunner,
23
)
24
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -122,8 +122,8 @@ class AfmoeMoE(nn.Module):
122
prefix=f"{prefix}.shared_experts",
123
)
124
125
- # Routed experts using FusedMoE
126
- self.experts = FusedMoE(
125
+ # Routed experts using FusedMoEFactory
126
+ self.experts = FusedMoEFactory(
127
shared_experts=self.shared_experts,
128
num_experts=config.num_experts,
129
top_k=config.num_experts_per_tok,
vllm/model_executor/models/aria.py
+4
-2
@@ -13,7 +13,9 @@ from vllm.config import VllmConfig
13
from vllm.config.multimodal import BaseDummyOptions
14
from vllm.inputs import MultiModalDataDict
15
from vllm.model_executor.layers.activation import get_act_fn
16
-from vllm.model_executor.layers.fused_moe import FusedMoE
16
+from vllm.model_executor.layers.fused_moe import (
17
+ FusedMoEFactory,
18
+)
19
from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
20
from vllm.model_executor.layers.logits_processor import LogitsProcessor
21
from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -222,7 +224,7 @@ class AriaTextMoELayer(nn.Module):
224
bias=config.mlp_bias,
225
)
226
225
- self.experts = FusedMoE(
227
+ self.experts = FusedMoEFactory(
228
shared_experts=self.shared_experts,
229
num_experts=config.moe_num_experts,
230
top_k=config.moe_topk,
vllm/model_executor/models/bailing_moe.py
+2
-2
@@ -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 FusedMoE
44
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
45
from vllm.model_executor.layers.layernorm import RMSNorm
46
from vllm.model_executor.layers.linear import (
47
MergedColumnParallelLinear,
@@ -289,7 +289,7 @@ class BailingMoE(nn.Module):
289
else:
290
self.shared_experts = None
291
292
- self.experts = FusedMoE(
292
+ self.experts = FusedMoEFactory(
293
shared_experts=self.shared_experts,
294
num_experts=self.num_experts,
295
top_k=self.top_k,
vllm/model_executor/models/bailing_moe_linear.py
+4
-4
@@ -18,7 +18,7 @@ from vllm.distributed import (
18
from vllm.forward_context import get_forward_context
19
from vllm.logger import init_logger
20
from vllm.model_executor.layers.fused_moe import (
21
- FusedMoE,
21
+ FusedMoEFactory,
22
fused_moe_make_expert_params_mapping,
23
)
24
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -329,8 +329,8 @@ class BailingMoeV25(nn.Module):
329
else:
330
self.shared_experts = None
331
332
- # Routed experts using FusedMoE
333
- self.experts = FusedMoE(
332
+ # Routed experts using FusedMoEFactory
333
+ self.experts = FusedMoEFactory(
334
shared_experts=self.shared_experts,
335
num_experts=self.num_experts,
336
top_k=self.top_k,
@@ -602,7 +602,7 @@ class BailingMoeV25Model(nn.Module):
602
(".gate_up_proj", ".up_proj", 1),
603
]
604
605
- # Expert parameter mappings from FusedMoE
605
+ # Expert parameter mappings from FusedMoEFactory
606
expert_mappings = list(self.get_expert_mapping())
607
608
def load_param(name: str, tensor: torch.Tensor, shard_id=None) -> bool:
vllm/model_executor/models/bert_with_rope.py
+1
-1
@@ -320,7 +320,7 @@ class NomicMoE(nn.Module):
320
# router_logits: (num_tokens, n_experts)
321
router_logits, _ = self.router(hidden_states)
322
# FIXME(Isotr0py): This implementation is too tricky,
323
- # we should use FusedMoE instead in the future
323
+ # we should use FusedMoEFactory instead in the future
324
# after supporting ungated activation for it.
325
topk_weights, topk_ids, _ = fused_topk(
326
hidden_states, router_logits, self.top_k, renormalize=False
vllm/model_executor/models/cohere2_moe.py
+3
-3
@@ -16,7 +16,7 @@ from vllm.distributed import (
16
)
17
from vllm.model_executor.layers.activation import SiluAndMul
18
from vllm.model_executor.layers.attention import Attention
19
-from vllm.model_executor.layers.fused_moe import FusedMoE
19
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
20
from vllm.model_executor.layers.linear import (
21
MergedColumnParallelLinear,
22
QKVParallelLinear,
@@ -300,7 +300,7 @@ class Cohere2Moe(nn.Module):
300
self.shared_experts = None
301
self.shared_expert_combination_strategy = None
302
303
- self.experts = FusedMoE(
303
+ self.experts = FusedMoEFactory(
304
num_experts=config.num_experts,
305
top_k=config.num_experts_per_tok,
306
hidden_size=config.hidden_size,
@@ -318,7 +318,7 @@ class Cohere2Moe(nn.Module):
318
orig_shape = hidden_states.shape
319
hidden_states = hidden_states.view(-1, self.hidden_size)
320
router_logits, _ = self.gate(hidden_states)
321
- # FusedMoE handles shared expert overlap internally and returns
321
+ # FusedMoEFactory handles shared expert overlap internally and returns
322
# shared_output + routed_output when shared_experts is set.
323
final_hidden_states = self.experts(hidden_states, router_logits)
324
if self.shared_expert_combination_strategy == "average":
vllm/model_executor/models/dbrx.py
+2
-2
@@ -16,7 +16,7 @@ from vllm.distributed import (
16
)
17
from vllm.model_executor.layers.attention import Attention
18
from vllm.model_executor.layers.fused_moe import (
19
- FusedMoE,
19
+ FusedMoEFactory,
20
RoutedExperts,
21
)
22
from vllm.model_executor.layers.linear import (
@@ -159,7 +159,7 @@ class DbrxMoE(nn.Module):
159
160
self.router = DbrxRouter(config, self.params_dtype)
161
162
- self.experts = FusedMoE(
162
+ self.experts = FusedMoEFactory(
163
num_experts=config.ffn_config.moe_num_experts,
164
top_k=config.ffn_config.moe_top_k,
165
hidden_size=config.d_model,
vllm/model_executor/models/deepseek_v2.py
+2
-2
@@ -50,7 +50,7 @@ from vllm.model_executor.layers.activation import SiluAndMul
50
from vllm.model_executor.layers.attention import Attention, RSWAAttention
51
from vllm.model_executor.layers.attention_layer_base import AttentionLayerBase
52
from vllm.model_executor.layers.fused_moe import (
53
- FusedMoE,
53
+ FusedMoEFactory,
54
GateLinear,
55
fused_moe_make_expert_params_mapping,
56
)
@@ -361,7 +361,7 @@ class DeepseekV2MoE(nn.Module):
361
prefix=f"{prefix}.shared_experts",
362
)
363
364
- self.experts = FusedMoE(
364
+ self.experts = FusedMoEFactory(
365
shared_experts=self.shared_experts,
366
gate=self.gate,
367
num_experts=config.n_routed_experts,
vllm/model_executor/models/ernie45_moe.py
+2
-2
@@ -41,7 +41,7 @@ from vllm.distributed import (
41
from vllm.logger import init_logger
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 FusedMoE, MoERunner
44
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory, MoERunner
45
from vllm.model_executor.layers.layernorm import RMSNorm
46
from vllm.model_executor.layers.linear import (
47
MergedColumnParallelLinear,
@@ -183,7 +183,7 @@ class Ernie4_5_MoeMoE(nn.Module):
183
else:
184
self.shared_experts = None
185
186
- self.experts = FusedMoE(
186
+ self.experts = FusedMoEFactory(
187
shared_experts=self.shared_experts,
188
num_experts=config.moe_num_experts,
189
top_k=config.moe_k,
vllm/model_executor/models/ernie45_vl_moe.py
+3
-3
@@ -37,7 +37,7 @@ 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 (
40
- FusedMoE,
40
+ FusedMoEFactory,
41
fused_moe_make_expert_params_mapping,
42
)
43
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -260,7 +260,7 @@ class Ernie4_5_VLMoeMoE(nn.Module):
260
prefix=f"{prefix}.text_experts_gate",
261
)
262
263
- self.text_experts = FusedMoE(
263
+ self.text_experts = FusedMoEFactory(
264
shared_experts=self.shared_experts,
265
num_experts=config.moe_num_experts[0],
266
top_k=config.moe_k,
@@ -297,7 +297,7 @@ class Ernie4_5_VLMoeMoE(nn.Module):
297
prefix=f"{prefix}.vision_experts_gate",
298
)
299
300
- self.vision_experts = FusedMoE(
300
+ self.vision_experts = FusedMoEFactory(
301
shared_experts=self.shared_experts,
302
num_experts=config.moe_num_experts[1],
303
top_k=config.moe_k,
vllm/model_executor/models/exaone_moe.py
+2
-4
@@ -29,9 +29,7 @@ from vllm.distributed import (
29
get_pp_group,
30
get_tensor_model_parallel_world_size,
31
)
32
-from vllm.model_executor.layers.fused_moe import (
33
- FusedMoE,
34
-)
32
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
33
from vllm.model_executor.layers.layernorm import RMSNorm
34
from vllm.model_executor.layers.linear import ReplicatedLinear
35
from vllm.model_executor.layers.logits_processor import LogitsProcessor
@@ -126,7 +124,7 @@ class ExaoneMoe(nn.Module):
124
else:
125
self.shared_experts = None
126
129
- self.experts = FusedMoE(
127
+ self.experts = FusedMoEFactory(
128
shared_experts=self.shared_experts,
129
gate=self.gate,
130
num_experts=self.n_routed_experts,
vllm/model_executor/models/flex_olmo.py
+2
-2
@@ -21,7 +21,7 @@ from vllm.config import VllmConfig
21
from vllm.distributed import get_tensor_model_parallel_world_size
22
from vllm.logger import init_logger
23
from vllm.model_executor.layers.fused_moe import (
24
- FusedMoE,
24
+ FusedMoEFactory,
25
)
26
from vllm.model_executor.layers.layernorm import RMSNorm
27
from vllm.model_executor.layers.linear import ReplicatedLinear
@@ -73,7 +73,7 @@ class FlexOlmoMoE(nn.Module):
73
prefix=f"{prefix}.gate",
74
)
75
76
- self.experts = FusedMoE(
76
+ self.experts = FusedMoEFactory(
77
num_experts=hf_config.num_experts,
78
top_k=hf_config.num_experts_per_tok,
79
hidden_size=hf_config.hidden_size,
vllm/model_executor/models/gemma4.py
+16
-16
@@ -38,7 +38,7 @@ from vllm.logger import init_logger
38
from vllm.model_executor.layers.activation import get_act_and_mul_fn
39
from vllm.model_executor.layers.attention import Attention
40
from vllm.model_executor.layers.fused_moe import (
41
- FusedMoE,
41
+ FusedMoEFactory,
42
GateLinear,
43
fused_moe_make_expert_params_mapping,
44
)
@@ -305,14 +305,14 @@ class Gemma4Router(nn.Module):
305
306
307
class Gemma4MoE(nn.Module):
308
- """Mixture of Experts for Gemma4 using vLLM's FusedMoE.
308
+ """Mixture of Experts for Gemma4 using vLLM's MoERunner.
309
310
- Wraps FusedMoE with custom routing. The router projection is
310
+ Wraps MoERunner with custom routing. The router projection is
311
external (Gemma4Router) — this class only handles expert dispatch.
312
313
Gemma4 routing: softmax over ALL experts → top-k → renormalize.
314
per_expert_scale is folded into routing weights for mathematical
315
- correctness with FusedMoE's fused kernel.
315
+ correctness with MoERunner's fused kernel.
316
"""
317
318
def __init__(
@@ -326,11 +326,11 @@ class Gemma4MoE(nn.Module):
326
self.num_experts = config.num_experts
327
328
# Per-expert output scale folded into routing weights so that
329
- # FusedMoE's fused kernel computes: Σ_e (expert_e * w_e * scale_e)
329
+ # MoERunner's fused kernel computes: Σ_e (expert_e * w_e * scale_e)
330
self.per_expert_scale = nn.Parameter(torch.ones(config.num_experts))
331
332
# Gemma4 routing: softmax over ALL experts → top-k → renormalize.
333
- # FusedMoE's built-in fused_topk scopes softmax differently, so
333
+ # MoERunner's built-in fused_topk scopes softmax differently, so
334
# a custom routing function is needed for numerical correctness.
335
# NOTE: self.per_expert_scale is read at call time (not captured into
336
# a local) so that torch.func.functional_call parameter substitution
@@ -350,8 +350,8 @@ class Gemma4MoE(nn.Module):
350
gating_output, topk, self.per_expert_scale
351
)
352
353
- # FusedMoE experts with custom Gemma4 routing
354
- self.experts = FusedMoE(
353
+ # MoERunner experts with custom Gemma4 routing
354
+ self.experts = FusedMoEFactory(
355
num_experts=config.num_experts,
356
top_k=config.top_k_experts,
357
hidden_size=config.hidden_size,
@@ -1382,10 +1382,10 @@ class Gemma4Model(nn.Module, EagleModelMixin):
1382
# MoE expert weight mapping: checkpoint can have either:
1383
# 1. 3D packed tensors (exploded in _weight_iterator to per-expert 2D)
1384
# 2. Already per-expert 2D weights (if quantized)
1385
- # Map to FusedMoE parameters:
1386
- # moe.experts.{id}.gate_proj → FusedMoE w1 (shard of w13)
1387
- # moe.experts.{id}.up_proj → FusedMoE w3 (shard of w13)
1388
- # moe.experts.{id}.down_proj → FusedMoE w2
1385
+ # Map to MoERunner parameters:
1386
+ # moe.experts.{id}.gate_proj → MoERunner w1 (shard of w13)
1387
+ # moe.experts.{id}.up_proj → MoERunner w3 (shard of w13)
1388
+ # moe.experts.{id}.down_proj → MoERunner w2
1389
num_experts = getattr(self.config, "num_experts", None) or 0
1390
# Strategy A: dot-separated suffix
1391
# (standard AWQ/GPTQ e.g. .qweight, .scales, .weight)
@@ -1475,7 +1475,7 @@ class Gemma4Model(nn.Module, EagleModelMixin):
1475
continue
1476
param = params_dict[moe_name]
1477
# Expert weights are already in the correct
1478
- # orientation for FusedMoE after _weight_iterator:
1478
+ # orientation for MoERunner after _weight_iterator:
1479
# gate/up: [I, H] → w1/w3 expects [I, H]
1480
# down: [H, I] → w2 expects [H, I]
1481
# Scales and other quantization params may be 1D or scalar.
@@ -1668,19 +1668,19 @@ class Gemma4ForCausalLM(
1668
1669
# MoE expert weights: checkpoint stores as 3D packed
1670
# tensors. Explode into per-expert 2D weights for
1671
- # FusedMoE weight_loader.
1671
+ # MoERunner weight_loader.
1672
#
1673
# Checkpoint format:
1674
# moe.gate_up_proj: [E, 2*I, H] (fused gate + up)
1675
# moe.down_proj: [E, H, I]
1676
#
1677
- # FusedMoE expects per-expert:
1677
+ # MoERunner expects per-expert:
1678
# w1 (gate): [I, H] — first half of gate_up
1679
# w3 (up): [I, H] — second half of gate_up
1680
# w2 (down): [H, I] — as-is from checkpoint
1681
#
1682
# No transpose needed: checkpoint orientation already
1683
- # matches FusedMoE's expected layout.
1683
+ # matches MoERunner's expected layout.
1684
if "moe.gate_up_proj" in name and weight.dim() == 3:
1685
num_experts = weight.size(0)
1686
intermediate_size = weight.size(1) // 2
vllm/model_executor/models/glm4_moe.py
+5
-3
@@ -42,7 +42,9 @@ 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 FusedMoE
45
+from vllm.model_executor.layers.fused_moe import (
46
+ FusedMoEFactory,
47
+)
48
from vllm.model_executor.layers.layernorm import RMSNorm
49
from vllm.model_executor.layers.linear import (
50
MergedColumnParallelLinear,
@@ -164,7 +166,7 @@ class Glm4MoE(nn.Module):
166
)
167
168
# AITER fused shared-expert (FSE) gate; mirrors the deepseek_v2.py
167
- # pattern (see Glm4MoE / FusedMoE wiring there).
169
+ # pattern (see Glm4MoE / MoERunner wiring there).
170
self.is_rocm_aiter_moe_enabled = rocm_aiter_ops.is_fused_moe_enabled()
171
self.is_fusion_moe_shared_experts_enabled = (
172
rocm_aiter_ops.is_fusion_moe_shared_experts_enabled()
@@ -183,7 +185,7 @@ class Glm4MoE(nn.Module):
185
prefix=f"{prefix}.shared_experts",
186
)
187
186
- self.experts = FusedMoE(
188
+ self.experts = FusedMoEFactory(
189
shared_experts=self.shared_experts,
190
num_experts=config.n_routed_experts,
191
top_k=config.num_experts_per_tok,
vllm/model_executor/models/gpt_oss.py
+3
-3
@@ -21,7 +21,7 @@ from vllm.distributed import (
21
)
22
from vllm.model_executor.layers.attention import Attention
23
from vllm.model_executor.layers.fused_moe import (
24
- FusedMoE,
24
+ FusedMoEFactory,
25
fused_moe_make_expert_params_mapping,
26
)
27
from vllm.model_executor.layers.fused_moe.config import FusedMoEParallelConfig
@@ -211,7 +211,7 @@ class MLPBlock(torch.nn.Module):
211
return_bias=False,
212
)
213
assert config.intermediate_size % self.world_size == 0
214
- self.experts = FusedMoE(
214
+ self.experts = FusedMoEFactory(
215
num_experts=config.num_local_experts,
216
top_k=config.num_experts_per_tok,
217
hidden_size=config.hidden_size,
@@ -1010,7 +1010,7 @@ class GptOssModel(nn.Module, EagleModelMixin):
1010
tp_rank_end = min((tp_rank + 1) * per_rank_intermediate_size, intermediate_size)
1011
1012
# Use centralized weight remapping for MoE expert parameters.
1013
- # The FusedMoE refactor moved expert params under
1013
+ # The MoERunner refactor moved expert params under
1014
# `mlp.experts.routed_experts.*`; this remaps checkpoint names so
1015
# MoE weight/bias keys resolve against params_dict.
1016
for name, weight in remap_moe_expert_weights(weights, params_dict):
vllm/model_executor/models/granitemoe.py
+2
-2
@@ -40,7 +40,7 @@ from vllm.distributed import (
40
)
41
from vllm.model_executor.layers.attention import Attention
42
from vllm.model_executor.layers.fused_moe import (
43
- FusedMoE,
43
+ FusedMoEFactory,
44
fused_moe_make_expert_params_mapping,
45
)
46
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -101,7 +101,7 @@ class GraniteMoeMoE(nn.Module):
101
prefix=f"{prefix}.gate",
102
)
103
104
- self.experts = FusedMoE(
104
+ self.experts = FusedMoEFactory(
105
num_experts=num_experts,
106
top_k=top_k,
107
hidden_size=hidden_size,
vllm/model_executor/models/hunyuan_v1.py
+2
-2
@@ -43,7 +43,7 @@ from vllm.distributed import (
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 (
46
- FusedMoE,
46
+ FusedMoEFactory,
47
fused_moe_make_expert_params_mapping,
48
)
49
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -441,7 +441,7 @@ class HunYuanSparseMoeBlock(nn.Module):
441
else:
442
self.shared_mlp = None
443
444
- self.experts = FusedMoE(
444
+ self.experts = FusedMoEFactory(
445
shared_experts=self.shared_mlp,
446
num_experts=self.n_routed_experts,
447
top_k=top_k,
vllm/model_executor/models/hy_v3.py
+2
-2
@@ -44,7 +44,7 @@ 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 (
47
- FusedMoE,
47
+ FusedMoEFactory,
48
GateLinear,
49
fused_moe_make_expert_params_mapping,
50
)
@@ -184,7 +184,7 @@ class HYV3MoEFused(nn.Module):
184
scoring_func = "sigmoid"
185
e_score_correction_bias = self.expert_bias
186
187
- self.experts = FusedMoE(
187
+ self.experts = FusedMoEFactory(
188
num_experts=self.n_routed_experts,
189
top_k=top_k,
190
hidden_size=config.hidden_size,
vllm/model_executor/models/interns1_pro.py
+2
-2
@@ -42,7 +42,7 @@ from vllm.logger import init_logger
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 (
45
- FusedMoE,
45
+ FusedMoEFactory,
46
)
47
from vllm.model_executor.layers.layernorm import RMSNorm
48
from vllm.model_executor.layers.linear import (
@@ -173,7 +173,7 @@ class InternS1ProMoeSparseMoeBlock(nn.Module):
173
# For custom routing function
174
self.n_groups = getattr(config, "router_n_groups", -1)
175
176
- self.experts = FusedMoE(
176
+ self.experts = FusedMoEFactory(
177
num_experts=self.n_routed_experts,
178
top_k=config.num_experts_per_tok,
179
hidden_size=config.hidden_size,
vllm/model_executor/models/jamba.py
+4
-2
@@ -14,7 +14,9 @@ from vllm.config import CacheConfig, ModelConfig, VllmConfig
14
from vllm.distributed import get_tensor_model_parallel_world_size
15
from vllm.distributed.parallel_state import get_pp_group
16
from vllm.model_executor.layers.attention import Attention
17
-from vllm.model_executor.layers.fused_moe import FusedMoE
17
+from vllm.model_executor.layers.fused_moe import (
18
+ FusedMoEFactory,
19
+)
20
from vllm.model_executor.layers.layernorm import RMSNorm
21
from vllm.model_executor.layers.linear import (
22
QKVParallelLinear,
@@ -81,7 +83,7 @@ class JambaMoE(nn.Module):
83
prefix=f"{prefix}.router",
84
)
85
84
- self.experts = FusedMoE(
86
+ self.experts = FusedMoEFactory(
87
self.num_total_experts,
88
self.top_k,
89
self.hidden_size,
vllm/model_executor/models/laguna.py
+9
-7
@@ -19,7 +19,7 @@ from vllm.distributed import (
19
)
20
from vllm.logger import init_logger
21
from vllm.model_executor.layers.attention import Attention
22
-from vllm.model_executor.layers.fused_moe import FusedMoE
22
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
23
from vllm.model_executor.layers.layernorm import RMSNorm
24
from vllm.model_executor.layers.linear import (
25
ColumnParallelLinear,
@@ -174,7 +174,7 @@ class LagunaMoE(nn.Module):
174
prefix=f"{prefix}.gate",
175
)
176
177
- # Shared expert (optional) - passed to FusedMoE for overlap optimization
177
+ # Shared expert (optional) - passed to FusedMoEFactory for overlap optimization
178
self.shared_expert: LagunaMLP | None
179
if config.shared_expert_intermediate_size > 0:
180
self.shared_expert = LagunaMLP(
@@ -191,20 +191,22 @@ class LagunaMoE(nn.Module):
191
# Auxiliary-loss-free load-balancing bias (arXiv:2408.15664). The
192
# checkpoint stores one [num_experts] tensor per MoE layer at
193
# `mlp.experts.e_score_correction_bias`; registering it as a Parameter
194
- # on the FusedMoE lets the weight loader pick it up and the router
194
+ # on the MoERunner lets the weight loader pick it up and the router
195
# add it during top-k selection. The fused top-k bias router requires
196
# float32 regardless of model dtype.
197
e_score_correction_bias = torch.nn.Parameter(
198
torch.zeros(config.num_experts, dtype=torch.float32),
199
requires_grad=False,
200
)
201
-
202
- # FusedMoE with SIGMOID routing. Passing `shared_experts=` lets the
201
+ # MoERunner with SIGMOID routing. Passing `shared_experts=` lets the
202
+ # layer overlap the shared-expert compute with the all2all dispatch.
203
+ # `apply_routed_scale_to_output=True` makes MoERunner handle the
204
+ # FusedMoEFactory with SIGMOID routing. Passing `shared_experts=` lets the
205
# layer overlap the shared-expert compute with the all2all dispatch.
204
- # `apply_routed_scale_to_output=True` makes FusedMoE handle the
206
+ # `apply_routed_scale_to_output=True` makes FusedMoEFactory handle the
207
# routed_scaling_factor, shared+routed combine, and TP all-reduce
208
# internally, so forward() just returns the final hidden states.
207
- self.experts = FusedMoE(
209
+ self.experts = FusedMoEFactory(
210
shared_experts=self.shared_expert,
211
num_experts=config.num_experts,
212
top_k=config.num_experts_per_tok,
vllm/model_executor/models/lfm2_moe.py
+4
-2
@@ -15,7 +15,9 @@ from vllm.distributed import (
15
)
16
from vllm.model_executor.layers.activation import SiluAndMul
17
from vllm.model_executor.layers.attention import Attention
18
-from vllm.model_executor.layers.fused_moe import FusedMoE
18
+from vllm.model_executor.layers.fused_moe import (
19
+ FusedMoEFactory,
20
+)
21
from vllm.model_executor.layers.layernorm import RMSNorm
22
from vllm.model_executor.layers.linear import (
23
MergedColumnParallelLinear,
@@ -143,7 +145,7 @@ class Lfm2MoeSparseMoeBlock(nn.Module):
145
else:
146
self.gate.e_score_correction_bias = None
147
146
- self.experts = FusedMoE(
148
+ self.experts = FusedMoEFactory(
149
num_experts=self.n_routed_experts,
150
top_k=config.num_experts_per_tok,
151
hidden_size=config.hidden_size,
vllm/model_executor/models/llama4.py
+2
-2
@@ -37,7 +37,7 @@ from vllm.model_executor.layers.attention import (
37
ChunkedLocalAttention,
38
)
39
from vllm.model_executor.layers.fused_moe import (
40
- FusedMoE,
40
+ FusedMoEFactory,
41
fused_moe_make_expert_params_mapping,
42
)
43
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -131,7 +131,7 @@ class Llama4MoE(nn.Module):
131
self.n_physical_experts = self.n_local_experts + self.n_redundant_experts
132
self.n_local_physical_experts = self.n_physical_experts // self.ep_size
133
134
- self.experts = FusedMoE(
134
+ self.experts = FusedMoEFactory(
135
shared_experts=self.shared_expert,
136
num_experts=config.num_local_experts,
137
top_k=config.num_experts_per_tok,
vllm/model_executor/models/longcat_flash.py
+4
-4
@@ -47,7 +47,7 @@ from vllm.distributed import get_pp_group
47
from vllm.logger import init_logger
48
from vllm.model_executor.layers.activation import SiluAndMul
49
from vllm.model_executor.layers.fused_moe import (
50
- FusedMoE,
50
+ FusedMoEFactory,
51
fused_moe_make_expert_params_mapping,
52
)
53
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -297,7 +297,7 @@ class LongcatMoe(nn.Module):
297
)
298
299
assert config.zero_expert_type is not None
300
- self.experts = FusedMoE(
300
+ self.experts = FusedMoEFactory(
301
zero_expert_type=config.zero_expert_type,
302
e_score_correction_bias=self.router.e_score_correction_bias,
303
num_experts=num_experts,
@@ -317,7 +317,7 @@ class LongcatMoe(nn.Module):
317
num_tokens, hidden_dim = hidden_states.shape
318
hidden_states = hidden_states.view(-1, hidden_dim)
319
320
- # Align to FusedMoE padded hidden size to avoid dim mismatch
320
+ # Align to MoERunner padded hidden size to avoid dim mismatch
321
padded_hidden = self.experts.moe_config.hidden_dim
322
if hidden_dim < padded_hidden:
323
hidden_states_padded = torch.nn.functional.pad(
@@ -333,7 +333,7 @@ class LongcatMoe(nn.Module):
333
hidden_states_padded.to(self.router_params_dtype)
334
)
335
336
- # FusedMoE handles routing memoization and zero expert computation
336
+ # MoERunner handles routing memoization and zero expert computation
337
# internally. Pass full router_logits (including zero experts) so that
338
# zero experts can be properly identified in routing.
339
final_hidden_states = self.experts(
vllm/model_executor/models/mimo_v2.py
+2
-2
@@ -24,7 +24,7 @@ from vllm.logger import init_logger
24
from vllm.model_executor.layers.activation import SiluAndMul
25
from vllm.model_executor.layers.attention import Attention
26
from vllm.model_executor.layers.fused_moe import (
27
- FusedMoE,
27
+ FusedMoEFactory,
28
fused_moe_make_expert_params_mapping,
29
)
30
from vllm.model_executor.layers.layernorm import RMSNorm
@@ -171,7 +171,7 @@ class MiMoV2MoE(nn.Module):
171
torch.empty(config.n_routed_experts, dtype=self.gate_dtype)
172
)
173
174
- self.experts = FusedMoE(
174
+ self.experts = FusedMoEFactory(
175
num_experts=self.n_routed_experts,
176
top_k=config.num_experts_per_tok,
177
hidden_size=config.hidden_size,
vllm/model_executor/models/minimax_m2.py
+2
-4
@@ -39,9 +39,7 @@ from vllm.distributed import (
39
get_tensor_model_parallel_world_size,
40
)
41
from vllm.model_executor.layers.attention import Attention
42
-from vllm.model_executor.layers.fused_moe import (
43
- FusedMoE,
44
-)
42
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
43
from vllm.model_executor.layers.fused_moe.router.gate_linear import GateLinear
44
from vllm.model_executor.layers.layernorm import RMSNorm
45
from vllm.model_executor.layers.linear import (
@@ -95,7 +93,7 @@ class MiniMaxM2MoE(nn.Module):
93
else:
94
self.e_score_correction_bias = None
95
98
- self.experts = FusedMoE(
96
+ self.experts = FusedMoEFactory(
97
num_experts=config.num_local_experts,
98
top_k=config.num_experts_per_tok,
99
scoring_func=config.scoring_func,
vllm/model_executor/models/mixtral.py
+2
-4
@@ -39,9 +39,7 @@ from vllm.distributed import (
39
get_tensor_model_parallel_world_size,
40
)
41
from vllm.model_executor.layers.attention import Attention
42
-from vllm.model_executor.layers.fused_moe import (
43
- FusedMoE,
44
-)
42
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
43
from vllm.model_executor.layers.layernorm import RMSNorm
44
from vllm.model_executor.layers.linear import (
45
QKVParallelLinear,
@@ -123,7 +121,7 @@ class MixtralMoE(nn.Module):
121
prefix=f"{prefix}.gate",
122
)
123
126
- self.experts = FusedMoE(
124
+ self.experts = FusedMoEFactory(
125
num_experts=num_experts,
126
top_k=top_k,
127
hidden_size=hidden_size,
vllm/model_executor/models/nemotron_h.py
+2
-2
@@ -33,7 +33,7 @@ from vllm.distributed.parallel_state import get_pp_group
33
from vllm.model_executor.layers.activation import ReLUSquaredActivation
34
from vllm.model_executor.layers.attention import Attention
35
from vllm.model_executor.layers.fused_moe import (
36
- FusedMoE,
36
+ FusedMoEFactory,
37
GateLinear,
38
activation_without_mul,
39
fused_moe_make_expert_params_mapping,
@@ -209,7 +209,7 @@ class NemotronHMoE(nn.Module):
209
self.fc1_latent_proj = None
210
self.fc2_latent_proj = None
211
212
- self.experts = FusedMoE(
212
+ self.experts = FusedMoEFactory(
213
shared_experts=self.shared_experts,
214
num_experts=config.n_routed_experts,
215
top_k=config.num_experts_per_tok,
vllm/model_executor/models/olmoe.py
+2
-4
@@ -32,9 +32,7 @@ from vllm.distributed import (
32
from vllm.distributed.utils import split_tensor_along_last_dim
33
from vllm.logger import init_logger
34
from vllm.model_executor.layers.attention import Attention
35
-from vllm.model_executor.layers.fused_moe import (
36
- FusedMoE,
37
-)
35
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
36
from vllm.model_executor.layers.layernorm import RMSNorm
37
from vllm.model_executor.layers.linear import (
38
QKVParallelLinear,
@@ -94,7 +92,7 @@ class OlmoeMoE(nn.Module):
92
prefix=f"{prefix}.gate",
93
)
94
97
- self.experts = FusedMoE(
95
+ self.experts = FusedMoEFactory(
96
num_experts=num_experts,
97
top_k=top_k,
98
hidden_size=hidden_size,
vllm/model_executor/models/openpangu.py
+2
-2
@@ -43,7 +43,7 @@ from vllm.model_executor.layers.attention import (
43
Attention,
44
StaticSinkAttention,
45
)
46
-from vllm.model_executor.layers.fused_moe import FusedMoE
46
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
47
from vllm.model_executor.layers.layernorm import RMSNorm
48
from vllm.model_executor.layers.linear import (
49
ColumnParallelLinear,
@@ -195,7 +195,7 @@ class OpenPanguMoE(nn.Module):
195
else:
196
self.shared_experts = None
197
198
- self.experts = FusedMoE(
198
+ self.experts = FusedMoEFactory(
199
shared_experts=self.shared_experts,
200
num_experts=config.n_routed_experts,
201
top_k=config.num_experts_per_tok,
vllm/model_executor/models/param2moe.py
+5
-3
@@ -32,7 +32,9 @@ 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 FusedMoE
35
+from vllm.model_executor.layers.fused_moe import (
36
+ FusedMoEFactory,
37
+)
38
from vllm.model_executor.layers.layernorm import RMSNorm
39
from vllm.model_executor.layers.linear import (
40
MergedColumnParallelLinear,
@@ -325,7 +327,7 @@ class Param2MoEMoEBlock(nn.Module):
327
else:
328
self.shared_experts = None # type: ignore[assignment]
329
328
- self.experts = FusedMoE(
330
+ self.experts = FusedMoEFactory(
331
shared_experts=self.shared_experts,
332
num_experts=self.num_experts,
333
top_k=self.top_k,
@@ -342,7 +344,7 @@ class Param2MoEMoEBlock(nn.Module):
344
routed_scaling_factor=self.routed_scaling_factor,
345
)
346
345
- def maybe_get_fused_moe(self) -> FusedMoE:
347
+ def maybe_get_fused_moe(self) -> FusedMoEFactory:
348
return self.experts
349
350
def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
vllm/model_executor/models/phimoe.py
+2
-4
@@ -35,9 +35,7 @@ from vllm.compilation.decorators import support_torch_compile
35
from vllm.config import CacheConfig, VllmConfig
36
from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
37
from vllm.model_executor.layers.attention import Attention
38
-from vllm.model_executor.layers.fused_moe import (
39
- FusedMoE,
40
-)
38
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
39
from vllm.model_executor.layers.linear import (
40
QKVParallelLinear,
41
ReplicatedLinear,
@@ -273,7 +271,7 @@ class PhiMoE(nn.Module):
271
prefix=f"{prefix}.gate",
272
)
273
276
- self.experts = FusedMoE(
274
+ self.experts = FusedMoEFactory(
275
num_experts=num_experts,
276
top_k=top_k,
277
hidden_size=hidden_size,
vllm/model_executor/models/qwen2_moe.py
+2
-4
@@ -40,9 +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 (
44
- FusedMoE,
45
-)
43
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
44
from vllm.model_executor.layers.layernorm import RMSNorm
45
from vllm.model_executor.layers.linear import (
46
MergedColumnParallelLinear,
@@ -165,7 +163,7 @@ class Qwen2MoeSparseMoeBlock(nn.Module):
163
else:
164
self.shared_expert = None
165
168
- self.experts = FusedMoE(
166
+ self.experts = FusedMoEFactory(
167
shared_experts=self.shared_expert,
168
num_experts=config.num_experts,
169
top_k=config.num_experts_per_tok,
vllm/model_executor/models/qwen3_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 FusedMoE
45
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
46
from vllm.model_executor.layers.layernorm import RMSNorm
47
from vllm.model_executor.layers.linear import (
48
MergedColumnParallelLinear,
@@ -201,7 +201,7 @@ class Qwen3MoeSparseMoeBlock(nn.Module):
201
self.shared_expert_gate = None
202
self.shared_expert = None
203
204
- self.experts = FusedMoE(
204
+ self.experts = FusedMoEFactory(
205
shared_experts=self.shared_expert,
206
gate=self.gate,
207
num_experts=self.n_routed_experts,
@@ -228,13 +228,13 @@ class Qwen3MoeSparseMoeBlock(nn.Module):
228
hidden_states = sequence_parallel_chunk(hidden_states)
229
230
if self.experts.is_internal_router:
231
- # In this case, the gate/router runs inside the FusedMoE class
231
+ # In this case, the gate/router runs inside the MoERunner class
232
final_hidden_states = self.experts(
233
hidden_states=hidden_states, router_logits=hidden_states
234
)
235
else:
236
# Actually this will be dead code, since we always pass gate into
237
- # FusedMoE in the current implementation. But we keep this code
237
+ # MoERunner in the current implementation. But we keep this code
238
# here for clarity and future flexibility.
239
router_logits, _ = self.gate(hidden_states)
240
final_hidden_states = self.experts(
vllm/model_executor/models/qwen3_next.py
+3
-5
@@ -20,9 +20,7 @@ from vllm.distributed import (
20
)
21
from vllm.logger import init_logger
22
from vllm.model_executor.layers.attention import Attention
23
-from vllm.model_executor.layers.fused_moe import (
24
- FusedMoE,
25
-)
23
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
24
from vllm.model_executor.layers.fused_qk_norm_rope import fused_qk_rmsnorm_rope_gate
25
from vllm.model_executor.layers.layernorm import (
26
GemmaRMSNorm as Qwen3NextRMSNorm,
@@ -175,7 +173,7 @@ class Qwen3NextSparseMoeBlock(nn.Module):
173
prefix=f"{prefix}.shared_expert",
174
)
175
178
- self.experts = FusedMoE(
176
+ self.experts = FusedMoEFactory(
177
shared_experts=self.shared_expert,
178
gate=self.gate,
179
num_experts=self.n_routed_experts,
@@ -208,7 +206,7 @@ class Qwen3NextSparseMoeBlock(nn.Module):
206
hidden_states = sequence_parallel_chunk(hidden_states)
207
208
if self.experts.is_internal_router:
211
- # In this case, the gate/router runs inside the FusedMoE class
209
+ # In this case, the gate/router runs inside the MoERunner class
210
final_hidden_states = self.experts(
211
hidden_states=hidden_states, router_logits=hidden_states
212
)
vllm/model_executor/models/sarvam.py
+2
-2
@@ -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 FusedMoE, MoERunner
38
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory, MoERunner
39
from vllm.model_executor.layers.layernorm import RMSNorm
40
from vllm.model_executor.layers.linear import (
41
ColumnParallelLinear,
@@ -334,7 +334,7 @@ class SarvamMLAMoE(nn.Module):
334
else:
335
self.shared_experts = None
336
337
- self.experts = FusedMoE(
337
+ self.experts = FusedMoEFactory(
338
shared_experts=self.shared_experts,
339
num_experts=self.num_experts,
340
top_k=self.top_k,
vllm/model_executor/models/step3_text.py
+2
-2
@@ -19,7 +19,7 @@ from vllm.logger import init_logger
19
from vllm.model_executor.layers.activation import SiluAndMul
20
from vllm.model_executor.layers.attention import Attention
21
from vllm.model_executor.layers.fused_moe import (
22
- FusedMoE,
22
+ FusedMoEFactory,
23
)
24
from vllm.model_executor.layers.layernorm import RMSNorm
25
from vllm.model_executor.layers.linear import (
@@ -68,7 +68,7 @@ class FusedMoEBlock(nn.Module):
68
f"the number of experts {config.moe_num_experts}."
69
)
70
71
- self.experts = FusedMoE(
71
+ self.experts = FusedMoEFactory(
72
num_experts=config.moe_num_experts,
73
top_k=config.moe_top_k,
74
hidden_size=config.hidden_size,
vllm/model_executor/models/step3p5.py
+3
-3
@@ -24,7 +24,7 @@ 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 (
27
- FusedMoE,
27
+ FusedMoEFactory,
28
MoERunner,
29
fused_moe_make_expert_params_mapping,
30
)
@@ -376,7 +376,7 @@ class FusedMoEBlock(nn.Module):
376
quant_config=quant_config,
377
prefix=f"{prefix}.share_expert",
378
)
379
- self.experts = FusedMoE(
379
+ self.experts = FusedMoEFactory(
380
shared_experts=self.share_expert,
381
gate=self.gate,
382
num_experts=config.moe_num_experts,
@@ -404,7 +404,7 @@ class FusedMoEBlock(nn.Module):
404
hidden_states=hidden_states, router_logits=hidden_states
405
)
406
else:
407
- # TODO(bnell): this gate could be moved into the FusedMoE?
407
+ # TODO(bnell): this gate could be moved into the MoERunner?
408
router_logits, _ = self.gate(hidden_states)
409
final_hidden_states = self.experts(
410
hidden_states=hidden_states, router_logits=router_logits
vllm/model_executor/models/transformers/moe.py
+10
-6
@@ -29,7 +29,11 @@ from vllm.distributed import get_dp_group, get_ep_group
29
from vllm.forward_context import ForwardContext, get_forward_context
30
from vllm.logger import init_logger
31
from vllm.model_executor.custom_op import PluggableLayer
32
-from vllm.model_executor.layers.fused_moe import FusedMoE, MoERunner, RoutedExperts
32
+from vllm.model_executor.layers.fused_moe import (
33
+ FusedMoEFactory,
34
+ MoERunner,
35
+ RoutedExperts,
36
+)
37
from vllm.model_executor.models.interfaces import MixtureOfExperts
38
from vllm.model_executor.models.transformers.fuser import get_fuser
39
from vllm.model_executor.models.transformers.fusers.moe import MoEBlockFuser
@@ -53,7 +57,7 @@ class TransformersMoEState:
57
# --8<-- [start:transformers_fused_moe]
58
@PluggableLayer.register("transformers_fused_moe")
59
class TransformersMoERunner(MoERunner):
56
- """Custom FusedMoE for the Transformers modeling backend."""
60
+ """Custom MoERunner for the Transformers modeling backend."""
61
62
# --8<-- [end:transformers_fused_moe]
63
def __init__(self, *args, moe_state: TransformersMoEState, **kwargs):
@@ -297,7 +301,7 @@ class MoEMixin(MixtureOfExperts):
301
)
302
if fuser is not None and not reaches_fp16_trick:
303
# MoE block forward is fully replaced.
300
- # gate/router and shared expert (if any) runs in FusedMoE.
304
+ # gate/router and shared expert (if any) runs in MoERunner.
305
shared_experts = fuser.shared_experts(moe_block, prefix)
306
# Store shared experts for later down projection adjustment
307
if shared_experts is not None:
@@ -331,7 +335,7 @@ class MoEMixin(MixtureOfExperts):
335
if fuser.shared_name:
336
routed += " + shared experts"
337
logger.info_once(
334
- "Fused: %s (%s) -> FusedMoE (internal routing)",
338
+ "Fused: %s (%s) -> MoERunner (internal routing)",
339
routed,
340
moe_block_cls,
341
)
@@ -373,10 +377,10 @@ class MoEMixin(MixtureOfExperts):
377
runner_args={"moe_state": moe_state},
378
)
379
logger.info_once(
376
- "Fused: experts (%s) -> FusedMoE (external routing)",
380
+ "Fused: experts (%s) -> MoERunner (external routing)",
381
experts_cls,
382
)
379
- fused_experts = FusedMoE(**kwargs)
383
+ fused_experts = FusedMoEFactory(**kwargs)
384
moe_block.experts = fused_experts
385
log_replacement(qual_name, experts, fused_experts)
386
# Update MixtureOfExperts mixin state
vllm/model_executor/warmup/deep_gemm_warmup.py
+1
-1
@@ -108,7 +108,7 @@ def _extract_data_from_fused_moe_module(
108
m_: torch.nn.Module,
109
) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, int]:
110
"""
111
- Extract weights, weight scales and num_topk from FusedMoE module.
111
+ Extract weights, weight scales and num_topk from MoERunner module.
112
"""
113
assert isinstance(m_, MoERunner)
114
m = m_.routed_experts
vllm/models/deepseek_v4/amd/model.py
+3
-3
@@ -18,7 +18,7 @@ from vllm.distributed import (
18
)
19
from vllm.model_executor.layers.activation import SiluAndMul, SiluAndMulWithClamp
20
from vllm.model_executor.layers.fused_moe import (
21
- FusedMoE,
21
+ FusedMoEFactory,
22
GateLinear,
23
fused_moe_make_expert_params_mapping,
24
)
@@ -279,7 +279,7 @@ class DeepseekV4MoE(nn.Module):
279
self.experts_start_idx = self.tp_rank * self.n_local_experts
280
self.experts_end_idx = self.experts_start_idx + self.n_local_experts
281
282
- self.experts = FusedMoE(
282
+ self.experts = FusedMoEFactory(
283
shared_experts=self.shared_experts,
284
n_shared_experts=(
285
config.n_shared_experts if self.fuse_shared_experts else None
@@ -308,7 +308,7 @@ class DeepseekV4MoE(nn.Module):
308
309
org_shape = hidden_states.shape
310
if self.experts.is_internal_router:
311
- # In this case, the gate/router runs inside the FusedMoE class
311
+ # In this case, the gate/router runs inside the MoERunner class
312
final_hidden_states = self.experts(
313
hidden_states=hidden_states,
314
router_logits=hidden_states,
vllm/models/deepseek_v4/amd/mtp.py
+1
-1
@@ -51,7 +51,7 @@ from .model import DeepseekV4DecoderLayer
51
logger = init_logger(__name__)
52
53
# MoE expert scales are fused into per-layer w13/w2 tensors. The exact
54
-# parameter suffix depends on which FusedMoE method handles the experts:
54
+# parameter suffix depends on which MoERunner method handles the experts:
55
# - fp4 experts (Mxfp4MoEMethod) register ``w{1,2,3}_weight_scale``;
56
# - fp8 experts (Fp8MoEMethod with block_quant=True) register
57
# ``w{1,2,3}_weight_scale_inv``.
vllm/models/deepseek_v4/nvidia/model.py
+3
-3
@@ -27,7 +27,7 @@ from vllm.model_executor.kernels.mhc.tilelang import (
27
)
28
from vllm.model_executor.layers.activation import SiluAndMul, SiluAndMulWithClamp
29
from vllm.model_executor.layers.fused_moe import (
30
- FusedMoE,
30
+ FusedMoEFactory,
31
fused_moe_make_expert_params_mapping,
32
)
33
from vllm.model_executor.layers.fused_moe.router.base_router import (
@@ -670,7 +670,7 @@ class DeepseekV4MoE(nn.Module):
670
self.physical_expert_start = self.experts_start_idx
671
self.physical_expert_end = self.experts_end_idx
672
673
- self.experts = FusedMoE(
673
+ self.experts = FusedMoEFactory(
674
shared_experts=self.shared_experts,
675
gate=self.gate,
676
num_experts=config.n_routed_experts,
@@ -736,7 +736,7 @@ class DeepseekV4MoE(nn.Module):
736
) -> torch.Tensor:
737
org_shape = hidden_states.shape
738
if self.experts.is_internal_router:
739
- # In this case, the gate/router runs inside the FusedMoE class
739
+ # In this case, the gate/router runs inside the MoERunner class
740
final_hidden_states = self.experts(
741
hidden_states=hidden_states,
742
router_logits=hidden_states,
vllm/models/deepseek_v4/nvidia/mtp.py
+1
-1
@@ -59,7 +59,7 @@ from .model import (
59
logger = init_logger(__name__)
60
61
# MoE expert scales are fused into per-layer w13/w2 tensors. The exact
62
-# parameter suffix depends on which FusedMoE method handles the experts:
62
+# parameter suffix depends on which FusedMoEFactory method handles the experts:
63
# - fp4 experts (Mxfp4MoEMethod) register ``w{1,2,3}_weight_scale``;
64
# - fp8 experts (Fp8MoEMethod with block_quant=True) register
65
# ``w{1,2,3}_weight_scale_inv``.
vllm/models/deepseek_v4/xpu/model.py
+2
-2
@@ -18,7 +18,7 @@ from vllm.distributed import (
18
from vllm.forward_context import get_forward_context
19
from vllm.model_executor.layers.activation import SiluAndMul, SiluAndMulWithClamp
20
from vllm.model_executor.layers.fused_moe import (
21
- FusedMoE,
21
+ FusedMoEFactory,
22
GateLinear,
23
fused_moe_make_expert_params_mapping,
24
)
@@ -729,7 +729,7 @@ class DeepseekV4MoE(nn.Module):
729
self.n_local_experts = config.n_routed_experts // self.tp_size
730
self.experts_start_idx = self.tp_rank * self.n_local_experts
731
self.experts_end_idx = self.experts_start_idx + self.n_local_experts
732
- self.experts = FusedMoE(
732
+ self.experts = FusedMoEFactory(
733
shared_experts=self.shared_experts,
734
gate=self.gate,
735
num_experts=config.n_routed_experts,
vllm/models/deepseek_v4/xpu/mtp.py
+1
-1
@@ -54,7 +54,7 @@ from .model import (
54
logger = init_logger(__name__)
55
56
# MoE expert scales are fused into per-layer w13/w2 tensors. The exact
57
-# parameter suffix depends on which FusedMoE method handles the experts:
57
+# parameter suffix depends on which FusedMoEFactory method handles the experts:
58
# - fp4 experts (Mxfp4MoEMethod) register ``w{1,2,3}_weight_scale``;
59
# - fp8 experts (Fp8MoEMethod with block_quant=True) register
60
# ``w{1,2,3}_weight_scale_inv``.
vllm/models/inkling/amd/model.py
+1
-1
@@ -646,7 +646,7 @@ def _load_inkling_weights(
646
weight.shard_id = shard_id
647
648
# MoE expert tensors (fused stacked, routed + shared sink): translate
649
- # the checkpoint layout to per-expert FusedMoE loads.
649
+ # the checkpoint layout to per-expert MoERunner loads.
650
moe_match = _MOE_EXPERT_WEIGHT_RE.match(name)
651
if moe_match is not None and moe_match.group("mlp") in moe_modules:
652
moe = moe_modules[moe_match.group("mlp")]
vllm/models/inkling/amd/moe.py
+8
-8
@@ -1,11 +1,11 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
-"""Inkling mixture-of-experts on vLLM's FusedMoE abstraction.
3
+"""Inkling mixture-of-experts on vLLM's MoERunner abstraction.
4
5
Overfit to the served checkpoint: sigmoid gate (+ selection bias) top-k over
6
the routed experts, log-sigmoid renormalization over the k routed + S shared
7
"sink" logits, scaled by route_scale * global_scale. The routed top-k goes
8
-through vLLM's FusedMoE (which handles TP/EP); the sink experts run in
8
+through vLLM's MoERunner (which handles TP/EP); the sink experts run in
9
:class:`InklingSinkExperts` -- replicated across EP ranks (every token
10
activates every sink) and always bf16 (the checkpoint excludes every
11
``shared_experts`` from quantization).
@@ -35,7 +35,7 @@ from vllm.distributed import (
35
get_tensor_model_parallel_world_size,
36
)
37
from vllm.model_executor.kernels.linear.cute_dsl import ll_bf16
38
-from vllm.model_executor.layers.fused_moe import FusedMoE
38
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
39
from vllm.model_executor.layers.quantization import QuantizationConfig
40
from vllm.model_executor.utils import set_weight_attrs
41
from vllm.platforms import current_platform
@@ -265,7 +265,7 @@ class InklingGate(nn.Module):
265
266
267
def _inkling_moe_ep_size() -> int:
268
- """EP size the FusedMoE layer will run with (mirrors
268
+ """EP size the MoERunner layer will run with (mirrors
269
FusedMoEParallelConfig.make: experts shard over tp * dp * pcp when
270
expert parallelism is enabled)."""
271
parallel_config = get_current_vllm_config().parallel_config
@@ -444,7 +444,7 @@ class InklingMoE(nn.Module):
444
445
# The released MXFP4 checkpoint keeps the first routed-expert layer
446
# in bf16 and lists its two expert weights explicitly in Quark's
447
- # exclusion list. FusedMoE asks for a quant method at the module
447
+ # exclusion list. FusedMoEFactory asks for a quant method at the module
448
# prefix, so an exact weight exclusion would otherwise be missed and
449
# the bf16 tensors would be loaded into MXFP4 parameters.
450
routed_quant_config = quant_config
@@ -458,7 +458,7 @@ class InklingMoE(nn.Module):
458
if routed_weights <= excluded:
459
routed_quant_config = None
460
461
- self.experts = FusedMoE(
461
+ self.experts = FusedMoEFactory(
462
num_experts=num_experts,
463
top_k=config.num_experts_per_tok,
464
hidden_size=config.hidden_size,
@@ -503,7 +503,7 @@ class InklingMoE(nn.Module):
503
topk: int,
504
renormalize: bool,
505
) -> tuple[torch.Tensor, torch.Tensor]:
506
- """FusedMoE ``custom_routing_function``: the routed top-k slice of the
506
+ """MoERunner ``custom_routing_function``: the routed top-k slice of the
507
full (routed + sink) selection.
508
509
forward() stashes its selection (keyed by logits identity) so the
@@ -523,7 +523,7 @@ class InklingMoE(nn.Module):
523
router_logits = self.gate.compute_logits(x)
524
num_tokens = x.shape[0]
525
# One gate select per layer: the routed slice is stashed for the
526
- # routing function inside the FusedMoE op; the sink gammas are the
526
+ # routing function inside the MoERunner op; the sink gammas are the
527
# trailing columns.
528
k = self.gate.topk
529
weights, ids = self.gate.select_experts(router_logits)
vllm/models/inkling/nvidia/moe.py
+2
-2
@@ -34,7 +34,7 @@ from vllm.distributed import (
34
get_tensor_model_parallel_world_size,
35
)
36
from vllm.model_executor.kernels.linear.cute_dsl import ll_bf16
37
-from vllm.model_executor.layers.fused_moe import FusedMoE
37
+from vllm.model_executor.layers.fused_moe import FusedMoEFactory
38
from vllm.model_executor.utils import set_weight_attrs
39
from vllm.platforms import current_platform
40
from vllm.triton_utils import tl, tldevice, triton
@@ -439,7 +439,7 @@ class InklingMoE(nn.Module):
439
# power-of-two EP sizes (n_routed is a power of two).
440
num_experts = n_routed + (-n_routed) % _inkling_moe_ep_size()
441
442
- self.experts = FusedMoE(
442
+ self.experts = FusedMoEFactory(
443
num_experts=num_experts,
444
top_k=config.num_experts_per_tok,
445
hidden_size=config.hidden_size,
vllm/models/kimi_k3/amd/linear.py
+2
-2
@@ -15,7 +15,7 @@ from vllm.distributed import (
15
from vllm.logger import init_logger
16
from vllm.model_executor.layers.activation import SiluAndMul, SituAndMul
17
from vllm.model_executor.layers.fused_moe import (
18
- FusedMoE,
18
+ FusedMoEFactory,
19
fused_moe_make_expert_params_mapping,
20
)
21
from vllm.model_executor.layers.fused_moe.router.gate_linear import GateLinear
@@ -260,7 +260,7 @@ class KimiMoE(nn.Module):
260
self.routed_expert_up_proj = None
261
self.routed_output_transform = None
262
263
- self.experts = FusedMoE(
263
+ self.experts = FusedMoEFactory(
264
shared_experts=self.shared_experts,
265
num_experts=num_experts,
266
top_k=num_experts_per_token,
vllm/models/kimi_k3/nvidia/model.py
+4
-4
@@ -20,7 +20,7 @@ from vllm.forward_context import get_forward_context, is_forward_context_availab
20
from vllm.logger import init_logger
21
from vllm.model_executor.layers.activation import SiluAndMul, SituAndMul
22
from vllm.model_executor.layers.fused_moe import (
23
- FusedMoE,
23
+ FusedMoEFactory,
24
fused_moe_make_expert_params_mapping,
25
)
26
from vllm.model_executor.layers.fused_moe.router.base_router import (
@@ -560,7 +560,7 @@ class KimiMoE(nn.Module):
560
current_platform.is_cuda()
561
and current_platform.is_device_capability_family(100)
562
)
563
- self.experts = FusedMoE(
563
+ self.experts = FusedMoEFactory(
564
shared_experts=self.shared_experts,
565
num_experts=num_experts,
566
top_k=num_experts_per_token,
@@ -578,7 +578,7 @@ class KimiMoE(nn.Module):
578
scoring_func=config.moe_router_activation_func,
579
e_score_correction_bias=self.gate.e_score_correction_bias,
580
routed_scaling_factor=self.routed_scaling_factor,
581
- # Down projection runs outside FusedMoE so it can overlap the
581
+ # Down projection runs outside MoERunner so it can overlap the
582
# router gate on the aux stream (see forward()); the original
583
# hidden states are passed to forward() as shared_experts_input
584
# so shared experts still see the untransformed input.
@@ -689,7 +689,7 @@ class KimiMoE(nn.Module):
689
)
690
else:
691
# Routed experts consume the down-projected latent; shared experts
692
- # (inside FusedMoE) get the original hidden states via
692
+ # (inside MoERunner) get the original hidden states via
693
# shared_experts_input.
694
final_hidden_states = self.experts(
695
hidden_states=routed_hidden_states,
vllm/models/minimax_m3/amd/model.py
+2
-2
@@ -41,7 +41,7 @@ from vllm.model_executor.layers.fused_allreduce_gemma_rms_norm import (
41
fused_allreduce_gemma_rms_norm,
42
)
43
from vllm.model_executor.layers.fused_moe import (
44
- FusedMoE,
44
+ FusedMoEFactory,
45
GateLinear,
46
fused_moe_make_expert_params_mapping,
47
)
@@ -391,7 +391,7 @@ class MiniMaxM3MoE(nn.Module):
391
# always-on shared expert; aiter applies the routed scaling internally.
392
# Every other path (vLLM top-k bias router, or no fusion) applies the
393
# routed scaling to the MoE output here.
394
- self.experts = FusedMoE(
394
+ self.experts = FusedMoEFactory(
395
num_experts=config.num_local_experts,
396
top_k=config.num_experts_per_tok,
397
hidden_size=config.hidden_size,
vllm/models/minimax_m3/nvidia/model.py
+2
-2
@@ -31,7 +31,7 @@ from vllm.model_executor.layers.fused_allreduce_gemma_rms_norm import (
31
fused_allreduce_gemma_rms_norm,
32
)
33
from vllm.model_executor.layers.fused_moe import (
34
- FusedMoE,
34
+ FusedMoEFactory,
35
GateLinear,
36
fused_moe_make_expert_params_mapping,
37
)
@@ -244,7 +244,7 @@ class MiniMaxM3MoE(nn.Module):
244
prefix=f"{prefix}.shared_experts",
245
)
246
247
- self.experts = FusedMoE(
247
+ self.experts = FusedMoEFactory(
248
num_experts=config.num_local_experts,
249
top_k=config.num_experts_per_tok,
250
hidden_size=config.hidden_size,