mirror of
https://github.com/deepseek-ai/DeepEP
synced 2025-06-26 18:28:11 +00:00
@@ -176,6 +176,16 @@ class Buffer:
|
||||
assert tensor.numel() >= size.numel()
|
||||
return tensor[:size.numel()].view(size)
|
||||
|
||||
@staticmethod
|
||||
def _unpack_bias(bias: Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]]):
|
||||
bias_0, bias_1 = None, None
|
||||
if isinstance(bias, torch.Tensor):
|
||||
bias_0 = bias
|
||||
elif isinstance(bias, tuple):
|
||||
assert len(bias) == 2
|
||||
bias_0, bias_1 = bias
|
||||
return bias_0, bias_1
|
||||
|
||||
@staticmethod
|
||||
def get_dispatch_config(num_ranks: int) -> Config:
|
||||
"""
|
||||
@@ -346,6 +356,7 @@ class Buffer:
|
||||
# noinspection PyTypeChecker
|
||||
def combine(self, x: torch.Tensor, handle: Tuple,
|
||||
topk_weights: Optional[torch.Tensor] = None,
|
||||
bias: Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]] = None,
|
||||
config: Optional[Config] = None,
|
||||
previous_event: Optional[EventOverlap] = None, async_finish: bool = False,
|
||||
allocate_on_comm_stream: bool = False) -> \
|
||||
@@ -376,14 +387,15 @@ class Buffer:
|
||||
|
||||
# Internode
|
||||
if self.runtime.get_num_rdma_ranks() > 1:
|
||||
return self.internode_combine(x, handle, topk_weights, config, previous_event, async_finish, allocate_on_comm_stream)
|
||||
return self.internode_combine(x, handle, topk_weights, bias, config, previous_event, async_finish, allocate_on_comm_stream)
|
||||
|
||||
# NOTES: the second `_` is for the sending side, so we should use the third one
|
||||
rank_prefix_matrix, _, channel_prefix_matrix, src_idx, is_recv_token_in_rank, send_head = handle
|
||||
bias_0, bias_1 = Buffer._unpack_bias(bias)
|
||||
|
||||
# Launch the kernel
|
||||
recv_x, recv_topk_weights, event = self.runtime.intranode_combine(
|
||||
x, topk_weights,
|
||||
x, topk_weights, bias_0, bias_1,
|
||||
src_idx, rank_prefix_matrix, channel_prefix_matrix, send_head, config,
|
||||
getattr(previous_event, 'event', None), async_finish, allocate_on_comm_stream)
|
||||
return recv_x, recv_topk_weights, EventOverlap(event)
|
||||
@@ -442,6 +454,7 @@ class Buffer:
|
||||
# noinspection PyTypeChecker
|
||||
def internode_combine(self, x: torch.Tensor, handle: Union[tuple, list],
|
||||
topk_weights: Optional[torch.Tensor] = None,
|
||||
bias: Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor]] = None,
|
||||
config: Optional[Config] = None,
|
||||
previous_event: Optional[EventOverlap] = None, async_finish: bool = False,
|
||||
allocate_on_comm_stream: bool = False) -> \
|
||||
@@ -452,15 +465,16 @@ class Buffer:
|
||||
"""
|
||||
assert config is not None
|
||||
|
||||
# Unpack handle
|
||||
# Unpack handle and bias
|
||||
is_combined_token_in_rank, \
|
||||
_, _, \
|
||||
rdma_channel_prefix_matrix, rdma_rank_prefix_sum, gbl_channel_prefix_matrix, gbl_rank_prefix_sum, \
|
||||
src_meta, send_rdma_head, send_nvl_head = handle
|
||||
bias_0, bias_1 = Buffer._unpack_bias(bias)
|
||||
|
||||
# Launch the kernel
|
||||
combined_x, combined_topk_weights, event = self.runtime.internode_combine(
|
||||
x, topk_weights,
|
||||
x, topk_weights, bias_0, bias_1,
|
||||
src_meta, is_combined_token_in_rank,
|
||||
rdma_channel_prefix_matrix, rdma_rank_prefix_sum, gbl_channel_prefix_matrix,
|
||||
send_rdma_head, send_nvl_head, config, getattr(previous_event, 'event', None),
|
||||
|
||||
Reference in New Issue
Block a user