def _all_reduce_offloaded(
tensor: torch.Tensor, op: dist.ReduceOp, group: object,
) -> torch.Tensor:
"""Reduce CPU-offloaded values on the backend's communication device."""
original_device = tensor.device
if original_device.type == "cpu":
device_type = {"nccl": "cuda", "hccl": "npu"}.get(dist.get_backend(group))
if device_type is not None:
device_module = torch.get_device_module(device_type)
tensor = tensor.to(torch.device(device_type, device_module.current_device()))
dist.all_reduce(tensor, op=op, group=group)
return tensor.to(original_device)
def _get_grad_obj(param: torch.nn.Parameter) -> Optional[torch.Tensor]:
"""Return the gradient object for *param*.