[parallel] Support moe_dense_tp_size == attn_tp_size to share the attention TP group (#23996)
This commit is contained in:
@@ -943,6 +943,23 @@ class CommunicateWithAllReduceAndLayerNormFn:
|
|||||||
residual_input_mode=residual_input_mode,
|
residual_input_mode=residual_input_mode,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
(hidden_states_input_mode == ScatterMode.TP_ATTN_FULL)
|
||||||
|
and (
|
||||||
|
residual_input_mode in [ScatterMode.SCATTERED, ScatterMode.TP_ATTN_FULL]
|
||||||
|
)
|
||||||
|
and (hidden_states_output_mode == ScatterMode.TP_ATTN_FULL)
|
||||||
|
and (residual_output_mode == ScatterMode.TP_ATTN_FULL)
|
||||||
|
and context.attn_tp_size > 1
|
||||||
|
):
|
||||||
|
# Used when the dense MLP is tensor-parallelized along the
|
||||||
|
# attention TP group (``moe_dense_tp_size > 1``): hidden states
|
||||||
|
# need an all-reduce inside the attention TP group before the
|
||||||
|
# next layernorm, while staying in TP_ATTN_FULL on both sides.
|
||||||
|
return (
|
||||||
|
CommunicateWithAllReduceAndLayerNormFn._tp_attn_all_reduce_and_layernorm
|
||||||
|
)
|
||||||
|
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
f"{hidden_states_input_mode=} {residual_input_mode=} {hidden_states_output_mode=} {residual_output_mode=}"
|
f"{hidden_states_input_mode=} {residual_input_mode=} {hidden_states_output_mode=} {residual_output_mode=}"
|
||||||
)
|
)
|
||||||
@@ -960,6 +977,25 @@ class CommunicateWithAllReduceAndLayerNormFn:
|
|||||||
hidden_states, residual = layernorm(hidden_states, residual)
|
hidden_states, residual = layernorm(hidden_states, residual)
|
||||||
return hidden_states, residual
|
return hidden_states, residual
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _tp_attn_all_reduce_and_layernorm(
|
||||||
|
hidden_states: torch.Tensor,
|
||||||
|
residual: torch.Tensor,
|
||||||
|
forward_batch: ForwardBatch,
|
||||||
|
layernorm: torch.nn.Module,
|
||||||
|
context: CommunicateContext,
|
||||||
|
):
|
||||||
|
"""All-reduce hidden states inside the attention TP group, then layernorm.
|
||||||
|
|
||||||
|
Used when the dense MLP shares the attention TP group
|
||||||
|
(``moe_dense_tp_size > 1``): both hidden states and residual stay in
|
||||||
|
``TP_ATTN_FULL`` across the boundary.
|
||||||
|
"""
|
||||||
|
hidden_states = get_attention_tp_group().all_reduce(hidden_states)
|
||||||
|
if hidden_states.shape[0] != 0:
|
||||||
|
hidden_states, residual = layernorm(hidden_states, residual)
|
||||||
|
return hidden_states, residual
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _gather_hidden_states_and_residual(
|
def _gather_hidden_states_and_residual(
|
||||||
hidden_states: torch.Tensor,
|
hidden_states: torch.Tensor,
|
||||||
|
|||||||
@@ -7199,10 +7199,11 @@ class ServerArgs:
|
|||||||
assert self.base_gpu_id >= 0, "base_gpu_id must be non-negative"
|
assert self.base_gpu_id >= 0, "base_gpu_id must be non-negative"
|
||||||
assert self.gpu_id_step >= 1, "gpu_id_step must be positive"
|
assert self.gpu_id_step >= 1, "gpu_id_step must be positive"
|
||||||
|
|
||||||
assert self.moe_dense_tp_size in {
|
assert self.moe_dense_tp_size in (
|
||||||
1,
|
|
||||||
None,
|
None,
|
||||||
}, "moe_dense_tp_size only support 1 and None currently"
|
1,
|
||||||
|
self.tp_size,
|
||||||
|
), "moe_dense_tp_size only supports None, 1, or tp_size currently"
|
||||||
|
|
||||||
# Check served model name to not have colon as it is reserved for LoRA adapter syntax
|
# Check served model name to not have colon as it is reserved for LoRA adapter syntax
|
||||||
if not is_runai_obj_uri(self.served_model_name):
|
if not is_runai_obj_uri(self.served_model_name):
|
||||||
|
|||||||
@@ -3119,8 +3119,7 @@ def require_attn_tp_gather(server_args: ServerArgs):
|
|||||||
|
|
||||||
from sglang.srt.layers.moe.utils import get_moe_a2a_backend
|
from sglang.srt.layers.moe.utils import get_moe_a2a_backend
|
||||||
|
|
||||||
assert server_args.moe_dense_tp_size in [1, None]
|
if not get_moe_a2a_backend().is_none() or server_args.moe_dense_tp_size is not None:
|
||||||
if not get_moe_a2a_backend().is_none() or server_args.moe_dense_tp_size == 1:
|
|
||||||
if server_args.enable_dp_attention:
|
if server_args.enable_dp_attention:
|
||||||
return server_args.dp_size < server_args.tp_size
|
return server_args.dp_size < server_args.tp_size
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user