+
    –°³j‡½  ã            
       ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RI	H
t
HtHt ^ RIt^ RIHt ^ RIHu Hu Ht ^ RIHu Hu Ht ^ RIHu Hu Ht ^ RIHt ^ RIHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$ ^ RI%H&t&H't'H(t(H)t)H*t*H+t+H,t, ^ R	I-H.t.H/t/H0t0H1t1 ^ R
I2H3t3 ^ RI4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t< ^ RI=H>t> ^ RI?H@t@ ^ RIAHBtB ^ RICHDtD ]'       d   ^ RIEHFtF RtG ^ RIHHItIHJtJ RbtLRtM]N]Pž                  ]Pž                  3,          tP]Pž                  ]P,          R,          tQ]:P¤                  ]1P¤                  ]:P¦                  ]1P¦                  ]:P¨                  ]1P¨                  ]:Pª                  ]1Pª                  ]:P¬                  ]1P¬                  /tW]:Pª                  ]:P¬                  .tX]:P¨                  ]:P¬                  3tY]RcR R ll4       tZ]R R l4       t[]R R l4       t\]R R l4       t]]R R l4       t^]R R  l4       t_R! R" lt`]RcR# R$ ll4       taR% R& ltb]R' R( l4       tc]R) R* l4       td]R+ R, l4       te]R- R. l4       tf]R/ R0 l4       tg]RcR1 R2 ll4       th]R3 R4 l4       tiR5 R6 ltj]R7 R8 l4       tk]R9 R: l4       tlR; R< ltmRcR= R> lltnR? R@ ltoRA RB ltpRC RD ltqRE RF ltrRG RH ltsRI RJ lttRK RL ltuRM RN ltvRO RP ltwRQ RR ltxRS tyRT RU ltzRV RW lt{RX RY lt|RZ R[ lt}R\ R] lt~R^ R_ ltR` Ra lt€R#   ]K d    RtG EL*i ; i)dé    N)ÚCallableÚ	GeneratorÚIterableÚIterator)ÚAnyÚno_type_checkÚTYPE_CHECKING)ÚCustomClassBase)Ú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ÚfakeFÚ_fsdp_syncedc                ó|   € V ^8„  d   QhR\         R\        R\        R\        R,          R\        R,          R\         /# )é   ÚstateÚprocess_groupÚsharding_strategyÚpolicyNÚdevice_meshÚreturn)r   ÚProcessGroupTyper   r"   r   )Úformats   "Úc/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/distributed/fsdp/_init_utils.pyÚ__annotate__r5   [   sM   € ÷ 0ñ 0Üð0ä#ð0ô (ð0ô �d�Nð	0ô
 ˜dÕ"ð0ô ñ0ó    c                 ón  € Ve   Ve   \        R4      hV\        9   pV'       d)   Vf   Vf   Vf   \        RV R24      h\        WV4      p M;V'       d   W@n        VP	                  ^ R7      V n        MVe   TM	\        4       V n        V P
                  P                  4       V n        V P
                  P                  4       V n	        V P                  pV'       d!   W`P                  P                  4       ,          p\        P                  P                  V4      V n        W`P                  ,          V n        V # )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.©Ú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/   r0   Úis_hybrid_strategyÚdata_parallel_world_sizes   &&&&&  r4   Ú_init_process_group_staterI   Z   sA  € ð Ò  [Ò%<Üð<ó
ð 	
ð +Ô.HÑHÐßØÒ  V¢^¸Ò8Kô Ø'Ð(9Ð':ð ;Sð Sóð ô
 ?Ø kó‰E÷ Ø!,ÔØ"-×"7Ñ"7ÀÐ"7Ó"CˆEÕð "/Ò!:‘Ô@RÓ@Tð Ôð ×$Ñ$×)Ñ)Ó+€E„JØ×*Ñ*×/Ñ/Ó1€EÔØ$×/Ñ/ÐßØ ×$8Ñ$8×$=Ñ$=Ó$?Õ?Ð ä×"Ñ"×AÑAØ$ó	
ð 
Ô$ð 	!×#CÑ#CÕCð 
Ô%ð €Lr6   c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r+   r,   r-   r0   r1   )r   r2   r   )r3   s   "r4   r5   r5   �   s0   € ÷ (ñ (Üð(ä#ð(ô ð(ô ñ	(r6   c                 óø  € V'       d_   \        V4      '       d6   W n        VP                  ^ R7      V n        VP                  ^R7      V n        M�\        RVP                   24      hVf=   \        4       p\        W0P                  P                  4       4      w  rEW@n        WPn        M8\        V4      '       d   Vw  V n        V n        M\        R\        V4       24      h\        V P                  R7      V n        V # )r   r8   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_meshr=   r>   rB   r-   r:   Ú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-   r0   Údefault_groupÚintra_node_groupÚinter_node_groups   &&&   r4   r<   r<   Ž   s  € ÷ Ü-¨k×:Ò:Ø!,Ôð $/×#8Ñ#8À!Ð#8Ó#DˆEÔ Ø"-×"7Ñ"7ÀÐ"7Ó"CˆEÕäØ>¸{×?OÑ?OÐ>PÐQóð ð 
Ò	Ü*Ó,ˆÜ-NØ×/Ñ/×<Ñ<Ó>ó.
Ñ*Ðð /Ôà/Õô *¨-×8Ò8ð 9FÑ5ˆEÔ Õ!5äðGÜGKÈMÓGZÐF[ð]óð ô
 ;Ø×*Ñ*ô€EÔð €Lr6   c                ó0   € V ^8„  d   QhR\         R\        /# ©r+   r-   r1   )r   Úbool)r3   s   "r4   r5   r5   »   s   € ÷ ñ ´#ð ¼$ñ r6   c                 óÆ   € \        V \        4      ;'       dK    \        V 4      ^8H  ;'       d5    \        ;QJ d    R V  4       F  '       d   K   R# 	  R# ! R V  4       4      # )r+   c              3   óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5i©N)Ú
isinstanceÚdistÚProcessGroup)Ú.0Úpgs   & r4   Ú	<genexpr>Ú1_is_valid_hybrid_shard_pg_type.<locals>.<genexpr>¿   s    é € ÐJ¹M°b”
˜2œt×0Ñ0×1Ð1»Mùó   ‚')FT)r_   ÚtupleÚlenÚallrL   s   &r4   rR   rR   º   sh   € ô 	�=¤%Ó(÷ 	Kð 	KÜ�Ó !Ñ#÷	Kð 	Kç‹CÑJ¹MÓJ�CŒCðò ðð ÑJ¹MÓJÓJðr6   c                ó0   € V ^8„  d   QhR\         R\        /# )r+   r0   r1   )r   r[   )r3   s   "r4   r5   r5   Ä   s   € ÷ Iñ I´Jð IÄ4ñ Ir6   c                 óP   € \        V \        4      ;'       d    V P                  ^8H  # )r+   )r_   r   rN   )r0   s   &r4   rM   rM   Ã   s"   € ä�k¤:Ó.×HÐH°;×3CÑ3CÀqÑ3HÐHr6   c                óD   € V ^8„  d   QhR\         R\        P                  /# )r+   Únum_devices_per_noder1   )Úintr`   ra   )r3   s   "r4   r5   r5   É   s    € ÷ ñ ¼ð Ä×ARÑARñ r6   c                ó6   € \         P                  ! V 4      w  rV# )a5  
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].
)r`   Únew_subgroups)rm   Úintra_node_subgroupÚ_s   &  r4   Ú_init_intra_node_process_grouprs   È   s   € ô "×/Ò/Ð0DÓEÑÐØÐr6   c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# ©r+   Úglobal_process_grouprm   r1   )r`   ra   rn   )r3   s   "r4   r5   r5   Ù   s2   € ÷ "ñ "Ü×+Ñ+ð"äð"ô 
×Ññ"r6   c                óŒ  € Rp\         P                  ! V 4      p\         P                  ! V 4      pWA,          p\         P                  ! V 4      V,          p\	        V4       FJ  p\	        V4       Uu. uF  q‡W�,          ,           NK  	  p	p\         P
                  ! W“R7      p
