§
    N�’j<Â  ã                   ó�  — d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
mZmZ d dlZd dlmZ d dlmc mc mZ d dlmc mc mZ d dlmc mc 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'm(Z(m)Z)m*Z*m+Z+m,Z, d d	l-m.Z.m/Z/m0Z0m1Z1 d d
l2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD erd dlEmFZF dZG	 d dlHmIZImJZJ n# eK$ r dZGY nw xY wdZLdZMeNejO        ejO        f         ZPejO        ePz  dz  ZQe:jR        e1jR        e:jS        e1jS        e:jT        e1jT        e:jU        e1jU        e:jV        e1jV        iZWe:jU        e:jV        gZXe:jT        e:jV        fZYe	 d`de'deQde:de>dz  de"dz  de'fd„¦   «         ZZede'deQde"de'fd„¦   «         Z[ede
de\fd„¦   «         Z]ede"de\fd„¦   «         Z^ed e_dejO        fd!„¦   «         Z`ed"ejO        d e_dejO        fd#„¦   «         Zad"ejO        d e_deNejO        ejO        f         fd$„Zbe	 d`de'd%ejc        d&eej        jc                 dz  d'eej        jd                 eej        jc                 z  dz  de'f
d(„¦   «         Zed'efe
         d)e\ddfd*„Zgede'd%ejc        d+ehejd                 d,e_eji        z  dz  de'f
d-„¦   «         Zjede'd%ejc        de'fd.„¦   «         Zkede'de:dz  d/e9dz  d0e6dz  d1e\d2e\d3e_d4e_de'fd5„¦   «         Zlede'de'fd6„¦   «         Zmede'd7e5d8e\de'fd9„¦   «         Zned`de'de"de'fd:„¦   «         Zoede'de'fd;„¦   «         Zpd%ejc        d<efejd                 ddfd=„Zqede'd>ejc        d,e_eji        z  dz  d?eejc        gdf         dz  d@e\de'fdA„¦   «         Zrede'd<efejd                 d>ejc        fdB„¦   «         ZsdCejc        dDeej        jc                 dz  dehejc                 fdE„Zt	 d`dCej        jc        d&ehej        jc                 dFeej        jd                 dz  dehej        jd                 fdG„ZudCej        jc        d&ehej        jc                 dehev         fdH„ZwdCejc        dehev         fdI„Zxd%ejc        d+ehejd                 d,e_eji        z  dz  ddfdJ„Zyd,e_eji        z  dz  dKe_dLe&deji        dz  fdM„Zzd%ejc        d+ehejd                 d&ehejc                 deNe\e\f         fdN„Z{dCejc        d?eejc        gdf         d&ehejc                 ddfdO„Z|dCejc        dPeji        dz  d&ehejc                 dLe&fdQ„Z}dCejc        d&ehejc                 defejc                 fdR„Z~d%ejc        d+ehejd                 dSehej                 dPeji        dz  ddf
dT„Z€d<efejd                 dUefej                 dPeji        dz  ddfdV„Z�dW„ Z‚d%ejc        d+ehejd                 dPeji        dz  dKe_dLe&deji        fdX„Zƒd%ejc        d<efejd                 dejO        ddfdY„Z„dZefej                 ddfd[„Z…d%ejc        d+ehejd                 deejd                 fd\„Z†d+ehejd                 ddfd]„Z‡de:fd^„ZˆdejO        de j‰        fd_„ZŠdS )aé    N)ÚCallableÚ	GeneratorÚIterableÚIterator)ÚAnyÚno_type_checkÚTYPE_CHECKING)Ú
OpaqueBase)Údefault_hooks)Ú
DeviceMesh)Ú_get_default_group)Ú_FSDPDeviceHandleÚ
_FSDPStateÚ_get_module_fsdp_stateÚ_is_fsdp_flattenedÚ!_named_parameters_with_duplicatesÚclean_tensor_nameÚTrainingState)Ú_FSDP_USE_FULL_PREC_IN_EVALÚFlatParameterÚFlatParamHandleÚHandleShardingStrategy)Ú_FreeEventQueue)ÚBackwardPrefetchÚ
CPUOffloadÚFullOptimStateDictConfigÚFullStateDictConfigÚMixedPrecisionÚShardingStrategyÚStateDictConfigÚStateDictType)Ú_Policy)ÚDTensorExtensions)Ú_sync_params_and_buffers)Úis_traceable_wrapper_subclass)ÚRemovableHandleT)Údeferred_initÚfakeFi   Ú_fsdp_syncedÚstateÚprocess_groupÚsharding_strategyÚpolicyÚdevice_meshÚreturnc                 ó8  — |�|�t          d¦  «        ‚|t          v }|r+|€|€|€t          d|› d�¦  «        ‚t          | ||¦  «        } n<|r#|| _        |                     d¬¦  «        | _        n|�|nt          ¦   «         | _        | j                             ¦   «         | _        | j                             ¦   «         | _	        | j	        }|r|| j
                             ¦   «         z  }t          j                             |¦  «        | _        || j        z  | _        | S )NzcCannot pass both process_group and device_mesh at the same time. Please just pass only one of them.zManual wrapping with zA requires explicit specification of process group or device_mesh.r   ©Úmesh_dim)Ú
ValueErrorÚHYBRID_SHARDING_STRATEGIESÚ*_init_process_group_state_for_hybrid_shardÚ_device_meshÚ	get_groupr+   r   ÚrankÚsizeÚ
world_sizeÚ_inter_node_pgr   ÚDefaultStateÚ_get_gradient_predivide_factorÚ_gradient_predivide_factorÚ_gradient_postdivide_factor)r*   r+   r,   r-   r.   Úis_hybrid_strategyÚdata_parallel_world_sizes          úPC:\Projects\DSCons\.venv\Lib\site-packages\torch\distributed\fsdp\_init_utils.pyÚ_init_process_group_staterC   Z   sw  € ð Ð  [Ð%<Ýð<ñ
ô 
ð 	
ð +Õ.HÐHÐØð ØÐ  V ^¸Ð8Kõ ðSÐ(9ð Sð Sð Sñô ð õ
 ?Ø�} kñô ˆEˆEð ð 	Ø!,ˆEÔØ"-×"7Ò"7ÀÐ"7Ñ"CÔ"CˆEÔÐð "/Ð!:��Õ@RÑ@TÔ@Tð Ôð Ô$×)Ò)Ñ+Ô+€E„JØÔ*×/Ò/Ñ1Ô1€EÔØ$Ô/ÐØð @Ø  EÔ$8×$=Ò$=Ñ$?Ô$?Ñ?Ð åÔ"×AÒAØ$ñ	
ô 	
ð 
Ô$ð 	! 5Ô#CÑCð 
Ô%ð €Ló    c                 ó  — |rdt          |¦  «        r>|| _        |                     d¬¦  «        | _        |                     d¬¦  «        | _        nžt          d|j        › �¦  «        ‚|€Gt          ¦   «         }t          || j	         
                    ¦   «         ¦  «        \  }}|| _        || _        n>t          |¦  «        r|\  | _        | _        nt          dt          |¦  «        › �¦  «        ‚t          | j        ¬¦  «        | _        | S )Nr   r1   é   z,Expected device_mesh to have ndim=2 but got zmExpected process_group to be passed in as either None or Tuple[dist.ProcessGroup, dist.ProcessGroup] but got ©r+   )Ú"_is_valid_hybrid_shard_device_meshr6   r7   r;   r+   r3   Úndimr   Ú!_init_intra_and_inter_node_groupsÚ_device_handleÚdevice_countÚ_is_valid_hybrid_shard_pg_typeÚtypeÚ_get_default_comm_hook_stateÚ_inter_node_state)r*   r+   r.   Údefault_groupÚintra_node_groupÚinter_node_groups         rB   r5   r5   Ž   sJ  € ð ð Ý-¨kÑ:Ô:ð 		Ø!,ˆEÔð $/×#8Ò#8À!Ð#8Ñ#DÔ#DˆEÔ Ø"-×"7Ò"7ÀÐ"7Ñ"CÔ"CˆEÔÐåØQ¸{Ô?OÐQÐQñô ð ð 
Ð	Ý*Ñ,Ô,ˆÝ-NØ˜5Ô/×<Ò<Ñ>Ô>ñ.
ô .
Ñ*ÐÐ*ð /ˆÔà/ˆÔÐõ *¨-Ñ8Ô8ð 	ð 9FÑ5ˆEÔ Ô!5Ð!5åð]ÝGKÈMÑGZÔGZð]ð ]ñô ð õ
 ;ØÔ*ðñ ô €EÔð €LrD   c                 ó„   — t          | t          ¦  «        o+t          | ¦  «        dk    ot          d„ | D ¦   «         ¦  «        S )Né   c              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S ©N)Ú
