U
    Jc:                     @   s   U d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZmZ i Zeeef ed
< dd ZG dd deZeeG dd deZedddZdS )    )ABCN)DictType)FullyShardedDataParallel)DistributedDataParallel)	Optimizer)as_functional_optim)allreduce_hook)_OptimizerHookState_hook_then_optimizer_registered_overlapped_optimsc                    s    fdd}|S )Nc              	      s8   | t kr,t|  dt    d  d  d| t  < | S )Nz# already registered with optim_cls  z, trying tore-register it for z is not supported.)r   
ValueError)Ztarget_overlapped_optim_cls	optim_cls e/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributed/algorithms/_optimizer_overlap/optimizer_overlap.py	decorator   s    z&register_overlapped.<locals>.decoratorr   )r   r   r   r   r   register_overlapped   s    	r   c                   @   s<   e Zd ZeddddZeddddZeddd	d
ZdS )OverlappedOptimizerNr   returnc                 C   s
   || _ dS )z
        OverlappedOptimizer is a base class that child classes can implement to
        specify how different optimizers will register themselves with DDP.
        Nr   )selfr   r   r   r   __init__#   s    zOverlappedOptimizer.__init__)ddpr   c                 C   s   t | jj ddS )z,Registers the overlapped optimizer with DDP.z! does not support overlapped DDP.NNotImplementedError	__class____name__)r   r   r   r   r   register_ddp*   s    z OverlappedOptimizer.register_ddp)fsdpr   c                 C   s   t | jj ddS )z-Registers the overlapped optimizer with FSDP.z" does not support overlapped FSDP.Nr   )r   r    r   r   r   register_fsdp0   s    z!OverlappedOptimizer.register_fsdp)	r   
__module____qualname__r   r   r   r   r   r!   r   r   r   r   r   "   s   r   c                       s6   e Zd ZdZedd fddZedddZ  ZS )	_OverlappedStandardOptimizerz!Overlaps a regular ``Optimizer``.Nr   c                    s.   t  | t| jf||}t||| _d S N)superr   r   r   r
   _opt_hook_state)r   r   paramsZ
optim_argsZoptim_kwargsZf_optimr   r   r   r   ;   s    z%_OverlappedStandardOptimizer.__init__)ddp_instc                 C   s   | d tt| j d S r%   )Zregister_comm_hookr   r	   r'   )r   r*   r   r   r   r   @   s    
z)_OverlappedStandardOptimizer.register_ddp)	r   r"   r#   __doc__r   r   r   r   __classcell__r   r   r)   r   r$   7   s   r$   r   c              	   O   sT   t | D ]6}zt| | |f||W   S  tk
r>   Y q
X q
t| |f||S )zU
    Returns a new ``OverlappedOptimizer`` instance that supports ``optim_cls``.
    )inspectgetmror   KeyErrorr$   )r   r(   argskwargsZclzr   r   r   _as_overlapped_optimK   s    r2   )abcr   r-   typingr   r   Ztorch.distributed.fsdpr   Ztorch.nn.parallelr   Ztorch.optimr   Ztorch.distributed.optimr   Z9torch.distributed.algorithms.ddp_comm_hooks.default_hooksr	   ZCtorch.distributed.algorithms.ddp_comm_hooks.optimizer_overlap_hooksr
   r   r   __annotations__r   r   r$   r2   r   r   r   r   <module>   s    