Wv8X  g   KH  T
pKL  	  Vf   \        V R24      hV# u upi )al  
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].
N)ÚranksÚbackendz. expected to assign inter-node pg, but did not)r`   Úget_backendÚget_world_sizeÚget_rankÚrangeÚ	new_groupÚAssertionError)rv   rm   Úinter_node_pgÚsharding_backendrA   Ú	num_nodesÚmy_local_rankÚ
local_rankÚiÚranks_for_inter_groupÚgrps   &&         r4   Ú_init_inter_node_process_grouprˆ   Ø   sÍ   € ð  €MÜ×'Ò'Ð(<Ó=ÐÜ×$Ò$Ð%9Ó:€JàÕ2€IÜ—M’MÐ"6Ó7Ð:NÕN€MÜÐ0Ö1ˆ
ä=BÀ9Ô=Mó!
Ù=M¸˜!Õ2×3Ð3Ñ=Mð 	ð !
ô �nŠnÐ#8ÔSˆØÖ&ØŠMñ 2ð ÒÜØˆoÐKÐLó
ð 	
ð Ðùò!
s   Á/Cc                óš   € V ^8„  d   QhR\         P                  R\        R\        \         P                  \         P                  3,          /# ru   )r`   ra   rn   rg   )r3   s   "r4   r5   r5   þ   sB   € ÷ ñ Ü×+Ñ+ðäðô Œ4×Ñœd×/Ñ/Ð/Õ0ñr6   c                ó.   € \        V4      \        W4      3# )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.
)rs   rˆ   )rv   rm   s   &&r4   rO   rO   þ   s    € ô 	'Ð';Ó<Ü&Ð';ÓRðð r6   c          
      óT  € V ^8„  d   QhR\         R\        P                  R\        \        P                  P                  ,          R,          R\        \        P                  P
                  ,          \        \        P                  P                  ,          ,          R,          R\         /# )r+   r,   ÚmoduleÚignored_modulesNÚignored_statesr1   )r   ÚnnÚModuler   ÚtorchÚ	Parameter)r3   s   "r4   r5   r5     s|   € ÷ +ñ +Üð+ä�I‰Ið+ô œeŸh™hŸo™oÕ.°Õ5ð+ô œUŸX™X×/Ñ/Õ0ÜŒu�x‰x�‰Õõ à
õð	+ô ñ+r6   c                 ó¸  € Ve   Ve   \        R4      hR pVR JpV'       d   \        V4      p\        VR4       M. p\        Ve   \        V4      M. R4       \        V4      ^ 8”  d-   \	        V^ ,          \
        P                  4      '       d   TpMTp\        W4      V n        \        VV P                  V4      V n
        \        VV P                  4      V n        V # )NzfCannot pass both ignored_modules and ignored_states at the same time. Please just pass ignored_states.TF)r:   ÚlistÚ_check_ignored_statesrh   r_   r�   r’   Ú_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   &&&&   r4   Ú_init_ignored_module_statesrŸ     sé   € ð Ò" ~Ò'AÜð:ó
ð 	
ð ÐØ-°TÐ9ÐßÜ" >Ó2ÐÜÐ1°4Õ8à ÐÜØ%4Ò%@ŒD�Ô!ÀbÈ%ô	
ô ÐÓ !Ô#ÜÐ)¨!Õ,¬b¯l©l×;Ò;Ø!4Ñà1ˆOÜ1°&ÓJ€EÔÜ/ØØ×ÑØó€EÔô
 #<ØØ×Ñó#€EÔð €Lr6   c                óJ   € V ^8„  d   QhR\         \        ,          R\        RR/# )r+   rŽ   r�   r1   N)r”   r   r[   )r3   s   "r4   r5   r5   @  s(   € ÷ ñ Üœ•IðÜ9=ðà	ñr6   c                óš  € \        V 4      ^ 8X  d   R# V'       dµ   \        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      p\        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      pV'       gC   V'       g9   \        V  Uu0 uF  p\        V4      kK  	  up\        R7      p\        RV 24      hR# R# \        ;QJ d    R V  4       F  '       d   K   RM	  RM! R V  4       4      '       g9   \        V  Uu0 uF  p\        V4      kK  	  up\        R7      p\        R	V 24      hR# u upi u upi )
z‹
Check that the ignored states are uniformly parameters or uniformly modules.