isinstanceÚdistÚProcessGroup)Ú.0Úpgs     rB   ú	<genexpr>z1_is_valid_hybrid_shard_pg_type.<locals>.<genexpr>¿   s/   è è € ÐJÐJ°b•
˜2�tÔ0Ñ1Ô1ÐJÐJÐJÐJÐJÐJrD   )rX   ÚtupleÚlenÚallrG   s    rB   rM   rM   º   sL   € õ 	�=¥%Ñ(Ô(ð 	KÝ�ÑÔ !Ò#ð	KåÐJÐJ¸MÐJÑJÔJÑJÔJðrD   c                 óB   — t          | t          ¦  «        o
| j        dk    S )NrU   )rX   r   rI   )r.   s    rB   rH   rH   Ã   s   € å�k¥:Ñ.Ô.ÐH°;Ô3CÀqÒ3HÐHrD   Únum_devices_per_nodec                 ó4   — t          j        | ¦  «        \  }}|S )aU  
    Return a process group across the current node.

    For example, given each row is a distinct node:
    0  1  2  3  4  5  6  7
    8  9 10 11 12 13 14 15
    This API would return an intra-node subgroup across
    [0, 1, ..., 7] or [8, 9, ..., 15] depending on the process's rank.
    For example, rank 3 would get [0, 1, ..., 7].
    )rY   Únew_subgroups)rb   Úintra_node_subgroupÚ_s      rB   Ú_init_intra_node_process_grouprg   È   s!   € õ "Ô/Ð0DÑEÔEÑÐ˜ØÐrD   Úglobal_process_groupc                 óV  ‡‡	— d}t          j        | ¦  «        }t          j        | ¦  «        }|‰z  }t          j        | ¦  «        ‰z  }t	          ‰¦  «        D ]<Š	ˆ	ˆfd„t	          |¦  «        D ¦   «         }t          j        ||¬¦  «        }‰	|k    r|}Œ=|€t          |› d�¦  «        ‚|S )aŒ  
    Return an inter-node process group where each contained rank has the same local rank.

    For example, given each row is a distinct node:
    0  1  2  3  4  5  6  7
    8  9 10 11 12 13 14 15
    This API would return inter-node process group [0, 8], [1, 9], [2, 10], and so forth
    depending on the process's rank. For example, rank 1 would get [1, 9], rank 5
    would get [5, 13].
    Nc                 ó    •— g | ]
}‰|‰z  z   ‘ŒS © rk   )r[   ÚiÚ
local_rankrb   s     €€rB   ú
<listcomp>z2_init_inter_node_process_group.<locals>.<listcomp>ï   s1   ø€ ð !
ð !
ð !
Ø89ˆJ˜!Ð2Ñ2Ñ3ð!
ð !
ð !
rD   )ÚranksÚbackendz. expected to assign inter-node pg, but did not)rY   Úget_backendÚget_world_sizeÚget_rankÚrangeÚ	new_groupÚAssertionError)
rh   rb   Úinter_node_pgÚsharding_backendr:   Ú	num_nodesÚmy_local_rankÚranks_for_inter_groupÚgrprm   s
    `       @rB   Ú_init_inter_node_process_groupr}   Ø   sò   øø€ ð  €MÝÔ'Ð(<Ñ=Ô=ÐÝÔ$Ð%9Ñ:Ô:€JàÐ2Ñ2€IÝ”MÐ"6Ñ7Ô7Ð:NÑN€MÝÐ0Ñ1Ô1ð  ð  ˆ
ð!
ð !
ð !
ð !
ð !
Ý=BÀ9Ñ=MÔ=Mð!
ñ !
ô !
Ðõ ŒnÐ#8ÐBRÐSÑSÔSˆØ˜Ò&Ð&ØˆMøàÐÝØÐLÐLÐLñ
ô 
ð 	
ð ÐrD   c                 ó@   — t          |¦  «        t          | |¦  «        fS )a¢  
    Initialize intra and inter-node process groups and return the ones corresponding to this process's rank.

    This function can be used to initialize process groups for ``HYBRID_SHARD`` or
    ``_HYBRID_SHARD_ZERO2`` in FSDP.
    This function assumes each node has an equal number of CUDA-enabled devices.
    Returns:
        Tuple[dist.ProcessGroup, dist.ProcessGroup]: Intra and inter-node process group.
    )rg   r}   )rh   rb   s     rB   rJ   rJ   þ   s)   € õ 	'Ð';Ñ<Ô<Ý&Ð';Ð=QÑRÔRðð rD   ÚmoduleÚignored_modulesÚignored_statesc                 óÆ  — |�|�t          d¦  «        ‚d }|d u}|r t          |¦  «        }t          |d¦  «         n#g }t          |�t          |¦  «        ng d¦  «         t          |¦  «        dk    r%t	          |d         t
          j        ¦  «        r|}n|}t          ||¦  «        | _        t          || j        |¦  «        | _
        t          || j        ¦  «        | _        | S )NzfCannot pass both ignored_modules and ignored_states at the same time. Please just pass ignored_states.TFr   )r3   ÚlistÚ_check_ignored_statesr_   rX   ÚnnÚ	ParameterÚ_get_ignored_modulesÚ_ignored_modulesÚ_get_ignored_paramsÚ_ignored_paramsÚ_get_ignored_buffer_namesÚ_ignored_buffer_names)r*   r   r€   r�   Úignored_parametersÚpassed_as_ignored_statesÚignored_states_lists          rB   Ú_init_ignored_module_statesr�     s$  € ð Ð" ~Ð'AÝð:ñ
ô 
ð 	
ð ÐØ-°TÐ9ÐØð 
Ý" >Ñ2Ô2ÐÝÐ1°4Ñ8Ô8Ð8Ð8à ÐÝØ%4Ð%@�D�Ñ!Ô!Ð!ÀbÈ%ñ	
ô 	
ð 	
õ ÐÑÔ !Ò#Ð#ÝÐ)¨!Ô,­b¬lÑ;Ô;ð 	2Ø!4ÐÐà1ˆOÝ1°&¸/ÑJÔJ€EÔÝ/ØØÔØñô €EÔõ
 #<ØØÔñ#ô #€EÔð €LrD   rŽ   c                 ó¢  — t          | ¦  «        dk    rdS |rlt          d„ | D ¦   «         ¦  «        }t          d„ | D ¦   «         ¦  «        }|s4|s4t          d„ | D ¦   «         t          ¬¦  «        }t	          d|› �¦  «        ‚dS dS t          d„ | D ¦   «         ¦  «        s2t          d	„ | D ¦   «         t          ¬¦  «        }t	          d
|› �¦  «        ‚dS )z—
    Check that the ignored states are uniformly parameters or uniformly modules.

    We may remove this check in the future if we permit mixing.
    r   Nc              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S rW   )rX   r…   r†   ©r[   r*   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>K  s.   è è € ÐUÐU¸U� E­2¬<Ñ8Ô8ÐUÐUÐUÐUÐUÐUrD   c              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S rW   ©rX   r…   ÚModuler“   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>L  s.   è è € ÐSÐS¸5�* U­B¬IÑ6Ô6ÐSÐSÐSÐSÐSÐSrD   c                 ó,   — h | ]}t          |¦  «        ’ŒS rk   ©rN   r“   s     rB   ú	<setcomp>z(_check_ignored_states.<locals>.<setcomp>O  ó   € Ð"KÐ"KÐ"K°5¥4¨¡;¤;Ð"KÐ"KÐ"KrD   )ÚkeyzUignored_states expects all nn.Parameter or all nn.Module list elements but got types c              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S rW   r•   r“   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>U  s.   è è € ÐLÐL°E•:˜e¥R¤YÑ/Ô/ÐLÐLÐLÐLÐLÐLrD   c                 ó,   — h | ]}t          |¦  «        ’ŒS rk   r˜   r“   s     rB   r™   z(_check_ignored_states.<locals>.<setcomp>V  rš   rD   z>ignored_modules expects nn.Module list elements but got types )r_   r`   ÚsortedÚreprr3   )r�   rŽ   Ú
