
    9j$                     V   d dl Z d dlmZ d dl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
e
      ZdededefdZ G d d      Z ee      	 ddej&                  deej                  j&                     dz  dej&                  fd       Zdej&                  defdZy)    N)Iterable)AnyNoReturn)_State)DistributedDataParallel   )_get_registrycontract c                       e Zd ZU ej                  ed<   d fdZefdej                  de
ej                     de
ej                     deddf
d	Zdd
Zdej                  de
ej                     ddfdZddZddZdej                  deedf   deeef   defdZdej                  deej.                     dej.                  dej.                  fdZ xZS )_ReplicateState_ddp_weakrefreturnNc                     t         |           t        j                         | _        d| _        t        j                         | _        | j                  | _        g | _        d| _	        d | _
        i | _        g | _        y )NF)super__init__nnParameterListmodulehas_initialized_param_list_orig_module_param_names_no_sync
_init_args_init_kwargs_comm_hook_args)self	__class__s    g/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributed/_composable/replicate.pyr   z_ReplicateState.__init__   sk    !#!1!1!3%*-/-=-=-? !KK')#26,.*,    r   ignored_modulesignored_paramsprefixc                 b   t        |      ry ||v ry |t        k7  r| dnt        }|j                  d      D ]D  \  }}||vs| j                  j	                  |       | j
                  j	                  | |        F |j                         D ]  \  }}	| j                  |	||| |          y )N.F)recurse)r$   )_is_fully_sharded_ROOT_MODULE_PREFIXnamed_parametersr   appendr   named_children_collect_params)
r   r   r"   r#   r$   recurse_prefixnpnamechild_modules
             r    r-   z_ReplicateState._collect_params"   s     V$ _$ #&99vhaL?R 	 ++E+: 	ADAq&  ''*!!((N+;A3)?@	A
 #)"7"7"9 	D,  ()$0	 ! 	r!   c                 P     t        j                  d       fd       } |        y )NT)	recursivec                       j                   t          j                   j                   i  j                    j	                          d _         i  _        y )N )r   AssertionErrorinitr   register_comm_hook)r   s   r    