We may remove this check in the future if we permit mixing.
Nc              3   óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5ir^   )r_   r�   r’   ©rb   r,   s   & r4   rd   Ú(_check_ignored_states.<locals>.<genexpr>K  s   é € ÐUÁn¸Uœ E¬2¯<©<×8Ð8Ãnùrf   FTc              3   óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5ir^   ©r_   r�   r�   r£   s   & r4   rd   r¤   L  s   é € ÐSÁN¸5œ* U¬B¯I©I×6Ð6ÃNùrf   )ÚkeyzUignored_states expects all nn.Parameter or all nn.Module list elements but got types c              3   óV   "  € T F  p\        V\        P                  4      x € K!  	  R # 5ir^   r¦   r£   s   & r4   rd   r¤   U  s   é € ÐL¹^°E”:˜e¤R§Y¡Y×/Ð/»^ùrf   z>ignored_modules expects nn.Module list elements but got types )rh   ri   ÚsortedrS   Úreprr:   )rŽ   r�   Ú
all_paramsÚall_modulesr,   Úsorted_typess   &&    r4   r•   r•   @  s  € ô ˆ>Ó˜aÔÙßß“SÑUÁnÓU—S—S’SÑUÁnÓUÓUˆ
ß“cÑSÁNÓS—c—c’cÑSÁNÓSÓSˆß§+ä!¹NÓ"K¹N°5¤4¨¦;¹NÑ"KÔQUÔVˆLÜð*Ø*6¨ð9óð ñ #.‰z÷ ‹sÑL¹^ÓL�s�sŠsÑL¹^ÓL×LÒLÜ!¹NÓ"K¹N°5¤4¨¦;¹NÑ"KÔQUÔVˆLÜðØ%˜ð(óð ñ Mùò #Lùò #Ls   ÂEÄEc          
      óÊ   € V ^8„  d   QhR\         R\        P                  R\        \        P                  ,          R\
        \        P                  ,          R,          R\         /# )r+   r,   rŒ   Úignored_paramsÚ	device_idNr1   )r   r�   r�   Úsetr’   rn   r‘   Údevice)r3   s   "r4   r5   r5   ^  sU   € ÷ -ñ -Üð-ä�I‰Ið-ô œŸ™Õ%ð-ô ”U—\‘\Õ! DÕ(ð	-ô
 ñ-r6   c                ór  € RpVe9   \        V\        P                  4      '       d   TM\        P                  ! V4      pVfÚ   \        W4       F†  pVP                  P                  R9   d   K   Vf   VP                  pK2  VP                  P                  VP                  8w  g   KY  \        RVP                   RVP                  P                   24      h	  T;'       g    \        P                  P                  4       pVP                  R8X  d   \        R4      h\        P                  ! V4      V n
        V # )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ÚcpuzLFSDP does not support modules with different device types but got params on z and zOFSDP needs a non-CPU accelerator device, but no accelerator device is detected.>   r´   Úmeta)r_   r‘   r²   Ú_get_orig_paramsrS   ÚRuntimeErrorÚ_CÚ_get_acceleratorr   Úfrom_devicerP   )r,   rŒ   r¯   r°   Údetermined_deviceÚparams   &&&&  r4   Ú_init_device_handler½   ]  s  € ð( ÐØÒô ˜)¤U§\¡\×2Ò2ñ ä—’˜iÓ(ð 	ð
 Ò Ü% fÖ=ˆEØ�|‰|× Ñ  OÔ3ÙØ Ò(Ø$)§L¡LÒ!à—<‘<×$Ñ$Ð(9×(>Ñ(>Ö>Ü&ð-Ø->×-CÑ-CÐ,DÀEÈ%Ï,É,×J[ÑJ[ÐI\ð^óð ñ >ð .×LÐL´·±×1JÑ1JÓ1LÐØ×!Ñ! UÔ*ÜØaóð ô -×8Ò8Ð9JÓK€EÔØ€Lr6   c                óP   € V ^8„  d   QhR\         R\        P                  R\         /# )r+   r,   rŒ   r1   )r   r�   r�   )r3   s   "r4   r5   r5   �  s*   € ÷ ñ Üðä�I‰Iðô ñr6   c                 óš   € \        V4      V n        / pVP                  4        F  w  r4\        V4      pVP                  W#&   K   	  W n        V # r^   )Ú_get_buffer_namesÚ_buffer_namesÚnamed_buffersr   ÚdtypeÚ_buffer_name_to_orig_dtype)r,   rŒ   rÄ   Úbuffer_nameÚbuffers   &&   r4   Ú_init_buffer_staterÇ   Ž  sT   € ô
 ,¨FÓ3€EÔð
 :<ÐØ%×3Ñ3Ö5ÑˆÜ'¨Ó4ˆØ28·,±,Ð"Ó/ñ  6ð (BÔ$Ø€Lr6   c                ó®   € V ^8„  d   QhR\         R\        R,          R\        R,          R\        R,          R\        R\        R\
        R	\
        R
\         /	# )r+   r,   r.   NÚmixed_precisionÚcpu_offloadÚlimit_all_gathersÚuse_orig_paramsÚbackward_prefetch_limitÚforward_prefetch_limitr1   )r   r   r   r   r[   rn   )r3   s   "r4   r5   r5   ¡  sq   € ÷ ?ñ ?Üð?ä'¨$Õ.ð?ô $ dÕ*ð?ô ˜dÕ"ð	?ô
 ð?ô ð?ô !ð?ô  ð?ô ñ?r6   c                 óÚ  € V P                   ^8X  d[   V\        P                  8w  d5   \        P                  ! RT;'       g    \        P
                   R2^R7       \        P                  pM2V\        P                  8X  d   \        P                  ! R\        ^R7       T;'       g    \        P
                  V n        T;'       g    \        4       V n	        Ve6   \        P                  P                  R\        V P                  4       24       \        P                  P!                  \"        R4      R8H  V n        T;'       g    \'        4       V n        W@n        WPn        \.        P0                  V n        RV n        \7        4       V n        \:        P<                  ! 4       V n        \@        PB                  ! V P>                  VV4      V n"        RV n#        / pW€n$        Rp	W�n%        . p
W n&        V # )	é   z/FSDP is switching to use `NO_SHARD` instead of z since the world size is 1.©Ú
stacklevelzoThe `NO_SHARD` sharding strategy is deprecated. If having issues, please use `DistributedDataParallel` instead.Nz'torch.distributed.fsdp.mixed_precision.Ú Ú1)'rA   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_queuer`   Ú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   &&&&&&&&   r4   Ú_init_core_staterî      s¯  € ð ×Ñ˜1ÔØÔ 0× 9Ñ 9Ô9Ü�MŠMØAØ$×CÐCÔ(8×(CÑ(CÐDð E'ð'ð õ	ô -×5Ñ5ÑØ	Ô.×7Ñ7Ô	7Ü�Šð<äð õ	
ð 0×NÐNÔ3C×3NÑ3N€EÔØ+×?Ð?¬~Ó/?€EÔØÒ"Ü�‰×$Ñ$Ø5´c¸%×:OÑ:OÓ6PÐ5QÐRô	
ô 	�
‰
�‰Ô2°BÓ7¸3Ñ>ð 
Ô ð $×3Ð3¤z£|€EÔØ/ÔØ,ÔÜ(×-Ñ-€EÔØ€E„NÜ-Ó/€EÔÜ×-Ò-Ó/€EÔÜ-×<Ò<Ø×ÑØØó€EÔð
  €EÔð IKÐ#Ø,KÔ)ð '+€GØ„MØ"$€FØ„LØ€Lr6   c                ó0   € V ^8„  d   QhR\         R\         /# ©r+   r,   r1   ©r   )r3   s   "r4   r5   r5   ä  s   € ÷ ñ Üðäñr6   c                 ó`   € . pWn         . pW n        . pW0n        R V n        RV n        RV n        V # )TN)Ú_root_pre_forward_handlesÚ_pre_forward_handlesÚ_post_forward_handlesÚ_sync_gradientsÚ
_comm_hookÚ_comm_hook_state)r,   ró   rô   rõ   s   &   r4   Ú_init_runtime_staterù   ã  sE   € ð 8:ÐØ&?Ô#Ø24ÐØ!5ÔØ35ÐØ"7ÔØ €EÔØ€EÔØ!€EÔà€Lr6   c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r+   r,   Úbackward_prefetchÚforward_prefetchr1   )r   r   r[   )r3   s   "r4   r5   r5   õ  s0   € ÷ 	ñ 	Üð	ä'ð	ô ð	ô ñ		r6   c                 ó   € Wn         W n        V # r^   )rû   rü   )r,   rû   rü   s   &&&r4   Ú_init_prefetching_staterþ   ô  s   € ð 0ÔØ-Ôð €Lr6   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r+   r,   r0   r1   )r   r   )r3   s   "r4   r5   r5     s!   € ÷ ñ œ:ð ´Jð Ì*ñ r6   c                 ó¨   € Ve   VP                  4       MR pV'       d-   W P                  8w  d   \        V P                  4      V n        V # R V n        V # r^   )Ú_get_root_meshr=   r#   rP   Ú_fsdp_extension)r,   r0   Ú	root_meshs   && r4   Ú_init_extensionr    sR   € ð
 1<Ò0G�×*Ñ*Ô,ÈT€I÷ �y×$6Ñ$6Ô6Ü 1°%×2FÑ2FÓ GˆÔð
 €Lð !%ˆÔØ€Lr6   c                ó0   € V ^8„  d   QhR\         R\         /# rð   rñ   )r3   s   "r4   r5   r5     s   € ÷ ñ ¤*ð ´ñ r6   c                 ó~   € \         P                  V n        \        4       p\	        4       V n        Wn        / pW n        V # r^   )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   &  r4   Ú_init_state_dict_stater    s;   € ä*×:Ñ:€EÔÜ)<Ó)>ÐÜ%=Ó%?€EÔ"Ø0ÔØ57ÐØ 2Ôà€Lr6   c                ór   € V ^8„  d   QhR\         P                  R\        \         P                  ,          RR/# )r+   rŒ   rí   r1   N)r�   r�   r”   r’   )r3   s   "r4   r5   r5     s.   € ÷ ñ ¤2§9¡9ð ´d¼2¿<¹<Õ6Hð ÈTñ r6   c                óØ   € V Fc  p\        VP                  4      ^ 8X  g   K  RpV P                  4        F  w  rEW%J g   K  Tp M	  V'       g   \        R4      h\	        RV R24      h	  R# )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Ó   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)rh   ÚshapeÚnamed_parametersr   r:   )rŒ   rí   r¼   Ú
param_nameÚnameÚparam_s   &&    r4   Ú_verify_managed_paramsr    sw   € ó
 ˆÜˆu�{‰{Ó˜qÖ ØˆJØ &× 7Ñ 7Ö 9‘�Ø•?Ø!%�JÙñ !:÷ Ü$Ð%DÓEÐEÜðØ$˜Ð%KðMóð ó r6   c                óê   € V ^8„  d   QhR\         R\        P                  R\        \        P
                  ,          R,          R\        \        P                  .R3,          R,          R\        R\         /# )r+   r,   Úfully_sharded_moduler°   NÚparam_init_fnÚsync_module_statesr1   )r   r�   r�   rn   r‘   r²   r   r[   )r3   s   "r4   r5   r5   3  ss   € ÷ Nñ NÜðNäŸ)™)ðNô ”U—\‘\Õ! DÕ(ðNô œRŸY™Y˜K¨Ð-Õ.°Õ5ð	Nô
 ðNô ñNr6   c                ó8  a € \        VS P                  V4       \        VS P                  S P                  4      p\        VS P                  S P                  4      w  rgV'       g	   V'       d   Ve   \        WS P                  4       MOV'       d$   \        VVS P                  S P                  4       M$V'       d   \        P                  ! VV 3R lR7       S P                   UU	u0 uF  pVP                  4        F  p	V	kK  	  K  	  p
pp	\        VS P                  V
V4       \        VS P                  VS P                  S P                  4      S n        \        \!        VS P                  4      4      p\#        W4       V'       d‚   S P$                  \&        9   dW   \)        WS P*                  4       VP                  4        F,  p	\-        V	\.        4      '       g   K  \1        V	\.        R4       K.  	  \)        WS P2                  4       \5        S W±4       S # u up	pi )zHInitialize a ``FlatParamHandle`` from a module ``fully_sharded_module``.c                 óL   <€ \        V 4      R J ;'       d    V SP                  9  # r^   )r   r—   )Ú	submoduler,   s   &€r4   Ú<lambda>Ú0_init_param_handle_from_module.<locals>.<lambda>Q  s-   ø€ Ô'=¸iÓ'HÈDÐ'P÷ (8ð (8Ø ×!7Ñ!7Ñ7ð(8r6   )Úcheck_fnF)Ú_check_single_device_moduler™   Ú_get_device_from_device_idr?   rP   Ú_need_to_materialize_moduler—   Ú_materialize_with_param_init_fnÚ_materialize_meta_moduler'   Úmaterialize_moduleÚbuffersÚ_move_module_to_deviceÚ_get_compute_deviceÚcompute_devicer”   r¶   r  r.   r;   Ú_sync_module_params_and_buffersrB   Ú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_modulerÆ   Úignored_buffersÚmanaged_paramss   f&&&&       r4   Ú_init_param_handle_from_moduler6  2  sä  ø€ ô  Ð 4°e×6KÑ6KÈYÔWÜ6Ø�5—:‘:˜u×3Ñ3óÐô 3NØ˜e×3Ñ3°U×5KÑ5Kó3Ñ/€N÷ 	×5¸=Ò;TÜ'Ø °×1GÑ1Gõ	
÷ 
Ü Ø ØØ×"Ñ"Ø× Ñ õ		
÷ 
%Ü×(Ò(Ø ô8õ	
ð $×4Ò4ôá4ˆNØ$×,Ñ,Ö.ˆFó 	á.ñ 	Ù4ð ñ ô ØØ×ÑØØô	ô /ØØ×ÑØØ�
‰
Ø×Ñó€EÔô Ô*Ð+?À×AVÑAVÓWÓX€NÜÐ/Ô@ßØ×"Ñ"Ô&@Ô@ô ,Ø$°e×6JÑ6Jôð /×6Ñ6Ö8�Ü˜6¤;×/Ô/Ü˜F¤K°Ö7ñ 9ô 	(Ø °%×2EÑ2Eô	
ô # 5¨.ÔOØ€LùóYs   Ã&"Hc                óz   € V ^8„  d   QhR\         R\        \        P                  ,          R\        P                  /# )r+   r,   rí   r  )r   r”   r�   r’   r�   )r3   s   "r4   r5   r5   …  s3   € ÷ )ñ )Üð)ä”—‘Õð)ô Ÿ)™)ñ)r6   c                 ó  € \        V4      ^ 8X  d   R# \        VVV P                  \        V P                  ,          V P
                  P                  V P                  P                  V P                  P                  V P                  P                  V P                  V P                  V P                  R7      pVP                  4        V P                  '       d   \!        R4      hV P"                  P%                  VP&                  4       W0n        W0P(                  VP*                  &   \,        P.                  ! R4      pV P
                  P                  '       d1   VP&                  P.                  V8w  d   VP1                  V4       R# R# R# )r   N)Úfsdp_extensionz!Expected state._handle to be Noner´   )rh   r   r*  ÚSHARDING_STRATEGY_MAPr.   rÊ   Úoffload_paramsrÉ   Úparam_dtypeÚreduce_dtypeÚkeep_low_precision_gradsr-   rà   r  Úshardrì   r   rí   ÚappendÚ
flat_paramrë   Ú_fully_sharded_moduler‘   r²   Úflat_param_to)r,   rí   r  ÚhandleÚ
cpu_devices   &&&  r4   r/  r/  „  s,  € ô ˆ6ƒ{�aÔÙÜØØØ×ÑÜ˜e×5Ñ5Õ6Ø×Ñ×(Ñ(Ø×Ñ×)Ñ)Ø×Ñ×*Ñ*Ø×Ñ×6Ñ6Ø×ÑØ×ÑØ×,Ñ,ô€Fð ‡L�L„NØ‡}‡}€}ÜÐ@ÓAÐAØ	‡L�L×Ñ˜×)Ñ)Ô*Ø„MØJP×)Ñ)¨&×*FÑ*FÑGÜ—’˜eÓ$€JØ×Ñ×'×'Ð'¨F×,=Ñ,=×,DÑ,DÈ
Ô,RØ×Ñ˜ZÖ(ñ -SÑ'r6   c                óÆ   € V ^8„  d   QhR\         P                  R\        \        P                   P                  ,          R,          R\        \         P                  ,          /# )r+   Úroot_moduler—   Nr1   )r�   r�   r   r‘   r±   )r3   s   "r4   r5   r5   ¤  sD   € ÷ :ñ :Ü—‘ð:äœuŸx™xŸ™Õ/°$Õ6ð:ô 	Œ�‰…^ñ:r6   c           	     ó®  € Rp Ve   \        V4      M	\        4       pT Fg  p\        T\        P
                  P                  4      '       g   \        TR\        T4       2,           4      h\        T4      '       g   K^  \        R4      h	  T P                  4        F2  p\        P                  ! T4      '       d   K!  TP                  T4       K4  	  T UUu0 uF>  pTP                  4        F'  p\        T\        P                  4      '       d   K%  TkK)  	  K@  	  pppY9   d   \        P                   ! RX 2^R7       T P                  4        FL  p\        T4      p	T	f   K  \#        T	R4      '       g   \%        R	4      hTP'                  T	P(                  4       KN  	  T#   \         d%   p\        TR\        T4       2,           4      ThRp?ii ; iu uppi )
aP  
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 modulesz•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: rÑ   r—   z?Expected optional_fsdp_state to have _ignored_modules attribute)r±   Ú	TypeErrorrS   r_   r‘   r�   r�   r   r:   ÚmodulesÚtraversal_utilsÚ_composableÚaddÚ	fsdp_fileÚFullyShardedDataParallelrÖ   r×   r,  r   Úupdater—   )
rG  r—   Ú
msg_prefixÚignored_root_modulesÚerŒ   Úchildr�   r  Úoptional_fsdp_states
   &&        r4   r–   r–   ¤  s¾  € ð R€JðQà%5Ò%AŒCÐ Ô!ÄsÃuð 	ó
 'ˆÜ˜&¤%§(¡(§/¡/×2Ò2Ü˜JÐ+DÄTÈ&Ã\ÀNÐ)SÕSÓTÐTÜ! &×)Ô)ô ÐPÓQÐQñ 'ð ×%Ñ%Ö'ˆÜ×*Ò*¨6×2Ô2Ø ×$Ñ$ VÖ,ñ (ñ +ôá*ˆFØ—^‘^Ö%ˆEÜ˜%¤×!CÑ!C×D÷ 	ˆá%ñ 	Ù*ð ñ ð Ô%Ü�Šð2à28°ð;ð õ		
ð !×(Ñ(Ö*ˆ	Ü4°YÓ?ÐØÔ*ÜÐ.Ð0B×CÒCÜ$ØUóð ð ×"Ñ"Ð#6×#GÑ#GÖHñ +ð ÐøôQ ô QÜ˜
 x´Ð5EÓ0FÐ/GÐ%HÕHÓIÈqÐPûðQüó$s#   „F Ã5GÄ
GÆGÆ*G	Ç	Gc          	      ó8  € V ^8„  d   QhR\         P                  P                  R\        \         P                  P                  ,          R\        \         P                  P
                  ,          R,          R\        \         P                  P
                  ,          /# )r+   rG  r�   rœ   Nr1   )r‘   r�   r�   r±   r   r’   )r3   s   "r4   r5   r5   á  sh   € ÷ "ñ "Ü—‘—‘ð"äœŸ™Ÿ™Õ)ð"ô !¤§¡×!3Ñ!3Õ4°tÕ;ð"ô 	Œ�‰×	Ñ	Õñ	"r6   c                óü  € \        4       pV UUu0 uF.  qDP                  4        F  p\        V4      '       d   K  VkK  	  K0  	  pppVP                  V4       Ve6   V Uu0 uF  p\        V4      '       d   K  VkK  	  ppVP                  V4       V P	                  4        FL  p\        V4      p	V	f   K  \        V	R4      '       g   \        R4      hVP                  V	P                  4       KN  	  V# u uppi u upi )z£
Return the parameters of the modules in ``ignored_modules`` and the parameters in ``ignored_parameters``.

:class:`FlatParameter` s are excluded from the result.
r™   z>Expected optional_fsdp_state to have _ignored_params attribute)	r±   Ú
parametersr   rP  rJ  r   r,  r   r™   )
rG  r�   rœ   Úall_ignored_paramsÚmÚpÚparams_in_ignored_modulesÚparams_in_ignored_parametersr  rU  s
   &&&       r4   r˜   r˜   á  sþ   € ô 36³%Ðñ #ô!Ù"ˆa¯L©L®N qÔBTÐUV×BW�ˆ©N‰‘?ð ñ !ð ×ÑÐ7Ô8àÒ%á)ó(
Ù)�!Ô1CÀA×1F�AˆAÑ)ð 	%ð (
ð 	×!Ñ!Ð">Ô?ð !×(Ñ(Ö*ˆ	Ü4°YÓ?ÐØÔ*ÜÐ.Ð0A×BÒBÜ$ØTóð ð ×%Ñ%Ð&9×&IÑ&IÖJñ +ð Ðùó-!ùò(
s   �%C3º
C3Á C9Á8C9c                ó¸   € V ^8„  d   QhR\         P                  P                  R\        \         P                  P                  ,          R\        \        ,          /# ©r+   rG  r�   r1   )r‘   r�   r�   r±   rÛ   )r3   s   "r4   r5   r5     s?   € ÷ $ñ $Ü—‘—‘ð$äœŸ™Ÿ™Õ)ð$ô 	Œ…Xñ$r6   c           	     óÊ  € \        4       pV UUu0 uF  q3P                  4        F  qDkK  	  K  	  pppTP                  V P                  4        UUu0 uF  w  rdWE9   g   K  \	        V4      kK  	  upp4       V P                  4        FL  p\        V4      pVf   K  \        VR4      '       g   \        R4      hVP                  VP                  4       KN  	  V# u uppi u uppi )z6Return the cleaned buffer FQNs in ``ignored_modules``.r›   zDExpected optional_fsdp_state to have _ignored_buffer_names attribute)
r±   r'  rP  rÂ   r   rJ  r   r,  r   r›   )	rG  r�   Úall_ignored_buffer_namesrZ  rÆ   Úbuffers_in_ignored_modulesrÅ   r  rU  s	   &&       r4   rš   rš     së   € ô
 *-«Ðñ (ô"Ù'�1·i±i¶k¨FŠ±k‰™ð ñ "ð ×#Ñ#ð (3×'@Ñ'@Ô'Bô	
á'BÑ#�ØÑ3ô +Ô˜kÖ*Ù'Bò	
ôð !×(Ñ(Ö*ˆ	Ü4°YÓ?ÐØÔ*ÜÐ.Ð0G×HÒHÜ$ØZóð ð %×+Ñ+Ð,?×,UÑ,UÖVñ +ð $Ð#ùó-"ùó
	
s   � CÁ
C
Á C
c                óZ   € V ^8„  d   QhR\         P                  R\        \        ,          /# )r+   rG  r1   )r�   r�   r±   rÛ   )r3   s   "r4   r5   r5   &  s"   € ÷ ñ ¤2§9¡9ð ´´Sµñ r6   c                óh   € V P                  4        UUu0 uF  w  r\        V4      kK  	  upp# u uppi )zrReturn the fully prefixed names of all buffers in the module hierarchy rooted at ``root_module`` as a class:`set`.)rÂ   r   )rG  rÅ   rr   s   &  r4   rÀ   rÀ   &  s8   € ð >I×=VÑ=VÔ=XôÙ=X©>¨;Ô˜+Ö&Ñ=Xòð ùó s   ”.c                ó¶   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        \
        P                  ,          R,          RR/# )r+   rŒ   r¯   r°   Nr1   )r�   r�   r±   r’   rn   r‘   r²   )r3   s   "r4   r5   r5   -  sK   € ÷ 
ñ 
Ü�I‰Ið
äœŸ™Õ%ð
ô ”U—\‘\Õ! DÕ(ð
ð 
ñ	
r6   c                ó
  € \        W4       Uu0 uF  q3P                  kK  	  pp\        V4      ^8X  d-   \        P                  ! R4      V9   d   Vf   \	        R4      hR# \        V4      ^8”  d   \	        RV 24      hR# u upi )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.
r´   NzTTo support a module with both CPU and GPU params, please pass in device_id argument.z;FSDP only supports single device modules but got params on )r¶   r²   rh   r‘   r·   )rŒ   r¯   r°   r¼   Údevicess   &&&  r4   r!  r!  -  sŒ   € ô *:¸&Ô)QÓRÑ)Q �|Œ|Ñ)Q€GÐRô ˆ7ƒ|�qÔœUŸ\š\¨%Ó0°GÔ;ØÒÜð5óð ñ ô
 
