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

    For example, given each row is a distinct node:
    0  1  2  3  4  5  6  7
    8  9 10 11 12 13 14 15
    This API would return an intra-node subgroup across
    [0, 1, ..., 7] or [8, 9, ..., 15] depending on the process's rank.
    For example, rank 3 would get [0, 1, ..., 7].
    )rY   Únew_subgroups)rc   Úintra_node_subgroupÚ_s      rB   Ú_init_intra_node_process_grouprh   È   s!   € ô "×/Ñ/Ð0DÓEÑÐ˜ØÐrD   Úglobal_process_groupc                 ó\  — d}t        j                  | «      }t        j                  | «      }||z  }t        j                  | «      |z  }t	        |«      D ]?  }t	        |«      D �cg c]
  }|||z  z   ‘Œ }	}t        j
                  |	|¬«      }
||k(  sŒ>|
}ŒA |€t        |› d�«      ‚|S c c}w )aŒ  
    Return an inter-node process group where each contained rank has the same local rank.

    For example, given each row is a distinct node:
    0  1  2  3  4  5  6  7
    8  9 10 11 12 13 14 15
    This API would return inter-node process group [0, 8], [1, 9], [2, 10], and so forth
    depending on the process's rank. For example, rank 1 would get [1, 9], rank 5
    would get [5, 13].
    N)ÚranksÚbackendz. expected to assign inter-node pg, but did not)rY   Úget_backendÚget_world_sizeÚget_rankÚrangeÚ	new_groupÚAssertionError)ri   rc   Ú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Ñ2€IÜ—M‘MÐ"6Ó7Ð:NÑN€MÜÐ0Ó1ò  ˆ