all_paramsÚall_modulesÚsorted_typess        rB   r„   r„   @  s6  € õ ˆ>ÑÔ˜aÒÐØˆØð ÝÐUÐUÀnÐUÑUÔUÑUÔUˆ
ÝÐSÐSÀNÐSÑSÔSÑSÔSˆØð 	 +ð 	å!Ð"KÐ"K¸NÐ"KÑ"KÔ"KÕQUÐVÑVÔVˆLÝð9Ø*6ð9ð 9ñô ð ð	ð 	ð 	ð 	õ ÐLÐL¸^ÐLÑLÔLÑLÔLð 	Ý!Ð"KÐ"K¸NÐ"KÑ"KÔ"KÕQUÐVÑVÔVˆLÝð(Ø%ð(ð (ñô ð ð	ð 	rD   Úignored_paramsÚ	device_idc                 óâ  — d}|�0t          |t          j        ¦  «        r|nt          j        |¦  «        }|€Ÿt          ||¦  «        D ]T}|j        j        dv rŒ|€|j        }Œ|j        j        |j        k    r$t          d|j        › d|j        j        › �¦  «        ‚ŒU|pt          j                             ¦   «         }|j        dk    rt          d¦  «        ‚t          j	        |¦  «        | _
        | S )a=  
    Determine device handle used for initializing FSDP.

    If a device is specified by ``device_id``,
    then returns device handle corresponds to that device type. Otherwise, If the
    module is already on a non-CPU device, then the device type is that non-CPU device type.
    If the module is on CPU or meta, then the device type is the current accelerator device.
    See the :ref:`Accelerators<accelerators>` for details.


    This method will be called once ignored parameters was determined, as the device handle maybe needed
    for other initialization.
    N>   ÚcpuÚmetazLFSDP does not support modules with different device types but got params on z and r¦   zOFSDP needs a non-CPU accelerator device, but no accelerator device is detected.)rX   ÚtorchÚdeviceÚ_get_orig_paramsrN   ÚRuntimeErrorÚ_CÚ_get_acceleratorr   Úfrom_devicerK   )r*   r   r£   r¤   Údetermined_deviceÚparams         rB   Ú_init_device_handler±   ]  s1  € ð( ÐØÐõ ˜)¥U¤\Ñ2Ô2ð)ˆIˆIå”˜iÑ(Ô(ð 	ð
 Ð Ý% f¨nÑ=Ô=ð 
	ð 
	ˆEØŒ|Ô  OÐ3Ð3ØØ Ð(Ø$)¤LÐ!Ð!à”<Ô$Ð(9Ô(>Ò>Ð>Ý&ð^Ø->Ô-Cð^ð ^ØJOÌ,ÔJ[ð^ð ^ñô ð ð ?ð
 .ÐLµ´×1JÒ1JÑ1LÔ1LÐØÔ! UÒ*Ð*ÝØañô ð õ -Ô8Ð9JÑKÔK€EÔØ€LrD   c                 ó¦   — t          |¦  «        | _        i }|                     ¦   «         D ]\  }}t          |¦  «        }|j        ||<   Œ|| _        | S rW   )Ú_get_buffer_namesÚ_buffer_namesÚnamed_buffersr   ÚdtypeÚ_buffer_name_to_orig_dtype)r*   r   r·   Úbuffer_nameÚbuffers        rB   Ú_init_buffer_staterº   Ž  sf   € õ
 ,¨FÑ3Ô3€EÔð
 :<ÐØ%×3Ò3Ñ5Ô5ð ?ð ?Ñˆ�VÝ'¨Ñ4Ô4ˆØ28´,Ð" ;Ñ/Ð/Ø'A€EÔ$Ø€LrD   Úmixed_precisionÚcpu_offloadÚlimit_all_gathersÚuse_orig_paramsÚbackward_prefetch_limitÚforward_prefetch_limitc                 ób  — | j         dk    rC|t          j        k    r&t          j        d|pt          j        › d�d¬¦  «         t          j        }n,|t          j        k    rt          j        dt          d¬¦  «         |pt          j        | _        |pt          ¦   «         | _	        |�4t          j                             dt          | j	        ¦  «        › �¦  «         t          j                             t"          d	¦  «        d
k    | _        |pt'          ¦   «         | _        || _        || _        t.          j        | _        d | _        t7          ¦   «         | _        t;          j        ¦   «         | _        tA          j!        | j        ||¦  «        | _"        d | _#        i }|| _$        d }	|	| _%        g }
|
| _&        | S )NrF   z/FSDP is switching to use `NO_SHARD` instead of z since the world size is 1.rU   ©Ú
stacklevelzoThe `NO_SHARD` sharding strategy is deprecated. If having issues, please use `DistributedDataParallel` instead.é   z'torch.distributed.fsdp.mixed_precision.Ú Ú1)'r:   r   ÚNO_SHARDÚwarningsÚwarnÚ
FULL_SHARDÚFutureWarningr,   r   r»   r¨   r¬   Ú_log_api_usage_onceÚstrÚosÚenvironÚgetr   Ú_use_full_prec_in_evalr   r¼   r½   Ú_use_orig_paramsr   ÚIDLEÚtraining_stateÚ_is_rootr   Ú_free_event_queuerY   Úget_debug_levelÚ_debug_levelÚexec_order_utilsÚ_ExecOrderDataÚ_exec_order_dataÚ_unshard_eventÚ_fully_sharded_module_to_handleÚ_handleÚparams)r*   r,   r»   r¼   r½   r¾   r¿   rÀ   rÝ   rÞ   rß   s              rB   Ú_init_core_staterà      sÑ  € ð Ô˜1ÒÐØÕ 0Ô 9Ò9Ð9ÝŒMð'Ø$ÐCÕ(8Ô(Cð'ð 'ð 'ð ð	ñ ô ð õ -Ô5ÐÐØ	Õ.Ô7Ò	7Ð	7ÝŒð<åð ð	
ñ 	
ô 	
ð 	
ð 0ÐNÕ3CÔ3N€EÔØ+Ð?­~Ñ/?Ô/?€EÔØÐ"ÝŒ×$Ò$ØRµc¸%Ô:OÑ6PÔ6PÐRÐRñ	
ô 	
ð 	
õ 	Œ
�ŠÕ2°BÑ7Ô7¸3Ò>ð 
Ô ð $Ð3¥z¡|¤|€EÔØ/€EÔØ,€EÔÝ(Ô-€EÔØ€E„NÝ-Ñ/Ô/€EÔÝÔ-Ñ/Ô/€EÔÝ-Ô<ØÔØØñô €EÔð
  €EÔð IKÐ#Ø,K€EÔ)ð '+€GØ€E„MØ"$€FØ€E„LØ€LrD   c                 óf   — g }|| _         g }|| _        g }|| _        d| _        d | _        d | _        | S )NT)Ú_root_pre_forward_handlesÚ_pre_forward_handlesÚ_post_forward_handlesÚ_sync_gradientsÚ
_comm_hookÚ_comm_hook_state)r*   râ   rã   rä   s       rB   Ú_init_runtime_staterè   ã  sK   € ð 8:ÐØ&?€EÔ#Ø24ÐØ!5€EÔØ35ÐØ"7€EÔØ €EÔØ€EÔØ!€EÔà€LrD   Úbackward_prefetchÚforward_prefetchc                 ó"   — || _         || _        | S rW   )ré   rê   )r*   ré   rê   s      rB   Ú_init_prefetching_staterì   ô  s   € ð 0€EÔØ-€EÔð €LrD   c                 ó’   — |�|                      ¦   «         nd }|r%|| j        k    rt          | j        ¦  «        | _        nd | _        | S rW   )Ú_get_root_meshr6   r#   rK   Ú_fsdp_extension)r*   r.   Ú	root_meshs      rB   Ú_init_extensionrñ     s[   € ð
 1<Ð0G�×*Ò*Ñ,Ô,Ð,ÈT€Ið ð %�y EÔ$6Ò6Ð6Ý 1°%Ô2FÑ GÔ GˆÔÐð !%ˆÔØ€LrD   c                 óŠ   — t           j        | _        t          ¦   «         }t	          ¦   «         | _        || _        i }|| _        | S rW   )r!   ÚFULL_STATE_DICTÚ_state_dict_typer   r   Ú_optim_state_dict_configÚ_state_dict_configÚ_unshard_params_ctx)r*   Ústate_dict_configÚunshard_params_ctxs      rB   Ú_init_state_dict_staterú     sB   € å*Ô:€EÔÝ)<Ñ)>Ô)>ÐÝ%=Ñ%?Ô%?€EÔ"Ø0€EÔØ57ÐØ 2€EÔà€LrD   rß   c                 óÐ   — |D ]b}t          |j        ¦  «        dk    rHd}|                      ¦   «         D ]\  }}||u r|} nŒ|st          d¦  «        ‚t	          d|› d�¦  «        ‚ŒcdS )zš
    Verify if the parameters are accepted by FSDP. The only restriction now
    is that the parameter cannot be a scalar tensor (param.shape == []).
    r   rÅ   zExpected param_name to be setz/FSDP doesn't support scalar parameters. Change z& to a 1D tensor with numel equal to 1.N)r_   ÚshapeÚnamed_parametersrv   r3   )r   rß   r°   Ú