ˆW‹˜Ô	ÜØIÈ'ÈÐSó
ð 	
ñ 
ùò Ss   ŽB c          	      ó¢   € V ^8„  d   QhR\         \        P                  ,          R,          R\         R\        R\        P                  R,          /# )r+   r°   Nr?   Údevice_handler1   )rn   r‘   r²   r   )r3   s   "r4   r5   r5   K  sG   € ÷ ñ Ü”U—\‘\Õ! DÕ(ðä
ðô %ðô ‡\�\�DÕñ	r6   c                ó‚  € V f   R# \        V \        P                  4      '       d   T M\        P                  ! V 4      pVP                  R8w  dp   VP                  fb   \
        P                  ! RV  RV RVP                  4        RVP                   R2	^R7       \        P                  ! VP                  4       4      pV# )	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.rÑ   )r_   r‘   r²   rS   ÚindexrÖ   r×   Úcurrent_device)r°   r?   ri  r²   s   &&& r4   r"  r"  K  s³   € ð ÒÙä 	¬5¯<©<×8Ò8‰	¼e¿lºlÈ9Ó>Uð ð ‡{�{�eÔ §¡Ò 4Ü�ŠØ0°°¸9Øˆfð 0Ø0=×0LÑ0LÓ0NÐ/Oð PCØCIÇ;Á;À-ð P1ð1ð õ	