ä=BÀ9Ó=Mö!
Ø89ˆJ˜!Ð2Ñ2Ó3ð!
Ðð !
ô �n‰nÐ#8ÐBRÔSˆØ˜Ó&Ø‰Mð ð ÐÜØˆoÐKÐLó
ð 	
ð Ðùò!
s   Á%B)c                 ó0   — t        |«      t        | |«      fS )a¢  
    Initialize intra and inter-node process groups and return the ones corresponding to this process's rank.

    This function can be used to initialize process groups for ``HYBRID_SHARD`` or
    ``_HYBRID_SHARD_ZERO2`` in FSDP.
    This function assumes each node has an equal number of CUDA-enabled devices.
    Returns:
        Tuple[dist.ProcessGroup, dist.ProcessGroup]: Intra and inter-node process group.
    )rh   r{   )ri   rc   s     rB   rJ   rJ   þ   s#   € ô 	'Ð';Ó<Ü&Ð';Ð=QÓRðð rD   ÚmoduleÚignored_modulesÚignored_statesc                 óŠ  — |�|�t        d«      ‚d }|d u}|rt        |«      }t        |d«       ng }t        |�t        |«      ng d«       t        |«      dkD  r"t	        |d   t
        j                  «      r|}n|}t        ||«      | _        t        || j                  |«      | _
        t        || j                  «      | _        | S )NzfCannot pass both ignored_modules and ignored_states at the same time. Please just pass ignored_states.TFr   )r3   ÚlistÚ_check_ignored_statesr`   rX   ÚnnÚ	ParameterÚ_get_ignored_modulesÚ_ignored_modulesÚ_get_ignored_paramsÚ_ignored_paramsÚ_get_ignored_buffer_namesÚ_ignored_buffer_names)r*   r}   r~   r   Úignored_parametersÚpassed_as_ignored_statesÚignored_states_lists          rB   Ú_init_ignored_module_statesrŽ     sè   € ð Ð" ~Ð'AÜð:ó
ð 	
ð ÐØ-°TÐ9ÐÙÜ" >Ó2ÐÜÐ1°4Õ8à ÐÜØ%4Ð%@ŒD�Ô!ÀbÈ%ô	
ô ÐÓ !Ò#ÜÐ)¨!Ñ,¬b¯l©lÔ;Ø!4Ñà1ˆOÜ1°&¸/ÓJ€EÔÜ/ØØ×ÑØó€EÔô
 #<ØØ×Ñó#€EÔð €LrD   rŒ   c                 óŠ  — t        | «      dk(  ry|r`t        d„ | D «       «      }t        d„ | D «       «      }|s9|s6t        | D �ch c]  }t        |«      ’Œ c}t        ¬«      }t        d|› �«      ‚yyt        d„ | D «       «      s6t        | D �ch c]  }t        |«      ’Œ c}t        ¬«      }t        d|› �«      ‚yc c}w c c}w )	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   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrW   )rX   rƒ   r„   ©r[   r*   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>K  s   è ø€ ÒU¸Uœ E¬2¯<©<×8ÑUùr^   c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrW   ©rX   rƒ   ÚModuler‘   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>L  s   è ø€ ÒS¸5œ* U¬B¯I©I×6ÑSùr^   )ÚkeyzUignored_states expects all nn.Parameter or all nn.Module list elements but got types c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wrW   r“   r‘   s     rB   r]   z(_check_ignored_states.<locals>.<genexpr>U  s   è ø€ ÒL°E”:˜e¤R§Y¡Y×/ÑLùr^   z>ignored_modules expects nn.Module list elements but got types )r`   ra   Ú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°5¤4¨¥;Ò"KÔQUÔVˆLÜð*Ø*6¨ð9óð ð #.ˆzô ÑL¸^ÔLÔLÜ!¸NÖ"K°5¤4¨¥;Ò"KÔQUÔVˆLÜðØ%˜ð(óð ð Mùò #Lùò #Ls   ÁB;ÂC Úignored_paramsÚ	device_idc                 ó6  — d}|�1t        |t        j                  «      r|nt        j                  |«      }|€Çt        ||«      D ]|  }|j                  j                  dv rŒ|€|j                  }Œ+|j                  j                  |j                  k7  sŒOt        d|j                  › d|j                  j                  › �«      ‚ |xs t        j                  j                  «       }|j                  dk(  rt        d«      ‚t        j                  |«      | _
        | S )a=  
    Determine device handle used for initializing FSDP.

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


    This method will be called once ignored parameters was determined, as the device handle maybe needed
    for other initialization.
    N>   ÚcpuÚmetazLFSDP does not support modules with different device types but got params on z and rŸ   zOFSDP needs a non-CPU accelerator device, but no accelerator device is detected.)rX   ÚtorchÚdeviceÚ_get_orig_paramsrN   ÚRuntimeErrorÚ_CÚ_get_acceleratorr   Úfrom_devicerK   )r*   r}   rœ   r�   Údetermined_deviceÚparams         rB   Ú_init_device_handlerª   ]  s  € ð( ÐØÐô ˜)¤U§\¡\Ô2ñ ä—‘˜iÓ(ð 	ð
 Ð Ü% f¨nÓ=ò 
	ˆ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                 óœ   — t        |«      | _        i }|j                  «       D ]  \  }}t        |«      }|j                  ||<   Œ! || _        | S rW   )Ú_get_buffer_namesÚ_buffer_namesÚnamed_buffersr   ÚdtypeÚ_buffer_name_to_orig_dtype)r*   r}   r°   Úbuffer_nameÚbuffers        rB   Ú_init_buffer_stater³   Ž  s_   € ô
 ,¨FÓ3€EÔð
 :<ÐØ%×3Ñ3Ó5ò ?Ñˆ�VÜ'¨Ó4ˆØ28·,±,Ð" ;Ò/ð?ð (B€EÔ$Ø€LrD   Úmixed_precisionÚcpu_offloadÚlimit_all_gathersÚuse_orig_paramsÚbackward_prefetch_limitÚforward_prefetch_limitc                 óœ  — | j                   dk(  rQ|t        j                  k7  r-t        j                  d|xs t        j
                  › d�d¬«       t        j                  }n/|t        j                  k(  rt        j                  dt        d¬«       |xs t        j
                  | _        |xs
 t        «       | _	        |�5t        j                  j                  dt        | j                  «      › �«       t        j                  j!                  t"        d	«      d
k(  | _        |xs
 t'        «       | _        || _        || _        t.        j0                  | _        d | _        t7        «       | _        t;        j<                  «       | _        tA        jB                  | j>                  ||«      | _"        d | _#        i }|| _$        d }	|	| _%        g }
|
| _&        | S )NrF   z/FSDP is switching to use `NO_SHARD` instead of z since the world size is 1.rU   ©Ú
stacklevelzoThe `NO_SHARD` sharding strategy is deprecated. If having issues, please use `DistributedDataParallel` instead.é   z'torch.distributed.fsdp.mixed_precision.Ú Ú1)'r:   r   ÚNO_SHARDÚwarningsÚwarnÚ
FULL_SHARDÚFutureWarningr,   r   r´   r¡   r¥   Ú_log_api_usage_onceÚstrÚosÚenvironÚgetr   Ú_use_full_prec_in_evalr   rµ   r¶   Ú_use_orig_paramsr   ÚIDLEÚtraining_stateÚ_is_rootr   Ú_free_event_queuerY   Úget_debug_levelÚ_debug_levelÚexec_order_utilsÚ_ExecOrderDataÚ_exec_order_dataÚ_unshard_eventÚ_fully_sharded_module_to_handleÚ_handleÚparams)r*   r,   r´   rµ   r¶   r·   r¸   r¹   rÖ   r×   rØ   s              rB   Ú_init_core_staterÙ      s­  € ð ×Ñ˜1ÒØÔ 0× 9Ñ 9Ò9Ü�M‰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ÔÜ(×-Ñ-€EÔØ€E„NÜ-Ó/€EÔÜ×-Ñ-Ó/€EÔÜ-×<Ñ<Ø×ÑØØó€EÔð
  €EÔð IKÐ#Ø,K€EÔ)ð '+€GØ€E„MØ"$€FØ€E„LØ€LrD   c                 óf   — g }|| _         g }|| _        g }|| _        d| _        d | _        d | _        | S )NT)Ú_root_pre_forward_handlesÚ_pre_forward_handlesÚ_post_forward_handlesÚ_sync_gradientsÚ
_comm_hookÚ_comm_hook_state)r*   rÛ   rÜ   rÝ   s       rB   Ú_init_runtime_staterá   ã  sK   € ð 8:ÐØ&?€EÔ#Ø24ÐØ!5€EÔØ35ÐØ"7€EÔØ €EÔØ€EÔØ!€EÔà€LrD   Úbackward_prefetchÚforward_prefetchc                 ó"   — || _         || _        | S rW   )râ   rã   )r*   râ   rã   s      rB   Ú_init_prefetching_staterå   ô  s   € ð 0€EÔØ-€EÔð €LrD   c                 ó–   — |�|j                  «       nd }|r+|| j                  k7  rt        | j                  «      | _        | S d | _        | S rW   )Ú_get_root_meshr6   r#   rK   Ú_fsdp_extension)r*   r.   Ú	root_meshs      rB   Ú_init_extensionrê     sT   € ð
 1<Ð0G�×*Ñ*Ô,ÈT€Iñ �y E×$6Ñ$6Ò6Ü 1°%×2FÑ2FÓ GˆÔð
 €Lð !%ˆÔØ€LrD   c                 ó‚   — t         j                  | _        t        «       }t	        «       | _        || _        i }|| _        | S rW   )r!   ÚFULL_STATE_DICTÚ_state_dict_typer   r   Ú_optim_state_dict_configÚ_state_dict_configÚ_unshard_params_ctx)r*   Ústate_dict_configÚunshard_params_ctxs      rB   Ú_init_state_dict_stateró     s?   € ä*×:Ñ:€EÔÜ)<Ó)>ÐÜ%=Ó%?€EÔ"Ø0€EÔØ57ÐØ 2€EÔà€LrD   rØ   c                 ó¾   — |D ]X  }t        |j                  «      dk(  sŒd}| j                  «       D ]  \  }}||u sŒ|} n |st        d«      ‚t	        d|› d�«      ‚ y)zš
    Verify if the parameters are accepted by FSDP. The only restriction now
    is that the parameter cannot be a scalar tensor (param.shape == []).
    r   r¾   zExpected param_name to be setz/FSDP doesn't support scalar parameters. Change z& to a 1D tensor with numel equal to 1.N)r`   ÚshapeÚnamed_parametersrr   r3   )r}   rØ   r©   Ú
