spikingjelly.activation_based.distributed.data_parallel 源代码
from __future__ import annotations
from typing import Optional, Sequence
import torch.nn as nn
from torch.nn.parallel import DistributedDataParallel
try:
from torch.distributed._tensor import DTensor
except ImportError:
DTensor = None
def prepare_snn_data_parallel(
module: nn.Module,
process_group=None,
device_ids: Optional[Sequence[int]] = None,
broadcast_buffers: bool = False,
find_unused_parameters: bool = False,
static_graph: bool = False,
) -> DistributedDataParallel:
return DistributedDataParallel(
module,
device_ids=list(device_ids) if device_ids is not None else None,
process_group=process_group,
broadcast_buffers=broadcast_buffers,
find_unused_parameters=find_unused_parameters,
static_graph=static_graph,
)
[文档]
def unwrap_parallel_module(module: nn.Module) -> nn.Module:
if isinstance(module, DistributedDataParallel):
return module.module
return module
def materialize_dtensor_output(output):
if DTensor is not None and isinstance(output, DTensor):
return output.full_tensor()
full_tensor = getattr(output, "full_tensor", None)
if callable(full_tensor):
return full_tensor()
if isinstance(output, tuple):
if hasattr(output, "_fields"):
return output.__class__(
*(materialize_dtensor_output(item) for item in output)
)
return tuple(materialize_dtensor_output(item) for item in output)
if isinstance(output, list):
return [materialize_dtensor_output(item) for item in output]
if isinstance(output, dict):
return {key: materialize_dtensor_output(value) for key, value in output.items()}
return output