ó
    IC˜j:  ã            	       óÊ  • S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  S SK Jr  S SKJr  S SKJrJr  S SKJr  S SKJrJrJr  S S	KJr  S SKrS SKJr  S SKJr  S SKJs  J r!  S S
K"J#r#  S SK$J%r%  S SK&J'r'J(r(J)r*  S SK+J,r,  S SK-J.r.J/r/  S SK0J1r1  S SK2J3r3J4r4J5r5  S SK6J7r7  S SK8J9r9J:r:J;r;  S SK<J=r=J>r>J?r?  S SK@JArAJBrBJCrCJDrD  S SKJErEJFrF  S SKGJHrI  S SKJJKrKJLrLJMrMJNrNJOrO  S SKPJQrQJRrRJSrSJTrTJUrUJVrVJWrW  S SKXJYrY  \V(       a)  \Z" S\[" S\R¸                  R»                  5       5      5      r^OSr^\T(       a  Sr_Sr`\R¸                  R»                  5       r^O8\U(       a  Sr_Sr`O,\W(       a  S r_S!r`\RÂ                  R»                  5       r^OS"r_S#r`S$r^ " S% S&\5      rb " S' S(\5      rc " S) S*\RÈ                  \5      reS+\RÈ                  S,\RÌ                  S-\
4S. jrgS/ rh  S~S+\RÈ                  S0\i4S1 jjrjSS2 jrkS3 rlS4 rmS€S+\RÈ                  S5\i4S6 jjrnS+\RÈ                  S7\i4S8 jroS+\RÈ                  S9\i4S: jrp " S; S<5      rq " S= S>\e5      rr " S? S@\e5      rs " SA SB\s5      rt " SC SD\s5      ru " SE SF\e5      rv " SG SH\v5      rw " SI SJ\RÈ                  5      rx " SK SL\s5      ry " SM SN\RÈ                  5      rz " SO SP\Rö                  5      r| " SQ SR\RÈ                  5      r}\ Rü                  SS\
4ST j5       r\ Rü                  SU\
4SV j5       r€\ Rü                  SW\
4SX j5       r�\ Rü                  SY\
4SZ j5       r‚\ Rü                  S[\
4S\ j5       rƒ\\ Rü                  S]\
4S^ j5       5       r„\\ Rü                  S_\
4S` j5       5       r…\\ Rü                  Sa\
4Sb j5       5       r†\\ Rü                  Sc\
4Sd j5       5       r‡Se\
S-\
Sf\Sg\4Sh jrˆ S�Si\RÈ                  Sj\RÈ                  Sk\‰\ŠSl4   4Sm jjr‹ " Sn So\M5      rŒ " Sp Sq5      r� " Sr Ss\�\L5      rŽ " St Su\�\K5      r�S‚Sv\�S-  4Sw jjr‘ " Sx Sy\RÈ                  5      r’ " Sz S{\RÈ                  5      r“ " S| S}\RÈ                  5      r”g)ƒé    N)ÚABCÚabstractmethod)ÚCallable)Únullcontext)Údeepcopy)ÚautoÚEnum©Úwraps)ÚAnyÚcastÚno_type_check)Úmock)Ú
checkpoint)Ú
DeviceMesh)Ú
CPUOffloadÚfully_shardÚFullyShardedDataParallel)ÚTrainingState)ÚFSDPParamGroupÚRegisterPostBackwardFunction)Ú#NO_RESHARD_AFTER_FORWARD_STRATEGIES)ÚBackwardPrefetchÚMixedPrecisionÚShardingStrategy)ÚShardedGradScaler)Úalways_wrap_policyÚModuleWrapPolicyÚwrap)Údistribute_tensorÚDTensorÚShard)ÚColwiseParallelÚparallelize_moduleÚRowwiseParallelÚSequenceParallel)ÚTransformerDecoderLayerÚTransformerEncoderLayer)ÚDistributedDataParallel)ÚMultiProcContinuousTestÚMultiProcessTestCaseÚMultiThreadedTestCaseÚrun_subtestsÚ
TEST_SKIPS)ÚFILE_SCHEMAÚget_cycles_per_msÚset_rng_seedÚ	TEST_CUDAÚTEST_HPUÚTEST_WITH_ROCMÚTEST_XPU)Ú
has_tritoné   é   ÚcudaÚncclzhpu:0ÚhcclÚxpuÚxcclÚcpuÚglooé   c                   ó0   • \ rS rSr\" 5       r\" 5       rSrg)ÚFSDPInitModeé]   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚNO_FSDPÚ	RECURSIVEÚ__static_attributes__rD   ó    Ú±C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\torch/testing/_internal/common_fsdp.pyrB   rB   ]   s   † á‹f€Gá“ƒIrL   rB   c                   ó>   • \ rS rSr\" 5       r\" 5       r\" 5       rSrg)ÚDEVICEInitModeéf   rD   N)	rE   rF   rG   rH   r   ÚDEVICE_BEFOREÚDEVICE_AFTERÚDEVICE_NEVERrK   rD   rL   rM   rO   rO   f   s   † á“F€Má“6€Lá“6ƒLrL   rO   c                   óÌ   • \ rS rSrSr\S\\R                  S4   4S j5       r	\S\R                  4S j5       r
\SS j5       r\\S	\S
\S\R                  4S j5       5       rSrg)ÚFSDPTestModeléo   zVThis defines the interface expected from all models used commonly for
FSDP unit tests.Úreturn.c                 ó   • g)z*Returns an input for the model as a tuple.NrD   ©ÚselfÚdevices     rM   Ú	get_inputÚFSDPTestModel.get_inputs   ó   € ð 	rL   c                 ó   • g)z,Returns the loss given the input and output.NrD   )rZ   ÚinputÚoutputs      rM   Úget_lossÚFSDPTestModel.get_lossx   r^   rL   Nc                 ó   • g)z<Runs the backward pass (e.g. including ``loss.backward()``).NrD   ©rZ   Úlosss     rM   Úrun_backwardÚFSDPTestModel.run_backward}   r^   rL   ÚargsÚkwargsc                  ó   • g)z&Initializes an instance of this model.NrD   )ri   rj   s     rM   ÚinitÚFSDPTestModel.init‚   s   € ð 	rL   rD   ©rW   N)rE   rF   rG   rH   Ú__doc__r   ÚtupleÚtorchÚTensorr\   rb   rg   Ústaticmethodr   ÚnnÚModulerl   rK   rD   rL   rM   rU   rU   o   s˜   † ñð ð 5¨¯©°sÐ):Ñ#;ó ó ðð ð¨¯©ó ó ðð óó ðð Øð�Cð  3ð ¨2¯9©9ó ó ó órL   rU   ÚmodelÚprocess_groupÚ	assert_fnc                 óX  • U R                  5        VVs/ s H$  u  p4X4R                  5       R                  5       4PM&     nnnUU R                  5        VVs/ s H$  u  pgXgR                  5       R                  5       4PM&     snn-  n[        R
                  " U5      n[        U5       V	s/ s H  n	SPM     n
n	[        R                  " X¥US9  U
S   nUc  [        S5      eU
SS  H1  nUc  [        S5      e[        X¼SS9 H  u  u  p�u  pžU" XÞ5        M     M3     gs  snnf s  snnf s  sn	f )	zþ
All-gathers module states across ranks and calls ``assert_fn`` on each pair
of corresponding states from rank 0 and a nonzero rank. For example, if
``assert_fn`` is ``self.assertEqual()``, then this checks that all module
states are equal across ranks.
N©Úgroupr   z$Expected rank0_states to not be Noner@   zExpected state to not be NoneT©Ústrict)
Únamed_parametersÚdetachr>   Únamed_buffersÚdistÚget_world_sizeÚrangeÚall_gather_objectÚAssertionErrorÚzip)rv   rw   rx   Ú
param_nameÚparamÚnamed_module_statesÚbuffer_nameÚbufferÚ
world_sizeÚ_ÚolistÚrank0_statesÚstateÚp1Úp2s                  rM   Ú_assert_module_statesr“   ‰   s3  € ð "'×!7Ñ!7Ô!9ôâ!9ÑˆJð 
—\‘\“^×'Ñ'Ó)Ó*Ù!9ð ñ ð à#(×#6Ñ#6Ô#8ôâ#8ÑˆKð 
—m‘m“o×)Ñ)Ó+Ó,Ù#8òñ Ðô ×$Ò$ ]Ó3€JÜ  Ô,Ó-Ò,�a‹TÑ,€EÐ-Ü×Ò˜5¸]ÒKØ˜‘8€LØÑÜÐCÓDÐDØ�q�r“ˆØ‰=Ü Ð!@ÓAÐAÜ # LÀÔ EÑ‰GˆQ‘W�aÙ�bÖó !Fò ùóùóùò
 .s   ”+DÁ+D!Â*D'c                  ó6   • [         R                  " [        5      $ ©N)rq   r[   ÚDEVICE_TYPErD   rL   rM   Úget_devtyper—   ª   s   € Ü�<Š<œÓ$Ð$rL   Úzero_buffersc                 óô  • U(       a  [         R                  " U 5      O	[        5       nU   U R                  5        H1  n[        R
                  " 5          UR                  5         SSS5        M3     U(       aE  U R                  5        H1  n[        R
                  " 5          UR                  5         SSS5        M3     SSS5        g! , (       d  f       M™  = f! , (       d  f       M_  = f! , (       d  f       g= f)zBZeros the parameters and optionally buffers of ``model`` in place.N)ÚFSDPÚsummon_full_paramsr   Ú
parametersrq   Úno_gradÚzero_Úbuffers)rv   r˜   Úsummon_fullÚctxrˆ   r‹   s         rM   Ú_zero_modelr¢   ®   s”   € ö -8Œ$×
!Ò
! %Ô
(¼[»]€CÚ	Ø×%Ñ%Ö'ˆEÜ—’•Ø—‘”÷ !‘ñ (ö ØŸ-™-ž/�Ü—]’]•_Ø—L‘L”N÷ %‘_ñ *÷ 
ˆç –ú÷ %–_ú÷ 
�ús;   ª)C)ÁCÁ$;C)ÂCÂ0C)Ã
CÃC)Ã
C&Ã!C)Ã)
C7c                 óˆ   • U(       d  U R                  [        5      n U(       a  U R                  5         U R                  5       $ r•   )Útor–   ÚhalfÚ
state_dict)rv   Úcpu_offloadr¥   s      rM   Ú_get_state_dictr¨   ¿   s.   € ÞØ—‘œÓ%ˆÞØ�
‰
Œà×ÑÓÐrL   c           	      óp   • SR                  U Vs/ s H  o"b  U [        U5         OSPM     sn5      $ s  snf )Nr�   Únone)ÚjoinÚstr)Útest_name_mappingri   Úss      rM   Úsubtest_namer¯   È   s9   € Ø�8‰8ÙIMÓNÊÀA¡mÐ	œ3˜q›6Ò	"¸Ò	?ÉÑNóð ùÚNs   �3c                 ó‚  • UR                  5        H=  u  p#UR                  [        R                  " S5      :w  d  M+  UR                  5       X'   M?     U S:X  a  UOS /n[        R
                  " U5        [        [        [        [        R                  4   US   5      nU H  nX   R                  [        5      X'   M     U$ )Nr>   r   )Úitemsr[   rq   r>   r�   Úbroadcast_object_listr   Údictr¬   rr   r¤   r–   )Úrankr¦   r‡   rˆ   rŽ   s        rM   Ú_broadcast_state_dictrµ   Î   s¡   € ð (×-Ñ-Ö/Ñˆ
Ø�<‰<œ5Ÿ<š<¨Ó.Õ.Ø%*§Y¡Y£[ˆJÓ"ñ 0ð   1›9‰Z¨$Ð/€EÜ×Ò˜uÔ%Ü”dœ3¤§¡Ð,Ñ-¨u°Q©xÓ8€Jã ˆ
Ø!+Ñ!7×!:Ñ!:¼;Ó!Gˆ
Óñ !àÐrL   Úrecursec                 ó¤   • [         R                  " XS9   [        [        U R	                  5       5      5      sSSS5        $ ! , (       d  f       g= f)a?  
Returns the full unsharded parameters of ``model``. Any FSDP-managed
parameters offloaded to CPU are moved to GPU in the returned list.

Args:
    recurse (bool): If ``False``, only unshards the parameters immediate to
        ``model``; if ``True``, recurses through the module hierarchy
        rooted at ``model``.
)r¶   N)rš   r›   r   Úlistrœ   )rv   r¶   s     rM   Úget_full_paramsr¹   ß   s4   € ô 
×	 Ò	  Ó	8Üœ˜U×-Ñ-Ó/Ó0Ó1÷ 
9×	8×	8ús   •"AÁ
AÚmove_to_devicec                 ó>   • U(       a  U R                  [        5      $ U $ r•   )r¤   r–   )rv   rº   s     rM   Ú_move_to_devicer¼   í   s   € Þ$2ˆ5�8‰8”KÓ Ð=¸Ð=rL   Ú	wrap_fsdpc                 ó2   • U(       d  U $ [        U /UQ70 UD6$ r•   ©rš   )rv   r½   ri   rj   s       rM   Ú_maybe_wrap_fsdprÀ   ñ   s   € Þ!ˆ5ÐC¤t¨EÐ'C°DÒ'C¸FÑ'CÐCrL   c                   óH   • \ rS rSrS\S\4S jrS\4S jrS\4S jrS rS	r	g
)ÚDummyProcessGroupéõ   r´   Úsizec                 ó   • Xl         X l        g r•   ©Ú_rankÚ_size)rZ   r´   rÄ   s      rM   Ú__init__ÚDummyProcessGroup.__init__ö   s   € ØŒ
Ø�
rL   rW   c                 ó   • U R                   $ r•   )rÇ   ©rZ   s    rM   r´   ÚDummyProcessGroup.rankú   ó   € Ø�z‰zÐrL   c                 ó   • U R                   $ r•   )rÈ   rÌ   s    rM   rÄ   ÚDummyProcessGroup.sizeý   rÎ   rL   c                 óB   • [         R                  " 5       nS nXCl        U$ )Nc                  ód   • [         R                  R                  5       n U R                  S5        U $ )Nr@   )rq   ÚfuturesÚFutureÚ
set_result)Úfutures    rM   Ú
get_futureÚ/DummyProcessGroup.allreduce.<locals>.get_future  s'   € Ü+0¯=©=×+?Ñ+?Ó+AˆFØ×Ñ˜aÔ ØˆMrL   )r   ÚMockr×   )rZ   ri   rj   Ú	dist_waitr×   s        rM   Ú	allreduceÚDummyProcessGroup.allreduce   s    € Ü—I’I“Kˆ	ò	ð
  *ÔØÐrL   rÆ   N)
rE   rF   rG   rH   ÚintrÉ   r´   rÄ   rÛ   rK   rD   rL   rM   rÂ   rÂ   õ   s2   † ð˜Sð ¨ô ð�cô ð�cô õ	rL   rÂ   c                   óæ   ^ • \ rS rSrS\R
                  S\S\S\4U 4S jjrS r	S r
S	 rS
 r\   SS\R
                  S\S\S\\\4   S-  S\S\S\R&                  \-  4S jj5       rS rSrU =r$ )ÚTransformerWithSharedParamsi  r{   Údevice_init_modeÚadd_bnÚdeterministicc                 óÄ  >• [         TU ]  5         UR                  5       U l        UR                  5       U l        U(       a  [
        R                  " S5        SnSn[        R                  " XV5      U l	        [        R                  " USSSSS9U l        [        R                  " Xe5      U l        U R                  R                  U R                  l        U R                  SU R                  R                  R!                  U45      5        U R                  S	[
        R"                  " U R$                  [
        R&                  S
95        SU l        U(       a)  [
        R                  R+                  U R(                  5      O[
        R                  R-                  5       U l        U[0        R2                  :X  a  U R5                  [6        5      n U(       a  U R9                  5         g g )Nr   é   é   r8   é   gš™™™™™¹?)Úd_modelÚnum_encoder_layersÚnum_decoder_layersÚdim_feedforwardÚdropoutÚ
vocab_biasÚlong_buffer)Údtype)ÚsuperrÉ   r´   rÄ   rŒ   rq   Úmanual_seedrt   Ú	EmbeddingÚembed_tokensÚTransformerÚtransformerÚLinearÚoutput_projÚweightÚregister_bufferÚnew_onesÚ
zeros_likerì   ÚlongÚbsÚBatchNorm1dÚIdentityÚbnrO   rQ   r¤   r–   Úeval)rZ   r{   rà   rá   râ   Úd_vocabrç   Ú	__class__s          €rM   rÉ   Ú$TransformerWithSharedParams.__init__  s]  ø€ ô 	‰ÑÔØ—J‘J“LˆŒ	ØŸ*™*›,ˆŒÞÜ×Ò˜aÔ ØˆØˆäŸLšL¨Ó:ˆÔÜŸ>š>ØØ Ø ØØñ
ˆÔô Ÿ9š9 WÓ6ˆÔð #'×"3Ñ"3×":Ñ":ˆ×ÑÔØ×ÑØ˜$×+Ñ+×2Ñ2×;Ñ;¸W¸JÓGô	
ð 	×ÑØÜ×Ò˜TŸ_™_´E·J±JÑ?ô	
ð
 ˆŒÞ39”%—(‘(×&Ñ& t§w¡wÔ/¼u¿x¹x×?PÑ?PÓ?RˆŒØœ~×;Ñ;Ó;Ø—7‘7œ;Ó'ˆDÞØ�I‰I�Kð rL   c                 ó$  • [         R                  " SU R                  -   5        [         R                  " SUS9R	                  SU R
                  5      n[         R                  " U R
                  S-  US9R	                  SU R
                  5      nX#4$ )Nr@   é   ©r[   é   r7   )rq   rð   r´   ÚarangeÚviewrü   )rZ   r[   ÚsrcÚtgts       rM   r\   Ú%TransformerWithSharedParams.get_input7  sj   € Ü×Ò˜!˜dŸi™i™-Ô(Ü�lŠl˜2 fÑ-×2Ñ2°1°d·g±gÓ>ˆÜ�lŠl˜4Ÿ7™7 Q™;¨vÑ6×;Ñ;¸A¸t¿w¹wÓGˆØˆzÐrL   c                 ó   • U R                  U5      nX0R                  -   U R                  R                  U5      -   nU R                  U5      nU R	                  U5      nU R                  X45      nU R                  U5      $ r•   )rò   rì   rí   Útype_asrÿ   rô   rö   )rZ   Úsrc_idsÚtgt_idsr
  r  Úxs         rM   ÚforwardÚ#TransformerWithSharedParams.forward=  sr   € Ø×Ñ Ó(ˆØ—O‘OÑ# d×&6Ñ&6×&>Ñ&>¸sÓ&CÑCˆØ×Ñ Ó(ˆØ�g‰g�c‹lˆØ×Ñ˜SÓ&ˆØ×Ñ Ó"Ð"rL   c                 ó¤   • Uu  p4[         R                  R                  UR                  SUR	                  S5      5      UR                  S5      SS9$ )NéÿÿÿÿÚsum)Ú	reduction)rt   Ú
functionalÚcross_entropyr	  rÄ   )rZ   r`   ra   r�   r  s        rM   rb   Ú$TransformerWithSharedParams.get_lossE  sG   € Ø‰ˆÜ�}‰}×*Ñ*Ø�K‰K˜˜FŸK™K¨›OÓ,¨c¯h©h°r«lÀeð +ð 
ð 	
rL   c                 ó$   • UR                  5         g r•   ©Úbackwardre   s     rM   rg   Ú(TransformerWithSharedParams.run_backwardK  ó   € Ø�‰�rL   NÚfsdp_init_modeÚfsdp_kwargsrW   c                 óx  • Uc  0 nU[         R                  :X  a)  [        U [        5      (       a  U S   nOU n[	        XbXT5      $ U[         R
                  :X  a×  SU;  a  [        [        [        15      nOUR                  S5      nSU;   a?  US   [        R                  [        R                  1;   a  [        U [        5      (       d  SnOU n[        U [        5      (       a  U S   n	OU n	[	        X’XT5      n
[        U
U4SU0UD6nU[        R                  :X  a  UR!                  ["        5      nU$ [%        SU 35      e)aý  
Initializes a :class:`TransformerWithSharedParams` instance.

Args:
    fsdp_init_mode (FSDPInitMode): If ``NO_FSDP``, then does not wrap
        any modules with FSDP. If ``RECURSIVE``, then wraps with
        top-level FSDP. By default, the top-level FSDP uses the
        ``ModuleWrapPolicy`` for encoder and decoder layers, but a
        different auto wrap policy may be specified via
        ``fsdp_kwargs``.
    device_init_mode (DEVICEInitMode): Determines model movement to DEVICE.
    fsdp_kwargs (Optional[Dict[str, Any]]): Optional keyword arguments
        forwarded to the FSDP constructor.
    deterministic (bool): Whether to make the model deterministic
        across constructions.
    add_bn (bool): Whether to include batch norm in the model.
Nr   Úauto_wrap_policyÚsharding_strategyúUnsupported FSDP init mode: )rB   rI   Ú
isinstancerp   rß   rJ   r   r(   r'   Úpopr   ÚHYBRID_SHARDÚ_HYBRID_SHARD_ZERO2rš   rO   rR   r¤   r–   Ú
ValueError)r{   r   rà   r!  râ   rá   Úpgr#  Úfsdp_pgÚ
tformer_pgÚmÚ
fsdp_models               rM   rl   Ú TransformerWithSharedParams.initN  sW  € ð6 ÑØˆKØœ\×1Ñ1Ó1Ü˜%¤×'Ñ'Ø˜1‘X‘à�Ü.Ø fóð ð œ|×5Ñ5Ó5à!¨Ó4Ü#3ä/Ü/ðó$Ñ ð $/§?¡?Ð3EÓ#FÐ ð $ {Ó2ØÐ 3Ñ4Ü$×1Ñ1Ô3C×3WÑ3WÐXóYä" 5¬%×0Ñ0à‘à�ä˜%¤×'Ñ'Ø" 1™X‘
à"�
ä+Ø¨fóˆAô ØØñð "2ðð ñ	ˆJð  ¤>×#>Ñ#>Ó>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrL   c                 ó   • U R                   /$ r•   )rô   rÌ   s    rM   Úget_ignored_modulesÚ/TransformerWithSharedParams.get_ignored_modulesœ  s   € Ø× Ñ Ð!Ð!rL   )rÿ   rü   rò   rö   r´   rô   rŒ   )NFT)rE   rF   rG   rH   r�   ÚProcessGrouprO   ÚboolrÉ   r\   r  rb   rg   rs   rB   r³   r¬   r   rt   ru   rš   rl   r2  rK   Ú__classcell__©r  s   @rM   rß   rß     sã   ø† ð(à× Ñ ð(ð )ð(ð ð	(ð
 ÷(òTò#ò
òð ð
 .2Ø#ØñKJØ× Ñ ðKJà$ðKJð )ðKJð ˜#˜s˜(‘^ dÑ*ð	KJð
 ðKJð ðKJð 
�‰�TÑ	ôKJó ðKJ÷Z"ð "rL   rß   c                   óÔ   ^ • \ rS rSrS\R
                  S\S\S\4U 4S jjrS r	S r
S	 rS
 r\  SS\R
                  S\S\S\\\4   S-  S\S\R&                  4S jj5       rSrU =r$ )ÚNestedWrappedModulei   r{   r½   rà   râ   c                 ó¬  >^^^• [         TU ]  5         TR                  5       U l        TR                  5       U l        U[
        R                  :H  nUUU4S jnU(       a  [        R                  " S5        [        R                  " [        [        R                  " SS5      U5      U" [        R                  " U" [        [        R                  " SS5      U5      5      [        [        R                  " SS5      U5      5      5      U" [        [        R                  " SS5      U5      5      [        [        R                  " SS5      U5      5      U l        g )Nc                 ó0   >• T(       a  [        U T40 TD6$ U $ r•   r¿   ©Úlayerr!  r{   r½   s    €€€rM   Ú_maybe_wrapÚ1NestedWrappedModule.__init__.<locals>._maybe_wrap®  ó   ø€ ÞÜ˜E 5Ñ8¨KÑ8Ð8ØˆLrL   r   ræ   r7   rå   )rï   rÉ   r´   rÄ   rŒ   rO   rQ   rq   rð   rt   Ú
Sequentialr¼   rõ   Úmodule©	rZ   r{   r½   rà   râ   r!  rº   r>  r  s	    ``  `  €rM   rÉ   ÚNestedWrappedModule.__init__¡  sé   û€ ô 	‰ÑÔØ—J‘J“LˆŒ	ØŸ*™*›,ˆŒØ)¬^×-IÑ-IÑIˆ÷	ö
 Ü×Ò˜aÔ Ü—m’mÜœBŸIšI a¨›O¨^Ó<ÙÜ—’Ù¤´·	²	¸!¸RÓ0@À.Ó QÓRÜ#¤B§I¢I¨b°"Ó$5°~ÓFóóñ œ¬¯	ª	°"°aÓ(8¸.ÓIÓJÜœBŸIšI a¨›O¨^Ó<ó

ˆ�rL   c                 óv   • [         R                  " SU R                  -   5        [         R                  " SSUS94$ )Nr@   r7   ræ   r  )rq   rð   r´   ÚrandrY   s     rM   r\   ÚNestedWrappedModule.get_inputÁ  s.   € Ü×Ò˜!˜dŸi™i™-Ô(Ü—
’
˜1˜a¨Ñ/Ð1Ð1rL   c                 ó$   • U R                  U5      $ r•   ©rB  ©rZ   r  s     rM   r  ÚNestedWrappedModule.forwardÅ  ó   € Ø�{‰{˜1‹~ÐrL   c                 ó&   • UR                  5       nU$ r•   )r  ©rZ   r`   ra   rf   s       rM   rb   ÚNestedWrappedModule.get_lossÈ  s   € Ø�z‰z‹|ˆØˆrL   c                 ó$   • UR                  5         g r•   r  re   s     rM   rg   Ú NestedWrappedModule.run_backwardÌ  r  rL   Nr   r!  rW   c                 ó  • Uc  0 nU[         R                  :X  a  [        U SUUS9$ U[         R                  :X  a;  [        U 4SUUS.UD6nU[        R
                  :X  a  UR                  [        5      nU$ [        SU 35      e)aŠ  
Initializes a :class:`NestedWrappedModule` instance.

Args:
    fsdp_init_mode (FSDPInitMode): If ``NO_FSDP``, then does not wrap
        any modules with FSDP. If ``RECURSIVE``, then wraps some nested
        modules with FSDP but not the top-level module. The model may
        later be wrapped with a top-level FSDP external to this method
        if desired.
    device_init_mode (DEVICEInitMode): Determines model movement to DEVICE.
    fsdp_kwargs (Optional[Dict[str, Any]]): Optional keyword arguments
        forwarded to the FSDP constructor.
    deterministic (bool): Whether to make the model deterministic
        across constructions.
F©r½   rà   râ   Tr%  )	rB   rI   r9  rJ   rO   rR   r¤   r–   r*  )r{   r   rà   r!  râ   r/  s         rM   rl   ÚNestedWrappedModule.initÏ  s£   € ð. ÑØˆKØœ\×1Ñ1Ó1Ü&ØØØ!1Ø+ñ	ð ð œ|×5Ñ5Ó5ä,ØðàØ!1Ø+ñ	ð
 ñˆJð  ¤>×#>Ñ#>Ó>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrL   ©rB  r´   rŒ   ©NF)rE   rF   rG   rH   r�   r4  r5  rO   rÉ   r\   r  rb   rg   rs   rB   r³   r¬   r   rt   ru   rl   rK   r6  r7  s   @rM   r9  r9     s¼   ø† ð
à× Ñ ð
ð ð
ð )ð	
ð
 ÷
ò@2òòòð ð
 .2Ø#ñ+JØ× Ñ ð+Jà$ð+Jð )ð+Jð ˜#˜s˜(‘^ dÑ*ð	+Jð
 ð+Jð 
�‰ô+Jó ö+JrL   r9  c                   óv   ^ • \ rS rSr\  S
S\R                  S\S\S\	\
\4   S-  S\4
U 4S jjj5       rS	rU =r$ )ÚAlwaysWrapNestedWrappedModuleiþ  Nr{   r   rà   r!  râ   c                 ó:  >• [         [        [        ]   U [        R                  UUUS9nU[        R                  :X  a  U$ U[        R
                  :X  aH  U=(       d    0 n[        U4S[        0UD6nU[        R                  :X  a  UR                  [        5      nU$ g)zÖ
Initializes a :class:`NestedWrappedModule` instance, but unlike
:meth:`NestedWrappedModule.init`, for the ``RECURSIVE`` init mode, this
wraps with top-level FSDP and the ``always_wrap_policy()`` auto wrap
policy.
)r{   r   rà   r!  râ   r#  N)rï   rX  rl   rB   rI   rJ   rš   r   rO   rR   r¤   r–   )r{   r   rà   r!  râ   rv   r/  r  s          €rM   rl   Ú"AlwaysWrapNestedWrappedModule.initÿ  s£   ø€ ô Ü)Ô+Hñà
ØÜ'×/Ñ/Ø-Ø#Ø'ð ð 
ð 	ð œ\×1Ñ1Ó1ØˆLØœ|×5Ñ5Ó5Ø%×+¨ˆKÜ˜eÑXÔ6HÐXÈKÑXˆJØ¤>×#>Ñ#>Ó>Ø'Ÿ]™]¬;Ó7�
ØÐð 6rL   rD   rV  )rE   rF   rG   rH   rs   r�   r4  rB   rO   r³   r¬   r   r5  rl   rK   r6  r7  s   @rM   rX  rX  þ  s^   ø† Øð
 .2Ø#ñØ× Ñ ðà$ðð )ðð ˜#˜s˜(‘^ dÑ*ð	ð
 ÷ó örL   rX  c                   ó¸   ^ • \ rS rSrS\R
                  S\S\S\4U 4S jjr\	SS j5       r
\	  SS\R
                  S	\S\S
\\\4   S-  S\4
S jj5       rSrU =r$ )ÚNonUniformReqGradNWMi   r{   r½   rà   râ   c                 óÜ  >^^^• [         [        U ]  5         TR                  5       U l        TR	                  5       U l        U[        R                  :H  nUUU4S jnU(       a  [        R                  " S5        [        R                  " [        [        R                  " SS5      U5      U" [        R                  " U" [        [        R                  " SS5      U5      5      [        [        R                  " SS5      U5      5      5      U" [        R                  " [        [        R                  " SS5      U5      [        [        R                  " SS5      U5      5      5      5      U l        g )Nc                 ó0   >• T(       a  [        U T40 TD6$ U $ r•   r¿   r<  s    €€€rM   r>  Ú2NonUniformReqGradNWM.__init__.<locals>._maybe_wrap4  r@  rL   r   ræ   r7   rå   )rï   r9  rÉ   r´   rÄ   rŒ   rO   rQ   rq   rð   rt   rA  r¼   rõ   rB  rC  s	    ``  `  €rM   rÉ   ÚNonUniformReqGradNWM.__init__!  sý   û€ ô 	Ô! 4Ñ1Ô3ð —J‘J“LˆŒ	ØŸ*™*›,ˆŒØ)¬^×-IÑ-IÑIˆ÷	ö
 Ü×Ò˜aÔ Ü—m’mÜœBŸIšI a¨›O¨^Ó<ÙÜ—’Ù¤´·	²	¸!¸RÓ0@À.Ó QÓRÜ#¤B§I¢I¨b°"Ó$5°~ÓFóóñ Ü—’Ü#¤B§I¢I¨b°!Ó$4°nÓEÜ#¤B§I¢I¨a°£O°^ÓDóóó
ˆ�rL   Nc                 ó’   • U R                  5        H3  u  p#[        R                  " X5      (       a  M"  UR                  S5        M5     g rV  )r~   ÚreÚmatchÚrequires_grad_)rv   Úreq_grad_maskÚnÚps       rM   Ú_set_nonuniform_req_gradÚ-NonUniformReqGradNWM._set_nonuniform_req_gradK  s4   € à×*Ñ*Ö,‰DˆAÜ—8’8˜M×-Ó-Ø× Ñ  Ö'ò -rL   r   r!  c                 óŠ  • [         R                  " S5      nU[        R                  :X  a#  [	        U SUUS9n[        R                  Xe5        U$ U[        R                  :X  aU  Uc  0 n[	        U 4SUUS.UD6nU[        R                  :X  a  UR                  [        5      n[        R                  Xu5        U$ [        SU 35      e)aÏ  
Initializes a :class:`NestedWrappedModule` instance, but unlike
:meth:`NestedWrappedModule.init`, it wraps a second :class:`torch.nn.Sequential`
container to enable the desired non-uniform ``requires_grad``
``use_orig_params=True`` tests. For both ``RECURSIVE`` and ``NO_FSDP``
init modes, freezes all parameters except the last two to validate
``ShardedGradScaler`` support for ranks with no (non-zero sized) local shards in
FSDP ``use_orig_params=True`` mode.
zmodule\.2.*\.1.*FrS  Tr%  )rb  ÚcompilerB   rI   r\  rh  rJ   rO   rR   r¤   r–   r*  )r{   r   rà   r!  râ   Úreq_grad_patternÚ	ddp_modelr/  s           rM   rl   ÚNonUniformReqGradNWM.initQ  sÒ   € ô( Ÿ:š:Ð&9Ó:ÐØœ\×1Ñ1Ó1Ü,ØØØ!1Ø+ñ	ˆIô !×9Ñ9¸)ÔVØÐØœ|×5Ñ5Ó5ØÑ"Ø �Ü-ØðàØ!1Ø+ñ	ð
 ñˆJð  ¤>×#>Ñ#>Ó>Ø'Ÿ]™]¬;Ó7�
Ü ×9Ñ9¸*ÔWØÐÜÐ7¸Ð7GÐHÓIÐIrL   rU  rn   rV  )rE   rF   rG   rH   r�   r4  r5  rO   rÉ   rs   rh  rB   r³   r¬   r   rl   rK   r6  r7  s   @rM   r\  r\     s­   ø† ð(
à× Ñ ð(
ð ð(
ð )ð	(
ð
 ÷(
ðT ó(ó ð(ð
 ð
 .2Ø#ñ+JØ× Ñ ð+Jà$ð+Jð )ð+Jð ˜#˜s˜(‘^ dÑ*ð	+Jð
 ô+Jó ö+JrL   r\  c                   ó–   ^ • \ rS rSrSrS\R                  S\S\4U 4S jjrS r	S r
S	 rS
 r\S\\   S\S\S\S\4
S j5       rSrU =r$ )ÚModuleWithDelayi€  z‚This class wraps a :class:`FSDPTestModel` to optionally add a delay
after computing the loss and/or before the gradient reduction.rB  Údelay_after_loss_msÚdelay_before_reduction_msc                 óF   >• [         TU ]  5         X l        X0l        Xl        g r•   )rï   rÉ   rq  rr  rB  )rZ   rB  rq  rr  r  s       €rM   rÉ   ÚModuleWithDelay.__init__„  s!   ø€ ô 	‰ÑÔØ#6Ô Ø)BÔ&Ø�rL   c                 ó8   • U R                   R                  U5      $ r•   )rB  r\   rY   s     rM   r\   ÚModuleWithDelay.get_input�  s   € Ø�{‰{×$Ñ$ VÓ,Ð,rL   c                 ó$   • U R                  U5      $ r•   rI  rJ  s     rM   r  ÚModuleWithDelay.forward’  rL  rL   c                 ób  • U R                   R                  X5      nU R                  S:”  aƒ  [        (       d  [        (       a%  [
        R                  " U R                  S-  5        U$ [        (       a=  [        R                  R                  [        U R                  [        5       -  5      5        U$ ©Nr   éè  )rB  rb   rq  r3   r5   ÚtimeÚsleepr2   rq   r9   Ú_sleeprÝ   r0   rN  s       rM   rb   ÚModuleWithDelay.get_loss•  s}   € Ø�{‰{×#Ñ# EÓ2ˆØ×#Ñ# aÓ'ßŠxŸ8š8Ü—
’
˜4×3Ñ3°dÑ:Ô;ð ˆ÷ ’Ü—
‘
×!Ñ!¤# d×&>Ñ&>ÔARÓATÑ&TÓ"UÔVàˆrL   c                 óâ   ^ ^• [         R                  R                  mUU 4S jn[        R                  " SU5         T R
                  R                  U5        S S S 5        g ! , (       d  f       g = f)Nc                  ó8  >• TR                   S:”  a‚  [        (       a>  [        R                  R	                  [        TR                   [        5       -  5      5        O9[        (       d  [        (       a#  [        R                  " TR                   S-  5        T" U 0 UD6$ rz  )rr  r2   rq   r9   r~  rÝ   r0   r3   r5   r|  r}  )ri   rj   Úorig_reduce_scatterrZ   s     €€rM   Ú_delayed_reduce_scatterÚ=ModuleWithDelay.run_backward.<locals>._delayed_reduce_scatter¢  sq   ø€ Ø×-Ñ-°Ó1ß’9Ü—J‘J×%Ñ%Ü˜D×:Ñ:Ô=NÓ=PÑPÓQõ÷ ’X§¢Ü—J’J˜t×=Ñ=ÀÑDÔEÙ&¨Ð7°Ñ7Ð7rL   z'torch.distributed.reduce_scatter_single)rq   ÚdistributedÚreduce_scatter_singler   ÚpatchrB  rg   )rZ   rf   rƒ  r‚  s   `  @rM   rg   ÚModuleWithDelay.run_backwardŸ  sR   ù€ Ü#×/Ñ/×EÑEÐö	8ô �ZŠZØ5Ð7Nõ
ð �K‰K×$Ñ$ TÔ*÷
÷ 
ö 
ús   »A Á 
A.Úmodule_classÚ
model_argsÚmodel_kwargsc                ó<   • [        U R                  " U0 UD6UU5      $ )aá  
Args:
    module_class (Type[FSDPTestModel]): Wrapped module class to which
        to add delays.
    model_args: Positional arguments forwarded to the ``module_class``
        ``init()``.
    delay_after_loss_ms (int): Delay after computing the loss/before
        the optimizer step (in ms).
    delay_before_reduction_ms (int): Delay before reduce-scattering
        gradients (in ms).
    model_kwargs: Keyword arguments forwarded to the ``module_class``
        ``init()``.
)rp  rl   )r‰  rq  rr  rŠ  r‹  s        rM   rl   ÚModuleWithDelay.init±  s*   € ô* Ø×Ò˜zÐ:¨\Ñ:ØØ%ó
ð 	
rL   )rq  rr  rB  )rE   rF   rG   rH   ro   rt   ru   rÝ   rÉ   r\   r  rb   rg   rs   ÚtyperU   r   rl   rK   r6  r7  s   @rM   rp  rp  €  s‰   ø† ñFð	à—	‘	ð	ð !ð	ð $'÷		ò-òòò+ð$ ð
Ø˜=Ñ)ð
àð
ð !ð
ð $'ð	
ð
 ó
ó ö
rL   rp  c                   óŠ   • \ rS rSr\\R                  SSSS4S\R                  S\	S\S\
\\4   S-  S	\S
\S\4S jj5       rSrg)ÚNestedWrappedModuleWithDelayiÍ  NFr   r{   r   rà   r!  râ   rq  rr  c                 ó>   • [         R                  [        U UUUUUUS9$ )N©r{   r   rà   r!  râ   rq  rr  )rp  rl   r9  r’  s          rM   rl   Ú!NestedWrappedModuleWithDelay.initÎ  s4   € ô ×#Ñ#ÜØØ)Ø-Ø#Ø'Ø 3Ø&?ð $ð 	
ð 		
rL   rD   )rE   rF   rG   rH   rs   rO   rR   r�   r4  rB   r³   r¬   r   r5  rÝ   rl   rK   rD   rL   rM   r�  r�  Í  s€   † Øð ,:×+FÑ+FØ-1Ø#Ø#$Ø)*ñ
Ø× Ñ ð
à$ð
ð )ð
ð ˜#˜s˜(‘^ dÑ*ð	
ð
 ð
ð !ð
ð $'ô
ó ó
rL   r�  c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚDummyDDPiä  c                 ó.   >• [         TU ]  5         Xl        g r•   )rï   rÉ   rB  )rZ   rB  r  s     €rM   rÉ   ÚDummyDDP.__init__å  s   ø€ Ü‰ÑÔØ�rL   c                 ó&   • U R                   " U0 UD6$ r•   rI  ©rZ   ri   rj   s      rM   r  ÚDummyDDP.forwardé  s   € Ø�{Š{˜DÐ+ FÑ+Ð+rL   rI  ©rE   rF   rG   rH   rÉ   r  rK   r6  r7  s   @rM   r•  r•  ä  s   ø† õ÷,ð ,rL   r•  c                   óº   ^ • \ rS rSrS\R
                  S\S\S\S\4
U 4S jjr	S r
S	 r\   SS\R
                  S\S\S\\\4   S
-  S\S\4S jj5       rSrU =r$ )ÚMixtureOfExpertsií  r{   r½   rà   Údelay_before_free_msrâ   c                 ó¸  >• [         TU ]  UUUUS9  Xl        X@l        X l        U[
        R                  :H  U l        U(       a#  [        R                  " SU R                  -   5        SnSnSn	[        [        R                  " Xx5      U R                  5      n
[        S U
R                  5        5       5      U l        U
R                  5        H
  nSUl        M     U(       a  [        R                  " S5        [        [        R                  " X‡5      U R                  5      nU(       aF  [        R$                  R'                  UR                  5       /5      n[)        X­40 UD6n
[)        XÁ40 UD6n[        R*                  " [        [        R                  " X˜5      U R                  5      UU
[        [        R                  " X‰5      U R                  5      5      U l        g )	N)r{   r½   rà   râ   é*   rä   r  ræ   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7fr•   )Únumel)Ú.0rg  s     rM   Ú	<genexpr>Ú,MixtureOfExperts.__init__.<locals>.<genexpr>	  s   é € Ð$LÒ8K°1§W¡W§Y YÒ8Kùó   ‚Tr   )rï   rÉ   r{   rž  r½   rO   rQ   rº   rq   rð   r´   r¼   rt   rõ   r  rœ   Únum_expert_paramsÚexpertr…  Ú	new_grouprš   rA  rB  )rZ   r{   r½   rà   rž  râ   r!  Úd_expertÚd_sharedÚd_inputr¨  rg  ÚsharedÚexpert_groupr  s                 €rM   rÉ   ÚMixtureOfExperts.__init__î  s{  ø€ ô 	‰ÑØØØ-Ø'ð	 	ñ 	
ð Œ
Ø$8Ô!Ø"ŒØ.´.×2NÑ2NÑNˆÔÞä×Ò˜b 4§9¡9™nÔ-ØˆØˆØˆÜ ¤§¢¨8Ó!>À×@SÑ@SÓTˆä!$Ñ$L¸×8IÑ8IÔ8KÓ$LÓ!LˆÔØ×"Ñ"Ö$ˆAØˆAŽHñ %ö ä×Ò˜aÔ ä ¤§¢¨8Ó!>À×@SÑ@SÓTˆæä ×,Ñ,×6Ñ6Ø—‘“�óˆLô ˜&Ñ>°+Ñ>ˆFÜ˜&Ñ7¨;Ñ7ˆFä—m’mÜœBŸIšI gÓ8¸$×:MÑ:MÓNØØÜœBŸIšI hÓ8¸$×:MÑ:MÓNó	
ˆ�rL   c                 ó€  ^ ^• T R                   S:”  a‹  T R                  S   n[        U[        5      (       ag  [        R
                  R                  R                  R                  mUU 4S jn[        R                  " SU5         T R                  U5      sS S S 5        $ T R                  U5      $ ! , (       d  f       N= f)Nr   r8   c                  ó  >• [         (       a>  [        R                  R                  [	        TR
                  [        5       -  5      5        O9[        (       d  [        (       a#  [        R                  " TR
                  S-  5        T" U 0 UD6$ )Nr{  )r2   rq   r9   r~  rÝ   rž  r0   r3   r5   r|  r}  )ri   rj   Úorig_reshardrZ   s     €€rM   Ú_delayed_reshardÚ2MixtureOfExperts.forward.<locals>._delayed_reshard(  sc   ø€ ß ’yÜŸ
™
×)Ñ)Ü × 9Ñ 9Ô<MÓ<OÑ OÓPõ÷ "š§X¢XÜŸ
š
 4×#<Ñ#<¸tÑ#CÔDá'¨Ð8°Ñ8Ð8rL   z.torch.distributed.fsdp._runtime_utils._reshard)rž  rB  r&  rš   rq   r…  ÚfsdpÚ_runtime_utilsÚ_reshardr   r‡  )rZ   r  r¨  r³  r²  s   `   @rM   r  ÚMixtureOfExperts.forward"  s“   ù€ Ø×$Ñ$ qÓ(Ø—[‘[ ‘^ˆFÜ˜&¤$×'Ñ'Ü$×0Ñ0×5Ñ5×DÑD×MÑM�ö9ô —Z’ZØDÐFVõð  Ÿ;™; q›>÷ñ ð
 �{‰{˜1‹~Ð÷õ ús   ÂB/Â/
B=c                 óÆ  • UR                  5         U R                  (       d¯  [        R                  " 5          U R	                  5        H|  n[        US5      (       a  M  UR                  c  M%  UR                  R                  U R                  5        [        R                  R                  UR                  U R                  S9  M~     S S S 5        g g ! , (       d  f       g = f)Nr¨  rz   )r  r½   rq   r�   rœ   ÚhasattrÚgradÚdiv_rŒ   r…  Ú
all_reducer{   )rZ   rf   rg  s      rM   rg   ÚMixtureOfExperts.run_backward:  s�   € Ø�‰Œà�~�~Ü—’•ØŸ™Ö*�AÜ˜q (×+Ñ+Ù Ø—v‘vÓ)ØŸ™Ÿ™ D§O¡OÔ4Ü×)Ñ)×4Ñ4°Q·V±VÀ4Ç:Á:Ð4ÓNñ +÷ !�ð ß •ús   ·2CÁ-ACÃ
C Nr   r!  c                 ó
  • Uc  0 nU[         R                  :X  a  [        U SUUUS9$ U[         R                  :X  a<  [        U 4SUUUS.UD6nU[        R
                  :X  a  UR                  [        5      nU$ [        SU 35      e)a  
Initializes a :class:`MixtureOfExperts` instance.

Args:
    fsdp_init_mode (FSDPInitMode): If ``NO_FSDP``, then does not wrap
        any modules with FSDP. If ``RECURSIVE``, then wraps some nested
        modules with FSDP, including the expert and shared layers, but
        not the top-level module. The model may later be wrapped with a
        top-level FSDP external to this method if desired.
    device_init_mode (DEVICEInitMode): Determines model movement to DEVICE.
    fsdp_kwargs (Optional[Dict[str, Any]]): Optional keyword arguments
        forwarded to the FSDP constructor.
    deterministic (bool): Whether to make the model deterministic
        across constructions.
    delay_before_free_ms (int): Delay before resharding expert
        parameters in the forward pass (in ms).
F)r½   rà   rž  râ   Tr%  )	rB   rI   r�  rJ   rO   rR   r¤   r–   r*  )r{   r   rà   r!  râ   rž  r/  s          rM   rl   ÚMixtureOfExperts.initF  s©   € ð4 ÑØˆKØœ\×1Ñ1Ó1Ü#ØØØ!1Ø%9Ø+ñð ð œ|×5Ñ5Ó5ä)ØðàØ!1Ø%9Ø+ñð ñˆJð  ¤>×#>Ñ#>Ó>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrL   )rž  r{   rB  rº   r§  r½   )NFr   )rE   rF   rG   rH   r�   r4  r5  rO   rÝ   rÉ   r  rg   rs   rB   r³   r¬   r   rl   rK   r6  r7  s   @rM   r�  r�  í  s¼   ø† ð2
à× Ñ ð2
ð ð2
ð )ð	2
ð
 "ð2
ð ÷2
òhò0
Oð ð
 .2Ø#Ø$%ñ0JØ× Ñ ð0Jà$ð0Jð )ð0Jð ˜#˜s˜(‘^ dÑ*ð	0Jð
 ð0Jð "ô0Jó ö0JrL   r�  c                   ó¬   ^ • \ rS rSr SSSSS.S\S\R                  S-  S	\S
\S\4
U 4S jjjjrS\R                  S\R                  4S jr
S rSrU =r$ )ÚMLPiz  NTFr7   )ÚbiasÚwith_bufferÚdim_multiplierÚdimr[   rÃ  rÄ  rÅ  c                ó   >• [         TU ]  5         [        R                  " XU-  X#S9U l        [        R                  " XQ-  XUS9U l        U(       a'  U R                  S[        R                  " U4US95        g S U l	        g )N)r[   rÃ  r‹   r  )
rï   rÉ   rt   rõ   Úin_projÚout_projrø   rq   Úrandnr‹   )rZ   rÆ  r[   rÃ  rÄ  rÅ  r  s         €rM   rÉ   ÚMLP.__init__{  sf   ø€ ô 	‰ÑÔÜ—y’y °sÑ&:À6ÑUˆŒÜŸ	š	 .Ñ"6¸ÐQUÑVˆŒÞØ× Ñ  ¬5¯;ª;¸°vÀfÑ+MÕNàˆD�KrL   r  rW   c                 óØ   • U R                  U5      n[        R                  " U5      nU R                  U5      n[        R                  " U5      nU R                  b  X R                  -   nU$ r•   )rÈ  ÚFÚrelurÉ  r‹   )rZ   r  Úzs      rM   r  ÚMLP.forwardŒ  sQ   € Ø�L‰L˜‹OˆÜ�FŠF�1‹IˆØ�M‰M˜!ÓˆÜ�FŠF�1‹IˆØ�;‰;Ñ"Ø—K‘K‘ˆAØˆrL   c                 ó†   • U R                   b4  [        R                  R                  R	                  U R                   5        g g r•   )r‹   rq   rt   rl   Únormal_rÌ   s    rM   Úreset_parametersÚMLP.reset_parameters•  s+   € Ø�;‰;Ñ"Ü�H‰H�M‰M×!Ñ! $§+¡+Õ.ð #rL   )r‹   rÈ  rÉ  r•   )rE   rF   rG   rH   rÝ   rq   r[   r5  rÉ   rr   r  rÓ  rK   r6  r7  s   @rM   rÂ  rÂ  z  s€   ø† ð '+ðð
 Ø!Øòàðð —‘˜tÑ#ðð
 ðð ðð ÷ñ ð"˜Ÿ™ð ¨%¯,©,ô ÷/ð /rL   rÂ  c                   óV   ^ • \ rS rSrSS.S\S\4U 4S jjjrS\S\S	\S
S 4S jrSr	U =r
$ )ÚMLPStackiš  F)Úwith_seq_parallelÚmlp_dimr×  c                ó¾   >• [        USS9[        U5      [        USS9/nU(       a$  UR                  [        R                  " USS95        [        TU ]  " U6   X l        g )Né   )rÅ  F©rÃ  )rÂ  Úappendrt   Ú	LayerNormrï   rÉ   r×  )rZ   rØ  r×  Úmodulesr  s       €rM   rÉ   ÚMLPStack.__init__›  sV   ø€ ô �¨Ñ*Ü�‹LÜ�¨Ñ*ð	$
ˆö Ø�N‰Nœ2Ÿ<š<¨°eÑ<Ô=Ü‰Ò˜'Ñ"Ø!2ÕrL   Útp_meshÚdp_meshÚuse_activation_checkpointingrW   c           
      ó²  • [        SS9[        SS9[        SS9[        SS9[        SS9U R                  (       a  [        [        S5      S9O	[        5       S.nU R                  (       a  [	        SS9US'   [        XUS9  U  HD  n[        U[        R                  5      (       a  M$  U(       a  [        U5        [        U4S	U0UD6  MF     [        U 4S	U0UD6  U $ )
NF)Úuse_local_outputr@   )Úoutput_layouts)z	0.in_projz
0.out_projz	1.in_projz
1.out_projz	2.in_projz
2.out_proj)Úsequence_dimÚ3)Údevice_meshÚparallelize_planÚmesh)r#   r%   r×  r"   r&   r$   r&  rt   rÝ  r   r   )rZ   rà  rá  râ  r!  ré  rB  s          rM   ÚparallelizeÚMLPStack.parallelize§  sË   € ô )¸%Ñ@Ü)¸5ÑAÜ(¸%Ñ@Ü)¸5ÑAÜ(¸%Ñ@à×%×%ô *¼¸q»ÒBä Ó"ñ
Ðð ×!×!Ü$4À!Ñ$DÐ˜SÑ!Ü˜4ÐGWÒXÛˆFÜ˜&¤"§,¡,×/Ñ/ÙÞ+Ü˜6Ô"Ü˜Ñ< WÐ<°Ô<ñ ô 	�DÑ6˜wÐ6¨+Ò6ØˆrL   )rE   rF   rG   rH   rÝ   r5  rÉ   r   rë  rK   r6  r7  s   @rM   rÖ  rÖ  š  sN   ø† ØBGò 
3 ð 
3¸4÷ 
3ð 
3ðàðð ðð '+ð	ð 
÷ò rL   rÖ  c                   ó®   ^ • \ rS rSrSrS
S\S\4U 4S jjjrS\R                  S\
\R                  \R                  4   \R                  -  4S jrS	rU =r$ )ÚDoubleLineariÇ  zˆ
This can be used for returning multiple outputs from a module
(``use_second_linear=True``) or for having an unused module (``False``).
rÆ  Úuse_second_linearc                 óÎ   >• [         TU ]  5         [        R                  " X5      U l        [        R                  " X5      U l        [        R                  " 5       U l        X l        g r•   )	rï   rÉ   rt   rõ   Úlin1Úlin2ÚReLUrÎ  rï  )rZ   rÆ  rï  r  s      €rM   rÉ   ÚDoubleLinear.__init__Í  sA   ø€ Ü‰ÑÔÜ—I’I˜cÓ'ˆŒ	Ü—I’I˜cÓ'ˆŒ	Ü—G’G“IˆŒ	Ø!2ÕrL   r  rW   c                 óä   • U R                   (       a@  U R                  U R                  U5      5      U R                  U R                  U5      5      4$ U R                  U R                  U5      5      $ r•   )rï  rÎ  rñ  rò  rJ  s     rM   r  ÚDoubleLinear.forwardÔ  sQ   € ð ×!×!Ø—9‘9˜TŸY™Y q›\Ó*¨D¯I©I°d·i±iÀ³lÓ,CÐCÐCØ�y‰y˜Ÿ™ 1›Ó&Ð&rL   )rñ  rò  rÎ  rï  ©T)rE   rF   rG   rH   ro   rÝ   r5  rÉ   rq   rr   rp   r  rK   r6  r7  s   @rM   rî  rî  Ç  sY   ø† ññ
3˜Cð 3°D÷ 3ð 3ð'Ø—‘ð'à	ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨U¯\©\Ñ	9÷'ò 'rL   rî  Únew_all_gather_into_tensorc              #   ó   #   • [         R                  n[         R                  " 5         U [         l         S v •  [         R                  " 5         U[         l        g ! [         R                  " 5         U[         l        f = f7fr•   )r�   Úall_gather_singleÚbarrier)rø  Úorig_all_gathers     rM   Úpatch_all_gatherrý  â  sN   é € ä×,Ñ,€OÜ‡L‚L„NØ7„DÔð1Ûä�ŠŒØ!0ŒÕøô 	�ŠŒØ!0ŒÕüó   ‚1A>´A ¸!A>Á"A;Á;A>Únew_foreach_all_gatherc              #   ó@  #   • [         R                  R                  R                  R                  R
                  n[        R                  " 5         U [         R                  R                  R                  R                  l         S v •  [        R                  " 5         U[         R                  R                  R                  R                  l        g ! [        R                  " 5         U[         R                  R                  R                  R                  l        f = f7fr•   )rq   r…  rµ  Ú_fully_shardÚ_fsdp_param_groupÚforeach_all_gatherr�   rû  )rÿ  Úorig_foreach_all_gathers     rM   Úpatch_foreach_all_gatherr  î  s¾   é € ô 	×Ñ×Ñ×+Ñ+×=Ñ=×PÑPð ô 	‡L‚L„Nàô 
×Ñ×Ñ×'Ñ'×9Ñ9ÔLð
Ûä�ŠŒà#ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕPøô 	�ŠŒà#ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕPüó    ‚BDÂC ÂA	DÃA
DÄDÚnew_foreach_reducec              #   ó@  #   • [         R                  R                  R                  R                  R
                  n[        R                  " 5         U [         R                  R                  R                  R                  l         S v •  [        R                  " 5         U[         R                  R                  R                  R                  l        g ! [        R                  " 5         U[         R                  R                  R                  R                  l        f = f7fr•   )rq   r…  rµ  r  r  Úforeach_reducer�   rû  )r  Úorig_foreach_foreach_reduces     rM   Úpatch_foreach_reducer     s¾   é € ô 	×Ñ×Ñ×+Ñ+×=Ñ=×LÑLð  ô 	‡L‚L„Nàô 
×Ñ×Ñ×'Ñ'×9Ñ9ÔHð
Ûä�ŠŒà'ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕLøô 	�ŠŒà'ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕLür  Únew_reduce_scatter_tensorc              #   ó   #   • [         R                  n[         R                  " 5         U [         l         S v •  [         R                  " 5         U[         l        g ! [         R                  " 5         U[         l        f = f7fr•   )r�   r†  rû  )r  r‚  s     rM   Úpatch_reduce_scatterr    sO   é € ä×4Ñ4ÐÜ‡L‚L„NØ!:„DÔð9Ûä�ŠŒØ%8ŒÕ"øô 	�ŠŒØ%8ŒÕ"ürþ  Únew_all_reducec              #   ó   #   • [         R                  n[         R                  " 5         U [         l         S v •  [         R                  " 5         U[         l        g ! [         R                  " 5         U[         l        f = f7fr•   )r�   r½  rû  )r  Úorig_all_reduces     rM   Úpatch_all_reducer    sI   é € ä—o‘o€OÜ‡L‚L„NØ$„D„Oð*Ûä�ŠŒØ)Œ�øô 	�ŠŒØ)Œ�ürþ  Únew_unshardc              #   ó   #   • [         R                  n[        R                  " 5         U [         l         S v •  [        R                  " 5         U[         l        g ! [        R                  " 5         U[         l        f = f7fr•   )r   Úunshardr�   rû  )r  Úorig_unshards     rM   Úpatch_unshardr  *  óP   é € ô "×)Ñ)€LÜ‡L‚L„NØ(„NÔð.Ûä�ŠŒØ!-ŒÕøô 	�ŠŒØ!-ŒÕürþ  Únew_reshardc              #   ó   #   • [         R                  n[        R                  " 5         U [         l         S v •  [        R                  " 5         U[         l        g ! [        R                  " 5         U[         l        f = f7fr•   )r   Úreshardr�   rû  )r  r²  s     rM   Úpatch_reshardr  7  r  rþ  Únew_post_backwardc              #   ó   #   • [         R                  n[        R                  " 5         U [         l         S v •  [        R                  " 5         U[         l        g ! [        R                  " 5         U[         l        f = f7fr•   )r   Úpost_backwardr�   rû  )r  Úorig_post_backwards     rM   Úpatch_post_backwardr!  D  sQ   é € ô (×5Ñ5ÐÜ‡L‚L„NØ#4„NÔ ð:Ûä�ŠŒØ'9ŒÕ$øô 	�ŠŒØ'9ŒÕ$ürþ  Únew_backwardc              #   ó   #   • [         R                  n[        R                  " 5         U [         l         S v •  [        R                  " 5         U[         l        g ! [        R                  " 5         U[         l        f = f7fr•   )r   r  r�   rû  )r"  Úorig_backwards     rM   Ú*patch_register_post_backward_hook_backwardr%  Q  sS   é € ô 1×9Ñ9€MÜ‡L‚L„NØ,8Ô Ô)ð>Ûä�ŠŒØ0=Ô$Õ-øô 	�ŠŒØ0=Ô$Õ-ürþ  r‚  ri   rj   c                 ó†   • [        U5      S:”  a  US   nOSU;   a  US   nO[        SU SU 35      eU" U5        U" U0 UD6$ )Nr   ra   z,Cannot get reduce-scatter output from
args: z	
kwargs: )Úlenr…   )Úclsr‚  rx   ri   rj   ra   s         rM   Úreduce_scatter_with_assertr)  ^  sa   € ô ˆ4ƒy�1ƒ}Ø�a‘‰Ø	�VÓ	Ø˜Ñ!‰äØ;¸D¸6ÀÈFÈ8ÐTó
ð 	
ñ ˆfÔÙ Ð/¨Ñ/Ð/rL   Úreplicated_moduleÚsharded_moduleÚprefixes_to_ignore.c                 óô  • [        UR                  5       UR                  5       SS9 GHÌ  u  u  pEu  pgUnU H  n	UR                  U	S5      nM     U R                  XH5        U R	                  U[
        5        [        U[
        5      (       d  [        S5      eUR                  UR                  pº[        U5      [        S5      [        S5      4:X  a  [        S5      e[        XZU5      nU R                  UR                  5       UR                  5       5        UR                  c  U R                  UR                  5        GM  U R!                  UR                  5        [        UR                  X«5      nU R	                  UR                  [
        5        [        UR                  [
        5      (       d  [        S5      eU R                  UR                  R                  5       UR                  5       5        GMÏ     g )NTr|   Ú z&Expected sharded_param to be a DTensorr   zmFSDP's (Shard(0), Shard(0)) layout differs from distribute_tensor(), so we cannot check for equality using itz+Expected sharded_param.grad to be a DTensor)r†   r~   ÚreplaceÚassertEqualÚassertIsInstancer!   r&  r…   rè  Ú
placementsrp   r"   r    Úto_localr»  ÚassertIsNoneÚassertIsNotNone)r(  r*  r+  r,  Úreplicated_nameÚreplicated_paramÚsharded_nameÚsharded_paramÚclean_sharded_nameÚprefixrê  r2  Úsharded_ref_paramÚsharded_ref_grads                 rM   Úcheck_sharded_parityr>  q  s®  € ô ORØ×*Ñ*Ó,Ø×'Ñ'Ó)ØõOÑJÑ+ˆÑ-J¨lð
 *ÐÛ(ˆFØ!3×!;Ñ!;¸FÀBÓ!GÒñ )à�‰˜Ô<Ø×Ñ˜]¬GÔ4Ü˜-¬×1Ñ1Ü Ð!IÓJÐJØ(×4Ñ4°m×6NÑ6NˆjÜ�Ó¤ q£¬5°«8Ð 4Ó4Ü ð;óð ô .Ð.>ÀjÓQÐØ�‰˜×.Ñ.Ó0Ð2C×2LÑ2LÓ2NÔOØ× Ñ Ñ(Ø×Ñ˜]×/Ñ/Ô0ÚØ×Ñ˜M×.Ñ.Ô/Ü,Ð-=×-BÑ-BÀDÓUÐØ×Ñ˜]×/Ñ/´Ô9Ü˜-×,Ñ,¬g×6Ñ6Ü Ð!NÓOÐOØ�‰˜×*Ñ*×3Ñ3Ó5Ð7G×7PÑ7PÓ7R×Sò9OrL   c                   óJ   ^ • \ rS rSr\S 5       rU 4S jrS rS rS r	Sr
U =r$ )ÚFSDPTestMultiThreadi–  c                 ó   • [         $ r•   ©ÚDEVICE_COUNTrÌ   s    rM   rŒ   ÚFSDPTestMultiThread.world_size—  ó   € äÐrL   c                 óB   >• [         TU ]  5         U R                  5         g r•   )rï   ÚsetUpÚ_spawn_threads©rZ   r  s    €rM   rG  ÚFSDPTestMultiThread.setUp›  s   ø€ Ü‰‰ŒØ×ÑÕrL   c                 ó    • [        U /UQ70 UD6$ r•   ©r-   r™  s      rM   r-   Ú FSDPTestMultiThread.run_subtestsŸ  ó   € Ü˜DÐ2 4Ò2¨6Ñ2Ð2rL   c                 ó@   • [         R                  R                  5         g r•   ©rq   Ú_dynamoÚresetrÌ   s    rM   ÚperThreadSetUpÚ"FSDPTestMultiThread.perThreadSetUp¢  ó   € Ü�‰×ÑÕrL   c                 ó@   • [         R                  R                  5         g r•   rP  rÌ   s    rM   ÚperThreadTearDownÚ%FSDPTestMultiThread.perThreadTearDown¥  rU  rL   rD   )rE   rF   rG   rH   ÚpropertyrŒ   rG  r-   rS  rW  rK   r6  r7  s   @rM   r@  r@  –  s.   ø† Øñó ðõò3ò÷ð rL   r@  c            #       ód  • \ rS rSrSrS rS rS rS r\	S 5       r
       S$S
\R                  S\S\S\S\S-  S\S\S-  S\S\S\\\4   S-  4S jjrSSS\" 5       SSSS	S	S	S	SS4S\\   S\S\S\S-  S\S\S\S\S-  S\S-  S\S-  S\S \S\S\S!\\\4   S-  S\\\4   S-  4 S" jjrS#rg)%ÚFSDPTestMixini©  z‡
Mixin class containing shared test utilities for FSDP tests.
Provides common helper methods for both FSDPTest and FSDPTestContinuous.
c                 ó:   • U R                  X!R                  5        g r•   )r0  r§   )rZ   r/  r§   s      rM   Ú_check_cpu_offloadÚ FSDPTestMixin._check_cpu_offload¯  s   € Ø×Ñ˜×&<Ñ&<Õ=rL   c                 ó:   • U R                  X!R                  5        g r•   )r0  Úbackward_prefetch)rZ   r/  r`  s      rM   Ú_check_backward_prefetchÚ&FSDPTestMixin._check_backward_prefetch²  s   € Ø×ÑÐ*×,HÑ,HÕIrL   c                 ó:   • U R                  X!R                  5        g r•   )r0  Úforward_prefetch)rZ   r/  rd  s      rM   Ú_check_forward_prefetchÚ%FSDPTestMixin._check_forward_prefetchµ  s   € Ø×ÑÐ)×+FÑ+FÕGrL   c                 ó    • [        U /UQ70 UD6$ r•   rL  r™  s      rM   r-   ÚFSDPTestMixin.run_subtests¸  rN  rL   c                 ó  • U " U5      nXl         X6l        UR                  SS5      n[        SUR                    SUR                   35        [
        S:w  a`  [        R                  R                  5       UR                  :  a4  [        R                  " [        SUR                   3   R                  5         U(       a^  [        R                  R                  R                  R                   R#                  5       n[$        R&                  " SUR                  UUS9  OC[$        R&                  " UR(                  [*        [-        UR                  5      UR                   S	9   S n
UR                   [2        -  n[4        (       d  [6        (       a  [        R                  R9                  U5        U/n
[$        R:                  " U
S9  [        R<                  R?                  5         [A        5         URC                  X$5        [        R<                  R?                  5         [$        R:                  " U
S9  [$        RD                  " 5         g ! [.         a@  n	S
U	R0                  S   ;   a'  [        R                  " [        S   R                  5        e S n	A	ff = f)NÚfake_pgFúdist init r=ú, world=r>   ú
multi-gpu-Úfake©ÚbackendrŒ   r´   Ústore©Úinit_methodrp  rŒ   r´   Ú	recompiler   Úbackend_unavailable©Ú
device_ids)#r´   Ú	file_nameÚgetÚprintrŒ   r–   rq   ÚacceleratorÚdevice_countÚsysÚexitr.   Ú	exit_codeÚtestingÚ	_internalr…  rj  Ú	FakeStorer�   Úinit_process_grouprs  ÚDISTRIBUTED_BACKENDrÝ   ÚRuntimeErrorri   rC  r2   r5   Úset_device_indexrû  rQ  rR  r1   Úrun_testÚdestroy_process_group©r(  r´   Ú	test_namerx  Úpiperj   rZ   rj  rq  Úerw  Ú	device_ids               rM   Ú_runÚFSDPTestMixin._run»  sÎ  € á�9‹~ˆØŒ	Ø"ŒØ—*‘*˜Y¨Ó.ˆä�˜TŸY™Y˜K x°·±Ð/@ÐAÔBÜ˜%Ó¤E×$5Ñ$5×$BÑ$BÓ$DÀtÇÁÓ$VÜ�HŠH”Z *¨T¯_©_Ð,=Ð >Ñ?×IÑIÔJð	ÞÜŸ™×/Ñ/×;Ñ;×CÑC×MÑMÓO�Ü×'Ò'Ø"Ø#Ÿ™ØØó	ô ×'Ò'Ø $× 0Ñ 0Ü/Ü" 4§?¡?Ó3ØŸ™ó	ð ˆ
Ø—I‘I¤Ñ,ˆ	ßŠ9ŸšÜ×Ñ×.Ñ.¨yÔ9Ø�[ˆ
ô
 	�Š 
Ò+ä�‰×ÑÔÜŒØ�‰�iÔ&Ü�‰×ÑÔä�Š 
Ò+ä×"Ò"Õ$øô1 ó 	Ø˜aŸf™f Q™iÓ'Ü—’œÐ$9Ñ:×DÑDÔEàûð		ús    Â7A$I ÄAI É
JÉ;JÊJNFrv   Ú	num_stepsÚautocastÚlrÚfsdp_cpu_offloadÚ
save_modelÚmixed_precisionÚenable_sharded_grad_scalerÚuse_pure_fp16Úsharded_grad_scaler_kwargsc           	      ó°  • U=(       a    UR                   n[        UR                  5       5      R                  nU
c  0 n
[	        S	SU0U
D6n[
        R                  R                  UR                  5       USS9n[        U5       GHt  nUR                  5         [
        R                  R                  [        US9   UR                  R                  [
        R                  " [        5      5      nU	(       d  U(       aW  [        U[         5      (       dB  [        U[
        R"                  5      (       a  UR%                  5       nO['        S U 5       5      nU" U6 nU(       ap  [        U[         5      (       a[  UR(                  [*        ;  aG  UR                  5        H3  nU R-                  UR                  [
        R                  " S5      5        M5     UR                  R/                  UU5      R1                  U5      nS S S 5        UR3                  W5      nU(       d1  U	(       d*  UR4                  [
        R6                  :w  a  [9        S5      eO¦U	(       a+  U R-                  UR4                  [
        R:                  5        Ot[        U[         5      (       a5  Uc  [9        S5      eU R-                  UR4                  UR<                  5        O*U R-                  UR4                  [
        R6                  5        UR                  R?                  U5        U(       a\  [        U[         5      (       aG  UR                  5        H3  nU R-                  UR                  [
        R                  " S5      5        M5     URA                  U5        URC                  5         U(       d  GM  URE                  5       RG                  5        VVs0 s H  u  nnUURI                  5       _M     nnn[K        U5        URM                  U5        GMw     [        U[         5      (       a  URO                  [P        RR                  5        WRU                  5       $ ! , (       d  f       GNN= fs  snnf )
NÚenabledgÍÌÌÌÌÌì?)r’  Úmomentum)rš  c              3   ó@   #   • U  H  oR                  5       v •  M     g 7fr•   )r¥   )r£  r  s     rM   r¤  Ú9FSDPTestMixin._train_for_several_steps.<locals>.<genexpr>  s   é € Ð%>º°1§f¡f§h hºùr¦  r>   zQloss data type should be float32, as the original parameter data type is float32.z'Expected mixed_precision to not be NonerD   )+Úoffload_paramsÚnextrœ   r[   r   rq   ÚoptimÚSGDrƒ   Ú	zero_gradÚampr‘  r–   rB  r\   r&  rš   rr   r¥   rp   r$  r   r0  rb   r¤   Úscalerî   Úfloat32r…   Úfloat16Úparam_dtyperg   ÚstepÚupdater¦   r±   Úcloner¢   Úload_state_dictÚ_assert_stater   ÚIDLEr   )rZ   rv   r�  r‘  r’  r“  r”  r•  r–  r—  r˜  Úcpu_offload_paramsÚmodel_deviceÚsharded_grad_scalerr   r�   r`   ra   rg  rf   ÚkÚvr¦   s                          rM   Ú_train_for_several_stepsÚ&FSDPTestMixin._train_for_several_stepsò  s@  € ð .×QÐ2B×2QÑ2QÐä˜E×,Ñ,Ó.Ó/×6Ñ6ˆØ%Ñ-Ø)+Ð&Ü/ñ 
Ø.ð
Ø2Lñ
Ðô
 —‘—‘ × 0Ñ 0Ó 2°rÀC�ÐHˆÜ�y×!ˆAØ�O‰OÔÜ—‘×#Ñ#¤K¸Ð#ÒBàŸ™×.Ñ.¬u¯|ª|¼KÓ/HÓI�Þ ¦_¼ZÈÌt×=TÑ=TÜ! %¬¯©×6Ñ6Ø %§
¡
£™ä %Ñ%>¹Ó%>Ó >˜Ù ˜�ö 'Ü" 5¬$×/Ñ/ð ×/Ñ/Ü>ó?ð #×-Ñ-Ö/˜à×(Ñ(¨¯©´5·<²<ÀÓ3FÖGñ 0ð —|‘|×,Ñ,¨U°FÓ;×>Ñ>¸|ÓL�÷- Cð. '×,Ñ,¨TÓ2ˆDæ"®=Ø—:‘:¤§¡Ó.Ü(ð:óð ð /ö !Ø×$Ñ$ T§Z¡Z´·±Õ?ä ¤t×,Ñ,Ø&Ñ.Ü,ØEóð ð ×$Ñ$ T§Z¡Z°×1LÑ1LÕMà×$Ñ$ T§Z¡Z´·±Ô?Ø�L‰L×%Ñ% dÔ+æ!¤j°¼×&=Ñ&=Ø×)Ñ)Ö+�Aà×$Ñ$ Q§X¡X¬u¯|ª|¸EÓ/BÖCñ ,ð  ×$Ñ$ UÔ+à×&Ñ&Ô(ç‰zØ7<×7GÑ7GÓ7I×7OÑ7OÔ7QÔRÒ7Q©t¨q°!˜a §¡£šlÑ7Q�
ÑRô ˜EÔ"Ø×%Ñ% j×1ñ{ "ô~ �eœT×"Ñ"Ø×Ñ¤× 2Ñ 2Ô3Ø�{‰{‹}Ð÷ CÖBüón Ss   Â9E Q Î:QÑ 
Q	r8   TÚmodel_classr   rà   Úref_init_fnÚ	num_itersr§   r`  r$  rd  Úuse_orig_paramsÚinit_kwargsc                 ó@  • U[         R                  :X  a  [        S5      eUc  0 nSnU R                  R	                  5       nUR
                  " U R                  [         R                  [        R                  4SS0UD6nUcC  [        (       a  [        U[        /[        S9nO+[        S:X  a  [        U5      nO[        UU/US9nOU" U5      nU(       a  UR                  5       nU R                  UUU
SLUUU
UUUS9	n[        UR                  5       5      nUR                  UUU	U
UUS	.5         UR
                  " U R                  UUU4SS0UD6n['        U[(        5      (       d  [)        UU R                  40 UD6nU(       a  UR                  5       nU[        R*                  :X  a  UR-                  [        5      nUSL=(       a    UR.                  nU=(       a    U[        R*                  :H  nU=(       a    U[        R*                  :g  nU(       aI  [0        R2                  " S5      nUR                  5        H  nU R5                  UR2                  U5        M!     U(       a  U R7                  [8        S[         35      O	[;        5       nU   U R                  UUSUUUU
UUUS9
n SSS5        U(       a  gU(       a^  [0        R2                  " S5      nUR                  5        H  nU R5                  UR2                  U5        M!     W R-                  [        5      n [=        U5      n![0        R>                  RA                  UW SS9  U
c  U(       d  U R5                  UU!SSS9  ggg! [          a   n[#        S
U S[%        U5       35      UeSnAff = f! , (       d  f       Nñ= f)a…  
Tests FSDP training against a reference, which defaults to DDP but
may be customized with ``ref_init_fn``.

Args:
    model_class (Type[FSDPTestModel]): A model class that inherits from
        ``FSDPTestModel``, which defines the expected interface.
    fsdp_init_mode (FSDPInitMode): The mode to initialize the
        FSDP-wrapped model. This should not be ``NO_FSDP``.
    ref_init_fn (Optional[Callable]): A callable to invoke that wraps a
        non-wrapped model to construct the reference model, where this
        wrapper should provide data parallel semantics. If ``None``,
        then the callable defaults to the DDP constructor.
z.Expects an FSDP init mode that wraps with FSDPNç{®Gáz„?râ   T)rw  Úoutput_devicer>   )r‘  r’  r“  r•  r–  r—  r˜  )r§   r`  r$  r•  rd  r¸  zInitializing z raised error zOAn FSDP-managed module with parameter CPU offloading enabled has parameters on F)r‘  r’  r“  r”  r•  r–  r—  r˜  )Úcheck_dtypezFSDP did not match DDP)Úexact_deviceÚmsg)!rB   rI   r…   rw   r´   rl   rO   rQ   r3   ÚDDPr–   r¥   r³  r¸   rœ   r©  Ú	Exceptionr*  r¬   r&  rš   rR   r¤   rž  rq   r[   r0  ÚassertRaisesRegexr…  r   r¹   r€  Úassert_close)"rZ   rµ  r   rà   r¶  r·  r”  r§   r`  r$  r•  rd  r¸  r–  r—  r¹  r˜  r!  r’  r´   rv   Ú	ref_modelÚref_lossÚ
ddp_paramsr/  rŒ  rž  Úexpects_device_errorÚexpects_cpu_deviceÚ
cpu_devicerˆ   ÚcontextÚ	fsdp_lossÚfsdp_unsharded_paramss"                                     rM   Ú_test_fsdp_parityÚFSDPTestMixin._test_fsdp_parityM  sµ  € ðD œ\×1Ñ1Ó1Ü Ð!QÓRÐRØÑØˆKØˆØ×!Ñ!×&Ñ&Ó(ˆà× Ò Ø×ÑÜ× Ñ Ü×(Ñ(ñ
ð ð	
ð
 ñ
ˆð ÑßŠxÜØ¤{ mÄ;ñ‘	ô  Ó%Ü ›J‘	ä °4°&ÈÑM‘	á# EÓ*ˆIÞØ!Ÿ™Ó(ˆIØ×0Ñ0ØØØ$¨DÐ0ØØ(Ø+Ø'AØ'Ø'Að 1ð 

ˆô ˜)×.Ñ.Ó0Ó1ˆ
à×Ñà*Ø%6Ø%6Ø#2Ø$4Ø#2ñô		
ð
	YØ$×)Ò)Ø×"Ñ"ØØ Øñ	ð
 #ðð ñˆJô ˜*¤d×+Ñ+ô ˜j¨$×*<Ñ*<ÑLÀÑLˆJÞà#Ÿ™Ó*ˆJØœ~×:Ñ:Ó:Ø#Ÿ™¤{Ó3ˆJØ$¨DÐ0×O°[×5OÑ5Oˆð
 ×NÐ/´>×3NÑ3NÑNð 	ð ×NÐ/´>×3NÑ3NÑNð 	ö ÜŸš eÓ,ˆJØ#×.Ñ.Ö0�Ø× Ñ  §¡¨zÖ:ñ 1ö $ð ×"Ñ"Üð%Ü%0 Mð3ôô “ð 	ò Ø×5Ñ5ØØØØØ!,Ø%Ø /Ø+EØ+Ø+Eð 6ð ˆI÷ ö  Øö ÜŸš eÓ,ˆJØ#×.Ñ.Ö0�Ø× Ñ  §¡¨zÖ:ñ 1à!Ÿ™¤[Ó1ˆIÜ /°
Ó ;Ðô 	�‰×"Ñ" 8¨YÀEÐ"ÑJð Ñ"®=Ø×ÑØØ%Ø!Ø,ð	 ò ð ,9Ð"øôK ó 	YÜ˜}¨[¨M¸ÌÈAËÀxÐPÓQÐWXÐXûð	Yú÷F �Wús$   Ä."M" ÊNÍ"
NÍ,NÎNÎ
N©rx  r´   )r»  NFNFFN)rE   rF   rG   rH   ro   r]  ra  re  r-   ÚclassmethodrŽ  rt   ru   rÝ   r5  Úfloatr   r   r³   r¬   r   r³  rŽ  rU   rB   rO   r   r   r   rÍ  rK   rD   rL   rM   r[  r[  ©  sî  † ñò
>òJòHò3ð ñ4%ó ð4%ðv Ø.2Ø Ø15Ø+0Ø#Ø<@ñYà�y‰yðYð ðYð ð	Yð
 ðYð % tÑ+ðYð ðYð (¨$Ñ.ðYð %)ðYð ðYð %)¨¨c¨¡N°TÑ$9õYð@ (,ØØÙ",£,Ø59Ø59Ø15Ø!&Ø %Ø+0Ø#Ø-1Ø<@ñ#hà˜-Ñ(ðhð %ðhð )ð	hð
  ‘_ðhð ðhð ðhð  ðhð ,¨dÑ2ðhð ,¨dÑ2ðhð (¨$Ñ.ðhð ðhð ðhð %)ðhð ðhð  ˜#˜s˜(‘^ dÑ*ð!hð" %)¨¨c¨¡N°TÑ$9÷#hð hrL   r[  c                   ó€   ^ • \ rS rSrU 4S jr\S 5       r\S 5       r\S\4S j5       r	\S 5       r
\S 5       rS	rU =r$ )
ÚFSDPTestiø  c                 óh   >• [         TU ]  5         S[        R                  S'   U R	                  5         g )NÚ0ÚTORCH_NCCL_DESYNC_DEBUG)rï   rG  ÚosÚenvironÚ_spawn_processesrI  s    €rM   rG  ÚFSDPTest.setUpù  s)   ø€ Ü‰‰Œð 14Œ�
‰
Ð,Ñ-Ø×ÑÕrL   c                 ó   • [         $ r•   rB  rÌ   s    rM   rŒ   ÚFSDPTest.world_size  rE  rL   c                 ó>   • [         R                  R                  5       $ r•   )r�   Údistributed_c10dÚ_get_default_grouprÌ   s    rM   rw   ÚFSDPTest.process_group  s   € ä×$Ñ$×7Ñ7Ó9Ð9rL   rW   c                 ó   • grV  rD   rÌ   s    rM   Údestroy_pg_upon_exitÚFSDPTest.destroy_pg_upon_exit	  s   € ð rL   c                 ó*   • [          U R                   3$ r•   )r/   rx  rÌ   s    rM   rs  ÚFSDPTest.init_method  s   € ä�˜tŸ~™~Ð.Ð/Ð/rL   c                 ó  • U " U5      nXl         X6l        UR                  SS5      n[        SUR                    SUR                   35        [
        R                  R                  5       UR                  :  a4  [        R                  " [        SUR                   3   R                  5         U(       a^  [
        R                  R                  R                  R                  R!                  5       n["        R$                  " SUR                  UUS9  OC["        R$                  " UR&                  [(        [+        UR                  5      UR                   S9   S n
UR                   [0        -  n[2        (       d  [4        (       a  [
        R                  R7                  U5        U/n
["        R8                  " U
S9  [
        R:                  R=                  5         [?        5         URA                  X$5        [
        R:                  R=                  5         ["        R8                  " U
S9  ["        RB                  " 5         g ! [,         a@  n	S	U	R.                  S
   ;   a'  [        R                  " [        S   R                  5        e S n	A	ff = f)Nrj  Frk  rl  rm  rn  ro  rr  rt  r   ru  rv  )"r´   rx  ry  rz  rŒ   rq   r{  r|  r}  r~  r.   r  r€  r�  r…  rj  r‚  r�   rƒ  rs  r„  rÝ   r…  ri   rC  r2   r5   r†  rû  rQ  rR  r1   r‡  rˆ  r‰  s               rM   rŽ  ÚFSDPTest._run  sÇ  € á�9‹~ˆØŒ	Ø"ŒØ—*‘*˜Y¨Ó.ˆä�˜TŸY™Y˜K x°·±Ð/@ÐAÔBÜ×Ñ×)Ñ)Ó+¨d¯o©oÓ=Ü�HŠH”Z *¨T¯_©_Ð,=Ð >Ñ?×IÑIÔJð	ÞÜŸ™×/Ñ/×;Ñ;×CÑC×MÑMÓO�Ü×'Ò'Ø"Ø#Ÿ™ØØó	ô ×'Ò'Ø $× 0Ñ 0Ü/Ü" 4§?¡?Ó3ØŸ™ó	ð ˆ
Ø—I‘I¤Ñ,ˆ	ßŠ9ŸšÜ×Ñ×.Ñ.¨yÔ9Ø�[ˆ
ô
 	�Š 
Ò+ä�‰×ÑÔÜŒØ�‰�iÔ&Ü�‰×ÑÔä�Š 
Ò+ä×"Ò"Õ$øô1 ó 	Ø˜aŸf™f Q™iÓ'Ü—’œÐ$9Ñ:×DÑDÔEàûð		ús    Â-A$H7 ÄAH7 È7
JÉ;I<É<JrÏ  )rE   rF   rG   rH   rG  rY  rŒ   rw   r5  râ  rs  rÐ  rŽ  rK   r6  r7  s   @rM   rÓ  rÓ  ø  ss   ø† õ ð ñó ðð ñ:ó ð:ð ð dó ó ðð ñ0ó ð0ð ñ4%ó ö4%rL   rÓ  c                   óž   ^ • \ rS rSr% Sr\r\\S'   \	S\
4S j5       r\	S\
4S j5       r\	U 4S j5       rU 4S jrU 4S	 jr\S
 5       rSrU =r$ )ÚFSDPTestContinuousiJ  zê
FSDP test base class using MultiProcContinuousTest for faster test execution.
This class reuses worker processes across tests, reducing process spawn overhead.
Use this for tests that don't require fresh process state between tests.
rŒ   rW   c                 ó   • [         $ r•   )r„  ©r(  s    rM   Úbackend_strÚFSDPTestContinuous.backend_strS  s   € ä"Ð"rL   c                 ó   • [         $ r•   )r–   rë  s    rM   Údevice_typeÚFSDPTestContinuous.device_typeW  s   € äÐrL   c                 ó`  >• S[         R                  S'   [        R                  R	                  5       U:  a*  [
        R                  " [        SU 3   R                  5        U[        -  n[        (       d  [        (       a  [        R                  R                  U5        [        TU ]9  XU5        g )NrÕ  rÖ  rm  )r×  rØ  rq   r{  r|  r}  r~  r.   r  rC  r2   r5   r†  rï   Ú_init_pg)r(  r´   rŒ   Ú	rdvz_filer�  r  s        €rM   rò  ÚFSDPTestContinuous._init_pg[  s   ø€ ð
 14Œ�
‰
Ð,Ñ-ä×Ñ×)Ñ)Ó+¨jÓ8Ü�HŠH”Z *¨Z¨LÐ 9Ñ:×DÑDÔEàœ<Ñ'ˆ	ßŠ9ŸšÜ×Ñ×.Ñ.¨yÔ9ä‰Ñ˜¨9Õ5rL   c                 óÐ   >• [         TU ]  5         U R                  U R                  :w  a  [        R
                  " 5         [        R                  R                  5         [        5         g r•   )
rï   rG  r´   ÚMAIN_PROCESS_RANKr�   rû  rq   rQ  rR  r1   rI  s    €rM   rG  ÚFSDPTestContinuous.setUpk  s>   ø€ Ü‰‰Œð �9‰9˜×.Ñ.Ó.Ü�LŠLŒNÜ�‰×ÑÔÜ�rL   c                 ó¼   >• U R                   U R                  :w  a  [        R                  " 5         [        TU ]  5         [        R                  R                  5         g r•   )	r´   rö  r�   rû  rï   ÚtearDownrq   rQ  rR  rI  s    €rM   rù  ÚFSDPTestContinuous.tearDownu  s9   ø€ à�9‰9˜×.Ñ.Ó.Ü�LŠLŒNÜ‰ÑÔÜ�‰×ÑÕrL   c                 ó.   • U R                   R                  $ r•   )r  r+  rÌ   s    rM   rw   Ú FSDPTestContinuous.process_group|  s   € à�~‰~× Ñ Ð rL   rD   )rE   rF   rG   rH   ro   rC  rŒ   rÝ   Ú__annotations__rÐ  r¬   rì  rï  rò  rG  rù  rY  rw   rK   r6  r7  s   @rM   ré  ré  J  sz   ø‡ ñð #€J�Ó"àð#˜Có #ó ð#ð ð˜Có ó ðð ô6ó ð6õõð ñ!ó ö!rL   ré  Úcompile_compute_on_modulec                 óD   ^ ^^• U 4S jm " S S[         5      mUU4S jnU$ )Nc                  ó°   >• [         R                  R                  R                  " U 0 UD6  Tb  [	        U S   T5      (       a  U S   R                  5         g g )Nr   )rq   r…  rµ  r   r&  rk  )ri   rj   rþ  s     €rM   Ú!fully_shard_with_compiled_computeÚ=compiled_fsdp_test.<locals>.fully_shard_with_compiled_compute‚  sS   ø€ Ü×Ñ×Ñ×*Ò*¨DÐ;°FÒ;Ø$Ñ,´
Ø�‰GÐ.÷1
ñ 1
ð �‰G�O‰OÕð1
rL   c                   ó0   • \ rS rSr\" 5       r\" 5       rSrg)Ú*compiled_fsdp_test.<locals>.FullyShardModei‰  rD   N)rE   rF   rG   rH   r   ÚEAGERÚCOMPILED_COMPUTErK   rD   rL   rM   ÚFullyShardModer  ‰  s   † Ù“ˆÙ›6ÓrL   r  c                 ó6   >^ • [        T 5      UUU 4S j5       nU$ )Nc                  óè  >• [         R                  R                  R                  nT GHF  nUTR                  :w  a&  [        5       (       d  [        R                  " SSS9  M:  [         R                  R                  R                  n[         R                  R                  5         UTR                  :X  a  UnO@UTR                  :X  a"  S[         R                  R                  l
        TnO[        SU 35      eUTR                  UR                  '   T" U 0 UD6  [         R                  R                  5         UTR                  UR                  '   U[         R                  R                  l
        GMI     g )Nz0Inductor on GPU needs Triton and recent GPU archr8   )Ú
stacklevelr@   z!Need to implement FullyShardMode=)rq   r…  rµ  r   r  r6   ÚwarningsÚwarnÚ	_inductorÚconfigÚcompile_threadsrû  r  ÚNotImplementedErrorÚ__globals__rE   )	ri   rj   Úoriginal_fully_shardÚmodeÚoriginal_compile_threadsÚfully_shard_patchr  r  Úfuncs	         €€€rM   ÚwrapperÚ6compiled_fsdp_test.<locals>.decorator.<locals>.wrapperŽ  s,  ø€ ä(-×(9Ñ(9×(>Ñ(>×(JÑ(JÐ Ü&�Ø˜>×/Ñ/Ó/¼
¿¹Ü—M’MØJÐWXòñ ä+0¯?©?×+AÑ+A×+QÑ+QÐ(Ü×!Ñ!×)Ñ)Ô+à˜>×/Ñ/Ó/Ø(<Ñ%Ø˜^×<Ñ<Ó<Ø=>”E—O‘O×*Ñ*Ô:Ø(IÑ%ä-Ø;¸D¸6ÐBóð ð CT�× Ñ Ð!5×!>Ñ!>Ñ?Ù�dÐ%˜fÒ%ä×!Ñ!×)Ñ)Ô+ØBV�× Ñ Ð!5×!>Ñ!>Ñ?Ø9Q”—‘×&Ñ&×6ò7 'rL   r
   )r  r  r  r  s   ` €€rM   Ú	decoratorÚ%compiled_fsdp_test.<locals>.decorator�  s"   ù€ Ü	ˆt‹ö	Ró 
ð	Rð> ˆrL   )r	   )rþ  r  r  r  s   ` @@rM   Úcompiled_fsdp_testr  �  s"   ú€ õô"œô "ö!ðF ÐrL   c                   ó2   ^ • \ rS rSrSU 4S jjrS rSrU =r$ )Ú
SkipModulei³  c                 óX   >• [         TU ]  5         [        R                  " SSSS9U l        g ©Né
   FrÛ  )rï   rÉ   rt   rõ   ÚlinrI  s    €rM   rÉ   ÚSkipModule.__init__´  s"   ø€ Ü‰ÑÔÜ—9’9˜R ¨%Ñ0ˆ�rL   c                 ó$   • U R                  U5      $ r•   ©r!  rJ  s     rM   r  ÚSkipModule.forward¸  s   € Ø�x‰x˜‹{ÐrL   r$  rn   r›  r7  s   @rM   r  r  ³  s   ø† ÷1÷ð rL   r  c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚNestedLineari¼  c                 óü   >• [         TU ]  5         U(       a8  [        [        R                  " SSSS9R                  [        5      5      U l        g [        R                  " SSSS9R                  [        5      U l        g r  )rï   rÉ   r   rt   rõ   r¤   r–   Únested_linear)rZ   Ú	fsdp_wrapr  s     €rM   rÉ   ÚNestedLinear.__init__½  sV   ø€ Ü‰ÑÔÞÜ!%¤b§i¢i°°B¸UÑ&C×&FÑ&FÄ{Ó&SÓ!TˆDÕä!#§¢¨2¨r¸Ñ!>×!AÑ!AÄ+Ó!NˆDÕrL   c                 ó$   • U R                  U5      $ r•   ©r)  rJ  s     rM   r  ÚNestedLinear.forwardÄ  s   € Ø×!Ñ! !Ó$Ð$rL   r-  r›  r7  s   @rM   r'  r'  ¼  s   ø† õO÷%ð %rL   r'  c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )Ú	SkipModeliÈ  c                 óö   >• [         TU ]  5         [        R                  " SSSS9R	                  [
        5      U l        [        5       R	                  [
        5      U l        [        [        US9[
        S9U l        g )Nr   FrÛ  )r*  )r�  )rï   rÉ   rt   rõ   r¤   r–   Úlinearr  Úlinear_skipr   r'  r)  )rZ   Údouble_nestr  s     €rM   rÉ   ÚSkipModel.__init__É  sW   ø€ Ü‰ÑÔÜ—i’i  B¨UÑ3×6Ñ6´{ÓCˆŒÜ%›<Ÿ?™?¬;Ó7ˆÔÜ!Ü ;Ñ/¼;ñ
ˆÕrL   c                 ól   • U R                  U5      nU R                  U5      nU R                  U5      nU$ r•   ©r2  r3  r)  rJ  s     rM   r  ÚSkipModel.forwardÑ  s4   € Ø�K‰K˜‹NˆØ×Ñ˜QÓˆØ×Ñ˜qÓ!ˆØˆrL   r7  r›  r7  s   @rM   r0  r0  È  s   ø† õ
÷ð rL   r0  )FT)FFr÷  )rD   r•   )•Ú
contextlibr×  rb  r}  r|  r  Úabcr   r   Úcollections.abcr   r   Úcopyr   Úenumr   r	   Ú	functoolsr   Útypingr   r   r   Úunittestr   rq   Útorch.distributedr…  r�   Útorch.nnrt   Útorch.nn.functionalr  rÍ  Útorch.distributed._composabler   Útorch.distributed.device_meshr   Útorch.distributed.fsdpr   r   r   rš   Ú$torch.distributed.fsdp._common_utilsr   Ú5torch.distributed.fsdp._fully_shard._fsdp_param_groupr   r   Ú"torch.distributed.fsdp._init_utilsr   Ú2torch.distributed.fsdp.fully_sharded_data_parallelr   r   r   Ú*torch.distributed.fsdp.sharded_grad_scalerr   Útorch.distributed.fsdp.wrapr   r   r   Útorch.distributed.tensorr    r!   r"   Ú!torch.distributed.tensor.parallelr#   r$   r%   r&   r'   r(   Útorch.nn.parallel.distributedr)   rÀ  Ú*torch.testing._internal.common_distributedr*   r+   r,   r-   r.   Ú$torch.testing._internal.common_utilsr/   r0   r1   r2   r3   r4   r5   Útorch.utils._tritonr6   ÚminÚmaxr9   r|  rC  r–   r„  r<   rB   rO   ru   rU   r4  r“   r—   r5  r¢   r¨   r¯   rµ   r¹   r¼   rÀ   rÂ   rß   r9  rX  r\  rp  r�  r•  r�  rÂ  rA  rÖ  rî  Úcontextmanagerrý  r  r  r  r  r  r  r!  r%  r)  rp   r¬   r>  r@  r[  rÓ  ré  rŽ  r  r  r'  r0  rD   rL   rM   Ú<module>rV     sî  ðó Û 	Û 	Û 
Û Û ß #Ý $Ý "Ý ß Ý ß +Ñ +Ý ã Ý  Ý ß Ð Ý 4Ý 4÷ñ õ
 ?÷õ S÷ñ õ
 Iß RÑ Rß FÑ F÷ó ÷ FÝ H÷õ ÷÷ ñ õ +ö Ù�q™#˜a §¡×!8Ñ!8Ó!:Ó;Ó<�Là€LæØ€KØ ÐØ—:‘:×*Ñ*Ó,�LÞØ€KØ ÑÞØ€KØ ÐØ—9‘9×)Ñ)Ó+�Là€KØ ÐØ€Lô�4ô ô�Tô ô�B—I‘I˜sô ð4Ø�9‰9ðà×$Ñ$ðð ôòB%ð Øñ#Ø�9‰9ð#àõ#ô"òòñ"2˜2Ÿ9™9ð 2¨tõ 2ð>˜2Ÿ9™9ð >°dô >ðD˜BŸI™Ið D°$ô D÷ñ ô.Q" -ô Q"ôh[J˜-ô [Jô|Ð$7ô ôD]JÐ.ô ]Jô@J
�mô J
ôZ
 ?ô 
ô.,ˆr�y‰yô ,ôJJÐ*ô JJôZ/ˆ"�)‰)ô /ô@*ˆr�}‰}ô *ôZ'�2—9‘9ô 'ð6 ×Ñð1°ó 1ó ð1ð ×Ñð
°Xó 
ó ð
ð" ×Ñð
¨Xó 
ó ð
ð" ×Ñð9°Hó 9ó ð9ð ×Ñð* Xó *ó ð*ð Ø×Ñð.˜xó .ó ó ð.ð Ø×Ñð.˜xó .ó ó ð.ð Ø×Ñð:¨8ó :ó ó ð:ð Ø×Ñð>¸Xó >ó ó ð>ð0à!ð0ð ð0ð ð	0ð
 ô0ð. +-ñ	"Tà—y‘yð"Tð —I‘Ið"Tð ˜c 3˜h™õ	"TôJÐ/ô ÷&Lñ Lô^
O%ˆ}Ð2ô O%ôd4!˜Ð(?ô 4!ñn/°$¸±+õ /ôd�—‘ô ô	%�2—9‘9ô 	%ô�—	‘	õ rL   