param_nameÚnameÚparam_s         rB   Ú_verify_managed_paramsrú     s…   € ð
 ò ˆÜˆu�{‰{Ó˜qÓ ØˆJØ &× 7Ñ 7Ó 9ò ‘��fØ˜F’?Ø!%�JÙðñ Ü$Ð%DÓEÐEÜðØ$˜Ð%KðMóð ñrD   Úfully_sharded_moduleÚparam_init_fnÚsync_module_statesc                 óà  ‡ — t        |‰ j                  |«       t        |‰ j                  ‰ j                  «      }t        |‰ j                  ‰ j                  «      \  }}|s|r|�t        ||‰ j                  «       nA|r#t        ||‰ j                  ‰ j                  «       n|rt        j                  |ˆ fd„¬«       ‰ j                  D ��	ch c]  }|j                  «       D ]  }	|	’Œ Œ }
}}	t        |‰ j                  |
|«       t        |‰ j                  |‰ j                  ‰ j                  «      ‰ _        t        t!        |‰ j                  «      «      }t#        ||«       |rw‰ j$                  t&        v rNt)        ||‰ j*                  «       |j                  «       D ]$  }	t-        |	t.        «      sŒt1        |	t.        d«       Œ& t)        ||‰ j2                  «       t5        ‰ ||«       ‰ S c c}	}w )zHInitialize a ``FlatParamHandle`` from a module ``fully_sharded_module``.c                 ó>   •— t        | «      d u xr | ‰j                  vS rW   )r   r†   )Ú	submoduler*   s    €rB   ú<lambda>z0_init_param_handle_from_module.<locals>.<lambda>Q  s(   ø€ Ô'=¸iÓ'HÈDÐ'Pò (8Ø ×!7Ñ!7Ð7ð rD   )Úcheck_fnF)Ú_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ú   r,   r4   Ú_sync_module_params_and_buffersr;   Ú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   `           rB   Ú_init_param_handle_from_moduler  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÷àØ$×,Ñ,Ó.òð ò 	ðØð€Oñ ô ØØ×ÑØØô	ô /ØØ×ÑØØ�
‰
Ø×Ñó€EÔô Ô*Ð+?À×AVÑAVÓWÓX€NÜÐ/°Ô@ÙØ×"Ñ"Ô&@Ñ@ô ,Ø$ n°e×6JÑ6Jôð /×6Ñ6Ó8ò 8�Ü˜6¤;Õ/Ü˜F¤K°Õ7ð8ô 	(Ø  .°%×2EÑ2Eô	
ô # 5¨.Ð:NÔOØ€LùóYs   ÃG*c                 óæ  — t        |«      dk(  ry t        ||| j                  t        | j                     | j
                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  | j                  | j                  ¬«      }|j                  «        | j                  rt!        d«      ‚| j"                  j%                  |j&                  «       || _        || j(                  |j*                  <   t-        j.                  d«      }| j
                  j                  r,|j&                  j.                  |k7  r|j1                  |«       y y y )Nr   )Úfsdp_extensionz!Expected state._handle to be NonerŸ   )r`   r   r  ÚSHARDING_STRATEGY_MAPr,   rµ   Úoffload_paramsr´   Úparam_dtypeÚreduce_dtypeÚkeep_low_precision_gradsr+   rË   rè   Úshardr×   rr   rØ   ÚappendÚ
flat_paramrÖ   Ú_fully_sharded_moduler¡   r¢   Úflat_param_to)r*   rØ   rû   ÚhandleÚ
cpu_devices        rB   r  r  „  s+  € ô ˆ6ƒ{�aÒØÜØØØ×ÑÜ˜e×5Ñ5Ñ6Ø×Ñ×(Ñ(Ø×Ñ×)Ñ)Ø×Ñ×*Ñ*Ø×Ñ×6Ñ6Ø×ÑØ×ÑØ×,Ñ,ô€Fð ‡L�L„NØ‡}‚}ÜÐ@ÓAÐAØ	‡L�L×Ñ˜×)Ñ)Ô*Ø€E„MØJP€E×)Ñ)¨&×*FÑ*FÑGÜ—‘˜eÓ$€JØ×Ñ×'Ò'¨F×,=Ñ,=×,DÑ,DÈ
Ò,RØ×Ñ˜ZÕ(ð -SÐ'rD   Úroot_moduler†   c           	      ó2  — d}	 |�t        |«      n	t        «       }|D ]V  }t        |t        j
                  j                  «      st        |dt        |«      › �z   «      ‚t        |«      sŒMt        d«      ‚ | j                  «       D ])  }t        j                  |«      rŒ|j                  |«       Œ+ |D ��ch c]3  }|j                  «       D ]  }t        |t        j                  «      s|’Œ  Œ5 }}}| |v rt        j                   d› �d¬«       | j                  «       D ]B  }t        |«      }	|	€Œt#        |	d	«      st%        d
«      ‚|j'                  |	j(                  «       ŒD |S # t        $ r }t        |dt        |«      › �z   «      |‚d}~ww xY wc c}}w )ah  
    Check that ``_ignored_modules`` is an iterable of ``nn.Module`` s without any FSDP instances.

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

    ``_ignored_modules`` represents the argument passed by the user to FSDP.
    z>`ignored_modules` should be an iterable of `torch.nn.Module`s Nzbut got zbut got an iterable with z1`ignored_modules` should not include FSDP 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Â   r  rr   Ú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ð 	ð
 'ò RˆÜ˜&¤%§(¡(§/¡/Ô2Ü˜JÐ+DÄTÈ&Ã\ÀNÐ)SÑSÓTÐTÜ! &Õ)ô ÐPÓQÐQðRð ×%Ñ%Ó'ò -ˆÜ×*Ñ*¨6Õ2Ø ×$Ñ$ VÕ,ð-ð +÷àØ—^‘^Ó%òð Ü˜%¤×!CÑ!CÔDò 	ðØð€Oñ ð �oÑ%Ü�‰ð2à28°ð;ð õ		
ð !×(Ñ(Ó*ò Iˆ	Ü4°YÓ?ÐØÑ*ÜÐ.Ð0BÔCÜ$ØUóð ð ×"Ñ"Ð#6×#GÑ#GÕHðIð ÐøôQ ò QÜ˜
 x´Ð5EÓ0FÐ/GÐ%HÑHÓIÈqÐPûðQüó$s   „E' Â78FÅ'	FÅ0FÆFr‹   c                 ó¼  — t        «       }|D ��ch c]%  }|j                  «       D ]  }t        |«      rŒ|’Œ Œ' }}}|j                  |«       |�,|D �ch c]  }t        |«      rŒ|’Œ }}|j                  |«       | j	                  «       D ]B  }t        |«      }	|	€Œt        |	d«      st        d«      ‚|j                  |	j                  «       ŒD |S c c}}w c c}w )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   r1  r+  r   r  rr   rˆ   )
r'  r~   r‹   Úall_ignored_paramsÚmÚpÚparams_in_ignored_modulesÚparams_in_ignored_parametersr   r6  s
             rB   r‡   r‡   á  s  € ô 36³%Ðð #÷!Ø¨A¯L©L«Nò!Ø'(ÔBTÐUVÕBWŠð!Ø	ð!Ðñ !ð ×ÑÐ7Ô8àÐ%à)ö(
ØÔ1CÀAÕ1FŠAð(
Ð$ð (
ð 	×!Ñ!Ð">Ô?ð !×(Ñ(Ó*ò Kˆ	Ü4°YÓ?ÐØÑ*ÜÐ.Ð0AÔBÜ$ØTóð ð ×%Ñ%Ð&9×&IÑ&IÕJðKð Ðùó-!ùò(
s   �#C´CÁCÁ%Cc           	      ó¦  — t        «       }|D ��ch c]  }|j                  «       D ]  }|’Œ Œ }}}|j                  | j                  «       D ��ch c]  \  }}||v rt	        |«      ’Œ c}}«       | j                  «       D ]B  }t        |«      }|€Œt        |d«      st        d«      ‚|j                  |j                  «       ŒD |S c c}}w c c}}w )z6Return the cleaned buffer FQNs in ``ignored_modules``.rŠ   zDExpected optional_fsdp_state to have _ignored_buffer_names attribute)
r)  r	  r1  r®   r   r+  r   r  rr   rŠ   )	r'  r~   Úall_ignored_buffer_namesr:  r²   Úbuffers_in_ignored_modulesr±   r   r6  s	            rB   r‰   r‰     sö   € ô
 *-«Ðð (÷"Ø°a·i±i³kò"Ø,2Šð"Øð"Ðñ "ð ×#Ñ#ð (3×'@Ñ'@Ó'B÷	
á#�˜VØÐ3Ñ3ô ˜kÕ*ó	
ôð !×(Ñ(Ó*ò Wˆ	Ü4°YÓ?ÐØÑ*ÜÐ.Ð0GÔHÜ$ØZóð ð %×+Ñ+Ð,?×,UÑ,UÕVðWð $Ð#ùó-"ùó
	
s   �CÁC
c                 óf   — | j                  «       D ��ch c]  \  }}t        |«      ’Œ c}}S c c}}w )zrReturn the fully prefixed names of all buffers in the module hierarchy rooted at ``root_module`` as a class:`set`.)r®   r   )r'  r±   rg   s      rB   r¬   r¬   &  s5   € ð >I×=VÑ=VÓ=X÷Ù+9¨;¸Ô˜+Õ&óð ùó s   ”-c                 óò   — t        | |«      D �ch c]  }|j                  ’Œ }}t        |«      dk(  r%t        j                  d«      |v r|€t	        d«      ‚yt        |«      dkD  rt	        d|› �«      ‚yc c}w )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¢   r`   r¡   r¤   )r}   rœ   r�   r©   Údevicess        rB   r  r  -  s�   € ô *:¸&À.Ó)QÖR ˆu�|‹|ÐR€GÐRô ˆ7ƒ|�qÒœUŸ\™\¨%Ó0°GÑ;ØÐÜð5óð ð ô
 