_lazy_initz-_ReplicateState.lazy_init.<locals>._lazy_initC   sK    &$$DIIt<$*;*;<##% DO "Dr!   )torch_disable_dynamo)r   r:   s   ` r    	lazy_initz_ReplicateState.lazy_initB   s'    				.	# 
/	# 	r!   c                    | j                   ry d| _         || _        |D ch c]  }|j                         D ]  }|  }}}|j                         D ]-  }t	        |      s|j                  |j                                / ddlm}  |||       | j                  |||       d|v rV|d   ;|d   }	t        |	t        j                        r|	j                  dk(  rd |d<   n|	g|d<   nd |d<   |j                  d       t        | j                  fi || _        t#        j$                  | j                         t&        j)                  | j                        _        y c c}}w )NTr   )_localize_dtensor)r#   	device_idcpu
device_ids)r   r   
parametersmodulesr(   update%torch.distributed.tensor.parallel.ddpr?   r-   
isinstancer;   devicetypepopr   r   _ddpweakrefref	replicatestater   )
r   r   r"   kwargsmr0   r#   	submoduler?   r@   s
             r    r8   z_ReplicateState.initN   s@    #%4MallnM!M!MM) 	>I +%%i&:&:&<=	> 	L&@V_nE& 
 k".";/	i69>>U;R+/F<( -6;F<('+|$JJ{#+D,<,<GG	4;KK		4J	$1; Ns   Ec                     | j                   D ]!  \  }} | j                  j                  |i | # | j                   j                          y N)r   rK   r9   clear)r   	comm_argscomm_kwargss      r    r9   z"_ReplicateState.register_comm_hookx   sI    &*&:&: 	D"I{(DII(()C{C	D""$r!   c                      || _         || _        y rT   )r   r   r   argsrP   s      r    record_init_argsz _ReplicateState.record_init_args}   s    "r!   rZ   .rP   c                     | j                   s| j                  r| j                          | j                   | j                  _        | j                  t        _         | j                  j                  |i |S rT   )	r   r   r=   r   rK   require_backward_grad_syncr   _active_ddp_module_pre_forward)r   r   rZ   rP   s       r    forward_pre_hookz _ReplicateState.forward_pre_hook   sY     ??d//NN37==/@		,59YY2%tyy%%t6v66r!   inputoutputc                 N    d t         _        | j                  j                  |      S rT   )r   r^   rK   _post_forward)r   r   ra   rb   s       r    forward_post_hookz!_ReplicateState.forward_post_hook   s"     6:2yy&&v..r!   r   N)__name__
__module____qualname__rL   rM   __annotations__r   r)   r   Moduleset	Parameterstrr-   r=   r8   r9   r[   tupler   dictr`   r;   Tensorre   __classcell__)r   s   @r    r   r      s   ++-& *		 RYY BLL)	
  
@
(K		(K RYY(K
 
(KT%
#7ii7',S#X7@DS#X7	7/		/ U\\"/ 	/
 
/r!   r   rZ   rP   r   c                      t        d      )NzGDDP does not support deepcopy. Please use state dict for serialization.)r7   )rZ   rP   s     r    unimplemented_deepcopyrt      s    
Q r!   c                   *    e Zd Zd ZdeddfdZddZy)DDPc                 L    | j                   d   } |j                  |g|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__)clsrZ   rP   orig_clss       r    rz   zDDP.__new__   s.     ;;q>x:4:6::r!   requires_gradient_syncr   Nc                 :    | t         j                  |       _        y)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)rN   rO   r   )r   r}   s     r    set_requires_gradient_synczDDP.set_requires_gradient_sync   s     .D)C	&r!   c                 d    t         j                  |       j                  j                  ||f       y rT   )rN   rO   r   r+   rY   s      r    r9   zDDP.register_comm_hook   s#    --44dF^Dr!   rf   )rg   rh   ri   rz   boolr   r9   r6   r!   r    rv   rv      s#    ;	D 	D$ 	DEr!   rv   )	state_clsr   r"   c                    t         j                  j                  d       d|v r=t        |d   t        t         j
                  f      st        dt        |d                t        |       rt        d      |i }nt        |      }t        j                  |       }| j                  |j                  d       |j                  d      }|?|j                         }||k7  r*dd	lm}m} | j                  |       | j'                  |       | j'                  |j(                          |j*                  | |fi | | j,                  }d
t.        i}	t        d|j0                   t2        |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.replicater@   z6Expected device_id to be int or torch.device, but got zGCannot apply `replicate()` on a Module already managed by `fully_shard`T)with_kwargsdevice_meshr   )r?   _reconstruct_dtensor__deepcopy__rv   )r;   _C_log_api_usage_oncerG   intrH   RuntimeErrorrI   r(   rl   rN   rO   register_forward_pre_hookr`   get_get_root_meshrF   r?   r   register_forward_hookre   r[   r   rt   rg   rv   )r   r"   rP   rO   r   	root_meshr?   r   r{   dctnew_clss              r    rN   rN      sv     
HH  !>? f&-U\\/BC{ 3457 
  U
 	
 o.OOF#E
$$U%;%;$N**]+K..0	 #
 ,,-AB(():;
  !8!89E6?=f= 

C1
2CS'#sS9GFMr!   c                 &    t        |       }|yd|v S )z+Check if module is marked with fully_shard.Ffully_shard)r	   )r   registrys     r    r(   r(      s     V$HH$$r!   rT   )rL   collections.abcr   typingr   r   r;   torch.nnr   #torch.distributed._composable_stater   torch.nn.parallelr   r
   r	   r)   r   rt   rv   rk   rN   r   r(   r6   r!   r    <module>r      s     $     6 5 -  @/f @/F#   E E4 
O$ 9=CIICehhoo.5C YY	C %CL%bii %D %r!   