ô —’˜m×:Ñ:Ó<Ó=ˆØ€Mr6   c          
      óÒ   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        \         P                  ,          R\        \
        \
        3,          /# )r+   rŒ   r¯   r�   r1   )r�   r�   r±   r’   rg   r[   )r3   s   "r4   r5   r5   i  sN   € ÷ 7ñ 7Ü�I‰Ið7äœŸ™Õ%ð7ô œŸ™•^ð7ô Œ4”ˆ:Õñ	7r6   c                óÎ  € \        \        W4      4      p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      pV P                  4        F6  pWR9   d   K  VP	                  RR7       F  pWFP
                  ,          pK  	  K8  	  V'       * ;'       dC    \        ;'       d5    \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      pWG3# )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   ó8   "  € T F  qP                   x € K  	  R # 5ir^   )Úis_meta©rb   r¼   s   & r4   rd   Ú._need_to_materialize_module.<locals>.<genexpr>v  s   é € ÐC±N¨5Ÿž³Nùs   ‚TF©Úrecursec              3   óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5ir^   )r(   Úis_fakerq  s   & r4   rd   rr  ‚  s   é € Ð@±¨”—’˜U×#Ð#³ùs   ‚#%)r”   r¶   ÚanyrJ  r'  rp  Ú_TORCHDISTX_AVAIL)rŒ   r¯   r�   r5  r1  r  Úbufr2  s   &&&     r4   r#  r#  i  sÅ   € ô Ô*¨6ÓBÓC€Nß“SÑC±NÓC—S—S’SÑC±NÓCÓC€Nð —^‘^Ö%ˆ	ØÔ'ÙØ×$Ñ$¨UÐ$Ö3ˆCØŸk™kÕ)ŠNó 4ñ &ð Ô÷ 	Að 	AÜ÷	Að 	Aç‹CÑ@±Ó@�C�CŠCÑ@±Ó@Ó@ð  ð
 Ð6Ð6r6   c                ó®   € V ^8„  d   QhR\         P                  R\        \         P                  .R3,          R\        \         P                  ,          RR/# )r+   rG  r  Nr�   r1   )r�   r�   r   r±   )r3   s   "r4   r5   r5   ‡  sL   € ÷ ñ Ü—‘ðäœRŸY™Y˜K¨Ð-Õ.ðô œŸ™•^ðð 