ˆW‹˜Ò	ÜØIÈ'ÈÐSó
ð 	
ð 
ùò Ss   �A4r8   Údevice_handlec                 ób  — | €yt        | t        j                  «      r| nt        j                  | «      }|j                  dk7  rk|j                  €_t        j                  d| › d|› d|j                  «       › d|j                  › d�	d¬	«       t        j                  |j                  «       «      }|S )
z»
    Return a ``torch.device`` for the specified ``device_id``.

    Processes ``device_id`` and returns either the corresponding device or
    ``None`` if ``device_id`` is ``None``.
    NrŸ   z"FSDP got the argument `device_id` z	 on rank zJ, which does not have an explicit index. FSDP will use the current device z6. If this is incorrect, please explicitly call `torch.zk.set_device()` before FSDP initialization or pass in the explicit device index as the `device_id` argument.rU   r»   )rX   r¡   r¢   rN   ÚindexrÁ   rÂ   Úcurrent_device)r�   r8   rD  r¢   s       rB   r  r  K  s°   € ð ÐØä 	¬5¯<©<Ô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                 ó  — t        t        | |«      «      }t        d„ |D «       «      }| j                  «       D ]-  }||v rŒ|j	                  d¬«      D ]  }||j
                  z  }Œ Œ/ | xr t        xr t        d„ |D «       «      }||fS )zø
    Return if ``module`` has parameters on meta device and if ``module`` is using torchdistX deferred initialization.

    At most of the returned bools can
    be ``True``. If either is ``True``, then ``module`` needs to be
    materialized.
    c              3   ó4   K  — | ]  }|j                   –— Œ y ­wrW   )Úis_meta©r[   r©   s     rB   r]   z._need_to_materialize_module.<locals>.<genexpr>v  s   è ø€ ÒC¨5˜Ÿ�ÑCùs   ‚F©Úrecursec              3   óF   K  — | ]  }t        j                  |«      –— Œ y ­wrW   )r(   Úis_fakerK  s     rB   r]   z._need_to_materialize_module.<locals>.<genexpr>‚  s   è ø€ Ò@¨”—‘˜U×#Ñ@ùs   ‚!)r�   r£   Úanyr+  r	  rJ  Ú_TORCHDISTX_AVAIL)r}   rœ   r~   r  r  r   Úbufr  s           rB   r  r  i  s¬   € ô Ô*¨6°>ÓBÓC€NÜÑC°NÔCÓC€Nð —^‘^Ó%ò *ˆ	Ø˜Ñ'ØØ×$Ñ$¨UÐ$Ó3ò 	*ˆCØ˜cŸk™kÑ)‰Nñ	*ð*ð Ðò 	AÜò	AäÑ@°Ô@Ó@ð  ð
 Ð6Ð6Ð6rD   c                 ó„   — t        |«      st        d|› dt        |«      › �«      ‚t        | |«      }|D ]
  } ||«       Œ y )Nz	Expected z to be callable but got )Úcallabler3   rN   Ú_get_modules_to_materialize)r'  rü   r~   Úmodules_to_materializer}   s        rB   r  r  ‡  sV   € ô
 �MÔ"ÜØ˜�Ð&>¼tÀMÓ?RÐ>SÐTó
