a
    hV$                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ ddlmZmZ dZG d	d
 d
eZeeedddZG dd dZeedde	jeeej	j  e	jdddZe	jedddZdS )    N)Iterable)AnyNoReturnOptional)_State)DistributedDataParallel   )_get_registrycontract c                       s   e Zd ZU ejed< dd fddZefej	e
ej	 e
ej eddddZddd	d
Zej	e
ej	 ddddZddddZddddZej	eedf eeef edddZej	eej ejejdddZ  ZS )_ReplicateState_ddp_weakrefNreturnc                    sN   t    t | _d| _t | _| j| _g | _d| _	d | _
i | _g | _d S )NF)super__init__nnZParameterListmodulehas_initialized_param_listZ_orig_module_param_names_no_sync
_init_args_init_kwargs_comm_hook_argsself	__class__ U/var/www/auris/lib/python3.9/site-packages/torch/distributed/_composable/replicate.pyr      s    


z_ReplicateState.__init__)r   ignored_modulesignored_paramsprefixr   c           
      C   s   t |rd S ||v rd S |tkr*| dnt}|jddD ]0\}}||vr:| j| | j| |  q:| D ]"\}}	| j|	||| | d qtd S )N.F)Zrecurse)r#   )_is_fully_sharded_ROOT_MODULE_PREFIXZnamed_parametersr   appendr   Znamed_children_collect_params)
r   r   r!   r"   r#   Zrecurse_prefixnpnameZchild_moduler   r   r    r(   "   s"    
z_ReplicateState._collect_paramsc                    s"   t jdd fdd}|  d S )NT)	recursivec                      s:    j d usJ  j j i  j    d _ i  _d S )Nr   )r   initr   register_comm_hookr   r   r   r    
_lazy_initC   s
    z-_ReplicateState.lazy_init.<locals>._lazy_init)torchZ_disable_dynamo)r   r/   r   r   r    	lazy_initB   s    
z_ReplicateState.lazy_initr   r!   r   c                 K   s   | j r
d S d| _ || _dd |D }| D ]}t|r,||  q,ddlm} |||d | ||| d|v r|d d ur|d }t	|t
jr|jdkrd |d	< q|g|d	< nd |d	< |d t| jfi || _t| jt| j_d S )
NTc                 S   s   h | ]}|  D ]}|qqS r   )
parameters).0mr*   r   r   r    	<setcomp>X       z'_ReplicateState.init.<locals>.<setcomp>r   )_localize_dtensor)r"   	device_idcpuZ
device_ids)r   r   modulesr%   updater3   %torch.distributed.tensor.parallel.ddpr8   r(   
isinstancer0   devicetypepopr   r   _ddpweakrefref	replicatestater   )r   r   r!   kwargsr"   	submoduler8   r9   r   r   r    r-   M   s*    

z_ReplicateState.initc                 C   s0   | j D ]\}}| jj|i | q| j   d S N)r   rB   r.   clear)r   Z	comm_argsZcomm_kwargsr   r   r    r.   w   s    z"_ReplicateState.register_comm_hookc                 O   s   || _ || _d S rI   )r   r   r   argsrG   r   r   r    record_init_args|   s    z _ReplicateState.record_init_args.)r   rL   rG   r   c                 C   s2   | j s| jr|   | j | j_| jj|i |S rI   )r   r   r1   r   rB   Zrequire_backward_grad_syncZ_pre_forward)r   r   rL   rG   r   r   r    forward_pre_hook   s    z _ReplicateState.forward_pre_hook)r   inputoutputr   c                 C   s   | j |S rI   )rB   Z_post_forward)r   r   rO   rP   r   r   r    forward_post_hook   s    z!_ReplicateState.forward_post_hook)__name__
__module____qualname__rC   rD   __annotations__r   r&   r   Moduleset	Parameterstrr(   r1   r-   r.   rM   tupler   dictrN   r0   ZTensorrQ   __classcell__r   r   r   r    r      s2   

 *
r   )rL   rG   r   c                  O   s   t dd S )NzGDDP does not support deepcopy. Please use state dict for serialization.)AssertionError)rL   rG   r   r   r    unimplemented_deepcopy   s    r^   c                   @   s2   e Zd Zdd ZeddddZdddd	ZdS )
DDPc                 O   s"   | j d }|j|g|R i |S )z
        Override ``__new__`` to remove the DDP class and directly construct
        the original class for cases like indexing into a container module.
           )__mro____new__)clsrL   rG   Zorig_clsr   r   r    rb      s    
zDDP.__new__N)requires_gradient_syncr   c                 C   s   | t | _dS )a  
        Sets if the module should sync gradients. This can be used to implement
        gradient accumulation without communication.

        Args:
            requires_gradient_sync (bool): Whether to reduce gradients for the
                module's parameters.
        N)rE   rF   r   )r   rd   r   r   r    set_requires_gradient_sync   s    	zDDP.set_requires_gradient_syncr   c                 O   s   t | j||f d S rI   )rE   rF   r   r'   rK   r   r   r    r.      s    zDDP.register_comm_hook)rR   rS   rT   rb   boolre   r.   r   r   r   r    r_      s   
r_   )Z	state_clsr2   c                 K   s$  t jd d|v r>t|d tt jfs>tdt|d  t| rNtd|du r\i }nt	|}t
| }| j|jdd |dd}|durd	d
lm} ||}||krd	dlm}m} | | | | | |j |j| |fi | | j}	dti}
td|	j t|	f|
}|| _| S )zReplicates a module

    Args:
        module (torch.nn.Module): module to replicate

    Example::
        >>> # xdoctest: +REQUIRES(module:torch._C._distributed_c10d)
        >>> module = nn.Linear(3, 3)
        >>> replicate(module)
    ztorch.distributed.replicater9   z6Expected device_id to be int or torch.device, but got zGCannot apply `replicate()` on a Module already managed by `fully_shard`NT)Zwith_kwargsdevice_meshr   )_mesh_resources)r8   _reconstruct_dtensor__deepcopy__r_   )r0   Z_CZ_log_api_usage_oncer>   intr?   RuntimeErrorr@   r%   rW   rE   rF   Zregister_forward_pre_hookrN   getZtorch.distributed.device_meshrh   Zget_root_meshr=   r8   ri   Zregister_forward_hookrQ   rM   r   r^   rR   r_   )r   r!   rG   rF   rg   rh   Z	root_meshr8   ri   rc   dctZnew_clsr   r   r    rE      s@    




rE   )r   r   c                 C   s   t | }|du rdS d|v S )z+Check if module is marked with fully_shard.NFZfully_shard)r	   )r   registryr   r   r    r%      s    r%   )N)rC   collections.abcr   typingr   r   r   r0   Ztorch.nnr   Z#torch.distributed._composable_stater   Ztorch.nn.parallelr   r
   r	   r&   r   r^   r_   rV   rE   rf   r%   r   r   r   r    <module>   s(     H