ñ	r6   c                 ó”   € \        V4      '       g   \        R V R\        V4       24      h\        W4      pV F  pV! V4       K  	  R# )z	Expected z to be callable but got N)Úcallabler:   rS   Ú_get_modules_to_materialize)rG  r  r�   Úmodules_to_materializerŒ   s   &&&  r4   r$  r$  ‡  sR   € ô
 �M×"Ò"ÜØ˜�Ð&>¼tÀMÓ?RÐ>SÐTó
ð 	
ô 9¸ÓVÐÛ(ˆÙ�fÖó )r6   c                ó¨   € V ^8„  d   QhR\         P                  R\        P                  R,          R\        \         P                  ,          R\
        /# )r+   rG  r0  Nr�   ri  )r�   r�   r‘   r²   r±   r   )r3   s   "r4   r5   r5   •  sE   € ÷ #ñ #Ü—‘ð#ä Ÿ<™<¨$Õ.ð#ô œŸ™•^ð#ô %ñ	#r6   c           
      ó†  € T;'       g%    \         P                  ! VP                  4       4      p\        W4      pR p \         P                  ! 4       ;_uu_ 4        V F~  p\
        P                  ! VP                  RR7      VP                  RR7      4      p\        \        V4      4      ^ 8„  pV'       g   K[  VP                  VRR7       VP                  4        K€  	  R R R 4       R #   + '       g   i     R # ; i  \         d9   p	\        P                  ! R\!        T	4       R\#        T4       R2^R7       T	hR p	?	ii ; i)NFrs  )r²   rt  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.rÑ   )r‘   r²   rl  r}  Úno_gradÚ	itertoolsÚchainrX  r'  rh   r”   Úto_emptyÚreset_parametersÚBaseExceptionrÖ   r×   rÛ   rS   )
rG  r0  r�   ri  Úmaterialization_devicer~  rŒ   Úmodule_state_iterÚhas_module_statesrS  s
   &&&&      r4   r%  r%  •  s  € ð 3÷ ð ´e·l²lØ×$Ñ$Ó&ó7Ðô 9¸ÓVÐØ€Fðô �]Š]�_�_Û0�ô %.§O¢OØ×%Ñ%¨eÐ%Ó4à—N‘N¨5�NÓ1ó%Ð!ô
 %(¬Ð->Ó(?Ó$@À1Ñ$DÐ!ß$Ñ$Ø—O‘OÐ+AÈ5�OÔQØ×+Ñ+Ö-ñ 1÷ �_�_Š_ûô ô Ü�Šð!Ü!$ Q£ ð )Ü˜“L�>Ð!KðMð õ		
ð ˆûðús<   ½C= ÁAC)Â8'C)ÃC= Ã)C:	Ã4C= Ã:C= Ã=E Ä3D;Ä;E c                ó¤   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        \         P                  ,          /# r_  )r�   r�   r±   r”   )r3   s   "r4   r5   r5   »  s8   € ÷ "ñ "Ü—‘ð"Ü-0´·±­^ð"ä	Œ"�)‰)…_ñ"r6   c                 óD  € . p\         P                  ! V .4      pV 0pV'       d|   VP                  4       pVP                  V4       VP	                  4        FD  pWd9  g   K  \        V4      e   K  Wa9  g   K"  VP                  V4       VP                  V4       KF  	  Kƒ  V# r^   )ÚcollectionsÚdequeÚpopleftr@  Úchildrenr   rM  )rG  r�   r~  ÚqueueÚvisited_modulesrŒ   Úchild_modules   &&     r4   r}  r}  »  s‰   € ð
 /1ÐÜ×Ò˜{˜mÓ,€EØ'2 m€Oß
Ø—‘“ˆØ×%Ñ% fÔ-Ø"ŸO™OÖ-ˆLàÖ3Ü*¨<Ó8Ô@Ø Ö7à×#Ñ# LÔ1Ø—‘˜\Ö*ó .ð "Ð!r6   c          
      óÖ   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        \        P
                  ,          R\        P                  R,          RR/# )r+   rŒ   r¯   r4  r0  Nr1   )r�   r�   r±   r’   r‘   ÚTensorr²   )r3   s   "r4   r5   r5   Ñ  sY   € ÷ 3ñ 3Ü�I‰Ið3äœŸ™Õ%ð3ô œŸ™Õ&ð3ô !Ÿ<™<¨$Õ.ð	3ð
 
ñ3r6   c                ó
  a€ \         P                  ! R4      oVEe%   \        P                  ! 4       pVP	                  V 4       . p. pV'       d³   VP                  4       pVP                  V3R lVP                  RR7       4       4       VP                  V3R lVP                  RR7       4       4       VP                  4        F6  p\        V\        P                  4      '       d   K%  VP	                  V4       K8  	  Kº  V U	u. uF  q™V9  g   K  V	NK  	  p
p	V U	u. uF  q™V9  g   K  V	NK  	  pp	\        W«V4       R# \        \        W4      R4      pVe    VP                  S8X  d   \!        4        R# R# R# u up	i u up	i )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   óN   <"  € T F  pVP                   S8X  g   K  Vx € K  	  R # 5ir^   ©r²   )rb   r¼   rE  s   & €r4   rd   Ú)_move_module_to_device.<locals>.<genexpr>ñ  s&   øé € ð áB�EØ—<‘< :Ñ-÷ ’ÛBùó   ƒ%›
%Frs  c              3   óN   <"  € T F  pVP                   S8X  g   K  Vx € K  	  R # 5ir^   r—  )rb   rÆ   rE  s   & €r4   rd   r˜  ö  s&   øé € ð á@�FØ—=‘= JÑ.÷ ’Û@ùr™  )r‘   r²   rŒ  r�  r@  rŽ  ÚextendrX  r'  r�  r_   rN  rO  Ú_move_states_to_deviceÚnextr¶   Ú_warn_cpu_init)rŒ   r¯   r4  r0  r�  rí   r'  Úcurr_moduler  r[  Úparams_to_moveÚbufs_to_mover¼   rE  s   &&&&         @r4   r(  r(  Ñ  sS  ø€ ô$ —’˜eÓ$€JØÓ(ô /:×.?Ò.?Ó.AˆØ�‰�VÔØ%'ˆØ&(ˆßØŸ-™-›/ˆKð
 �M‰Mô à(×3Ñ3¸EÐ3ÔBóô ð
 �N‰Nô à)×1Ñ1¸%Ð1Ô@óô ð
 )×1Ñ1Ö3�	Ü! )¬Y×-OÑ-O×PÔPØ—L‘L Ö+ó 4ñ &,ÓG¡V ¸Ñ/FŸ!˜!¡VˆÐGÙ#*ÓG¡7˜a°Ñ.FŸ˜¡7ˆÐGÜ˜~Ð=RÔSÙÜÔ! &Ó9¸4Ó@€EØÒ˜UŸ\™\¨ZÔ7ÜÖñ 8Ñùò HùÚGs   ÄE;ÄE;ÄF Ä+F c                ó¶   € V ^8„  d   QhR\         \        P                  ,          R\         \        P                  ,          R\        P
                  R,          RR/# )r+   rí   r'  r0  Nr1   )r”   r�   r’   r‘   r”  r²   )r3   s   "r4   r5   r5     sK   € ÷ ñ Ü”—‘Õðä”%—,‘,Õðô !Ÿ<™<¨$Õ.ðð 