ð 	
ô 9¸ÀoÓVÐØ(ò ˆÙ�fÕñrD   r  c           	      ó>  — |xs# t        j                  |j                  «       «      }t        | |«      }d }	 t        j                  «       5  |D ]u  }t        j                  |j                  d¬«      |j                  d¬«      «      }t        t        |«      «      dkD  }|sŒS|j                  |d¬«       |j                  «        Œw 	 d d d «       y # 1 sw Y   y xY w# t        $ r7}	t        j                  dt!        |	«      › dt#        |«      › d�d¬	«       |	‚d }	~	ww xY w)
NFrL  r   )r¢   rM  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¢   rG  rU  Úno_gradÚ	itertoolsÚchainr8  r	  r`   r�   Úto_emptyÚreset_parametersÚBaseExceptionrÁ   rÂ   rÆ   rN   )
r'  r  r~   rD  Úmaterialization_devicerV  r}   Úmodule_state_iterÚhas_module_statesr4  s
             rB   r  r  •  s$  € ð 3ò ´e·l±lØ×$Ñ$Ó&ó7Ðô 9¸ÀoÓVÐØ€Fðô �]‰]‹_ñ 	.Ø0ò .�ô %.§O¡OØ×%Ñ%¨eÐ%Ó4à—N‘N¨5�NÓ1ó%Ð!ô
 %(¬Ð->Ó(?Ó$@À1Ñ$DÐ!Ú$Ø—O‘OÐ+AÈ5�OÔQØ×+Ñ+Õ-ñ.÷	.÷ 	.ñ 	.ûô ò Ü�‰ð!Ü!$ Q£ ð )Ü˜“L�>Ð!KðMð õ		
ð ˆûðús<   ·C ÁACÂ!%CÃC ÃCÃC ÃC Ã	DÃ%2DÄDc                 ó"  — g }t        j                  | g«      }| h}|rq|j                  «       }|j                  |«       |j	                  «       D ]:  }||vsŒt        |«      �Œ||vsŒ|j                  |«       |j                  |«       Œ< |rŒq|S rW   )ÚcollectionsÚdequeÚpopleftr!  Úchildrenr   r.  )r'  r~   rV  ÚqueueÚvisited_modulesr}   Úchild_modules          rB   rU  rU  »  s—   € ð
 /1ÐÜ×Ñ˜{˜mÓ,€EØ'2 m€OÙ
Ø—‘“ˆØ×%Ñ% fÔ-Ø"ŸO™OÓ-ò 	+ˆLà OÒ3Ü*¨<Ó8Ñ@Ø ¨Ò7à×#Ñ# LÔ1Ø—‘˜\Õ*ð	+ò ð "Ð!rD   r  c                 óÂ  ‡— t        j                  d«      Š|��	t        j                  «       }|j	                  | «       g }g }|r¨|j                  «       }|j                  ˆfd„|j                  d¬«      D «       «       |j                  ˆfd„|j                  d¬«      D «       «       |j                  «       D ].  }t        |t        j                  «      rŒ|j	                  |«       Œ0 |rŒ¨|D �	cg c]	  }	|	|vsŒ|	‘Œ }
}	|D �	cg c]	  }	|	|vsŒ|	‘Œ }}	t        |
||«       yt        t        | |«      d«      }|�|j                  ‰k(  rt!        «        yyyc c}	w c c}	w )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   ó@   •K  — | ]  }|j                   ‰k(  r|–— Œ y ­wrW   ©r¢   )r[   r©   r&  s     €rB   r]   z)_move_module_to_device.<locals>.<genexpr>ñ  s%   øè ø€ ò àØ—<‘< :Ò-ô ñùó   ƒFrL  c              3   ó@   •K  — | ]  }|j                   ‰k(  r|–— Œ y ­wrW   rk  )r[   r²   r&  s     €rB   r]   z)_move_module_to_device.<locals>.<genexpr>ö  s%   øè ø€ ò àØ—=‘= JÒ.ô ñùrl  )r¡   r¢   rb  rc  r!  rd  Úextendr8  r	  re  rX   r/  r0  Ú_move_states_to_deviceÚnextr£   Ú_warn_cpu_init)r}   rœ   r  r  rf  rØ   r	  Úcurr_moduler   r;  Úparams_to_moveÚbufs_to_mover©   r&  s                @rB   r
  r
  Ñ  s\  ø€ ô$ —‘˜eÓ$€JØÑ(ô /:×.?Ñ.?Ó.AˆØ�‰�VÔØ%'ˆØ&(ˆÙØŸ-™-›/ˆKð
 �M‰Mó à(×3Ñ3¸EÐ3ÓBôô ð
 �N‰Nó à)×1Ñ1¸%Ð1Ó@ôô ð
 )×1Ñ1Ó3ò ,�	Ü! )¬Y×-OÑ-OÕPØ—L‘L Õ+ð,ò! ð& &,ÖG ¨q¸Ò/Fš!ÐGˆÐGØ#*ÖG˜a¨a°Ò.FšÐGˆÐGÜ˜~¨|Ð=RÔSØÜÔ! &¨.Ó9¸4Ó@€EØÐ˜UŸ\™\¨ZÒ7ÜÕð 8Ðùò HùÚGs   Ã1	EÃ;EÄ	EÄEr	  c                 ó6  — t        | «      dk(  rt        |«      dk(  ryt        | «      dkD  r| d   j                  }nt        |«      dkD  r|d   j                  }t        j                  d«      }|�Ž| D ]k  }t        j                  «       5  |j	                  |«      |_        |j                  �*|j                  j	                  |«      |j                  _        ddd«       Œm |D ]  }|j	                  |«      |_        Œ y|k(  rt        «        yy# 1 sw Y   Œ¦xY w)z­
    Move states to the specified device.

    Precondition: ``_check_single_device_module()`` and module's parameters and
    buffers have been materialized if needed.
    r   NrŸ   )r`   r¢   r¡   rX  ÚtoÚdataÚgradrq  )rØ   r	  r  rG  r&  r©   r²   s          rB   ro  ro    s  € ô ˆ6ƒ{�aÒœC ›L¨AÒ-ØÜ
ˆ6ƒ{�Q‚Ø ™×)Ñ)‰Ü	ˆW‹˜Ò	Ø  ™×*Ñ*ˆÜ—‘˜eÓ$€JØÐ(ð ò 	KˆEÜ—‘“ñ KØ"ŸX™XÐ&;Ó<�”
Ø—:‘:Ð)Ø&+§j¡j§m¡mÐ4IÓ&J�E—J‘J”O÷Kð Kð	Kð
 ò 	;ˆFØ Ÿ)™)Ð$9Ó:ˆF�Kñ	;à	˜:Ò	%ÜÕð 
