§
    Ÿ²Åj<%  ã                   óZ  — d dl Z d dlmZmZmZmZmZmZ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	e¦  «        Zd
ededefd„Z G d„ d¦  «        Z ee¬¦  «        	 ddej        deeej        j                          dej        fd„¦   «         Zdej        defd„ZdS )é    N)	ÚAnyÚcastÚDictÚIterableÚListÚNoReturnÚOptionalÚSetÚTuple)Ú_State)ÚDistributedDataParallelé   )Ú_get_registryÚcontractÚ c                   óP  ‡ — e Zd Z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ÚreturnNc                 ó  •— t          ¦   «                              ¦   «          t          j        ¦   «         | _        d| _        t          j        ¦   «         | _        | j        | _        g | _        d| _	        d | _
        i | _        g | _        d S )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    €úXC:\Projects\Historical\venv\Lib\site-packages\torch/distributed/_composable/replicate.pyr   z_ReplicateState.__init__   sz   ø€ Ý‰Œ×ÒÑÔÐÝ!#Ô!1Ñ!3Ô!3ˆŒØ%*ˆÔÝ-/Ô-=Ñ-?Ô-?ˆÔð !œKˆÔØ')ˆÔØ#ˆŒØ59ˆŒØ,.ˆÔØ*,ˆÔÐÐó    r   Úignored_modulesÚignored_paramsÚprefixc                 ó€  — t          |¦  «        rd S ||v rd S |t          k    r|› d�nt          }|                     d¬¦  «        D ]A\  }}||vr8| j                             |¦  «         | j                             |› |› �¦  «         ŒB|                     ¦   «         D ]"\  }}	|                      |	|||› |› �¬¦  «         Œ#d S )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%   r2   z_ReplicateState._collect_params    s  € õ ˜VÑ$Ô$ð 	ØˆFð �_Ð$Ð$ØˆFð #Õ&9Ò9Ð9ˆvˆLˆLˆLˆLÕ?Rð 	ð ×+Ò+°EÐ+Ñ:Ô:ð 	Að 	A‰DˆAˆqØ˜Ð&Ð&ØÔ ×'Ò'¨Ñ*Ô*Ð*ØÔ!×(Ò(¨NÐ)?¸AÐ)?Ð)?Ñ@Ô@Ð@øà"(×"7Ò"7Ñ"9Ô"9ð 	ð 	ÑˆD�,Ø× Ò ØØØØ(Ð0¨$Ð0Ð0ð	 !ñ ô ð ð ð	ð 	r&   c                 ó\   ‡ — t          j        d¬¦  «        ˆ fd„¦   «         } |¦   «          d S )NT)Ú	recursivec                  óŒ   •— ‰ j         €J ‚ ‰ j        ‰ j         i ‰ j        ¤Ž ‰                      ¦   «          d‰ _         i ‰ _        d S )N© )r    Úinitr!   Úregister_comm_hook)r#   s   €r%   Ú
