| import torch | |
| import torch.distributed as dist | |
| from torch.distributed import ProcessGroup | |
| from sglang.srt.utils import is_npu | |
| class NpuCommunicator: | |
| def __init__(self, group: ProcessGroup): | |
| if not is_npu(): | |
| self.disabled = True | |
| return | |
| self.disabled = False | |
| self.group = group | |
| self.world_size = dist.get_world_size(self.group) | |
| def all_reduce(self, x: torch.Tensor) -> torch.Tensor: | |
| dist.all_reduce(x, group=self.group) | |
| return x | |
| def all_gather(self, x: torch.Tensor, dim: int = -1) -> torch.Tensor: | |
| world_size = self.world_size | |
| if dim < 0: | |
| # Convert negative dim to positive. | |
| dim += x.dim() | |
| input_size = x.size() | |
| output_size = (input_size[0] * world_size,) + input_size[1:] | |
| # Allocate output tensor. | |
| output_tensor = torch.empty(output_size, dtype=x.dtype, device=x.device) | |
| # All-gather. | |
| dist.all_gather_into_tensor(output_tensor, x, group=self.group) | |
| # Reshape | |
| output_tensor = output_tensor.reshape((world_size,) + input_size) | |
| output_tensor = output_tensor.movedim(0, dim) | |
| output_tensor = output_tensor.reshape( | |
| input_size[:dim] + (world_size * input_size[dim],) + input_size[dim + 1 :] | |
| ) | |
| return output_tensor | |
Xet Storage Details
- Size:
- 1.35 kB
- Xet hash:
- 2039b2d1cf78214fa646b0a1c79975e4d7a75721a90e471a51352c6bc6f3bbc3
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.