[AMD][TBO] Fix mori ep dual stream accuracy (#19888)

This commit is contained in:
billishyahao
2026-03-18 17:00:55 +08:00
committed by GitHub
parent 8b46f1f4ec
commit f0d7a3f427
2 changed files with 59 additions and 22 deletions

View File

@@ -1035,7 +1035,8 @@ class MaybeTboDeepEPDispatcher(BaseDispatcher):
]
elif get_moe_a2a_backend().is_mori():
self._inners = [
MoriEPDispatcher(**kwargs) for _ in range(num_inner_dispatchers)
MoriEPDispatcher(instance_id=i, **kwargs)
for i in range(num_inner_dispatchers)
]
elif get_moe_a2a_backend().is_nixl():
self._inners = [

View File

@@ -195,6 +195,7 @@ def init_mori_op(
params_dtype,
num_max_dispatch_tokens_per_rank,
deepep_mode,
instance_id=0,
):
import mori
@@ -204,9 +205,23 @@ def init_mori_op(
gpu_per_node = 8 if world_size >= 8 else world_size
group_name = f"mori"
cpu_group = group.cpu_group
torch._C._distributed_c10d._register_process_group("mori", cpu_group)
mori.shmem.shmem_torch_process_group_init("mori")
try:
torch._C._distributed_c10d._register_process_group(group_name, cpu_group)
except Exception as e:
if "already registered" in str(e):
logger.info(
f"[MORI init] The same process group is already "
f"registered. Ignoring [{str(e)}]"
)
else:
raise
else:
# If new group is newly registered then need to init mori shmem. However
# if the group is registered already then need to skip init mori shmem
# and reuse the previous one.
mori.shmem.shmem_torch_process_group_init(group_name)
mode = EpMode.INTRA_NODE if world_size <= 8 else EpMode.INTER_NODE
async_mode = deepep_mode.enable_low_latency()
@@ -214,7 +229,9 @@ def init_mori_op(
mode = EpMode.LOW_LATENCY
logger.info(
f"[MORI init] {world_size=} {rank=} {hidden_size=} {params_dtype=} {num_max_dispatch_tokens_per_rank=} {num_local_experts=} {router_topk=} {mode=}"
f"[MORI init] {world_size=} {rank=} {hidden_size=} {params_dtype=} "
f"{num_max_dispatch_tokens_per_rank=} {num_local_experts=} "
f"{router_topk=} {mode=}"
)
cfg = get_ep_dispatch_configs(num_max_dispatch_tokens_per_rank)[mode]
@@ -234,7 +251,10 @@ def init_mori_op(
if fp8_dispatch:
scale_dim = hidden_size // 128
elif fp4_dispatch:
# FP4 kernel still takes the original hidden size and do quantization internally, so hidden_dim is not reduced. The reason is that for FP4 quantization, we need to keep the original hidden size to calculate the quantization scale correctly. don't use packed hidden size for FP4 kernel.
# FP4 kernel still takes the original hidden size and do quantization
# internally, so hidden_dim is not reduced. The reason is that for FP4
# quantization, we need to keep the original hidden size to calculate
# the quantization scale correctly. Don't use packed hidden size for FP4 kernel.
hidden_dim = hidden_size
scale_dim = hidden_size // 32
data_type = torch.float4_e2m1fn_x2
@@ -308,6 +328,7 @@ class _MoriEPDispatcherImplBase:
hidden_size: int,
params_dtype: torch.dtype,
deepep_mode: DeepEPMode,
instance_id: int = 0,
):
try:
import mori # noqa: F401
@@ -321,6 +342,7 @@ class _MoriEPDispatcherImplBase:
self.hidden_size = hidden_size
self.params_dtype = params_dtype
self.deepep_mode = deepep_mode
self.instance_id = instance_id
self.num_max_dispatch_tokens_per_rank = get_int_env_var(
"SGLANG_MORI_NUM_MAX_DISPATCH_TOKENS_PER_RANK", 4096
@@ -335,6 +357,7 @@ class _MoriEPDispatcherImplBase:
self.params_dtype,
self.num_max_dispatch_tokens_per_rank,
self.deepep_mode,
self.instance_id,
)
self.quant_config: Optional[dict] = None
@@ -383,7 +406,6 @@ class _MoriEPDispatcherImplNormal(_MoriEPDispatcherImplBase):
self.async_finish = async_finish
self.quant_config = {}
# [kk TODO] need to support mxfp4 type
self.fp8_quant_func = get_hip_quant(QuantType.per_1x128)
self.fp4_quant_func = get_hip_quant(QuantType.per_1x32)
self.enable_dual_stream = is_tbo_enabled()
@@ -406,18 +428,7 @@ class _MoriEPDispatcherImplNormal(_MoriEPDispatcherImplBase):
):
topk_weights, topk_ids = topk_output.topk_weights, topk_output.topk_ids
previous_event = self._capture_event_if_async() if self._comm_stream else None
return (hidden_states, topk_weights, topk_ids, previous_event)
def dispatch_b(
self,
hidden_states,
topk_weights,
topk_ids,
previous_event,
):
num_tokens = hidden_states.shape[0]
num_token = hidden_states.shape[0]
output_dtype = hidden_states.dtype
scale = None
@@ -425,8 +436,9 @@ class _MoriEPDispatcherImplNormal(_MoriEPDispatcherImplBase):
if fp8_dispatch:
# FP8 quant
if num_tokens > 0:
# NOTE: aiter is able to handle token=0 case in UT. But for some reason it failed at e2e case. Root cause TBD.
if num_token > 0:
# NOTE: aiter is able to handle token=0 case in UT. But for some
# reason it failed at e2e case. Root cause TBD.
hidden_states, scale = self.fp8_quant_func(
hidden_states, quant_dtype=fp8_dtype
)
@@ -442,7 +454,7 @@ class _MoriEPDispatcherImplNormal(_MoriEPDispatcherImplBase):
elif fp4_dispatch:
# FP4 quant
if num_tokens > 0:
if num_token > 0:
hidden_states, scale = self.fp4_quant_func(hidden_states, shuffle=False)
else:
hidden_states = torch.empty(
@@ -456,6 +468,27 @@ class _MoriEPDispatcherImplNormal(_MoriEPDispatcherImplBase):
device=hidden_states.device,
)
previous_event = self._capture_event_if_async() if self._comm_stream else None
return (
hidden_states,
topk_weights,
topk_ids,
scale,
output_dtype,
previous_event,
)
def dispatch_b(
self,
hidden_states,
topk_weights,
topk_ids,
scale,
output_dtype,
previous_event,
):
(
packed_recv_hidden,
recv_topk_weights,
@@ -650,7 +683,8 @@ class _MoriEPDispatcherImplLowLatency(_MoriEPDispatcherImplBase):
if fp8_dispatch:
# FP8 quant
if num_tokens > 0:
# NOTE: aiter is able to handle token=0 case in UT. But for some reason it failed at e2e case. Root cause TBD.
# NOTE: aiter is able to handle token=0 case in UT. But for some
# reason it failed at e2e case. Root cause TBD.
hidden_states, scale = self.fp8_quant_func(
hidden_states, quant_dtype=fp8_dtype
)
@@ -818,6 +852,7 @@ class MoriEPDispatcher(BaseDispatcher):
deepep_mode: DeepEPMode = DeepEPMode.AUTO,
async_finish: bool = False,
return_recv_hook: bool = False,
instance_id: int = 0,
):
super().__init__()
@@ -832,6 +867,7 @@ class MoriEPDispatcher(BaseDispatcher):
hidden_size=hidden_size,
params_dtype=params_dtype,
deepep_mode=deepep_mode,
instance_id=instance_id,
)
if self.deepep_mode.enable_low_latency():