param_nameÚnameÚparam_s         rB   Ú_verify_managed_paramsr    sº   € ð
 ð ð ˆÝˆuŒ{ÑÔ˜qÒ Ð ØˆJØ &× 7Ò 7Ñ 9Ô 9ð ð ‘��fØ˜F�?�?Ø!%�JØ�Eð #ð ð FÝ$Ð%DÑEÔEÐEÝðMØ$ðMð Mð Mñô ð ð !ðð rD   Úfully_sharded_moduleÚparam_init_fnÚsync_module_statesc                 ót  ‡ — t          |‰ j        |¦  «         t          |‰ j        ‰ j        ¦  «        }t          |‰ j        ‰ j        ¦  «        \  }}|s|r|�t          ||‰ j        ¦  «         n:|rt          ||‰ j        ‰ j        ¦  «         n|rt          j
        |ˆ fd„¬¦  «         d„ ‰ j        D ¦   «         }t          |‰ j        ||¦  «         t          |‰ j        |‰ j        ‰ j        ¦  «        ‰ _        t          t          |‰ j        ¦  «        ¦  «        }	t!          ||	¦  «         |r|‰ j        t$          v rXt'          ||	‰ j        ¦  «         |                     ¦   «         D ]-}
t-          |
t.          ¦  «        rt1          |
t.          d¦  «         Œ.t'          ||	‰ j        ¦  «         t5          ‰ |	|¦  «         ‰ S )zHInitialize a ``FlatParamHandle`` from a module ``fully_sharded_module``.Nc                 ó8   •— t          | ¦  «        d u o| ‰j        vS rW   )r   rˆ   )Ú	submoduler*   s    €rB   ú<lambda>z0_init_param_handle_from_module.<locals>.<lambda>Q  s(   ø€ Õ'=¸iÑ'HÔ'HÈDÐ'Pð (8Ø Ô!7Ð7ð rD   )Úcheck_fnc                 ó@   — h | ]}|                      ¦   «         D ]}|’ŒŒS rk   ©Úbuffers)r[   Úignored_moduler¹   s      rB   r™   z1_init_param_handle_from_module.<locals>.<setcomp>U  sK   € ð ð ð àØ$×,Ò,Ñ.Ô.ðð ð ð 	ðð ð ð rD   F)Ú_check_single_device_modulerŠ   Ú_get_device_from_device_idr8   rK   Ú_need_to_materialize_modulerˆ   Ú_materialize_with_param_init_fnÚ_materialize_meta_moduler'   Úmaterialize_moduleÚ_move_module_to_deviceÚ_get_compute_deviceÚcompute_devicerƒ   rª   r  r,   r4   Ú_sync_module_params_and_buffersr;   r  ÚhasattrÚFSDP_SYNCEDÚsetattrr+   Ú_init_param_handle_from_params)r*   r  r¤   r  r  Údevice_from_device_idÚis_meta_moduleÚis_torchdistX_deferred_initÚignored_buffersÚmanaged_paramsr¹   s   `          rB   Ú_init_param_handle_from_moduler!  2  sM  ø€ õ  Ð 4°eÔ6KÈYÑWÔWÐWÝ6Ø�5”:˜uÔ3ñô Ðõ 3NØ˜eÔ3°UÔ5Kñ3ô 3Ñ/€NÐ/ð 	ð 
Ð5ð 
¸=Ð;TÝ'Ø  -°Ô1Gñ	
ô 	
ð 	
ð 	
ð 
ð 
Ý Ø ØØÔ"ØÔ ñ		
ô 	
ð 	
ð 	
ð 
%ð 
ÝÔ(Ø ð8ð 8ð 8ð 8ð	
ñ 	
ô 	
ð 	
ðð à#Ô4ðñ ô €Oõ ØØÔØØñ	ô ð õ /ØØÔØØŒ
ØÔñô €EÔõ Õ*Ð+?ÀÔAVÑWÔWÑXÔX€NÝÐ/°Ñ@Ô@Ð@Øð 
ØÔ"Õ&@Ð@Ð@õ ,Ø$ n°eÔ6Jñô ð ð /×6Ò6Ñ8Ô8ð 8ð 8�Ý˜6¥;Ñ/Ô/ð 8Ý˜F¥K°Ñ7Ô7Ð7øÝ'Ø  .°%Ô2Eñ	
ô 	
ð 	
õ # 5¨.Ð:NÑOÔOÐOØ€LrD   c                 óL  — t          |¦  «        dk    rd S t          ||| j        t          | j                 | j        j        | j        j        | j        j	        | j        j
        | j        | j        | j        ¬¦  «        }|                     ¦   «          | j        rt!          d¦  «        ‚| j                             |j        ¦  «         || _        || j        |j        <   t-          j        d¦  «        }| j        j        r'|j        j        |k    r|                     |¦  «         d S d S d S )Nr   )Úfsdp_extensionz!Expected state._handle to be Noner¦   )r_   r   r  ÚSHARDING_STRATEGY_MAPr,   r¼   Úoffload_paramsr»   Úparam_dtypeÚreduce_dtypeÚkeep_low_precision_gradsr+   rÒ   rï   ÚshardrÞ   rv   rß   ÚappendÚ
flat_paramrÝ   Ú_fully_sharded_moduler¨   r©   Úflat_param_to)r*   rß   r  ÚhandleÚ
cpu_devices        rB   r  r  „  s+  € õ ˆ6�{„{�aÒÐØˆÝØØØÔÝ˜eÔ5Ô6ØÔÔ(ØÔÔ)ØÔÔ*ØÔÔ6ØÔØÔØÔ,ðñ ô €Fð ‡L‚L�N„N€NØ„}ð BÝÐ@ÑAÔAÐAØ	„L×Ò˜Ô)Ñ*Ô*Ð*Ø€E„MØJP€EÔ)¨&Ô*FÑGÝ”˜eÑ$Ô$€JØÔÔ'ð )¨FÔ,=Ô,DÈ
Ò,RÐ,RØ×Ò˜ZÑ(Ô(Ð(Ð(Ð(ð)ð )Ð,RÐ,RrD   Úroot_modulerˆ   c                 ó  — d}	 |�t          |¦  «        nt          ¦   «         }n5# t          $ r(}t          |dt          |¦  «        › �z   ¦  «        |‚d}~ww xY w|D ]a}t          |t          j        j        ¦  «        s"t          |dt          |¦  «        › �z   ¦  «        ‚t          |¦  «        rt          d¦  «        ‚Œb|  	                    ¦   «         D ]+}t          j        |¦  «        s|                     |¦  «         Œ,d„ |D ¦   «         }| |v rt          j        d|› �d¬	¦  «         |  	                    ¦   «         D ]L}t          |¦  «        }|�9t          |d
¦  «        st!          d¦  «        ‚|                     |j        ¦  «         ŒM|S )ah  
    Check that ``_ignored_modules`` is an iterable of ``nn.Module`` s without any FSDP instances.

    Return the modules contained in their module
    subtrees as a :class:`set`. Nested FSDP instances are excluded, but their
    already-computed ignored modules are included.

    ``_ignored_modules`` represents the argument passed by the user to FSDP.
    z>`ignored_modules` should be an iterable of `torch.nn.Module`s Nzbut got zbut got an iterable with z1`ignored_modules` should not include FSDP modulesc                 ót   — h | ]5}|                      ¦   «         D ]}t          |t          j        ¦  «        °|’ŒŒ6S rk   )ÚmodulesrX   Ú	fsdp_fileÚFullyShardedDataParallel)r[   r   Úchilds      rB   r™   z'_get_ignored_modules.<locals>.<setcomp>È  s\   € ð ð ð àØ—^’^Ñ%Ô%ðð ð Ý˜%¥Ô!CÑDÔDð	Øðð ð ð rD   z•Trying to ignore the top-level module passed into the FSDP constructor itself will result in all parameters being ignored and is not well-supported: rU   rÂ   rˆ   z?Expected optional_fsdp_state to have _ignored_modules attribute)ÚsetÚ	TypeErrorrN   rX   r¨   r…   r–   r   r3   r3  Útraversal_utilsÚ_composableÚaddrÈ   rÉ   r  rv   Úupdaterˆ   )	r0  rˆ   Ú
msg_prefixÚignored_root_modulesÚer   r€   r  Úoptional_fsdp_states	            rB   r‡   r‡   ¤  s  € ð R€JðQà%5Ð%A�CÐ Ñ!Ô!Ð!ÅsÁuÄuð 	Ðøõ ð Qð Qð QÝ˜
Ð%HµÐ5EÑ0FÔ0FÐ%HÐ%HÑHÑIÔIÈqÐPøøøøðQøøøà&ð Rð RˆÝ˜&¥%¤(¤/Ñ2Ô2ð 	UÝ˜JÐ)SÅTÈ&Á\Ä\Ð)SÐ)SÑSÑTÔTÐTÝ! &Ñ)Ô)ð 	Rõ ÐPÑQÔQÐQð	Rð ×%Ò%Ñ'Ô'ð -ð -ˆÝÔ*¨6Ñ2Ô2ð 	-Ø ×$Ò$ VÑ,Ô,Ð,øð
ð à*ðñ ô €Oð �oÐ%Ð%ÝŒð;à28ð;ð ;ð ð		
ñ 	
ô 	
ð 	
ð !×(Ò(Ñ*Ô*ð Ið Iˆ	Ý4°YÑ?Ô?ÐØÐ*ÝÐ.Ð0BÑCÔCð Ý$ØUñô ð ð ×"Ò"Ð#6Ô#GÑHÔHÐHøØÐs   „$ ¤
A®#AÁAr�   c                 ól  — t          ¦   «         }d„ |D ¦   «         }|                     |¦  «         |�!d„ |D ¦   «         }|                     |¦  «         |                      ¦   «         D ]L}t          |¦  «        }|�9t	          |d¦  «        st          d¦  «        ‚|                     |j        ¦  «         ŒM|S )z¯
    Return the parameters of the modules in ``ignored_modules`` and the parameters in ``ignored_parameters``.

    :class:`FlatParameter` s are excluded from the result.
    c                 ó^   — h | ]*}|                      ¦   «         D ]}t          |¦  «        °|’ŒŒ+S rk   )Ú
parametersr   )r[   ÚmÚps      rB   r™   z&_get_ignored_params.<locals>.<setcomp>í  sS   € ð !ð !ð !Ø¨A¯LªL©N¬Nð!ð !Ø'(ÕBTÐUVÑBWÔBWð!Ø	ð!ð !ð !ð !rD   Nc                 ó0   — h | ]}t          |¦  «        °|’ŒS rk   )r   )r[   rE  s     rB   r™   z&_get_ignored_params.<locals>.<setcomp>ô  s6   € ð (
ð (
ð (
ØÕ1CÀAÑ1FÔ1Fð(
Øð(
ð (
ð (
rD   rŠ   z>Expected optional_fsdp_state to have _ignored_params attribute)r7  r<  r3  r   r  rv   rŠ   )r0  r€   r�   Úall_ignored_paramsÚparams_in_ignored_modulesÚparams_in_ignored_parametersr  r@  s           rB   r‰   r‰   á  sý   € õ 36±%´%Ðð!ð !Ø"ð!ñ !ô !Ðð ×ÒÐ7Ñ8Ô8Ð8àÐ%ð(
ð (
Ø)ð(
ñ (
ô (
Ð$ð 	×!Ò!Ð">Ñ?Ô?Ð?ð !×(Ò(Ñ*Ô*ð Kð Kˆ	Ý4°YÑ?Ô?ÐØÐ*ÝÐ.Ð0AÑBÔBð Ý$ØTñô ð ð ×%Ò%Ð&9Ô&IÑJÔJÐJøàÐrD   c                 ód  ‡— t          ¦   «         }d„ |D ¦   «         Š|                     ˆfd„|                      ¦   «         D ¦   «         ¦  «         |                      ¦   «         D ]L}t	          |¦  «        }|�9t          |d¦  «        st          d¦  «        ‚|                     |j        ¦  «         ŒM|S )z6Return the cleaned buffer FQNs in ``ignored_modules``.c                 ó@   — h | ]}|                      ¦   «         D ]}|’ŒŒS rk   r  )r[   rD  r¹   s      rB   r™   z,_get_ignored_buffer_names.<locals>.<setcomp>  sA   € ð "ð "ð "Ø°a·i²i±k´kð"ð "Ø,2ˆð"ð "ð "ð "rD   c                 ó<   •— h | ]\  }}|‰v ¯	t          |¦  «        ’ŒS rk   ©r   )r[   r¸   r¹   Úbuffers_in_ignored_moduless      €rB   r™   z,_get_ignored_buffer_names.<locals>.<setcomp>  s;   ø€ ð 	
ð 	
ð 	
á#�˜VØÐ3Ð3Ð3õ ˜kÑ*Ô*à3Ð3Ð3rD   NrŒ   zDExpected optional_fsdp_state to have _ignored_buffer_names attribute)r7  r<  rµ   r3  r   r  rv   rŒ   )r0  r€   Úall_ignored_buffer_namesr  r@  rN  s        @rB   r‹   r‹     s÷   ø€ õ
 *-©¬Ðð"ð "Ø'ð"ñ "ô "Ðð ×#Ò#ð	
ð 	
ð 	
ð 	
à'2×'@Ò'@Ñ'BÔ'Bð	
ñ 	
ô 	
ñô ð ð !×(Ò(Ñ*Ô*ð Wð Wˆ	Ý4°YÑ?Ô?ÐØÐ*ÝÐ.Ð0GÑHÔHð Ý$ØZñô ð ð %×+Ò+Ð,?Ô,UÑVÔVÐVøà#Ð#rD   c                 ó>   — d„ |                       ¦   «         D ¦   «         S )zrReturn the fully prefixed names of all buffers in the module hierarchy rooted at ``root_module`` as a class:`set`.c                 ó2   — h | ]\  }}t          |¦  «        ’ŒS rk   rM  )r[   r¸   rf   s      rB   r™   z$_get_buffer_names.<locals>.<setcomp>(  s2   € ð ð ð Ù+9¨;¸Õ˜+Ñ&Ô&ðð ð rD   )rµ   )r0  s    rB   r³   r³   &  s/   € ðð Ø=H×=VÒ=VÑ=XÔ=Xðñ ô ð rD   c                 óü   — d„ t          | |¦  «        D ¦   «         }t          |¦  «        dk    r)t          j        d¦  «        |v r|€t	          d¦  «        ‚dS t          |¦  «        dk    rt	          d|› �¦  «        ‚dS )zí
    Raise an error if ``module`` has original parameters on multiple devices, ignoring the parameters in ``ignored_params``.

    Thus, after this method, the
    module must be either fully on the CPU or fully on a non-CPU device.
    c                 ó   — h | ]	}|j         ’Œ
S rk   ©r©   ©r[   r°   s     rB   r™   z._check_single_device_module.<locals>.<setcomp>8  s   € ÐRÐRÐR ˆuŒ|ÐRÐRÐRrD   rU   r¦   NzTTo support a module with both CPU and GPU params, please pass in device_id argument.rF   z;FSDP only supports single device modules but got params on )rª   r_   r¨   r©   r«   )r   r£   r¤   Údevicess       rB   r  r  -  s§   € ð SÐRÕ)9¸&À.Ñ)QÔ)QÐRÑRÔR€Gõ ˆ7�|„|�qÒÐ�Uœ\¨%Ñ0Ô0°GÐ;Ð;ØÐÝð5ñô ð ð Ðõ
 
ˆW‰Œ˜Ò	Ð	ÝØSÈ'ÐSÐSñ
ô 
ð 	
ð 
Ð	rD   r8   Údevice_handlec                 óR  — | €dS t          | t          j        ¦  «        r| nt          j        | ¦  «        }|j        dk    rg|j        €`t          j        d| › d|› d|                     ¦   «         › d|j        › d�	d¬	¦  «         t          j        |                     ¦   «         ¦  «        }|S )
z»
    Return a ``torch.device`` for the specified ``device_id``.

    Processes ``device_id`` and returns either the corresponding device or
    ``None`` if ``device_id`` is ``None``.
    Nr¦   z"FSDP got the argument `device_id` z	 on rank zJ, which does not have an explicit index. FSDP will use the current device z6. If this is incorrect, please explicitly call `torch.zk.set_device()` before FSDP initialization or pass in the explicit device index as the `device_id` argument.rU   rÂ   )rX   r¨   r©   rN   ÚindexrÈ   rÉ   Úcurrent_device)r¤   r8   rW  r©   s       rB   r  r  K  sÛ   € ð ÐØˆtå 	­5¬<Ñ8Ô8ÐUˆ	ˆ	½e¼lÈ9Ñ>UÔ>Uð ð „{�eÒÐ ¤Ð 4ÝŒð1°ð 1ð 1Øð1ð 1à0=×0LÒ0LÑ0NÔ0Nð1ð 1ð DJÄ;ð1ð 1ð 1ð ð	
