ó
    Eñij·  ã                   ój  • S SK r S SKrS SKrS SKrS SKJrJrJrJr  S SK	J
r
JrJrJr  S SKrS SKJr  S SKJs  Js  Jr  S SKJs  Js  Jr  S SKJs  Js  Jr  S SKJr  S SKJr  S SK J!r!  S SK"J#r#  S SK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+  S SK,J-r-J.r.J/r/J0r0  S S	K1J2r2  S S
K3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;  S SK<J=r=  S SK>J?r?  S SK@JArA  S SKBJCrC  \(       a  S SKDJErE  SrF S SKGJHrHJIrI  SrKSrL\M\Rœ                  \Rœ                  4   rO\\Rœ                  \O-     rP\9R¢                  \0R¢                  \9R¤                  \0R¤                  \9R¦                  \0R¦                  \9R¨                  \0R¨                  \9Rª                  \0Rª                  0rV\9R¨                  \9Rª                  /rW\9R¦                  \9Rª                  4rX\ S_S\&S\PS\9S\=S-  S\!S-  S\&4S jj5       rY\S\&S\PS\!S\&4S j5       rZ\S\
S\[4S j5       r\\S\!S\[4S j5       r]\S\^S\Rœ                  4S  j5       r_\S!\Rœ                  S\^S\Rœ                  4S" j5       r`S!\Rœ                  S\^S\M\Rœ                  \Rœ                  4   4S# jra\ S_S\&S$\RÄ                  S%\\R:                  RÄ                     S-  S&\\R:                  RÆ                     \\R:                  RÄ                     -  S-  S\&4
S' jj5       rdS&\e\
   S(\[SS4S) jrf\S\&S$\RÄ                  S*\g\RÆ                     S+\^\RÐ                  -  S-  S\&4
S, j5       ri\S\&S$\RÄ                  S\&4S- j5       rj\S\&S\9S-  S.\8S-  S/\5S-  S0\[S1\[S2\^S3\^S\&4S4 j5       rk\S\&S\&4S5 j5       rl\S\&S6\4S7\[S\&4S8 j5       rm\S_S\&S\!S\&4S9 jj5       rn\S\&S\&4S: j5       roS$\RÄ                  S;\e\RÆ                     SS4S< jrp\S\&S=\RÄ                  S+\^\RÐ                  -  S-  S>\\RÄ                  /S4   S-  S?\[S\&4S@ j5       rq\S\&S;\e\RÆ                     S=\RÄ                  4SA j5       rrSB\RÄ                  SC\\R:                  RÄ                     S-  S\g\RÄ                     4SD jrs S_SB\R:                  RÄ                  S%\g\R:                  RÄ                     SE\\R:                  RÆ                     S-  S\g\R:                  RÆ                     4SF jjrtSB\R:                  RÄ                  S%\g\R:                  RÄ                     S\g\u   4SG jrvSB\RÄ                  S\g\u   4SH jrwS$\RÄ                  S*\g\RÆ                     S+\^\RÐ                  -  S-  SS4SI jrxS+\^\RÐ                  -  S-  SJ\^SK\%S\RÐ                  S-  4SL jryS$\RÄ                  S*\g\RÆ                     S%\g\RÄ                     S\M\[\[4   4SM jrzSB\RÄ                  S>\\RÄ                  /S4   S%\g\RÄ                     SS4SN jr{SB\RÄ                  SO\RÐ                  S-  S%\g\RÄ                     SK\%4SP jr|SB\RÄ                  S%\g\RÄ                     S\e\RÄ                     4SQ jr}S$\RÄ                  S*\g\RÆ                     SR\g\Rü                     SO\RÐ                  S-  SS4
SS jrS;\e\RÆ                     ST\e\Rü                     SO\RÐ                  S-  SS4SU jr€SV r�S$\RÄ                  S*\g\RÆ                     SO\RÐ                  S-  SJ\^SK\%S\RÐ                  4SW jr‚S$\RÄ                  S;\e\RÆ                     S\Rœ                  SS4SX jrƒSY\e\Rü                     SS4SZ jr„S$\RÄ                  S*\g\RÆ                     S\\RÆ                     4S[ jr…S*\g\RÆ                     SS4S\ jr†S\94S] jr‡S\Rœ                  S\GR                  4S^ jr‰g! \J a    SrF GNÚf = f)`é    N)ÚCallableÚ	GeneratorÚIterableÚIterator)ÚAnyÚno_type_checkÚOptionalÚTYPE_CHECKING)Ú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                 óF  • Ub  Ub  [        S5      eU[        ;   nU(       a%  Uc  Uc  Uc  [        SU S35      e[        XU5      n O6U(       a  X@l        UR	                  SS9U l        OUb  UO	[        5       U l        U R
                  R                  5       U l        U R
                  R                  5       U l	        U R                  nU(       a  X`R                  R                  5       -  n[        R                  R                  U5      U l        X`R                  -  U l        U $ )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          Ú_/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/distributed/fsdp/_init_utils.pyÚ_init_process_group_staterC   Y   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ð 
Ô%ð €Ló    c                 óÞ  • U(       aW  [        U5      (       a/  X l        UR                  SS9U l        UR                  SS9U l        OŽ[        SUR                   35      eUc<  [        5       n[        X0R                  R                  5       5      u  pEX@l        XPl        O7[        U5      (       a  Uu  U l        U l        O[        S[        U5       35      e[        U R                  S9U l        U $ )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   �   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Ôð €LrD   c                 ó~   • [        U [        5      =(       a'    [        U 5      S:H  =(       a    [        S U  5       5      $ )Né   c              3   óV   #   • U  H  n[        U[        R                  5      v •  M!     g 7f©N)Ú
isinstanceÚdistÚProcessGroup)Ú.0Úpgs     rB   Ú	<genexpr>Ú1_is_valid_hybrid_shard_pg_type.<locals>.<genexpr>¾   s    é € ÐJºM°b”
˜2œt×0Ñ0×1Ð1ºMùó   ‚'))rX   ÚtupleÚlenÚallrG   s    rB   rM   rM   ¹   s:   € ô 	�=¤%Ó(÷ 	KÜ�Ó !Ñ#÷	KäÑJ¹MÓJÓJðrD   c                 óN   • [        U [        5      =(       a    U R                  S:H  $ )NrU   )rX   r   rI   )r.   s    rB   rH   rH   Â   s   € ä�k¤:Ó.×H°;×3CÑ3CÀqÑ3HÐHrD   Únum_devices_per_nodec                 ó6   • [         R                  " U 5      u  pU$ )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].
)rY   Únew_subgroups)rd   Úintra_node_subgroupÚ_s      rB   Ú_init_intra_node_process_groupri   Ç   s   € ô "×/Ò/Ð0DÓEÑÐØÐrD   Úglobal_process_groupc                 ód  • Sn[         R                  " U 5      n[         R                  " U 5      nXA-  n[         R                  " U 5      U-  n[	        U5       H?  n[	        U5       Vs/ s H	  o‡X�-  -   PM     n	n[         R
                  " X“S9n
Xv:X  d  M=  U
nMA     Uc  [        U S35      eU$ s  snf )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)rY   Úget_backendÚget_world_sizeÚget_rankÚrangeÚ	new_groupÚAssertionError)rj   rd   Úinter_node_pgÚsharding_backendr:   Ú	num_nodesÚmy_local_rankÚ
local_rankÚiÚranks_for_inter_groupÚgrps              rB   Ú_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Ñ=Mð 	ð !
ô �nŠnÐ#8ÑSˆØÕ&ØŠMñ 2ð ÑÜØˆoÐKÐLó
ð 	
ð Ðùò!
s   Á'B-c                 ó.   • [        U5      [        X5      4$ )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.
)ri   r|   )rj   rd   s     rB   rJ   rJ   ý   s    € ô 	'Ð';Ó<Ü&Ð';ÓRðð rD   ÚmoduleÚignored_modulesÚignored_statesc                 ó¤  • Ub  Ub  [        S5      eS nUS LnU(       a  [        U5      n[        US5        O/ n[        Ub  [        U5      O/ S5        [        U5      S:”  a'  [	        US   [
        R                  5      (       a  UnOUn[        X5      U l        [        UU R                  U5      U l
        [        UU R                  5      U l        U $ )NzfCannot pass both ignored_modules and ignored_states at the same time. Please just pass ignored_states.TFr   )r3   ÚlistÚ_check_ignored_statesra   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ÐÜÐ1°4Õ8à ÐÜØ%4Ñ%@ŒD�Ô!ÀbÈ%ô	
ô ÐÓ !Ó#ÜÐ)¨!Ñ,¬b¯l©l×;Ñ;Ø!4Ñà1ˆOÜ1°&ÓJ€EÔÜ/ØØ×ÑØó€EÔô
 #<ØØ×Ñó#€EÔð €LrD   r�   c                 ó´  • [        U 5      S:X  a  gU(       aj  [        S U  5       5      n[        S U  5       5      nU(       d>  U(       d6  [        U  Vs1 s H  n[        U5      iM     sn[        S9n[        SU 35      egg[        S U  5       5      (       d6  [        U  Vs1 s H  n[        U5      iM     sn[        S9n[        SU 35      egs  snf s  snf )	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   óV   #   • U  H  n[        U[        R                  5      v •  M!     g 7frW   )rX   r„   r…   ©r[   r*   s     rB   r]   Ú(_check_ignored_states.<locals>.<genexpr>J  s   é € ÐUÂn¸Uœ E¬2¯<©<×8Ð8Ânùr_   c              3   óV   #   • U  H  n[        U[        R                  5      v •  M!     g 7frW   ©rX   r„   ÚModuler’   s     rB   r]   r“   K  s   é € ÐSÂN¸5œ* U¬B¯I©I×6Ð6ÂNùr_   )ÚkeyzUignored_states expects all nn.Parameter or all nn.Module list elements but got types c              3   óV   #   • U  H  n[        U[        R                  5      v •  M!     g 7frW   r•   r’   s     rB   r]   r“   T  s   é € ÐLº^°E”:˜e¤R§Y¡Y×/Ð/º^ùr_   z>ignored_modules expects nn.Module list elements but got types )ra   rb   ÚsortedrN   Úreprr3   )r€   r�   Ú
all_paramsÚall_modulesr*   Úsorted_typess         rB   rƒ   rƒ   ?  sà   € ô ˆ>Ó˜aÓØÞÜÑUÁnÓUÓUˆ
ÜÑSÁNÓSÓSˆÞ¦+ä!¹NÓ"KºN°5¤4¨¦;¹NÑ"KÔQUÑVˆLÜð*Ø*6¨ð9óð ð #.ˆzô ÑL¹^ÓL×LÑLÜ!¹NÓ"KºN°5¤4¨¦;¹NÑ"KÔQUÑVˆLÜðØ%˜ð(óð ð Mùò #Lùò #Ls   ÁCÂ"CÚignored_paramsÚ	device_idc                 ób  • SnUb7  [        U[        R                  5      (       a  UO[        R                  " U5      nUcÔ  [        X5       Hƒ  nUR                  R                  S;   a  M  Uc  UR                  nM0  UR                  R                  UR                  :w  d  MV  [        SUR                   SUR                  R                   35      e   U=(       d    [        R                  R                  5       nUR                  S:X  a  [        S5      e[        R                  " U5      U l
        U $ )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¬   \  s  € ð( ÐØÑô ˜)¤U§\¡\×2Ñ2ñ ä—’˜iÓ(ð 	ð
 Ñ Ü% fÖ=ˆEØ�|‰|× Ñ  OÓ3ÙØ Ñ(Ø$)§L¡LÒ!à—<‘<×$Ñ$Ð(9×(>Ñ(>Õ>Ü&ð-Ø->×-CÑ-CÐ,DÀEÈ%Ï,É,×J[ÑJ[ÐI\ð^óð ñ >ð .×L´·±×1JÑ1JÓ1LÐØ×!Ñ! UÓ*ÜØaóð ô -×8Ò8Ð9JÓK€EÔØ€LrD   c                 óš   • [        U5      U l        0 nUR                  5        H  u  p4[        U5      nUR                  X#'   M      X l        U $ rW   )Ú_get_buffer_namesÚ_buffer_namesÚnamed_buffersr   ÚdtypeÚ_buffer_name_to_orig_dtype)r*   r~   r²   Úbuffer_nameÚbuffers        rB   Ú_init_buffer_staterµ   �  sT   € ô
 ,¨FÓ3€EÔð
 :<ÐØ%×3Ñ3Ö5ÑˆÜ'¨Ó4ˆØ28·,±,Ð"Ó/ñ  6ð (BÔ$Ø€LrD   Úmixed_precisionÚcpu_offloadÚlimit_all_gathersÚuse_orig_paramsÚbackward_prefetch_limitÚforward_prefetch_limitc                 ó¾  • U R                   S:X  aU  U[        R                  :w  a0  [        R                  " SU=(       d    [        R
                   S3SS9  [        R                  nO.U[        R                  :X  a  [        R                  " S[        SS9  U=(       d    [        R
                  U l        U=(       d
    [        5       U l	        Ub5  [        R                  R                  S[        U R                  5       35        [        R                  R!                  ["        S	5      S
:H  U l        U=(       d
    ['        5       U l        X@l        XPl        [.        R0                  U l        S U l        [7        5       U l        [:        R<                  " 5       U l        [@        RB                  " U R>                  UU5      U l"        S U l#        0 nX€l$        S n	X�l%        / n
X l&        U $ )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ŠMØAØ$×CÔ(8×(CÑ(CÐDð E'ð'ð ò	ô -×5Ñ5ÑØ	Ô.×7Ñ7Ó	7Ü�Šð<äð ò	
ð 0×NÔ3C×3NÑ3N€EÔØ+×?¬~Ó/?€EÔØÑ"Ü�‰×$Ñ$Ø5´c¸%×:OÑ:OÓ6PÐ5QÐRô	
ô 	�
‰
�‰Ô2°BÓ7¸3Ñ>ð 
Ô ð $×3¤z£|€EÔØ/ÔØ,ÔÜ(×-Ñ-€EÔØ€E„NÜ-Ó/€EÔÜ×-Ò-Ó/€EÔÜ-×<Ò<Ø×ÑØØó€EÔð
  €EÔð IKÐ#Ø,KÔ)ð '+€GØ„MØ"$€FØ„LØ€LrD   c                 ó`   • / nXl         / nX l        / nX0l        SU l        S U l        S U l        U $ )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ã   â  sE   € ð 8:ÐØ&?Ô#Ø24ÐØ!5ÔØ35ÐØ"7ÔØ €EÔØ€EÔØ!€EÔà€LrD   Úbackward_prefetchÚforward_prefetchc                 ó   • Xl         X l        U $ rW   )rä   rå   )r*   rä   rå   s      rB   Ú_init_prefetching_staterç   ó  s   € ð 0ÔØ-Ôð €LrD   c                 ó¢   • Ub  UR                  5       OS nU(       a+  X R                  :w  a  [        U R                  5      U l        U $ S U l        U $ rW   )Ú_get_root_meshr6   r#   rK   Ú_fsdp_extension)r*   r.   Ú	root_meshs      rB   Ú_init_extensionrì      sR   € ð
 1<Ñ0G�×*Ñ*Ô,ÈT€Iö �y×$6Ñ$6Ó6Ü 1°%×2FÑ2FÓ GˆÔð
 €Lð !%ˆÔØ€LrD   c                 ó~   • [         R                  U l        [        5       n[	        5       U l        Xl        0 nX l        U $ 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õ     s;   € ä*×:Ñ:€EÔÜ)<Ó)>ÐÜ%=Ó%?€EÔ"Ø0ÔØ57ÐØ 2Ôà€LrD   rÚ   c                 óÐ   • U H`  n[        UR                  5      S:X  d  M  SnU R                  5        H  u  pEX%L d  M  Un  O   U(       d  [        S5      e[	        SU S35      e   g)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)ra   ÚshapeÚnamed_parametersrs   r3   )r~   rÚ   r«   Ú
param_nameÚnameÚparam_s         rB   Ú_verify_managed_paramsrü     sw   € ó
 ˆÜˆu�{‰{Ó˜qÕ ØˆJØ &× 7Ñ 7Ö 9‘�Ø”?Ø!%�JÙñ !:ö Ü$Ð%DÓEÐEÜðØ$˜Ð%KðMóð ò rD   Úfully_sharded_moduleÚparam_init_fnÚsync_module_statesc                 ó¨  ^ • [        UT R                  U5        [        UT R                  T R                  5      n[        UT R                  T R                  5      u  pgU(       d  U(       a  Ub  [        XT R                  5        OJU(       a#  [        UUT R                  T R                  5        O U(       a  [        R                  " UU 4S jS9  T R                   VV	s1 s H  nUR                  5         H  n	U	iM     M     n
nn	[        UT R                  U
U5        [        UT R                  UT R                  T R                  5      T l        [        [!        UT R                  5      5      n[#        X5        U(       a@  [%        XT R&                  5        T R(                  [*        ;   a  [%        XT R,                  5        [/        T X±5        T $ s  sn	nf )zHInitialize a ``FlatParamHandle`` from a module ``fully_sharded_module``.c                 óJ   >• [        U 5      S L =(       a    U TR                  ;  $ rW   )r   r‡   )Ú	submoduler*   s    €rB   Ú<lambda>Ú0_init_param_handle_from_module.<locals>.<lambda>P  s(   ø€ Ô'=¸iÓ'HÈDÐ'P÷ (8Ø ×!7Ñ!7Ñ7ð(8rD   )Úcheck_fn)Ú_check_single_device_moduler‰   Ú_get_device_from_device_idr8   rK   Ú_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ü   Ú_sync_module_params_and_buffersr+   r,   r4   r;   Ú_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   `           rB   Ú_init_param_handle_from_moduler  1  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ÜÐ/Ô@ÞÜ'Ø °%×2EÑ2Eô	
ð ×"Ñ"Ô&@Ó@Ü+Ø$°e×6JÑ6Jôô # 5¨.ÔOØ€Lùó?s   Ã$Gc                 óö  • [        U5      S:X  a  g [        UUU R                  [        U R                     U R
                  R                  U R                  R                  U R                  R                  U R                  R                  U R                  U R                  U R                  S9nUR                  5         U R                  (       a  [!        S5      eU R"                  R%                  UR&                  5        X0l        X0R(                  UR*                  '   [,        R.                  " S5      nU R
                  R                  (       a-  UR&                  R.                  U:w  a  UR1                  U5        g g g )Nr   )Úfsdp_extensionz!Expected state._handle to be Noner¡   )ra   r   r  ÚSHARDING_STRATEGY_MAPr,   r·   Úoffload_paramsr¶   Úparam_dtypeÚreduce_dtypeÚkeep_low_precision_gradsr+   rÍ   rê   ÚshardrÙ   rs   rÚ   ÚappendÚ
flat_paramrØ   Ú_fully_sharded_moduler£   r¤   Úflat_param_to)r*   rÚ   rý   ÚhandleÚ
cpu_devices        rB   r  r  v  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Ð'rD   Úroot_moduler‡   c           	      óŠ  • Sn Ub  [        U5      O	[        5       nU Ha  n[        U[        R
                  R                  5      (       d  [        US[        U5       3-   5      e[        U5      (       d  MX  [        S5      e   U R                  5        H1  n[        R                  " U5      (       a  M   UR                  U5        M3     U VVs1 s H>  nUR                  5         H&  n[        U[        R                  5      (       a  M$  UiM(     M@     nnnX;   a  [        R                   " SW 3SS9  U R                  5        HJ  n[        U5      n	U	c  M  [#        U	S	5      (       d  [%        S
5      eUR'                  U	R(                  5        ML     U$ ! [         a   n[        US[        U5       3-   5      UeSnAff = fs  snnf )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: rU   r½   r‡   z?Expected optional_fsdp_state to have _ignored_modules attribute)ÚsetÚ	TypeErrorrN   rX   r£   r„   r–   r   r3   ÚmodulesÚtraversal_utilsÚ_composableÚaddÚ	fsdp_fileÚFullyShardedDataParallelrÃ   rÄ   Úhasattrrs   Úupdater‡   )
r'  r‡   Ú
msg_prefixÚignored_root_modulesÚer~   Úchildr   r  Úoptional_fsdp_states
             rB   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 Ã7F?Ä
F?Æ
F<ÆF7Æ7F<rŒ   c                 óø  • [        5       nU VVs1 s H.  oDR                  5         H  n[        U5      (       a  M  UiM     M0     nnnUR                  U5        Ub5  U Vs1 s H  n[        U5      (       a  M  UiM     nnUR                  U5        U R	                  5        HJ  n[        U5      n	U	c  M  [        U	S5      (       d  [        S5      eUR                  U	R                  5        ML     U$ s  snnf s  snf )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   r2  r+  r   r1  rs   r‰   )
r'  r   rŒ   Úall_ignored_paramsÚmÚpÚparams_in_ignored_modulesÚparams_in_ignored_parametersr  r7  s
             rB   rˆ   rˆ   Ó  sú   € ô 36³%Ðñ #ô!Ú"ˆa¯L©L¯N qÔBTÐUV×BW�©N‰‘?ð ñ !ð ×ÑÐ7Ô8àÑ%á)ó(
Ú)�!Ô1CÀA×1F�AÑ)ð 	%ð (
ð 	×!Ñ!Ð">Ô?ð !×(Ñ(Ö*ˆ	Ü4°YÓ?ÐØÓ*ÜÐ.Ð0A×BÑBÜ$ØTóð ð ×%Ñ%Ð&9×&IÑ&IÖJñ +ð Ðùó-!ùò(
s   �'C1»
C1Á C7Á8C7c           	      óÊ  • [        5       nU VVs1 s H  o3R                  5         H  oDiM     M     nnnUR                  U R                  5        VVs1 s H  u  pdXE;   d  M  [	        U5      iM     snn5        U R                  5        HJ  n[        U5      nUc  M  [        US5      (       d  [        S5      eUR                  UR                  5        ML     U$ s  snnf s  snnf )z6Return the cleaned buffer FQNs in ``ignored_modules``.r‹   zDExpected optional_fsdp_state to have _ignored_buffer_names attribute)
r)  r  r2  r°   r   r+  r   r1  rs   r‹   )	r'  r   Úall_ignored_buffer_namesr;  r´   Úbuffers_in_ignored_modulesr³   r  r7  s	            rB   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                 ój   • U R                  5        VVs1 s H  u  p[        U5      iM     snn$ s  snnf )zrReturn the fully prefixed names of all buffers in the module hierarchy rooted at ``root_module`` as a class:`set`.)r°   r   )r'  r³   rh   s      rB   r®   r®     s8   € ð >I×=VÑ=VÔ=XôÚ=X©>¨;Ô˜+Ö&Ñ=Xòð ùó s   ”/c                 ó   • [        X5       Vs1 s H  o3R                  iM     nn[        U5      S:X  a)  [        R                  " S5      U;   a  Uc  [	        S5      eg[        U5      S:”  a  [	        SU 35      egs  snf )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.
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¤   ra   r£   r¦   )r~   rž   rŸ   r«   Údevicess        rB   r  r    sŒ   € ô *:¸&Ô)QÓRÒ)Q �|Œ|Ñ)Q€GÐRô ˆ7ƒ|�qÓœUŸ\š\¨%Ó0°GÓ;ØÑÜð5óð ð ô
 
ˆW‹˜Ó	ÜØIÈ'ÈÐSó
ð 	
ð 
ùò Ss   ŽA;r8   Údevice_handlec                 ór  • U c  g[        U [        R                  5      (       a  U O[        R                  " U 5      nUR                  S:w  ak  UR                  c^  [
        R                  " SU  SU SUR                  5        SUR                   S3	SS	9  [        R                  " UR                  5       5      nU$ )
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   rE  r¤   s       rB   r  r  =  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×:Ñ:Ó<Ó=ˆØ€MrD   c                 ó2  • [        [        X5      5      n[        S U 5       5      nU R                  5        H.  nXR;   a  M
  UR	                  SS9 H  nXFR
                  -  nM     M0     U(       + =(       a    [        =(       a    [        S U 5       5      nXG4$ )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   #   • U  H  oR                   v •  M     g 7frW   )Úis_meta©r[   r«   s     rB   r]   Ú._need_to_materialize_module.<locals>.<genexpr>h  s   é € ÐC²N¨5Ÿž²Nùs   ‚F©Úrecursec              3   óN   #   • U  H  n[         R                  " U5      v •  M     g 7frW   )r(   Úis_fakerL  s     rB   r]   rM  t  s   é € Ð@²¨”—’˜U×#Ð#²ùs   ‚#%)r‚   r¥   Úanyr+  r  rK  Ú_TORCHDISTX_AVAIL)r~   rž   r   r  r  r  Úbufr  s           rB   r  r  [  s™   € ô Ô*¨6ÓBÓC€NÜÑC±NÓCÓC€Nð —^‘^Ö%ˆ	ØÓ'ÙØ×$Ñ$¨UÐ$Ó3ˆCØŸk™kÑ)ŠNó 4ñ &ð Ô÷ 	AÜ÷	AäÑ@±Ó@Ó@ð  ð
 Ð6Ð6rD   c                 ó�   • [        U5      (       d  [        SU S[        U5       35      e[        X5      nU H  nU" U5        M     g )Nz	Expected z to be callable but got )Úcallabler3   rN   Ú_get_modules_to_materialize)r'  rþ   r   Úmodules_to_materializer~   s        rB   r	  r	  y  sR   € ô
 �M×"Ñ"ÜØ˜�Ð&>¼tÀMÓ?RÐ>SÐTó
ð 	
ô 9¸ÓVÐÛ(ˆÙ�fÖò )rD   r  c           	      óP  • U=(       d$    [         R                  " UR                  5       5      n[        X5      nS n [         R                  " 5          U Ht  n[
        R                  " UR                  SS9UR                  SS95      n[        [        U5      5      S:„  nU(       d  MT  UR                  USS9  UR                  5         Mv     S S S 5        g ! , (       d  f       g = f! [         a5  n	[        R                  " S[!        U	5       S[#        U5       S3SS	9  U	eS n	A	ff = f)
NFrN  r   )r¤   rO  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¤   rH  rW  Úno_gradÚ	itertoolsÚchainr9  r  ra   r‚   Úto_emptyÚreset_parametersÚBaseExceptionrÃ   rÄ   rÈ   rN   )
r'  r  r   rE  Úmaterialization_devicerX  r~   Úmodule_state_iterÚhas_module_statesr5  s
             rB   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Â($CÃC& Ã
C#ÃC& Ã#C& Ã&
D%Ã00D Ä D%c                 óJ  • / n[         R                  " U /5      nU 1nU(       a  UR                  5       nUR                  U5        UR	                  5        HA  nXd;  d  M
  [        U5      b  M  Xa;  d  M  UR                  U5        UR                  U5        MC     U(       a  M  U$ rW   )ÚcollectionsÚdequeÚpopleftr!  Úchildrenr   r.  )r'  r   rX  ÚqueueÚvisited_modulesr~   Úchild_modules          rB   rW  rW  ­  s�   € ð
 /1ÐÜ×Ò˜{˜mÓ,€EØ'2 m€OÞ
Ø—‘“ˆØ×%Ñ% fÔ-Ø"ŸO™OÖ-ˆLàÕ3Ü*¨<Ó8Ó@Ø Õ7à×#Ñ# LÔ1Ø—‘˜\Ö*ñ .÷ ˆ%ð "Ð!rD   r  c                 óú  ^• [         R                  " S5      mUGb"  [        R                  " 5       nUR	                  U 5        / n/ nU(       a²  UR                  5       nUR                  U4S jUR                  SS9 5       5        UR                  U4S jUR                  SS9 5       5        UR                  5        H5  n[        U[        R                  5      (       a  M$  UR	                  U5        M7     U(       a  M²  U V	s/ s H  o™U;  d  M
  U	PM     n
n	U V	s/ s H  o™U;  d  M
  U	PM     nn	[        X«U5        g[        [        X5      S5      nUb  UR                  T:X  a  [!        5         gggs  sn	f s  sn	f )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   óL   >#   • U  H  nUR                   T:X  d  M  Uv •  M     g 7frW   ©r¤   )r[   r«   r&  s     €rB   r]   Ú)_move_module_to_device.<locals>.<genexpr>ã  s&   øé € ð âB�EØ—<‘< :Ñ-÷ ‘ÚBùó   ƒ$›	$FrN  c              3   óL   >#   • U  H  nUR                   T:X  d  M  Uv •  M     g 7frW   rm  )r[   r´   r&  s     €rB   r]   rn  è  s&   øé € ð â@�FØ—=‘= JÑ.÷ ‘Ú@ùro  )r£   r¤   rd  re  r!  rf  Úextendr9  r  rg  rX   r/  r0  Ú_move_states_to_deviceÚnextr¥   Ú_warn_cpu_init)r~   rž   r  r  rh  rÚ   r  Úcurr_moduler  r<  Úparams_to_moveÚbufs_to_mover«   r&  s                @rB   r  r  Ã  sV  ø€ ô$ —’˜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÷! ˆeñ& &,ÓG¢V ¸Ñ/FŸ!¡VˆÐGÙ#*ÓG¢7˜a°Ñ.FŸ¡7ˆÐGÜ˜~Ð=RÔSØÜÔ! &Ó9¸4Ó@€EØÑ˜UŸ\™\¨ZÓ7ÜÕð 8Ðùò HùÚGs   Ä	E3ÄE3Ä	E8Ä)E8r  c                 ó\  • [        U 5      S:X  a  [        U5      S:X  a  g[        U 5      S:”  a  U S   R                  nO[        U5      S:”  a  US   R                  n[        R                  " S5      nUb”  U  Hn  n[        R                  " 5          UR	                  U5      Ul        UR                  b*  UR                  R	                  U5      UR                  l        SSS5        Mp     U H  nUR	                  U5      Ul        M     gWU:X  a  [        5         gg! , (       d  f       M³  = f)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¡   )ra   r¤   r£   rZ  ÚtoÚdataÚgradrt  )rÚ   r  r  rH  r&  r«   r´   s          rB   rr  rr  ù  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DÄ
D+	c                  ó.   • [         R                  " SSS9  g )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Ä   © rD   rB   rt  rt    s   € Ü‡M‚Mð	1ð órD   c                 ó  • [        [        X5      S5      nUb'  UR                  R                  S:w  a  UR                  nO$[        R                  " UR                  5       5      nUb  Xb:w  a  [        SU SU SU 35      eU$ )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 )rs  r¥   r¤   rN   r£   rH  r3   )r~   rž   r  r8   rE  r«   r  s          rB   r  r  %  s‰   € ô* Ô! &Ó9¸4Ó@€EØÑ˜UŸ\™\×.Ñ.°%Ó7ØŸ™‰äŸš m×&BÑ&BÓ&DÓEˆØÑ(¨^Ó-TÜØBÀ4À&ÈØÐ˜dÐ#8Ð"9ð;ó
ð 	
ð ÐrD   c                 ó¨  • / nU R                  5        H�  n[        U[        S5      (       a  M  [        U[        S5        UR	                  5       n[        U5      (       a@  UR                  5       u  pgU Vs/ s H  n[        XX5      PM     n	nUR                  U	5        MŒ  UR                  U5        MŸ     U Ht  n
U
R	                  5       n[        U5      (       a@  UR                  5       u  pgU Vs/ s H  n[        X¸5      PM     nnUR                  U5        Mc  UR                  U5        Mv     [        U5        [        UU[        SS9  gs  snf s  snf )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   )ÚsrcN)r  ÚgetattrÚFSDP_SYNCEDÚsetattrÚdetachr%   Ú__tensor_flatten__rq  r!  Ú+_check_module_states_for_sync_module_statesr$   ÚPARAM_BROADCAST_BUCKET_SIZE)r~   rÚ   r+   Úmodule_statesr´   Údetached_bufferÚattrsrh   ÚattrÚinner_buffersr«   Údetached_paramÚinner_paramss                rB   r  r  H  s#  € ð )+€MØ—.‘.Ö"ˆä�vœ{¨E×2Ó2Ü�FœK¨Ô.Ø$Ÿm™m›oˆOÜ,¨_×=Ñ=ð +×=Ñ=Ó?‘�ÙLQÓ RÊEÀD¤¨Ö!?ÉE�Ð RØ×$Ñ$ ]Ö3à×$Ñ$ _Ö5ñ #ó ˆØŸ™›ˆÜ(¨×8Ñ8Ø%×8Ñ8Ó:‰HˆEÙFKÓLÂe¸dœG NÖ9ÁeˆLÐLØ× Ñ  Ö.à× Ñ  Ö0ñ ô 0°Ô>ÜØØÜ#Øó	ùò !Sùò Ms   Á5E
Ã/Erˆ  c                 óX   • U (       a#  [        S U  5       5      (       a  [        S5      eg g )Nc              3   óf   #   • U  H'  oR                   [        R                   " S 5      :H  v •  M)     g7f)r¡   N)r¤   r£   )r[   Útensors     rB   r]   Ú>_check_module_states_for_sync_module_states.<locals>.<genexpr>w  s#   é € ð Ú;H°�‰œŸš eÓ,Ö,º=ùs   ‚/1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.)rR  r3   )rˆ  s    rB   r†  r†  t  s<   € ö œñ Ù;Hó÷ ñ ô ðCó
ð 	
ð€}rD   c              #   óš   #   • U R                  5       n  [        U5      nX1;  a  [        U5      (       d  Uv •  M&  ! [         a     gf = f7f)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)r9  rs  r   ÚStopIteration)r~   rž   Ú	param_genr«   s       rB   r¥   r¥   �  sT   é € ð ×!Ñ!Ó#€IðØÜ˜“OˆEØÓ*Ô3EÀe×3LÑ3LØ’ñ øô ó Ùðüs    ‚A”'; »
AÁAÁAÁAc           	      ó²   • [        U 5       HH  u  p#X1;  d  M  [        U5      (       a  M  [        SU SUR                  5        SUR                   35      e   g)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¦   r9   Ú	__class__)Úfsdp_modulerž   rù   r«   s       rB   Ú_check_orig_params_flattenedrš  —  sY   € ô ?¸{ÖKÑˆ
ØÕ&Ô/AÀ%×/HÓ/HÜØ2°:°,¸bØ—:‘:“<�.  %§/¡/Ð!2ð4óð ò LrD   c                 ój   • U [         R                  :X  a  [        R                  $ [        R                  $ rW   )r   rÂ   r   Úallreduce_hookÚreduce_scatter_hook)r,   s    rB   Ú_get_default_comm_hookrž  «  s3   € ð Ô 0× 9Ñ 9Ó9ô 	×$Ñ$ðô ×.Ñ.ðrD   c                 ó*   • [         R                  " U S9$ )NrG   )r   r<   rG   s    rB   rO   rO   ³  s   € ô ×%Ò%°MÑBÐBrD   rW   )Šrd  r[  rÉ   rÃ   Úcollections.abcr   r   r   r   Útypingr   r   r	   r
   r£   Útorch.distributedÚdistributedrY   Ú(torch.distributed.fsdp._exec_order_utilsÚfsdpÚ_exec_order_utilsrÔ   Ú'torch.distributed.fsdp._traversal_utilsÚ_traversal_utilsr,  Ú2torch.distributed.fsdp.fully_sharded_data_parallelÚfully_sharded_data_parallelr/  Útorch.nnr„   Ú(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&   rS  Ú
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   Úintri   r|   rJ   r–   r…   r�   r‚   rƒ   r)  r¤   r¬   rµ   rÛ   rã   rç   rì   rõ   rü   r  r  r†   rˆ   rÈ   rŠ   r®   r  r  r  r	  r
  rW  ÚTensorr  rr  rt  r  r  r†  r¥   rš  rž  r<   rO   r}  rD   rB   Ú<module>rÃ     s‹
  ðã Û Û 	Û ß CÓ Cß >Ó >ã Ý  ß CÓ Cß AÓ Aß FÓ FÝ Ý BÝ 4Ý A÷÷ ñ ÷ó õ B÷	÷ 	ó 	õ 0Ý DÝ <Ý Fö Ý1àÐ ðß.ð 0Ð Ø€à# D×$5Ñ$5°t×7HÑ7HÐ$HÑIÐ à˜D×-Ñ-Ð0KÑKÑLÐ ð
 ×ÑÐ5×>Ñ>Ø×ÑÐ!7×!BÑ!BØ×"Ñ"Ð$:×$HÑ$HØ×!Ñ!Ð#9×#FÑ#FØ×(Ñ(Ð*@×*TÑ*TðÐ ð ×!Ñ!Ø×(Ñ(ðÐ ð
 ×"Ñ"Ø×(Ñ(ð'Ð #ð ð &*ñ0Øð0à#ð0ð (ð0ð �d‰Nð	0ð
 ˜dÑ"ð0ð ô0ó ð0ðf ð(Øð(à#ð(ð ð(ð ó	(ó ð(ðV ð°#ð ¸$ó ó ðð ðI°Jð IÀ4ó Ió ðIð ð¸ð À×ARÑARó ó ðð ð"Ø×+Ñ+ð"àð"ð 
×Ñó"ó ð"ðJØ×+Ñ+ðàðð ˆ4×Ñ˜d×/Ñ/Ð/Ñ0ôð& ð ñ+Øð+à�I‰Ið+ð ˜eŸh™hŸo™oÑ.°Ñ5ð+ð ˜UŸX™X×/Ñ/Ñ0Øˆu�x‰x�‰Ññ à
ñð	+ð ô+ó ð+ð\Ø˜‘IðØ9=ðà	ôð: ð-Øð-à�I‰Ið-ð ˜Ÿ™Ñ%ð-ð �U—\‘\Ñ! DÑ(ð	-ð
 ó-ó ð-ð` ðØðà�I‰Iðð óó ðð" ð?Øð?à'¨$Ñ.ð?ð $ dÑ*ð?ð ˜dÑ"ð	?ð
 ð?ð ð?ð !ð?ð  ð?ð ó?ó ð?ðD ðØðàóó ðð  ð	Øð	à'ð	ð ð	ð ó		ó ð	ð ñ˜:ð °Jð È*ô ó ðð ð *ð °ó ó ðð 2§9¡9ð °d¸2¿<¹<Ñ6Hð ÈTô ð( ðAØðAàŸ)™)ðAð �U—\‘\Ñ! DÑ(ðAð ˜RŸY™Y˜K¨Ð-Ñ.°Ñ5ð	Að
 ðAð óAó ðAðH ð)Øð)à�—‘Ñð)ð Ÿ)™)ó)ó ð)ð>:Ø—‘ð:à˜uŸx™xŸ™Ñ/°$Ñ6ð:ð 	ˆ�‰�^ô:ð@ ?Cñ"Ø—‘—‘ð"à˜Ÿ™Ÿ™Ñ)ð"ð ! §¡×!3Ñ!3Ñ4°tÑ;ð"ð 	ˆ�‰×	Ñ	Ñõ	"ðJ$Ø—‘—‘ð$à˜Ÿ™Ÿ™Ñ)ð$ð 	ˆ�Xô$ð@ 2§9¡9ð °°S±ô ð
Ø�I‰Ið
à˜Ÿ™Ñ%ð
ð �U—\‘\Ñ! DÑ(ð
ð 
ô	
ð<Ø�U—\‘\Ñ! DÑ(ðà
ðð %ðð ‡\�\�DÑô	ð<7Ø�I‰Ið7à˜Ÿ™Ñ%ð7ð ˜Ÿ™‘^ð7ð ˆ4�ˆ:Ñô	7ð<Ø—‘ðà˜RŸY™Y˜K¨Ð-Ñ.ðð ˜Ÿ™‘^ðð 
ô	ð#Ø—‘ð#à Ÿ<™<¨$Ñ.ð#ð ˜Ÿ™‘^ð#ð %ô	#ðL"Ø—‘ð"Ø-0°·±©^ð"à	ˆ"�)‰)�_ô"ð,3Ø�I‰Ið3à˜Ÿ™Ñ%ð3ð ˜Ÿ™Ñ&ð3ð !Ÿ<™<¨$Ñ.ð	3ð
 
ô3ðlØ�—‘Ñðà�%—,‘,Ñðð !Ÿ<™<¨$Ñ.ðð 
ô	ò@	ðØ�I‰Iðà˜Ÿ™Ñ%ðð !Ÿ<™<¨$Ñ.ðð ð	ð
 %ðð ‡\�\ôðF)Ø�I‰Ið)à�—‘Ñð)ð ×$Ñ$ð)ð 
ô	)ðX

Ø˜Ÿ™Ñ%ð

à	ô

ðØ�I‰Iðà˜Ÿ™Ñ%ðð ˆb�l‰lÑôð,à˜Ÿ™Ñ%ðð 
ôð(Ð.>ô ðCØ×$Ñ$ðCà×ÒõCøðw# ó ØÓðús   Ã^& Þ&^2Þ1^2