Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/vllm-main-verified.commit
Original file line number Diff line number Diff line change
@@ -1 +1 @@
967c5c3bc38891f4465d3f4e99917ed837bb3833
dc68bd8c4199b00631fe71eb37313f406cc66ac1
127 changes: 101 additions & 26 deletions vllm_ascend/_310p/fused_moe/fused_moe.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@
import torch
from vllm.distributed import get_dp_group, get_ep_group, get_tp_group
from vllm.model_executor.layers.fused_moe.config import FusedMoEConfig
from vllm.model_executor.layers.fused_moe.layer import FusedMoE, UnquantizedFusedMoEMethod
from vllm.model_executor.layers.fused_moe.routed_experts import RoutedExperts
from vllm.model_executor.layers.fused_moe.unquantized_fused_moe_method import (
UnquantizedFusedMoEMethod,
)

from vllm_ascend.ascend_forward_context import _EXTRA_CTX, MoECommType
from vllm_ascend.ops.fused_moe.experts_selector import zero_experts_compute
Expand Down Expand Up @@ -126,35 +129,72 @@ def apply(
return final_hidden_states


class AscendFusedMoE310(FusedMoE):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self._routed_input_transform = kwargs.get("routed_input_transform")
self._shared_experts = kwargs.get("shared_experts")
self.global_num_experts = kwargs["num_experts"]
class AscendFusedMoE310(RoutedExperts):
def __init__(
self,
layer_name: str,
params_dtype: torch.dtype,
moe_config: FusedMoEConfig,
quant_config,
expert_map_manager,
expert_mapping=None,
renormalize=True,
use_grouped_topk=False,
num_expert_group=None,
topk_group=None,
custom_routing_function=None,
scoring_func="softmax",
routed_scaling_factor=1.0,
swiglu_limit=None,
e_score_correction_bias=None,
apply_router_weight_on_input=False,
# Extra Ascend-specific kwargs
gate=None,
shared_experts=None,
shared_expert_gate=None,
routed_input_transform=None,
routed_output_transform=None,
**kwargs,
):
super().__init__(
layer_name=layer_name,
params_dtype=params_dtype,
moe_config=moe_config,
quant_config=quant_config,
expert_map_manager=expert_map_manager,
expert_mapping=expert_mapping,
renormalize=renormalize,
use_grouped_topk=use_grouped_topk,
num_expert_group=num_expert_group,
topk_group=topk_group,
custom_routing_function=custom_routing_function,
scoring_func=scoring_func,
routed_scaling_factor=routed_scaling_factor,
swiglu_limit=swiglu_limit,
e_score_correction_bias=e_score_correction_bias,
apply_router_weight_on_input=apply_router_weight_on_input,
)

if self.quant_config is None:
self.quant_method = AscendUnquantizedFusedMoEMethod310(self.moe_config)
else:
self.quant_method = self.quant_config.get_quant_method(self, self.layer_name)
self._routed_input_transform = routed_input_transform
self._shared_experts = shared_experts
self.global_num_experts = self.moe_config.num_experts

# Replace quant_method with Ascend 310P version
assert self.quant_method is not None
# Keep base_quant_method aligned with the Ascend-replaced quant_method
# so FusedMoE.maybe_init_modular_kernel doesn't dispatch into the
# upstream UnquantizedFusedMoEMethod.maybe_make_prepare_finalize.
self.base_quant_method = self.quant_method
Comment on lines +182 to 184

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

self.vllm_config is not initialized in AscendFusedMoE310.init (unlike AscendFusedMoE which retrieves it via get_current_vllm_config()). Since RoutedExperts.init does not set self.vllm_config, any downstream access to self.vllm_config on 310P will raise an AttributeError.\n\nWe should initialize self.vllm_config using get_current_vllm_config().

Suggested change
# Replace quant_method with Ascend 310P version
assert self.quant_method is not None
# Keep base_quant_method aligned with the Ascend-replaced quant_method
# so FusedMoE.maybe_init_modular_kernel doesn't dispatch into the
# upstream UnquantizedFusedMoEMethod.maybe_make_prepare_finalize.
self.base_quant_method = self.quant_method
# Replace quant_method with Ascend 310P version\n assert self.quant_method is not None\n self.base_quant_method = self.quant_method\n\n from vllm.config import get_current_vllm_config\n self.vllm_config = get_current_vllm_config()


self.moe_config.tp_group = get_tp_group()
self.moe_config.dp_group = get_dp_group()
self.moe_config.ep_group = get_ep_group()
self.moe_config.supports_eplb = False

# init moe
self.global_expert_map = None
self.local_expert_map = None
if self.moe_config.ep_size > 1:
raise RuntimeError("Expert Parallel is not supported on 310P. Please remove --enable-expert-parallel.")
raise RuntimeError(
"Expert Parallel is not supported on 310P. "
"Please remove --enable-expert-parallel."
)
self.local_num_experts = self.global_num_experts

self.moe_config.num_experts = self.global_num_experts
Expand All @@ -176,22 +216,57 @@ def __init__(self, *args, **kwargs):

from vllm_ascend.ops.fused_moe.fused_moe import AscendMoERunner

self.runner = AscendMoERunner(
self.layer_name,
self.moe_config,
self.router,
self._routed_input_transform,
kwargs.pop("gate", None),
kwargs.pop("shared_experts", None),
self.quant_method,
self.vllm_config.parallel_config.enable_dbo,
# Store runner reference for factory to optionally use
self._runner = AscendMoERunner(
layer_name=self.layer_name,
moe_config=self.moe_config,
router=None, # router is set by factory
routed_experts=self,
enable_dbo=False,
gate=gate,
shared_experts=shared_experts,
routed_input_transform=routed_input_transform,
)

@property
def is_internal_router(self) -> bool:
# 310P Ascend path expects router logits from the model forward path.
return False
Comment on lines 231 to 234

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Unlike AscendFusedMoE, AscendFusedMoE310 is missing the forward method override. Legacy callers that still call forward() directly on the routed experts layer instead of the runner on 310P will bypass the custom _runner / forward_impl path or fail.\n\nWe should add the forward method override to AscendFusedMoE310 to match AscendFusedMoE.

    @property\n    def is_internal_router(self) -> bool:\n        # 310P Ascend path expects router logits from the model forward path.\n        return False\n\n    def forward(\n        self,\n        hidden_states: torch.Tensor,\n        router_logits: torch.Tensor,\n    ) -> torch.Tensor | tuple[torch.Tensor, torch.Tensor]:\n        if hasattr(self, \"_runner\"):\n            return self._runner.forward(hidden_states, router_logits)\n        self._ensure_moe_quant_config_init()\n        return self.forward_impl(hidden_states, router_logits)


def _get_quant_method(
self,
prefix: str,
quant_config,
moe_config: FusedMoEConfig,
):
if quant_config is None:
return AscendUnquantizedFusedMoEMethod310(moe_config)
else:
return quant_config.get_quant_method(self, prefix)

@property
def tp_size(self):
return self.moe_config.tp_size

@property
def ep_size(self):
return self.moe_config.moe_parallel_config.ep_size

@property
def tp_rank(self):
return self.moe_config.tp_rank

@property
def ep_rank(self):
return self.moe_config.moe_parallel_config.ep_rank

@property
def use_ep(self) -> bool:
return self.moe_config.moe_parallel_config.use_ep

def ensure_moe_quant_config_init(self):
return self._ensure_moe_quant_config_init()

def init_experts_map(self, moe_config):
"""
Initialize expert mapping for MoE (Mixture of Experts) model.
Expand Down
4 changes: 2 additions & 2 deletions vllm_ascend/_310p/quantization/modelslim_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import torch
from vllm.config import get_current_vllm_config
from vllm.logger import logger
from vllm.model_executor.layers.fused_moe import FusedMoE
from vllm.model_executor.layers.fused_moe import RoutedExperts
from vllm.model_executor.layers.linear import LinearBase
from vllm.model_executor.layers.quantization import register_quantization_config
from vllm.model_executor.layers.quantization.base_config import QuantizeMethodBase
Expand Down Expand Up @@ -118,7 +118,7 @@ def get_quant_method(
logger.debug("Select AscendLinearMethod for %s (layer=%s)", prefix, "LinearBase")
return AscendLinearMethod(scheme)

elif isinstance(layer, FusedMoE):
elif isinstance(layer, RoutedExperts):
if self.is_layer_skipped_ascend(prefix, self.packed_modules_mapping):
from vllm_ascend._310p.fused_moe.fused_moe import AscendUnquantizedFusedMoEMethod310

Expand Down
6 changes: 3 additions & 3 deletions vllm_ascend/models/deepseek_v4.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
tensor_model_parallel_all_gather,
)
from vllm.model_executor.layers.activation import SiluAndMul
from vllm.model_executor.layers.fused_moe import FusedMoE
from vllm.model_executor.layers.fused_moe import FusedMoE, RoutedExperts
from vllm.model_executor.layers.layernorm import RMSNorm
from vllm.model_executor.layers.linear import (
ColumnParallelLinear,
Expand Down Expand Up @@ -1272,7 +1272,7 @@ def compute_logits(
def get_expert_mapping(self) -> list[tuple[str, str, int, str]]:
# Params for weights, fp8 weight scales, fp8 activation scales
# (param_name, weight_name, expert_id, shard_id)
return FusedMoE.make_expert_params_mapping(
return RoutedExperts.make_expert_params_mapping(
self.model,
ckpt_gate_proj_name="gate_proj",
ckpt_down_proj_name="down_proj",
Expand All @@ -1298,7 +1298,7 @@ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:

# Params for weights, fp8 weight scales, fp8 activation scales
# (param_name, weight_name, expert_id, shard_id)
expert_params_mapping = FusedMoE.make_expert_params_mapping(
expert_params_mapping = RoutedExperts.make_expert_params_mapping(
self.model,
ckpt_gate_proj_name="gate_proj",
ckpt_down_proj_name="down_proj",
Expand Down
4 changes: 2 additions & 2 deletions vllm_ascend/models/deepseek_v4_mtp.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from vllm.compilation.decorators import support_torch_compile
from vllm.config import VllmConfig
from vllm.distributed import get_tensor_model_parallel_rank, get_tensor_model_parallel_world_size
from vllm.model_executor.layers.fused_moe import FusedMoE
from vllm.model_executor.layers.fused_moe import FusedMoE, RoutedExperts
from vllm.model_executor.layers.layernorm import RMSNorm
from vllm.model_executor.layers.linear import ReplicatedLinear
from vllm.model_executor.layers.logits_processor import LogitsProcessor
Expand Down Expand Up @@ -257,7 +257,7 @@ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
("gate_up_proj", "up_proj", 1),
]

expert_params_mapping = FusedMoE.make_expert_params_mapping(
expert_params_mapping = RoutedExperts.make_expert_params_mapping(
model=self.model,
ckpt_gate_proj_name="gate_proj",
ckpt_down_proj_name="down_proj",
Expand Down
Loading
Loading