ñ 	
ô 	
ð 	
õ ”˜m×:Ò:Ñ<Ô<Ñ=Ô=ˆØ€MrD   c                 ó:  — t          t          | |¦  «        ¦  «        }t          d„ |D ¦   «         ¦  «        }|                      ¦   «         D ]*}||v rŒ|                     d¬¦  «        D ]}||j        z  }ŒŒ+| ot          ot          d„ |D ¦   «         ¦  «        }||fS )zø
    Return if ``module`` has parameters on meta device and if ``module`` is using torchdistX deferred initialization.

    At most of the returned bools can
    be ``True``. If either is ``True``, then ``module`` needs to be
    materialized.
    c              3   ó$   K  — | ]}|j         V — Œd S rW   )Úis_metarU  s     rB   r]   z._need_to_materialize_module.<locals>.<genexpr>v  s$   è è € ÐCÐC¨5˜œÐCÐCÐCÐCÐCÐCrD   F©Úrecursec              3   ó>   K  — | ]}t          j        |¦  «        V — Œd S rW   )r(   Úis_fakerU  s     rB   r]   z._need_to_materialize_module.<locals>.<genexpr>‚  s,   è è € Ð@Ð@¨•”˜UÑ#Ô#Ð@Ð@Ð@Ð@Ð@Ð@rD   )rƒ   rª   Úanyr3  r  r]  Ú_TORCHDISTX_AVAIL)r   r£   r€   r   r  r  Úbufr  s           rB   r  r  i  sØ   € õ Õ*¨6°>ÑBÔBÑCÔC€NÝÐCÐC°NÐCÑCÔCÑCÔC€Nð —^’^Ñ%Ô%ð *ð *ˆ	Ø˜Ð'Ð'ØØ×$Ò$¨UÐ$Ñ3Ô3ð 	*ð 	*ˆCØ˜cœkÑ)ˆNˆNð	*ð Ðð 	AÝð	AåÐ@Ð@°Ð@Ñ@Ô@Ñ@Ô@ð  ð
 Ð6Ð6Ð6rD   c                 ó¨   — t          |¦  «        s"t          d|› dt          |¦  «        › �¦  «        ‚t          | |¦  «        }|D ]} ||¦  «         Œd S )Nz	Expected z to be callable but got )Úcallabler3   rN   Ú_get_modules_to_materialize)r0  r  r€   Úmodules_to_materializer   s        rB   r  r  ‡  s   € õ
 �MÑ"Ô"ð 