ñ	r6   c                ó–  € \        V 4      ^ 8X  d   \        V4      ^ 8X  d   R# \        V 4      ^ 8”  d   V ^ ,          P                  pM#\        V4      ^ 8”  d   V^ ,          P                  p\        P                  ! R4      pVeŸ   V  Fw  p\        P                  ! 4       ;_uu_ 4        VP	                  V4      Vn        VP                  e+   VP                  P	                  V4      VP                  n        RRR4       Ky  	  V F  pVP	                  V4      Vn        K  	  R# XV8X  d   \        4        R# R#   + '       g   i     KÂ  ; i)z�
Move states to the specified device.

Precondition: ``_check_single_device_module()`` and module's parameters and
buffers have been materialized if needed.
Nr´   )rh   r²   r‘   r�  ÚtoÚdataÚgradrž  )rí   r'  r0  rl  rE  r¼   rÆ   s   &&&    r4   rœ  rœ    só   € ô ˆ6ƒ{�aÔœC ›L¨AÔ-ÙÜ
ˆ6ƒ{�Q„Ø �×)Ñ)‰Ü	ˆW‹˜Ô	Ø  �×*Ñ*ˆÜ—’˜eÓ$€JØÒ(ó ˆEÜ—’—•Ø"ŸX™XÐ&;Ó<�”
Ø—:‘:Ò)Ø&+§j¡j§m¡mÐ4IÓ&J�E—J‘J”O÷ !‘ñ ó
 ˆFØ Ÿ)™)Ð$9Ó:ˆFŽKó à	˜:Ô	%ÜÖñ 
&÷ !—�ús   Â&AD7Ä7Ec                  ó6   € \         P                  ! R ^R7       R# )am  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.rÑ   N)rÖ   r×   © r6   r4   rž  rž  '  s   € Ü‡M‚Mð	1ð ÷r6   c                óÔ   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        P
                  R,          R\        R\        R\        P
                  /# )r+   rŒ   r¯   r0  Nr?   ri  r1   )r�   r�   r±   r’   r‘   r²   rn   r   )r3   s   "r4   r5   r5   3  s^   € ÷ ñ Ü�I‰IðäœŸ™Õ%ðô !Ÿ<™<¨$Õ.ðô ð	ô
 %ðô ‡\�\ñr6   c                ó  € \        \        W4      R4      pVe)   VP                  P                  R8w  d   VP                  pM$\        P                  ! VP                  4       4      pVe   Wb8w  d   \        RV RV RV 24      hV# )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²   rS   r‘   rl  r:   )rŒ   r¯   r0  r?   ri  r¼   r*  s   &&&&&  r4   r)  r)  3  s‰   € ô* Ô! &Ó9¸4Ó@€EØÒ˜UŸ\™\×.Ñ.°%Ô7ØŸ™‰äŸš m×&BÑ&BÓ&DÓEˆØÒ(¨^Ô-TÜØBÀ4À&ÈØÐ˜dÐ#8Ð"9ð;ó
ð 	
ð Ðr6   c                ó’   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        P
                  RR/# )r+   rŒ   rí   r-   r1   N)r�   r�   r”   r’   r`   ra   )r3   s   "r4   r5   r5   V  sC   € ÷ 9ñ 9Ü�I‰Ið9ä”—‘Õð9ô ×$Ñ$ð9ð 
ñ	9r6   c                óž  € . pV P                  4        FÞ  p\        V\        R4      '       d   K  \        V\        R4       VP	                  4       p\        V4      '       d€   VP                  4       w  rgV Fe  p\        WX4      ;;\        P                  Rc ;e   w   p	 VP                  V	4       K;    ;\        Rc ;e   w    KN   p
\        R\        V
4       24      h	  KÍ  VP                  V4       Kà  	  V F´  pVP	                  4       p\        V4      '       d€   VP                  4       w  rgV Fe  p\        WÈ4      ;;\        P                  Rc ;e   w   p	 VP                  V	4       K;    ;\        Rc ;e   w    KN   p
\        R\        V
4       24      h	  K£  VP                  V4       K¶  	  \        V4       \        VV\        ^ R7       R# )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.
FTr¨  Nz(expected Tensor or CustomClassBase, got )Úsrc)r'  Úgetattrr-  r.  Údetachr%   Ú__tensor_flatten__r‘   r”  r@  r
   r   rS   Ú+_check_module_states_for_sync_module_statesr$   ÚPARAM_BROADCAST_BUCKET_SIZE)rŒ   rí   r-   Úmodule_statesrÆ   Údetached_bufferÚattrsrr   ÚattrÚvÚ