&÷Kð Kús   Â	ADÄD	c                  ó2   — t        j                  dd¬«       y )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   rq  rq  '  s   € Ü‡M�Mð	1ð örD   c                 óþ   — t        t        | |«      d«      }|�&|j                  j                  dk7  r|j                  }n#t	        j                  |j                  «       «      }|�||k7  rt        d|› d|› d|› �«      ‚|S )a)  
    Determine and return this FSDP instance's compute device.

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

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

    Precondition: ``_check_single_device_module()`` and
    ``_move_module_to_device()``.
    NrŸ   z4Inconsistent compute device and `device_id` on rank z: z vs )rp  r£   r¢   rN   r¡   rG  r3   )r}   rœ   r  r8   rD  r©   r  s          rB   r  r  3  sŽ   € ô* Ô! &¨.Ó9¸4Ó@€EØÐ˜UŸ\™\×.Ñ.°%Ò7ØŸ™‰äŸ™ m×&BÑ&BÓ&DÓEˆØÐ(¨^Ð?TÒ-TÜØBÀ4À&ÈØÐ˜dÐ#8Ð"9ð;ó
ð 	
ð ÐrD   c                 óV  — g }| j                  «       D ]Ê  }t        |t        d«      rŒt        |t        d«       |j	                  «       }t        |«      ry|j                  «       \  }}|D ]`  }t        ||«      xxt        j                  d˜ x�\   }	 |j                  |	«       Œ9  xt        d˜ x�\    ŒI }
t        dt        |
«      › �«      ‚ Œº|j                  |«       ŒÌ |D ]§  }|j	                  «       }t        |«      ry|j                  «       \  }}|D ]`  }t        ||«      xxt        j                  d˜ x�\   }	 |j                  |	«       Œ9  xt        d˜ x�\    ŒI }
t        dt        |
«      › �«      ‚ Œ—|j                  |«       Œ© t        |«       t        ||t        d¬«       y)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.
    FTrz  Nz#expected Tensor or OpaqueBase, got r   )Úsrc)r	  Úgetattrr  r  Údetachr%   Ú__tensor_flatten__r¡   ÚTensorr!  r
   rr   rN   Ú+_check_module_states_for_sync_module_statesr$   ÚPARAM_BROADCAST_BUCKET_SIZE)r}   rØ   r+   Úmodule_statesr²   Údetached_bufferÚattrsrg   ÚattrÚvÚ