ÝØT˜ÐTÐT½tÀMÑ?RÔ?RÐTÐTñ
ô 
ð 	
õ 9¸ÀoÑVÔVÐØ(ð ð ˆØˆ�fÑÔÐÐðð rD   r  c           	      óŠ  — |p%t          j        |                     ¦   «         ¦  «        }t          | |¦  «        }d }	 t          j        ¦   «         5  |D ]Œ}t          j        |                     d¬¦  «        |                     d¬¦  «        ¦  «        }t          t          |¦  «        ¦  «        dk    }|r+|                     |d¬¦  «         |                     ¦   «          Œ�	 d d d ¦  «         d S # 1 swxY w Y   d S # t          $ r>}	t          j        dt!          |	¦  «        › dt#          |¦  «        › d�d¬	¦  «         |	‚d }	~	ww xY w)
NFr^  r   )r©   r_  zIUnable to call `reset_parameters()` for module on meta device with error z(. Please ensure that your module oftype z* implements a `reset_parameters()` method.rU   rÂ   )r¨   r©   rZ  rg  Úno_gradÚ	itertoolsÚchainrC  r  r_   rƒ   Úto_emptyÚreset_parametersÚBaseExceptionrÈ   rÉ   rÍ   rN   )
r0  r  r€   rW  Úmaterialization_devicerh  r   Úmodule_state_iterÚhas_module_statesr?  s
             rB   r  r  •  sÓ  € ð 3ð µe´lØ×$Ò$Ñ&Ô&ñ7ô 7Ðõ 9¸ÀoÑVÔVÐØ€Fðõ Œ]‰_Œ_ð 	.ð 	.Ø0ð .ð .�õ %.¤OØ×%Ò%¨eÐ%Ñ4Ô4à—N’N¨5�NÑ1Ô1ñ%ô %Ð!õ
 %(­Ð->Ñ(?Ô(?Ñ$@Ô$@À1Ò$DÐ!Ø$ð .Ø—O’OÐ+AÈ5�OÑQÔQÐQØ×+Ò+Ñ-Ô-Ð-øð.ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øõ ð ð ð ÝŒðMÝ!$ Q¡¤ðMð Må˜‘L”LðMð Mð Mð ð		
ñ 	
ô 	
ð 	
ð ˆøøøøðøøøs<   ¼C: ÁBC-Ã C: Ã-C1Ã1C: Ã4C1Ã5C: Ã:
EÄ9D=Ä=Ec                 óD  — g }t          j        | g¦  «        }| h}|rƒ|                     ¦   «         }|                     |¦  «         |                     ¦   «         D ]C}||vr=t          |¦  «        €.||vr*|                     |¦  «         |                     |¦  «         ŒD|°ƒ|S rW   )ÚcollectionsÚdequeÚpopleftr*  Úchildrenr   r;  )r0  r€   rh  ÚqueueÚvisited_modulesr   Úchild_modules          rB   rg  rg  »  sÂ   € ð
 /1ÐÝÔ˜{˜mÑ,Ô,€EØ'2 m€OØ
ð 
+Ø—’‘”ˆØ×%Ò% fÑ-Ô-Ð-Ø"ŸOšOÑ-Ô-ð 	+ð 	+ˆLà OÐ3Ð3Ý*¨<Ñ8Ô8Ð@Ø ¨Ð7Ð7à×#Ò# LÑ1Ô1Ð1Ø—’˜\Ñ*Ô*Ð*øð ð 
+ð "Ð!rD   r  c                 óú  ‡‡‡— t          j        d¦  «        Š|��#t          j        ¦   «         }|                     | ¦  «         g }g }|rÆ|                     ¦   «         }|                     ˆfd„|                     d¬¦  «        D ¦   «         ¦  «         |                     ˆfd„|                     d¬¦  «        D ¦   «         ¦  «         | 	                    ¦   «         D ]1}t          |t          j        ¦  «        s|                     |¦  «         Œ2|°Æˆfd„|D ¦   «         }	ˆfd„|D ¦   «         }
t          |	|
|¦  «         dS t          t          | ‰¦  «        d¦  «        }|�|j        ‰k    rt!          ¦   «          dS dS dS )	a£  
    Move ``module`` depending on ``device_from_device_id`` and its current device.

    This includes moving ignored modules' parameters.

    - If ``device_from_device_id`` is not ``None``, then this moves
    ``module`` to the device.
    - If ``device_from_device_id`` is ``None``, then this does not move
    ``module`` but warns the user if it is on CPU.

    Precondition: ``_check_single_device_module()``.
    r¦   Nc              3   ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S rW   rT  )r[   r°   r/  s     €rB   r]   z)_move_module_to_device.<locals>.<genexpr>ñ  s<   øè è € ð ð àØ”< :Ò-Ð-ð à-Ð-Ð-Ð-ðð rD   Fr^  c              3   ó2   •K  — | ]}|j         ‰k    ¯|V — Œd S rW   rT  )r[   r¹   r/  s     €rB   r]   z)_move_module_to_device.<locals>.<genexpr>ö  s<   øè è € ð ð àØ”= JÒ.Ð.ð à.Ð.Ð.Ð.ðð rD   c                 ó   •— g | ]}|‰v¯|‘Œ	S rk   rk   )r[   rE  r£   s     €rB   rn   z*_move_module_to_device.<locals>.<listcomp>þ  s#   ø€ ÐGÐGÐG ¨q¸Ð/FÐ/F˜!Ð/FÐ/FÐ/FrD   c                 ó   •— g | ]}|‰v¯|‘Œ	S rk   rk   )r[   rE  r  s     €rB   rn   z*_move_module_to_device.<locals>.<listcomp>ÿ  s#   ø€ ÐGÐGÐG˜a¨a°Ð.FÐ.F˜Ð.FÐ.FÐ.FrD   )r¨   r©   rt  ru  r*  rv  ÚextendrC  r  rw  rX   r4  r5  Ú_move_states_to_deviceÚnextrª   Ú_warn_cpu_init)r   r£   r  r  rx  rß   r  Úcurr_moduler  Úparams_to_moveÚbufs_to_mover°   r/  s    ``         @rB   r  r  Ñ  sã  øøø€ õ$ ”˜eÑ$Ô$€JØÑ(õ /:Ô.?Ñ.AÔ.AˆØ�Š�VÑÔÐØ%'ˆØ&(ˆØð 	,ØŸ-š-™/œ/ˆKð
 �MŠMð ð ð ð à(×3Ò3¸EÐ3ÑBÔBðñ ô ñ ô ð ð
 �NŠNð ð ð ð à)×1Ò1¸%Ð1Ñ@Ô@ðñ ô ñ ô ð ð
 )×1Ò1Ñ3Ô3ð ,ð ,�	Ý! )­YÔ-OÑPÔPð ,Ø—L’L Ñ+Ô+Ð+øð% ð 	,ð& HÐGÐGÐG VÐGÑGÔGˆØGÐGÐGÐG 7ÐGÑGÔGˆÝ˜~¨|Ð=RÑSÔSÐSØˆÝÕ! &¨.Ñ9Ô9¸4Ñ@Ô@€EØÐ˜Uœ\¨ZÒ7Ð7ÝÑÔÐÐÐð ÐÐ7Ð7rD   r  c                 ó\  — t          | ¦  «        dk    rt          |¦  «        dk    rdS t          | ¦  «        dk    r| d         j        }n t          |¦  «        dk    r|d         j        }t          j        d¦  «        }|�–| D ]r}t          j        ¦   «         5  |                     |¦  «        |_        |j        �$|j                             |¦  «        |j        _        ddd¦  «         n# 1 swxY w Y   Œs|D ]}|                     |¦  «        |_        ŒdS ||k    rt          ¦   «          dS dS )z­
    Move states to the specified device.

    Precondition: ``_check_single_device_module()`` and module's parameters and
    buffers have been materialized if needed.
    r   Nr¦   )r_   r©   r¨   rj  ÚtoÚdataÚgradrƒ  )rß   r  r  rZ  r/  r°   r¹   s          rB   r�  r�    s‰  € õ ˆ6�{„{�aÒÐ�C ™LœL¨AÒ-Ð-ØˆÝ
ˆ6�{„{�Q‚€Ø œÔ)ˆˆÝ	ˆW‰Œ˜Ò	Ð	Ø  œÔ*ˆÝ”˜eÑ$Ô$€JØÐ(ð ð 	Kð 	KˆEÝ”‘”ð Kð KØ"ŸXšXÐ&;Ñ<Ô<�”
Ø”:Ð)Ø&+¤j§m¢mÐ4IÑ&JÔ&J�E”J”OðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Køð ð 	;ð 	;ˆFØ Ÿ)š)Ð$9Ñ:Ô:ˆFŒKˆKð	;ð 	;à	˜:Ò	%Ð	%ÝÑÔÐÐÐð 
&Ð	%s   ÂAC)Ã)C-	Ã0C-	c                  ó2   — t          j        dd¬¦  «         d S )Nam  The passed-in `module` is on CPU and will thus have FSDP's sharding initialization run on CPU, which may be slower than on GPU. We recommend passing in the `device_id` argument for FSDP to move `module` to GPU for the sharding initialization. `module` must also be on GPU device to work with the `sync_module_states=True` flag since that requires GPU communication.rU   rÂ   )rÈ   rÉ   rk   rD   rB   rƒ  rƒ  '  s/   € Ý„Mð	1ð ðñ ô ð ð ð rD   c                 ó  — t          t          | |¦  «        d¦  «        }|�|j        j        dk    r|j        }n&t	          j        |                     ¦   «         ¦  «        }|�||k    rt          d|› d|› d|› �¦  «        ‚|S )a)  
    Determine and return this FSDP instance's compute device.

    If the module is already on a non-CPU device, then the compute device is that non-CPU
    device. If the module is on CPU, then the compute device is the current
    device.

    Since this method should be called after materializing the module, any
    non-CPU device should not be meta device. For now, the compute device is
    always a CUDA or CUDA-like device with its explicit index.

    Precondition: ``_check_single_device_module()`` and
    ``_move_module_to_device()``.
    Nr¦   z4Inconsistent compute device and `device_id` on rank z: z vs )r‚  rª   r©   rN   r¨   rZ  r3   )r   r£   r  r8   rW  r°   r  s          rB   r  r  3  s­   € õ* Õ! &¨.Ñ9Ô9¸4Ñ@Ô@€EØÐ˜Uœ\Ô.°%Ò7Ð7Øœˆˆåœ m×&BÒ&BÑ&DÔ&DÑEÔEˆØÐ(¨^Ð?TÒ-TÐ-TÝð;À4ð ;ð ;Øð;ð ;Ø#8ð;ð ;ñ
ô 
ð 	
ð ÐrD   c                 óè  — g }|                       ¦   «         D ]î}t          |t          d¦  «        sÖt          |t          d¦  «         |                     ¦   «         }t          |¦  «        rˆ|                     ¦   «         \  }}|D ]m}t          ||¦  «        xxt          j        d˜ x�\   }	 | 	                    |	¦  «         Œ<  xt          d˜ x�\    ŒM }
t          dt          |
¦  «        › �¦  «        ‚ŒÙ| 	                    |¦  «         Œï|D ]Â}|                     ¦   «         }t          |¦  «        rˆ|                     ¦   «         \  }}|D ]m}t          ||¦  «        xxt          j        d˜ x�\   }	 | 	                    |	¦  «         Œ<  xt          d˜ x�\    ŒM }
t          dt          |
¦  «        › �¦  «        ‚Œ­| 	                    |¦  «         ŒÃt          |¦  «         t          ||t          d¬¦  «         dS )zè
    Synchronize module states (i.e. parameters ``params`` and all not-yet-synced buffers) by broadcasting from rank 0 to all ranks.

    Precondition: ``sync_module_states == True`` and ``self.process_group`` has
    been set.
    FTrk   Nz#expected Tensor or OpaqueBase, got r   )Úsrc)r  Úgetattrr  r  Údetachr%   Ú__tensor_flatten__r¨   ÚTensorr*  r
   rv   rN   Ú+_check_module_states_for_sync_module_statesr$   ÚPARAM_BROADCAST_BUCKET_SIZE)r   rß   r+   Úmodule_statesr¹   Údetached_bufferÚattrsrf   ÚattrÚvÚ