unexpectedr¼   Údetached_params   &&&          r4   r+  r+  V  s”  € ð )+€MØ—.‘.Ö"ˆä�vœ{¨E×2Ô2Ü�FœK¨Ô.Ø$Ÿm™m›oˆOÜ,¨_×=Ò=ð +×=Ñ=Ó?‘�Û!�DÜ! /Ó8Ù0œUŸ\™\Ÿ^Ð0Ù)×0Ñ0°Ö3ñ 1à.œ_×.Ú ð /à'Ü"0Ø"JÌ4ÐPZÓK[ÐJ\Ð ]ó#ð ó "ð ×$Ñ$ _Ö5ñ) #ó, ˆØŸ™›ˆÜ(¨×8Ò8Ø%×8Ñ8Ó:‰HˆEÛ�Ü˜nÓ3Ù,œŸ™ŸÐ,Ù%×,Ñ,¨QÖ/ñ -à*œ×*Úð +à#Ü,ØFÄtÈJÓGWÐFXÐYóð ó ð × Ñ  Ö0ñ ô" 0°Ô>ÜØØÜ#Ø÷	r6   c                óR   € V ^8„  d   QhR\         \        P                  ,          RR/# )r+   r³  r1   N)r”   r‘   r”  )r3   s   "r4   r5   r5   ’  s%   € ÷ 

ñ 

ÜœŸ™Õ%ð

à	ñ

r6   c                 ó¤   € V '       dH   \         ;QJ d    R  V  4       F  '       g   K   RM	  RM! R  V  4       4      '       d   \        R4      hR# R# )c              3   óf   "  € T F'  qP                   \        P                   ! R 4      8H  x € K)  	  R# 5i)r´   N)r²   r‘   )rb   Útensors   & r4   rd   Ú>_check_module_states_for_sync_module_states.<locals>.<genexpr>•  s#   é € ð Ù;H°�‰œŸš eÓ,Ö,»=ùs   ‚/1TFzÇ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.N)rw  r:   )r³  s   &r4   r±  r±  ’  sQ   € ÷ Ÿ›ñ Ù;HóŸŸšñ Ù;Hó÷ ò ô ðCó
ð 	
ñ�}r6   c                ó¤   € V ^8„  d   QhR\         P                  R\        \         P                  ,          R\        \         P                  ,          /# )r+   rŒ   r¯   r1   )r�   r�   r±   r’   r   )r3   s   "r4   r5   r5   Ÿ  s<   € ÷ ñ Ü�I‰IðäœŸ™Õ%ðô Œb�l‰lÕñr6   c              #  óª   "  € V P                  4       p  \        V4      pW19  g   K  \        V4      '       d   K'  Vx € K-    \         d     R# i ; i5i)a,  
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``).
N)rX  r�  r   ÚStopIteration)rŒ   r¯   Ú	param_genr¼   s   &&  r4   r¶   r¶   Ÿ  sM   é € ð ×!Ñ!Ó#€IðØÜ˜“OˆEØÖ*Ô3EÀe×3LÔ3LØ”øÜô Úðüs,   ‚A”A ¨A »A ÁAÁAÁAÁAc                óR   € V ^8„  d   QhR\         \        P                  ,          RR/# )r+   r¯   r1   N)r±   r�   r’   )r3   s   "r4   r5   r5   µ  s'   € ÷ ñ äœŸ™Õ%ðð 
ñr6   c           	     ó¸   € \        V 4       FJ  w  r#W19  g   K  \        V4      '       d   K   \        RV RVP                  4        RVP                   24      h	  R# )a  
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·   r@   Ú	__class__)Úfsdp_moduler¯   r  r¼   s   &&  r4   Ú_check_orig_params_flattenedrÈ  µ  sY   € ô ?¸{ÖKÑˆ
ØÖ&Ô/AÀ%×/HÔ/HÜØ2°:°,¸bØ—:‘:“<�.  %§/¡/Ð!2ð4óð ó Lr6   c                ó$   € V ^8„  d   QhR\         /# )r+   r.   )r   )r3   s   "r4   r5   r5   É  s   € ÷ ñ Ô.>ñ r6   c                 ól   € V \         P                  8X  d   \        P                  # \        P                  # r^   )r   rÕ   r   Úallreduce_hookÚreduce_scatter_hook)r.   s   &r4   Ú_get_default_comm_hookrÍ  É  s3   € ð Ô 0× 9Ñ 9Ô9ô 	×$Ñ$ðô ×.Ñ.ðr6   c                óX   € V ^8„  d   QhR\         P                  R\        P                  /# rZ   )r`   ra   r   rC   )r3   s   "r4   r5   r5   Ñ  s,   € ÷ Cñ CÜ×$Ñ$ðCä×ÑñCr6   c                 ó0   € \         P                  ! V R 7      # )rL   )r   rC   rL   s   &r4   rT   rT   Ñ  s   € ô ×%Ò%°MÔBÐBr6   i   r^   )�rŒ  r‚  rÜ   rÖ   Úcollections.abcr   r   r   r   Útypingr   r   r	   r‘   Útorch.distributedÚdistributedr`   Ú(torch.distributed.fsdp._exec_order_utilsÚfsdpÚ_exec_order_utilsrç   Ú'torch.distributed.fsdp._traversal_utilsÚ_traversal_utilsrK  Ú2torch.distributed.fsdp.fully_sharded_data_parallelÚfully_sharded_data_parallelrN  Útorch.nnr�   Útorch._custom_class_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&   rx  Ú
torchdistxr'   r(   ÚImportErrorr²  r-  rg   ra   ÚHybridShardProcessGroupTyper2   rÕ   rØ   ÚSHARD_GRAD_OPÚHYBRID_SHARDÚ_HYBRID_SHARD_ZERO2r:  r;   Ú#NO_RESHARD_AFTER_FORWARD_STRATEGIESrI   r<   rR   rM   rs   rˆ   rO   rŸ   r•   r½   rÇ   rî   rù   rþ   r  r  r  r6  r/  r–   r˜   rš   rÀ   r!  r"  r#  r$  r%  r}  r(  rœ  rž  r)  r+  r±  r¶   rÈ  rÍ  rT   r¨  r6   r4   Ú<module>rð     sQ  ðã Û Û 	Û ß CÓ Cß 4Ñ 4ã Ý  ß CÓ Cß AÓ Aß FÓ FÝ Ý 4Ý BÝ 4Ý A÷÷ ñ ÷ó õ B÷	÷ 	ó 	õ 0Ý DÝ <Ý F÷ Ý1àÐ ðß.ð 0Ð Ø€à# D×$5Ñ$5°t×7HÑ7HÐ$HÕIÐ à×$Ñ$Ð'BÕBÀTÕIÐ ð
 ×ÑÐ5×>Ñ>Ø×ÑÐ!7×!BÑ!BØ×"Ñ"Ð$:×$HÑ$HØ×!Ñ!Ð#9×#FÑ#FØ×(Ñ(Ð*@×*TÑ*TðÐ ð ×!Ñ!Ø×(Ñ(ðÐ ð
 ×"Ñ"Ø×(Ñ(ð'Ð #ð ö0ó ð0ðf ô(ó ð(ðV ôó ðð ôIó ðIð ôó ðð ô"ó ð"õJð& ö+ó ð+õ\ð: ô-ó ð-ð` ôó ðð" ô?ó ð?ðD ôó ðð  ô	ó ð	ð öó ðð ôó ðõð( ôNó ðNðb ô)ó ð)õ>:÷z"õJ$õ@õ
õ<õ<7õ<õ#õL"õ,3õlò@	õõF9õx

õõ,õ(÷Cøðq$ ô ØÓðús   ÃK: Ë:	LÌL