_lazy_initz-_ReplicateState.lazy_init.<locals>._lazy_initA   sT   ø€ à”?Ð.Ð.Ð.ØˆDŒI�t”Ð<¨$Ô*;Ð<Ð<Ð<Ø×#Ò#Ñ%Ô%Ð%Ø ˆDŒOØ "ˆDÔÐÐr&   )ÚtorchÚ_disable_dynamo)r#   r>   s   ` r%   Ú	lazy_initz_ReplicateState.lazy_init@   sF   ø€ Ý	Ô	¨Ð	.Ñ	.Ô	.ð	#ð 	#ð 	#ð 	#ñ 
/Ô	.ð	#ð 	ˆ
‰Œˆˆˆr&   c                 óž  — | j         rd S d| _         || _        d„ |D ¦   «         }|                     ¦   «         D ]8}t          |¦  «        r'|                     |                     ¦   «         ¦  «         Œ9ddlm}  |||¬¦  «         |                      |||¦  «         d|v r\|d         �:|d         }t          |t          j        ¦  «        r|j        dk    rd |d<   n|g|d<   nd |d<   |                     d¦  «         t          | j        fi |¤Ž| _        t#          j        | j        ¦  «        t&                               | j        ¦  «        _        d S )	NTc                 ó@   — h | ]}|                      ¦   «         D ]}|’ŒŒS r;   )Ú
parameters)Ú.0Úmr5   s      r%   ú	<setcomp>z'_ReplicateState.init.<locals>.<setcomp>V   s-   € ÐMÐMÐM ¸a¿lºl¹n¼nÐMÐM¸˜!ÐMÐMÐMÐMr&   r   )Ú_localize_dtensor)r(   Ú	device_idÚcpuÚ
device_ids)r   r   Úmodulesr-   ÚupdaterD   Ú%torch.distributed.tensor.parallel.ddprH   r2   Ú
isinstancer?   ÚdeviceÚtypeÚpopr   r   Ú_ddpÚweakrefÚrefÚ	replicateÚstateÚ_ddp_weakref)r#   r   r'   Úkwargsr(   Ú	submodulerH   rI   s           r%   r<   z_ReplicateState.initK   s~  € ð Ôð 	ØˆFà#ˆÔØˆŒØMÐM _ÐMÑMÔMˆØŸšÑ)Ô)ð 	>ð 	>ˆIÝ  Ñ+Ô+ð >Ø×%Ò% i×&:Ò&:Ñ&<Ô&<Ñ=Ô=Ð=øØKÐKÐKÐKÐKÐKàÐ˜&°Ð@Ñ@Ô@Ð@Ø×Ò˜V _°nÑEÔEÐEà˜&Ð Ð ð
 �kÔ"Ð.Ø" ;Ô/�	å˜i­¬Ñ6Ô6ð 7¸9¼>ÈUÒ;RÐ;Rà+/�F˜<Ñ(Ð(ð -6¨;�F˜<Ñ(Ð(à'+��|Ñ$Ø�JŠJ�{Ñ#Ô#Ð#å+¨DÔ,<ÐGÐGÀÐGÐGˆŒ	å4;´KÀÄ	Ñ4JÔ4J�	�Š˜œÑ$Ô$Ô1Ð1Ð1r&   c                 óv   — | j         D ]\  }} | j        j        |i |¤Ž Œ| j                              ¦   «          d S ©N)r"   rS   r=   Úclear)r#   Ú	comm_argsÚcomm_kwargss      r%   r=   z"_ReplicateState.register_comm_hooku   sS   € Ø&*Ô&:ð 	Dð 	DÑ"ˆI�{Ø(ˆDŒIÔ(¨)ÐC°{ÐCÐCÐCÐCØÔ×"Ò"Ñ$Ô$Ð$Ð$Ð$r&   c                 ó"   — || _         || _        d S r\   )r    r!   ©r#   ÚargsrY   s      r%   Úrecord_init_argsz _ReplicateState.record_init_argsz   s   € ØˆŒØ"ˆÔÐÐr&   rb   .rY   c                 óŽ   — | j         s| j        r|                      ¦   «          | j         | j        _         | j        j        |i |¤ŽS r\   )r    r!   rA   r   rS   Úrequire_backward_grad_syncÚ_pre_forward)r#   r   rb   rY   s       r%   Úforward_pre_hookz _ReplicateState.forward_pre_hook~   sQ   € ð Œ?ð 	˜dÔ/ð 	Ø�NŠNÑÔÐØ37´=Ð/@ˆŒ	Ô,Ø%ˆtŒyÔ% tÐ6¨vÐ6Ð6Ð6r&   ÚinputÚoutputc                 ó6   — | j                              |¦  «        S r\   )rS   Ú_post_forward)r#   r   rh   ri   s       r%   Úforward_post_hookz!_ReplicateState.forward_post_hook†   s   € ð Œy×&Ò& vÑ.Ô.Ð.r&   ©r   N)Ú__name__Ú
__module__Ú__qualname__r   r.   r   ÚModuler
   Ú	ParameterÚstrr2   rA   r<   r=   rc   r   r   r   rg   r?   ÚTensorrl   Ú__classcell__)r$   s   @r%   r   r      s¤  ø€ € € € € ð-ð -ð -ð -ð -ð -ð& *ðð à”	ðð ˜RœYœðð ˜BœLÔ)ð	ð
 ðð 
ðð ð ð ð@	ð 	ð 	ð 	ð(Kà”	ð(Kð ˜RœYœð(Kð
 
ð(Kð (Kð (Kð (KðT%ð %ð %ð %ð
#ð #ð #ð #ð7Ø”ið7Ø',¨S°#¨X¤ð7Ø@DÀSÈ#ÀXÄð7à	ð7ð 7ð 7ð 7ð/à”	ð/ð �U”\Ô"ð/ð ”ð	/ð
 
Œð/ð /ð /ð /ð /ð /ð /ð /r&   r   rb   rY   r   c                  ó    — t          d¦  «        ‚)NzGDDP does not support deepcopy. Please use state dict for serialization.)ÚAssertionError)rb   rY   s     r%   Úunimplemented_deepcopyrx   �   s   € Ý
ØQñô ð r&   c                   ó,   — e Zd Zd„ Zdeddfd„Zdd„ZdS )ÚDDPc                 ó>   — | 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__)Úclsrb   rY   Úorig_clss       r%   r~   zDDP.__new__—   s2   € ð ”;˜q”>ˆØˆxÔ Ð:¨4Ð:Ð:Ð:°6Ð:Ð:Ð:r&   Úrequires_gradient_syncr   Nc                 óF   — | 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)rV   rW   r   )r#   r�   s     r%   Úset_requires_gradient_synczDDP.set_requires_gradient_sync¡   s"   € ð .DÐ)C�	�Š˜ÑÔÔ&Ð&Ð&r&   c                 ón   — t                                | ¦  «        j                             ||f¦  «         d S r\   )rV   rW   r"   r0   ra   s      r%   r=   zDDP.register_comm_hook¬   s/   € Ý�Š˜ÑÔÔ-×4Ò4°d¸F°^ÑDÔDÐDÐDÐDr&   rm   )rn   ro   rp   r~   Úboolrƒ   r=   r;   r&   r%   rz   rz   –   se   € € € € € ð;ð ;ð ;ð	DÀð 	DÈ$ð 	Dð 	Dð 	Dð 	DðEð Eð Eð Eð Eð Er&   rz   )Ú	state_clsr   r'   c                 óp  — t           j                             d¦  «         d|v rLt          |d         t          t           j        f¦  «        s%t          dt          |d         ¦  «        › �¦  «        ‚t          | ¦  «        rt          d¦  «        ‚|€i }nt          |¦  «        }t          t          t                               | ¦  «        ¦  «        }|                      |j        d¬¦  «         |                     dd¦  «        }|�Sd	d
lm} |                     |¦  «        }||k    r2d	dlm}m} |                      |¦  «         |                      |¦  «         |                      |j        ¦  «          |j        | |fi |¤Ž | j        }	dt6          i}
t          d|	j        › �t:          |	f|
¦  «        }|| _        | S )zðReplicates 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.replicaterI   z6Expected device_id to be int or torch.device, but got zGCannot apply `replicate()` on a Module already managed by `fully_shard`NT)Úwith_kwargsÚdevice_meshr   )Ú_mesh_resources)rH   Ú_reconstruct_dtensorÚ__deepcopy__rz   )r?   Ú_CÚ_log_api_usage_oncerO   ÚintrP   ÚRuntimeErrorrQ   r-   Úsetr   r   rV   rW   Úregister_forward_pre_hookrg   ÚgetÚtorch.distributed.device_meshrŠ   Úget_root_meshrN   rH   r‹   Úregister_forward_hookrl   rc   r$   rx   rn   rz   )r   r'   rY   rW   r‰   rŠ   Ú	root_meshrH   r‹   r   ÚdctÚnew_clss               r%   rV   rV   °   s  € õ  
„H× Ò Ð!>Ñ?Ô?Ð?ð �fÐÐÝ˜& Ô-µµU´\Ð/BÑCÔCð 	Ýð7Ý  {Ô 3Ñ4Ô4ð7ð 7ñô ð õ
 ˜Ñ Ô ð 
ÝØUñ
ô 
ð 	
ð ÐØˆˆå˜oÑ.Ô.ˆå•¥)§/¢/°&Ñ"9Ô"9Ñ:Ô:€EØ
×$Ò$ UÔ%;ÈÐ$ÑNÔNÐNØ—*’*˜]¨DÑ1Ô1€KØÐØAÐAÐAÐAÐAÐAà#×1Ò1°+Ñ>Ô>ˆ	ð ˜Ò#Ð#ðð ð ð ð ð ð ð ð
 ×,Ò,Ð-AÑBÔBÐBØ×(Ò(Ð):Ñ;Ô;Ð;à
× Ò  Ô!8Ñ9Ô9Ð9à€EÔ˜6 ?Ð=Ð=°fÐ=Ð=Ð=ð Ô
€CØÕ1Ð
2€CÝÐ'˜œÐ'Ð'­#¨s¨°SÑ9Ô9€GØ€FÔØ€Mr&   c                 ó0   — t          | ¦  «        }|€dS d|v S )z+Check if module is marked with fully_shard.NFÚfully_shard)r   )r   Úregistrys     r%   r-   r-   ù   s%   € å˜VÑ$Ô$€HØÐØˆuØ˜HÐ$Ð$r&   r\   )rT   Útypingr   r   r   r   r   r   r	   r
   r   r?   Útorch.nnr   Ú#torch.distributed._composable_stater   Útorch.nn.parallelr   r   r   r.   r   rx   rz   rq   rV   r…   r-   r;   r&   r%   ú<module>r¡      sÙ  ðð €€€Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ Rà €€€Ø Ð Ð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5à -Ð -Ð -Ð -Ð -Ð -Ð -Ð -ð Ð ð{/ð {/ð {/ð {/ð {/�fñ {/ô {/ð {/ð| #ð °ð ¸ð ð ð ð ðEð Eð Eð Eð Eñ Eô Eð Eð4 
€�OÐ$Ñ$Ô$ð <@ðEð EØŒIðEà˜h u¤x¤Ô7Ô8ðEð „Yð	Eð Eð Eñ %Ô$ðEðP%˜bœið %¨Dð %ð %ð %ð %ð %ð %r&   