unexpectedr°   Údetached_params                rB   r  r  V  sZ  € ð )+€MØ—.’.Ñ"Ô"ð 6ð 6ˆå�v�{¨EÑ2Ô2ð 	6Ý�F�K¨Ñ.Ô.Ð.Ø$Ÿmšm™oœoˆOÝ,¨_Ñ=Ô=ð 6ð +×=Ò=Ñ?Ô?‘��qØ!ð 	ð 	�DÝ! /°4Ñ8Ô8Ø0Ð0�Uœ\˜^˜^˜^˜^™^˜^˜^Ø)×0Ò0°Ñ3Ô3Ð3Ð3ð 1Ð0à)�Z˜\˜\˜\˜\™\˜\Ø ð *à'Ý"0Ø XÅdÈ:ÑFVÔFVÐ XÐ Xñ#ô #ð ð	ð ×$Ò$ _Ñ5Ô5Ð5øàð 1ð 1ˆØŸš™œˆÝ(¨Ñ8Ô8ð 	1Ø%×8Ò8Ñ:Ô:‰HˆE�1Øð 	ð 	�Ý˜n¨dÑ3Ô3Ø,Ð,�œ˜˜˜˜™˜˜Ø%×,Ò,¨QÑ/Ô/Ð/Ð/ð -Ð,à%�˜˜˜˜™˜Øð &à#Ý,ØTÅ$ÀzÑBRÔBRÐTÐTñô ð ð	ð × Ò  Ñ0Ô0Ð0Ð0å/°Ñ>Ô>Ð>ÝØØÝ#Øð	ñ ô ð ð ð rD   r•  c                 ó^   — | r(t          d„ | D ¦   «         ¦  «        rt          d¦  «        ‚d S d S )Nc              3   óP   K  — | ]!}|j         t          j         d ¦  «        k    V — Œ"dS )r¦   N)r©   r¨   )r[   Útensors     rB   r]   z>_check_module_states_for_sync_module_states.<locals>.<genexpr>•  sD   è è € ð ð Ø17ˆŒ�œ eÑ,Ô,Ò,ðð ð ð ð ð rD   zÇThe module has CPU parameters or buffers when `sync_module_states=True`, which requires them to be on GPU. Please specify the `device_id` argument or move the module to GPU before passing it to FSDP.)rb  r3   )r•  s    rB   r“  r“  ’  sg   € ð ð 
�ð ð Ø;Hðñ ô ñ ô ð 
õ ðCñ
ô 
ð 	
ð
ð 
ð 
ð 
rD   c              #   ó¢   K  — |                       ¦   «         }	 	 t          |¦  «        }||vrt          |¦  «        s|V — Œ'# t          $ r Y dS w xY w)aD  
    Return an iterator over the original parameters in ``module``.

    The iterator does not return
    the parameters in ``ignored_params``, any ``FlatParameter`` s (which may be
    present due to nested FSDP wrapping), or any original parameters already
    flattened (only relevant when ``use_orig_params=True``).
    TN)rC  r‚  r   ÚStopIteration)r   r£   Ú	param_genr°   s       rB   rª   rª   Ÿ  sy   è è € ð ×!Ò!Ñ#Ô#€Iðð	Ý˜‘O”OˆEØ˜NÐ*Ð*Õ3EÀeÑ3LÔ3LÐ*Ø���ð	øõ ð ð ð Øˆˆðøøøs   ˜(A  Á 