unexpectedr©   Údetached_params                rB   r  r  V  s¤  € ð )+€MØ—.‘.Ó"ò 6ˆä�vœ{¨EÕ2Ü�FœK¨Ô.Ø$Ÿm™m›oˆOÜ,¨_Ô=ð +×=Ñ=Ó?‘��qØ!ò 	�DÜ! /°4Ó8Ù0œUŸ\™\�^Ñ0Ø)×0Ñ0°Õ3ñ 1à)œZž\Ø ð *à'Ü"0Ø"EÄdÈ:ÓFVÐEWÐ Xó#ð ñ	ð ×$Ñ$ _Õ5ð)6ð, ò 1ˆØŸ™›ˆÜ(¨Ô8Ø%×8Ñ8Ó:‰HˆE�1Øò 	�Ü˜n¨dÓ3Ù,œŸ™�Ñ,Ø%×,Ñ,¨QÕ/ñ -à%œžØð &à#Ü,ØAÄ$ÀzÓBRÐASÐTóð ñ	ð × Ñ  Õ0ð1ô" 0°Ô>ÜØØÜ#Øö	rD   r„  c                 óD   — | rt        d„ | D «       «      rt        d«      ‚y y )Nc              3   ó`   K  — | ]&  }|j                   t        j                   d «      k(  –— Œ( y­w)rŸ   N)r¢   r¡   )r[   Útensors     rB   r]   z>_check_module_states_for_sync_module_states.<locals>.<genexpr>•  s'   è ø€ ò Ø17ˆ�‰œŸ™ eÓ,Õ,ñùs   ‚,.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.)rP  r3   )r„  s    rB   r‚  r‚  ’  s7   € ñ œñ Ø;Hôô ô ðCó
ð 	
ð€}rD   c              #   óŠ   K  — | j                  «       }	 	 t        |«      }||vrt        |«      s|–— Œ# t        $ r Y yw xY w­w)aD  
    Return an iterator over the original parameters in ``module``.

    The iterator does not return
    the parameters in ``ignored_params``, any ``FlatParameter`` s (which may be
    present due to nested FSDP wrapping), or any original parameters already
    flattened (only relevant when ``use_orig_params=True``).
    N)r8  rp  r   ÚStopIteration)r}   rœ   Ú	param_genr©   s       rB   r£   r£   Ÿ  sT   è ø€ ð ×!Ñ!Ó#€IðØÜ˜“OˆEØ˜NÑ*Ô3EÀeÔ3LØ’ð øô ò Ùðüs   ‚A” 4 ´	A ½A¿A Á Ac           	      ó¢   — t        | «      D ]A  \  }}||vsŒt        |«      rŒt        d|› d|j                  «       › d|j                  › �«      ‚ y)a5  
    Check that original parameters in ``fsdp_module`` have been flattened.

    The flattened parameters are made
    invisible to ``named_parameters()`` for the module hierarchy rooted at
    ``fsdp_module``. This should be called as a sanity check after flattening
    the wrapped module's parameters.
    z Found an unflattened parameter: z; ú N)r   r   r¤   r9   Ú	__class__)Úfsdp_modulerœ   r÷   r©   s       rB   Ú_check_orig_params_flattenedr•  µ  s^   € ô ?¸{ÓKò Ñˆ
�EØ˜Ò&Ô/AÀ%Õ/HÜØ2°:°,¸bØ—:‘:“<�.  %§/¡/Ð!2ð4óð ñrD   c                 óh   — | t         j                  k(  rt        j                  S t        j                  S rW   )r   rÀ   r   Úallreduce_hookÚreduce_scatter_hook)r,   s    rB   Ú_get_default_comm_hookr™  É  s3   € ð Ô 0× 9Ñ 9Ò9ô 	×$Ñ$ðô ×.Ñ.ðrD   c                 ó.   — t        j                  | ¬«      S )NrG   )r   r<   rG   s    rB   rO   rO   Ñ  s   € ô ×%Ñ%°MÔBÐBrD   rW   )‹rb  rY  rÇ   rÁ   Úcollections.abcr   r   r   r   Útypingr   r   r	   r¡   Útorch.distributedÚdistributedrY   Ú(torch.distributed.fsdp._exec_order_utilsÚfsdpÚ_exec_order_utilsrÒ   Ú'torch.distributed.fsdp._traversal_utilsÚ_traversal_utilsr,  Ú2torch.distributed.fsdp.fully_sharded_data_parallelÚfully_sharded_data_parallelr/  Útorch.nnrƒ   Útorch._opaque_baser
   Ú(torch.distributed.algorithms._comm_hooksr   Útorch.distributed.device_meshr   Ú"torch.distributed.distributed_c10dr   Ú$torch.distributed.fsdp._common_utilsr   r   r   r   r   r   r   Ú"torch.distributed.fsdp._flat_paramr   r   r   r   Ú%torch.distributed.fsdp._limiter_utilsr   Útorch.distributed.fsdp.apir   r   r   r   r   r   r    r!   Útorch.distributed.fsdp.wrapr"   Ú&torch.distributed.tensor.parallel.fsdpr#   Útorch.distributed.utilsr$   Útorch.utils._python_dispatchr%   Útorch.utils.hooksr&   rQ  Ú
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   Úintrh   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  rU  r�  r
  ro  rq  r  r  r‚  r£   r•  r™  r<   rO   rz  rD   rB   ú<module>r¾     sŽ
  ðã Û Û 	Û ß CÓ Cß 4Ñ 4ã Ý  ß CÓ Cß AÓ Aß FÓ FÝ Ý )Ý 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à#ð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ó ð( ðNØðNàŸ)™)ðNð �U—\‘\Ñ! DÑ(ðNð ˜RŸY™Y˜K¨Ð-Ñ.°Ñ5ð	Nð
 ðNð òNó ðNðb ð)Øð)à�—‘Ñð)ð Ÿ)™)ò)ó ð)ð>:Ø—‘ð:à˜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9Ø�I‰Ið9à�—‘Ñð9ð ×$Ñ$ð9ð 
ó	9ðx

Ø˜Ÿ™Ñ%ð

à	ó

ðØ�I‰Iðà˜Ÿ™Ñ%ðð ˆb�l‰lÑóð,à˜Ÿ™Ñ%ðð 
óð(Ð.>ó ðCØ×$Ñ$ðCà×ÒôCøðq$ ò ØÓðús   Ã]; Ý;^Þ^