Skip to content

Commit 881a762

Browse files
committed
MoE intermediate_scale stack
1 parent 0d74108 commit 881a762

2 files changed

Lines changed: 38 additions & 10 deletions

File tree

fastdeploy/model_executor/layers/backends/intel_hpu/moe/fused_moe_hpu_backend.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,17 @@ def init_ep(self, layer: nn.Layer) -> None:
5959
"""
6060
return
6161

62-
def apply(
62+
def apply_tp(
6363
self,
6464
layer: nn.Layer,
6565
x: paddle.Tensor,
6666
gate: nn.Layer,
6767
topk_ids_hookfunc: Callable = None,
6868
) -> paddle.Tensor:
6969
"""
70-
Paddle compute Fused MoE.
70+
Apply the TP prefill method.
7171
"""
72-
# for all layer.ep_size and layer.tp_size
73-
return self.apply_tp(layer, x, gate, topk_ids_hookfunc=topk_ids_hookfunc)
72+
raise NotImplementedError
7473

7574
def apply_ep_prefill(
7675
self,
@@ -96,7 +95,7 @@ def apply_ep_decode(
9695
"""
9796
raise NotImplementedError
9897

99-
def apply_tp(
98+
def apply(
10099
self,
101100
layer: nn.Layer,
102101
x: paddle.Tensor,
@@ -209,17 +208,18 @@ def _extract_descale_tensor(key_template, logical_expert_ids):
209208
down_proj_weight = paddle.stack(down_proj_weights, axis=0)
210209
up_gate_proj_weight_scale = paddle.stack(up_gate_proj_weight_scale, axis=0)
211210
down_proj_weight_scale = paddle.stack(down_proj_weight_scale, axis=0)
211+
down_proj_in_scale = paddle.stack(down_proj_in_scale, axis=0)
212212

213213
name_tensor_map = {
214214
"up_gate_proj_weight": up_gate_proj_weight,
215215
"down_proj_weight": down_proj_weight,
216216
"up_gate_proj_weight_scale": up_gate_proj_weight_scale,
217217
"down_proj_weight_scale": down_proj_weight_scale,
218218
"up_gate_proj_in_scale": up_gate_proj_in_scale,
219+
"down_proj_in_scale": down_proj_in_scale,
219220
}
220221
for name, tensor in name_tensor_map.items():
221222
getattr(layer, name).set_value(tensor)
222-
setattr(layer, "down_proj_in_scale", down_proj_in_scale)
223223

224224
def create_weights(self, layer: nn.Layer, **extra_weight_attrs):
225225
"""
@@ -266,6 +266,15 @@ def create_weights(self, layer: nn.Layer, **extra_weight_attrs):
266266
default_initializer=paddle.nn.initializer.Constant(0),
267267
),
268268
)
269+
setattr(
270+
layer,
271+
"down_proj_in_scale",
272+
layer.create_parameter(
273+
shape=[layer.num_local_experts, 1],
274+
dtype=self.default_dtype,
275+
default_initializer=paddle.nn.initializer.Constant(0),
276+
),
277+
)
269278

270279
# weight_scales
271280
setattr(
@@ -321,17 +330,17 @@ def init_ep(self, layer: nn.Layer) -> None:
321330
"""
322331
return
323332

324-
def apply(
333+
def apply_tp(
325334
self,
326335
layer: nn.Layer,
327336
x: paddle.Tensor,
328337
gate: nn.Layer,
329338
topk_ids_hookfunc: Callable = None,
330339
) -> paddle.Tensor:
331340
"""
332-
Paddle compute Fused MoE.
341+
Apply the TP decoder method.
333342
"""
334-
return self.apply_tp(layer, x, gate, topk_ids_hookfunc=topk_ids_hookfunc)
343+
raise NotImplementedError
335344

336345
def apply_ep_prefill(
337346
self,
@@ -357,7 +366,7 @@ def apply_ep_decode(
357366
"""
358367
raise NotImplementedError
359368

360-
def apply_tp(
369+
def apply(
361370
self,
362371
layer: nn.Layer,
363372
x: paddle.Tensor,

fastdeploy/worker/hpu_model_runner.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,24 @@ def fused_mlp_forward(
326326
from fastdeploy.model_executor.models.qwen3 import Qwen3Attention
327327

328328

329+
def process_scales_alignment_after_loading(layer, alignment=0x80) -> None:
330+
aligned_attrs = ["down_proj_in_scale"]
331+
for attr in aligned_attrs:
332+
if hasattr(layer, attr):
333+
value = getattr(layer, attr)
334+
if value.dim() != 2 or value.shape[1] != 1:
335+
raise ValueError(f"{attr} must be [num_experts, 1], but got {value.shape}")
336+
337+
dtype_size = value.element_size()
338+
elements_per_slot = alignment // dtype_size
339+
# special 3D shape [..., 1, align_with_padding] as a mark for HPU alignment
340+
padded_tensor = paddle.zeros(shape=[value.shape[0], 1, elements_per_slot], dtype=value.dtype)
341+
padded_tensor[:, 0, 0] = value[:, 0]
342+
343+
delattr(layer, attr)
344+
setattr(layer, attr, padded_tensor)
345+
346+
329347
def convert_model(model, measurement_mode=False, init_done=False):
330348
""" """
331349
if measurement_mode:
@@ -354,6 +372,7 @@ def convert_model(model, measurement_mode=False, init_done=False):
354372
module.forward = types.MethodType(fused_attention_forward, module)
355373
if isinstance(module, FusedMoE):
356374
module.measurement_mode = measurement_mode
375+
process_scales_alignment_after_loading(module)
357376

358377
return model
359378

0 commit comments

Comments
 (0)