AÁAc           	      ó´   — t          | ¦  «        D ]G\  }}||vr>t          |¦  «        s/t          d|› d|                     ¦   «         › d|j        › �¦  «        ‚ŒHdS )a5  
    Check that original parameters in ``fsdp_module`` have been flattened.

    The flattened parameters are made
    invisible to ``named_parameters()`` for the module hierarchy rooted at
    ``fsdp_module``. This should be called as a sanity check after flattening
    the wrapped module's parameters.
    z Found an unflattened parameter: z; ú N)r   r   r«   r9   Ú	__class__)Úfsdp_moduler£   rþ   r°   s       rB   Ú_check_orig_params_flattenedr¦  µ  s‹   € õ ?¸{ÑKÔKð ð Ñˆ
�EØ˜Ð&Ð&Õ/AÀ%Ñ/HÔ/HÐ&Ýð4°:ð 4ð 4Ø—:’:‘<”<ð4ð 4Ø"'¤/ð4ð 4ñô ð øðð rD   c                 óR   — | t           j        k    rt          j        nt          j        S rW   )r   rÇ   r   Úallreduce_hookÚreduce_scatter_hook)r,   s    rB   Ú_get_default_comm_hookrª  É  s)   € ð Õ 0Ô 9Ò9Ð9õ 	Ô$Ð$åÔ.ðrD   c                 ó,   — t          j        | ¬¦  «        S )NrG   )r   r<   rG   s    rB   rO   rO   Ñ  s   € õ Ô%°MÐBÑBÔBÐBrD   rW   )‹rt  rk  rÎ   rÈ   Úcollections.abcr   r   r   r   Útypingr   r   r	   r¨   Útorch.distributedÚdistributedrY   Ú(torch.distributed.fsdp._exec_order_utilsÚfsdpÚ_exec_order_utilsrÙ   Ú'torch.distributed.fsdp._traversal_utilsÚ_traversal_utilsr9  Ú2torch.distributed.fsdp.fully_sharded_data_parallelÚfully_sharded_data_parallelr4  Útorch.nnr…   Útorch._opaque_baser
   Ú(torch.distributed.algorithms._comm_hooksr   Útorch.distributed.device_meshr   Ú"torch.distributed.distributed_c10dr   Ú$torch.distributed.fsdp._common_utilsr   r   r   r   r   r   r   Ú"torch.distributed.fsdp._flat_paramr   r   r   r   Ú%torch.distributed.fsdp._limiter_utilsr   Útorch.distributed.fsdp.apir   r   r   r   r   r   r    r!   Útorch.distributed.fsdp.wrapr"   Ú&torch.distributed.tensor.parallel.fsdpr#   Útorch.distributed.utilsr$   Útorch.utils._python_dispatchr%   Útorch.utils.hooksr&   rc  Ú
torchdistxr'   r(   ÚImportErrorr”  r  r^   rZ   ÚHybridShardProcessGroupTypeÚProcessGroupTyperÇ   rÊ   ÚSHARD_GRAD_OPÚHYBRID_SHARDÚ_HYBRID_SHARD_ZERO2r$  r4   Ú#NO_RESHARD_AFTER_FORWARD_STRATEGIESrC   r5   ÚboolrM   rH   Úintrg   r}   rJ   r–   r†   r�   rƒ   r„   r7  r©   r±   rº   rà   rè   rì   rñ   rú   r  r!  r  r‡   r‰   rÍ   r‹   r³   r  r  r  r  r  rg  r’  r  r�  rƒ  r  r  r“  rª   r¦  rª  r<   rO   rk   rD   rB   ú<module>rÏ     sR  ðà Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ø BÐ BÐ BÐ BÐ BÐ BØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø AÐ AÐ AÐ AÐ AÐ Aðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð BÐ AÐ AÐ AÐ AÐ Að	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 0Ð /Ð /Ð /Ð /Ð /Ø DÐ DÐ DÐ DÐ DÐ DØ <Ð <Ð <Ð <Ð <Ð <Ø FÐ FÐ FÐ FÐ FÐ Fð ð 2Ø1Ð1Ð1Ð1Ð1Ð1àÐ ðØ.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øØð ð ð ØÐÐÐðøøøð 0Ð Ø€à# DÔ$5°tÔ7HÐ$HÔIÐ àÔ$Ð'BÑBÀTÑIÐ ð
 ÔÐ5Ô>ØÔÐ!7Ô!BØÔ"Ð$:Ô$HØÔ!Ð#9Ô#FØÔ(Ð*@Ô*TðÐ ð Ô!ØÔ(ðÐ ð
 Ô"ØÔ(ð'Ð #ð ð &*ð0ð 0Øð0à#ð0ð (ð0ð �d‰Nð	0ð
 ˜dÑ"ð0ð ð0ð 0ð 0ñ „ð0ðf ð(Øð(à#ð(ð ð(ð ð	(ð (ð (ñ „ð(ðV ð°#ð ¸$ð ð ð ñ „ðð ðI°Jð IÀ4ð Ið Ið Iñ „ðIð ð¸ð ÀÔARð ð ð ñ „ðð ð"ØÔ+ð"àð"ð 
Ôð"ð "ð "ñ „ð"ðJØÔ+ðàðð ˆ4Ô˜dÔ/Ð/Ô0ðð ð ð ð& ð ð+ð +Øð+àŒIð+ð ˜eœhœoÔ.°Ñ5ð+ð ˜UœXÔ/Ô0ØˆuŒxŒÔñ à
ñð	+ð ð+ð +ð +ñ „ð+ð\Ø˜”IðØ9=ðà	ðð ð ð ð: ð-Øð-àŒIð-ð ˜œÔ%ð-ð �U”\Ñ! DÑ(ð	-ð
 ð-ð -ð -ñ „ð-ð` ðØðàŒIðð ðð ð ñ „ðð" ð?Øð?à'¨$Ñ.ð?ð $ dÑ*ð?ð ˜dÑ"ð	?ð
 ð?ð ð?ð !ð?ð  ð?ð ð?ð ?ð ?ñ „ð?ðD ðØðàðð ð ñ „ðð  ð	Øð	à'ð	ð ð	ð ð		ð 	ð 	ñ „ð	ð ðð ˜:ð °Jð È*ð ð ð ñ „ðð ð *ð °ð ð ð ñ „ðð 2¤9ð °d¸2¼<Ô6Hð ÈTð ð ð ð ð( ðNØðNàœ)ðNð �U”\Ñ! DÑ(ðNð ˜RœY˜K¨Ð-Ô.°Ñ5ð	Nð
 ðNð ðNð Nð Nñ „ðNðb ð)Øð)à�”Ôð)ð œ)ð)ð )ð )ñ „ð)ð>:Ø”ð:à˜uœxœÔ/°$Ñ6ð:ð 	ˆŒ„^ð:ð :ð :ð :ð@ ?Cð"ð "Ø””ð"à˜œœÔ)ð"ð ! ¤Ô!3Ô4°tÑ;ð"ð 	ˆŒÔ	Ôð	"ð "ð "ð "ðJ$Ø””ð$à˜œœÔ)ð$ð 	ˆ„Xð$ð $ð $ð $ð@ 2¤9ð °°S´ð ð ð ð ð
ØŒIð
à˜œÔ%ð
ð �U”\Ñ! DÑ(ð
ð 
ð	
ð 
ð 
ð 
ð<Ø�U”\Ñ! DÑ(ðà
ðð %ðð „\�DÑð	ð ð ð ð<7ØŒIð7à˜œÔ%ð7ð ˜œ”^ð7ð ˆ4�ˆ:Ôð	7ð 7ð 7ð 7ð<Ø”ðà˜RœY˜K¨Ð-Ô.ðð ˜œ”^ðð 
ð	ð ð ð ð#Ø”ð#à œ<¨$Ñ.ð#ð ˜œ”^ð#ð %ð	#ð #ð #ð #ðL"Ø”ð"Ø-0°´¬^ð"à	ˆ"Œ)„_ð"ð "ð "ð "ð,3ØŒIð3à˜œÔ%ð3ð ˜œÔ&ð3ð !œ<¨$Ñ.ð	3ð
 
ð3ð 3ð 3ð 3ðlØ�”Ôðà�%”,Ôðð !œ<¨$Ñ.ðð 
ð	ð ð ð ð@	ð 	ð 	ðØŒIðà˜œÔ%ðð !œ<¨$Ñ.ðð ð	ð
 %ðð „\ðð ð ð ðF9ØŒIð9à�”Ôð9ð Ô$ð9ð 
ð	9ð 9ð 9ð 9ðx

Ø˜œÔ%ð

à	ð

ð 

ð 

ð 

ðØŒIðà˜œÔ%ðð ˆbŒlÔðð ð ð ð,à˜œÔ%ðð 
ðð ð ð ð(Ð.>ð ð ð ð ðCØÔ$ðCàÔðCð Cð Cð Cð Cð Cs   ÃC ÃC!Ã C!