spikingjelly.activation_based.distributed.optimizer 源代码

from __future__ import annotations

from typing import Optional

import torch
import torch.distributed as dist
import torch.nn as nn

try:
    from torch.distributed.optim import ZeroRedundancyOptimizer

    ZERO_REDUNDANCY_OPTIMIZER_AVAILABLE = True
except ImportError:
    ZeroRedundancyOptimizer = None
    ZERO_REDUNDANCY_OPTIMIZER_AVAILABLE = False


[文档] def build_snn_optimizer( module: nn.Module, mode: str, lr: float, weight_decay: float = 0.0, optimizer_sharding: str = "none", foreach: Optional[bool] = None, optimizer_cls=torch.optim.Adam, **optimizer_kwargs, ): """Build an optimizer for an SNN distributed training mode. .. admonition:: Chinese 为 SNN 分布式训练构造优化器,并在纯数据并行模式下可选启用 ``ZeroRedundancyOptimizer``。 :param module: Model whose parameters are optimized. :type module: torch.nn.Module :param mode: Distributed mode, such as ``"dp"``. :type mode: str :param lr: Learning rate. :type lr: float :param weight_decay: Weight decay. :type weight_decay: float :param optimizer_sharding: ``"none"`` or ``"zero"``. :type optimizer_sharding: str :param foreach: Optional foreach flag passed to the optimizer. :type foreach: bool or None :param optimizer_cls: Optimizer class to instantiate. :return: Optimizer instance. """ if optimizer_sharding not in ("none", "zero"): raise ValueError( f"Unsupported optimizer_sharding='{optimizer_sharding}'. Expected 'none' or 'zero'." ) if foreach is not None: optimizer_kwargs["foreach"] = foreach if optimizer_sharding == "zero": if mode != "dp": raise ValueError( "optimizer_sharding='zero' is currently supported for pure 'dp' mode only." ) if not dist.is_initialized(): raise RuntimeError( "optimizer_sharding='zero' requires an initialized torch.distributed process group." ) if not ZERO_REDUNDANCY_OPTIMIZER_AVAILABLE: raise RuntimeError( "torch.distributed.optim.ZeroRedundancyOptimizer is unavailable in the current PyTorch build." ) return ZeroRedundancyOptimizer( module.parameters(), optimizer_class=optimizer_cls, lr=lr, weight_decay=weight_decay, **optimizer_kwargs, ) return optimizer_cls( module.parameters(), lr=lr, weight_decay=weight_decay, **optimizer_kwargs, )