Ë
    ÌÓ^j«ù  ã            	       ó¬  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZ d dl mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZmZ d d	lmZ d dlZd dlmZ d dlmZ d dlmc m Z! d d
l"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z* d dl+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z:m;Z; d dl<m=Z=m>Z>m?Z? d dl@mAZAmBZBmCZCmDZD d dlmEZEmFZF d dlGmHZI d dlJmKZKmLZLmMZMmNZNmOZO d dlPmQZQmRZRmSZSmTZTmUZUmVZVmWZW d dlXmYZY eVr) eZd e[dej¸                  j»                  «       «      «      Z^ndZ^eTrdZ_dZ`ej¸                  j»                  «       Z^n.eUrdZ_dZ`n'eWrd Z_d!Z`ejÂ                  j»                  «       Z^nd"Z_d#Z`d$Z^ G d%„ d&e«      Zb G d'„ d(e«      Zc G d)„ d*ejÈ                  e«      Zed+ejÈ                  d,ejÌ                  d-efd.„Zgd/„ Zh	 	 dd+ejÈ                  d0eifd1„Zjd€d2„Zkd3„ Zld4„ Zmd�d+ejÈ                  d5eifd6„Znd+ejÈ                  d7eifd8„Zod+ejÈ                  d9eifd:„Zp G d;„ d<«      Zq G d=„ d>ee«      Zr G d?„ d@ee«      Zs G dA„ dBes«      Zt G dC„ dDes«      Zu G dE„ dFee«      Zv G dG„ dHev«      Zw G dI„ dJejÈ                  «      Zx G dK„ dLes«      Zy G dM„ dNejÈ                  «      Zz G dO„ dPejö                  «      Z| G dQ„ dRejÈ                  «      Z}e jü                  dSefdT„«       Ze jü                  dUefdV„«       Z€e jü                  dWefdX„«       Z�e jü                  dYefdZ„«       Z‚e jü                  d[efd\„«       Zƒee jü                  d]efd^„«       «       Z„ee jü                  d_efd`„«       «       Z…ee jü                  daefdb„«       «       Z†ee jü                  dcefdd„«       «       Z‡deed-edfedgefdh„Zˆ	 d‚diejÈ                  djejÈ                  dke‰eŠdlf   fdm„Z‹ e�j                  eWdn«       G do„ dpeM«      «       Z� G dq„ dr«      ZŽ G ds„ dteŽeL«      Z� G du„ dveŽeK«      Z�dƒdwe‘dz  fdx„Z’ G dy„ dzejÈ                  «      Z“ G d{„ d|ejÈ                  «      Z” G d}„ d~ejÈ                  «      Z•y)„é    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                   ó(   — e Zd Z e«       Z e«       Zy)ÚFSDPInitModeN)Ú__name__Ú
__module__Ú__qualname__r   ÚNO_FSDPÚ	RECURSIVE© ó    ún/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/testing/_internal/common_fsdp.pyrB   rB   ^   s   „ á‹f€Gá“�IrI   rB   c                   ó6   — e Zd Z e«       Z e«       Z e«       Zy)ÚDEVICEInitModeN)rC   rD   rE   r   ÚDEVICE_BEFOREÚDEVICE_AFTERÚDEVICE_NEVERrH   rI   rJ   rL   rL   g   s   „ á“F€Má“6€Lá“6�LrI   rL   c                   ó¼   — e Zd ZdZedeej                  df   fd„«       Zedej                  fd„«       Z	edd„«       Z
eeded	edej                  fd
„«       «       Zy)ÚFSDPTestModelzZThis defines the interface expected from all models used commonly for
    FSDP unit tests.Úreturn.c                  ó   — y)z*Returns an input for the model as a tuple.NrH   ©ÚselfÚdevices     rJ   Ú	get_inputzFSDPTestModel.get_inputt   ó   € ð 	rI   c                  ó   — y)z,Returns the loss given the input and output.NrH   )rU   ÚinputÚoutputs      rJ   Úget_losszFSDPTestModel.get_lossy   rX   rI   Nc                  ó   — y)z<Runs the backward pass (e.g. including ``loss.backward()``).NrH   ©rU   Úlosss     rJ   Úrun_backwardzFSDPTestModel.run_backward~   rX   rI   ÚargsÚkwargsc                   ó   — y)z&Initializes an instance of this model.NrH   )ra   rb   s     rJ   ÚinitzFSDPTestModel.initƒ   s   € ð 	rI   ©rR   N)rC   rD   rE   Ú__doc__r   ÚtupleÚtorchÚTensorrW   r\   r`   Ústaticmethodr   ÚnnÚModulerd   rH   rI   rJ   rQ   rQ   p   s˜   „ ñð ð 5¨¯©°sÐ):Ñ#;ò ó ðð ð¨¯©ò ó ðð òó ðð Øð�Cð  3ð ¨2¯9©9ò ó ó ñrI   rQ   ÚmodelÚprocess_groupÚ	assert_fnc                 óT  — | j                  «       D ��cg c]%  \  }}||j                  «       j                  «       f‘Œ' }}}|| j                  «       D ��cg c]%  \  }}||j                  «       j                  «       f‘Œ' c}}z  }t	        j
                  |«      }t        |«      D �	cg c]  }	d‘Œ }
}	t	        j                  |
||¬«       |
d   }|€t        d«      ‚|
dd D ]4  }|€t        d«      ‚t        ||d¬«      D ]  \  \  }	}\  }	} |||«       Œ Œ6 yc c}}w c c}}w c c}	w )	a  
    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)rm   rn   ro   Ú
param_nameÚparamÚnamed_module_statesÚbuffer_nameÚbufferÚ
world_sizeÚ_ÚolistÚrank0_statesÚstateÚp1Úp2s                  rJ   Ú_assert_module_statesrŠ   Š   sC  € ð "'×!7Ñ!7Ó!9÷áˆJ˜ð 
�U—\‘\“^×'Ñ'Ó)Ò*ðÐñ ð à#(×#6Ñ#6Ó#8÷áˆK˜ð 
�f—m‘m“o×)Ñ)Ó+Ò,óñ Ðô ×$Ñ$ ]Ó3€JÜ  Ó,Ö-�aŠTÐ-€EÐ-Ü×Ñ˜5Ð"5¸]ÕKØ˜‘8€LØÐÜÐCÓDÐDØ�q�r�ò ˆØˆ=Ü Ð!@ÓAÐAÜ # L°%ÀÔ Eò 	Ñ‰GˆQ�‘W�a˜Ù�b˜"Õñ	ñùóùóùò
 .s   ”*DÁ*DÂ'	D%c                  ó4   — t        j                  t        «      S ©N)rh   rV   ÚDEVICE_TYPErH   rI   rJ   Úget_devtyperŽ   «   s   € Ü�<‰<œÓ$Ð$rI   Úzero_buffersc                 ó°  — |rt        j                  | «      n	t        «       }|5  | j                  «       D ]/  }t	        j
                  «       5  |j                  «        ddd«       Œ1 |rB| j                  «       D ]/  }t	        j
                  «       5  |j                  «        ddd«       Œ1 ddd«       y# 1 sw Y   ŒˆxY w# 1 sw Y   ŒPxY w# 1 sw Y   yxY w)zBZeros the parameters and optionally buffers of ``model`` in place.N)ÚFSDPÚsummon_full_paramsr   Ú
parametersrh   Úno_gradÚzero_Úbuffers)rm   r�   Úsummon_fullÚctxr   r‚   s         rJ   Ú_zero_modelr™   ¯   sÁ   € ñ -8Œ$×
!Ñ
! %Ô
(¼[»]€CØ	ñ #Ø×%Ñ%Ó'ò 	ˆEÜ—‘“ñ Ø—‘”÷ð ð	ñ ØŸ-™-›/ò #�Ü—]‘]“_ñ #Ø—L‘L”N÷#ð #ð#÷#ð #÷ð ú÷#ð #ú÷#ð #ús;   ¤(CÁB4Á3CÂC Â!
CÂ4B=Â9CÃ C	ÃCÃCc                 ót   — |s| j                  t        «      } |r| j                  «        | j                  «       S rŒ   )Útor�   ÚhalfÚ
state_dict)rm   Úcpu_offloadrœ   s      rJ   Ú_get_state_dictrŸ   À   s.   € ÙØ—‘œÓ%ˆÙØ�
‰
Œà×ÑÓÐrI   c           	      ój   — dj                  |D �cg c]  }|�| t        |«         nd‘Œ c}«      S c c}w )Nr„   Únone)ÚjoinÚstr)Útest_name_mappingra   Úss      rJ   Úsubtest_namer¦   É   s7   € Ø�8‰8ØIMÖNÀA a mÐ	œ3˜q›6Ò	"¸Ñ	?ÒNóð ùÚNs   �0c                 óx  — |j                  «       D ];  \  }}|j                  t        j                  d«      k7  sŒ)|j                  «       ||<   Œ= | dk(  r|nd g}t	        j
                  |«       t        t        t        t        j                  f   |d   «      }|D ]  }||   j                  t        «      ||<   Œ |S )Nr>   r   )ÚitemsrV   rh   r>   rx   Úbroadcast_object_listr   Údictr£   ri   r›   r�   )Úrankr�   r~   r   r…   s        rJ   Ú_broadcast_state_dictr¬   Ï   sµ   € ð (×-Ñ-Ó/ò 1Ñˆ
�EØ�<‰<œ5Ÿ<™<¨Ó.Ó.Ø%*§Y¡Y£[ˆJ�zÒ"ð1ð   1š9‰Z¨$Ð/€EÜ×Ñ˜uÔ%Ü”dœ3¤§¡Ð,Ñ-¨u°Q©xÓ8€Jà ò Hˆ
Ø!+¨JÑ!7×!:Ñ!:¼;Ó!Gˆ
�:ÒðHàÐrI   Úrecursec                 ó    — t        j                  | |¬«      5  t        t        | j	                  «       «      «      cddd«       S # 1 sw Y   yxY w)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“   )rm   r­   s     rJ   Úget_full_paramsr°   à   s?   € ô 
×	 Ñ	  °Ô	8ñ 2Üœ˜U×-Ñ-Ó/Ó0Ó1÷2÷ 2ò 2ús   ˜"AÁAÚmove_to_devicec                 ó4   — |r| j                  t        «      S | S rŒ   )r›   r�   )rm   r±   s     rJ   Ú_move_to_devicer³   î   s   € Ù$2ˆ5�8‰8”KÓ Ð=¸Ð=rI   Ú	wrap_fsdpc                 ó(   — |s| S t        | g|¢­i |¤ŽS rŒ   ©r‘   )rm   r´   ra   rb   s       rJ   Ú_maybe_wrap_fsdpr·   ò   s   € Ù!ˆ5ÐC¤t¨EÐ'C°DÒ'C¸FÑ'CÐCrI   c                   ó:   — e Zd Zdedefd„Zdefd„Zdefd„Zd„ Zy)	ÚDummyProcessGroupr«   Úsizec                 ó    — || _         || _        y rŒ   )Ú_rankÚ_size)rU   r«   rº   s      rJ   Ú__init__zDummyProcessGroup.__init__÷   s   € ØˆŒ
Øˆ�
rI   rR   c                 ó   — | j                   S rŒ   )r¼   ©rU   s    rJ   r«   zDummyProcessGroup.rankû   ó   € Ø�z‰zÐrI   c                 ó   — | j                   S rŒ   )r½   rÀ   s    rJ   rº   zDummyProcessGroup.sizeþ   rÁ   rI   c                 óB   — t        j                  «       }d„ }||_        |S )Nc                  ód   — t         j                  j                  «       } | j                  d«       | S )Nr@   )rh   ÚfuturesÚFutureÚ
set_result)Úfutures    rJ   Ú
get_futurez/DummyProcessGroup.allreduce.<locals>.get_future  s'   € Ü+0¯=©=×+?Ñ+?Ó+AˆFØ×Ñ˜aÔ ØˆMrI   )r   ÚMockrÉ   )rU   ra   rb   Ú	dist_waitrÉ   s        rJ   Ú	allreducezDummyProcessGroup.allreduce  s"   € Ü—I‘I“Kˆ	ò	ð
  *ˆ	ÔØÐrI   N)rC   rD   rE   Úintr¾   r«   rº   rÌ   rH   rI   rJ   r¹   r¹   ö   s2   „ ð˜Sð ¨ó ð�có ð�có ó	rI   r¹   c                   óÖ   ‡ — e Zd Zdej                  dededefˆ fd„Zd„ Zd„ Z	d„ Z
d	„ Ze	 	 	 ddej                  dededeeef   d
z  dededej$                  ez  fd„«       Zd„ Zˆ xZS )ÚTransformerWithSharedParamsrr   Údevice_init_modeÚadd_bnÚdeterministicc                 óª  •— t         ‰| �  «        |j                  «       | _        |j                  «       | _        |rt        j                  d«       d}d}t        j                  ||«      | _	        t        j                  |dddd¬«      | _        t        j                  ||«      | _        | j                  j                  | j                  _        | j                  d| j                  j                  j!                  |f«      «       | j                  d	t        j"                  | j$                  t
        j&                  ¬
«      «       d| _        |r)t
        j                  j+                  | j(                  «      nt
        j                  j-                  «       | _        |t0        j2                  k(  r| j5                  t6        «      } |r| j9                  «        y y )Nr   é   é   r8   é   gš™™™™™¹?)Úd_modelÚnum_encoder_layersÚnum_decoder_layersÚdim_feedforwardÚdropoutÚ
vocab_biasÚlong_buffer)Údtype)Úsuperr¾   r«   rº   rƒ   rh   Úmanual_seedrk   Ú	EmbeddingÚembed_tokensÚTransformerÚtransformerÚLinearÚoutput_projÚweightÚregister_bufferÚnew_onesÚ
zeros_likerÜ   ÚlongÚbsÚBatchNorm1dÚIdentityÚbnrL   rM   r›   r�   Úeval)rU   rr   rÐ   rÑ   rÒ   Úd_vocabr×   Ú	__class__s          €rJ   r¾   z$TransformerWithSharedParams.__init__  sa  ø€ ô 	‰ÑÔØ—J‘J“LˆŒ	ØŸ*™*›,ˆŒÙÜ×Ñ˜aÔ ØˆØˆäŸL™L¨°'Ó:ˆÔÜŸ>™>ØØ Ø ØØô
ˆÔô Ÿ9™9 W¨gÓ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ð rI   c                 ó,  — t        j                  d| j                  z   «       t        j                  d|¬«      j	                  d| j
                  «      }t        j                  | j
                  dz  |¬«      j	                  d| j
                  «      }||fS )Nr@   é   ©rV   é   r7   )rh   rà   r«   ÚarangeÚviewrì   )rU   rV   ÚsrcÚtgts       rJ   rW   z%TransformerWithSharedParams.get_input8  sl   € Ü×Ñ˜!˜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ˆØ�SˆzÐrI   c                 ó  — | j                  |«      }|| j                  z   | j                  j                  |«      z   }| j                  |«      }| j	                  |«      }| j                  ||«      }| j                  |«      S rŒ   )râ   rÜ   rÝ   Útype_asrï   rä   ræ   )rU   Úsrc_idsÚtgt_idsrù   rú   Úxs         rJ   Úforwardz#TransformerWithSharedParams.forward>  sv   € Ø×Ñ Ó(ˆØ�D—O‘OÑ# d×&6Ñ&6×&>Ñ&>¸sÓ&CÑCˆØ×Ñ Ó(ˆØ�g‰g�c‹lˆØ×Ñ˜S #Ó&ˆØ×Ñ Ó"Ð"rI   c                 ó¬   — |\  }}t         j                  j                  |j                  d|j	                  d«      «      |j                  d«      d¬«      S )NéÿÿÿÿÚsum)Ú	reduction)rk   Ú
functionalÚcross_entropyrø   rº   )rU   rZ   r[   r„   rú   s        rJ   r\   z$TransformerWithSharedParams.get_lossF  sI   € Ø‰ˆˆ3Ü�}‰}×*Ñ*Ø�K‰K˜˜FŸK™K¨›OÓ,¨c¯h©h°r«lÀeð +ó 
ð 	
rI   c                 ó$   — |j                  «        y rŒ   ©Úbackwardr^   s     rJ   r`   z(TransformerWithSharedParams.run_backwardL  ó   € Ø�‰�rI   NÚfsdp_init_modeÚfsdp_kwargsrR   c                 óN  — |€i }|t         j                  k(  r&t        | t        «      r| d   }n| }t	        ||||«      S |t         j
                  k(  rÈd|vrt        t        t        h«      }n|j                  d«      }d|v r8|d   t        j                  t        j                  hv rt        | t        «      sd}n| }t        | t        «      r| d   }	n| }	t	        |	|||«      }
t        |
|fd|i|¤Ž}|t        j                  k(  r|j!                  t"        «      }|S t%        d|› �«      ‚)au  
        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   rF   Ú
isinstancerg   rÏ   rG   r   r(   r'   Úpopr   ÚHYBRID_SHARDÚ_HYBRID_SHARD_ZERO2r‘   rL   rN   r›   r�   Ú
ValueError)rr   r  rÐ   r  rÒ   rÑ   Úpgr  Úfsdp_pgÚ
tformer_pgÚmÚ
fsdp_models               rJ   rd   z TransformerWithSharedParams.initO  sX  € ð6 ÐØˆKØœ\×1Ñ1Ò1Ü˜%¤Ô'Ø˜1‘X‘à�Ü.ØÐ$ f¨móð ð œ|×5Ñ5Ò5à!¨Ñ4Ü#3ä/Ü/ðó$Ñ ð $/§?¡?Ð3EÓ#FÐ ð $ {Ñ2ØÐ 3Ñ4Ü$×1Ñ1Ô3C×3WÑ3WÐXñYä" 5¬%Ô0à‘à�ä˜%¤Ô'Ø" 1™X‘
à"�
ä+ØÐ,¨f°móˆAô ØØñð "2ðð ñ	ˆJð  ¤>×#>Ñ#>Ò>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrI   c                 ó   — | j                   gS rŒ   )rä   rÀ   s    rJ   Úget_ignored_modulesz/TransformerWithSharedParams.get_ignored_modules�  s   € Ø× Ñ Ð!Ð!rI   )NFT)rC   rD   rE   rx   ÚProcessGrouprL   Úboolr¾   rW   r   r\   r`   rj   rB   rª   r£   r   rk   rl   r‘   rd   r  Ú__classcell__©rò   s   @rJ   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"rI   rÏ   c                   óÄ   ‡ — e Zd Zdej                  dededefˆ fd„Zd„ Zd„ Z	d„ Z
d	„ Ze	 	 ddej                  dededeeef   d
z  dedej$                  fd„«       Zˆ xZS )ÚNestedWrappedModulerr   r´   rÐ   rÒ   c                 ó�  •‡‡‡— t         ‰| �  «        ‰j                  «       | _        ‰j                  «       | _        |t
        j                  k(  }ˆˆˆfd„}|rt        j                  d«       t        j                  t        t        j                  dd«      |«       |t        j                   |t        t        j                  dd«      |«      «      t        t        j                  dd«      |«      «      «       |t        t        j                  dd«      |«      «      t        t        j                  dd«      |«      «      | _        y )Nc                 ó&   •— ‰rt        | ‰fi ‰¤ŽS | S rŒ   r¶   ©Úlayerr  rr   r´   s    €€€rJ   Ú_maybe_wrapz1NestedWrappedModule.__init__.<locals>._maybe_wrap¯  ó   ø€ ÙÜ˜E 5Ñ8¨KÑ8Ð8ØˆLrI   r   rÖ   r7   rÕ   )rß   r¾   r«   rº   rƒ   rL   rM   rh   rà   rk   Ú
Sequentialr³   rå   Úmodule©	rU   rr   r´   rÐ   rÒ   r  r±   r'  rò   s	    ``  `  €rJ   r¾   z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¨^Ó<ó

ˆ�rI   c                 óx   — t        j                  d| j                  z   «       t        j                  dd|¬«      fS )Nr@   r7   rÖ   rõ   )rh   rà   r«   ÚrandrT   s     rJ   rW   zNestedWrappedModule.get_inputÂ  s.   € Ü×Ñ˜!˜dŸi™i™-Ô(Ü—
‘
˜1˜a¨Ô/Ð1Ð1rI   c                 ó$   — | j                  |«      S rŒ   ©r*  ©rU   rÿ   s     rJ   r   zNestedWrappedModule.forwardÆ  ó   € Ø�{‰{˜1‹~ÐrI   c                 ó&   — |j                  «       }|S rŒ   )r  ©rU   rZ   r[   r_   s       rJ   r\   zNestedWrappedModule.get_lossÉ  s   € Ø�z‰z‹|ˆØˆrI   c                 ó$   — |j                  «        y rŒ   r  r^   s     rJ   r`   z NestedWrappedModule.run_backwardÍ  r
  rI   Nr  r  rR   c                 ó  — |€i }|t         j                  k(  rt        | d||¬«      S |t         j                  k(  r:t        | fd||dœ|¤Ž}|t        j
                  k(  r|j                  t        «      }|S t        d|› �«      ‚)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   rF   r"  rG   rL   rN   r›   r�   r  )rr   r  rÐ   r  rÒ   r  s         rJ   rd   zNestedWrappedModule.initÐ  s£   € ð. ÐØˆKØœ\×1Ñ1Ò1Ü&ØØØ!1Ø+ô	ð ð œ|×5Ñ5Ò5ä,ØðàØ!1Ø+ñ	ð
 ñˆJð  ¤>×#>Ñ#>Ò>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrI   ©NF)rC   rD   rE   rx   r  r  rL   r¾   rW   r   r\   r`   rj   rB   rª   r£   r   rk   rl   rd   r  r   s   @rJ   r"  r"  ¡  s¼   ø„ ð
à× Ñ ð
ð ð
ð )ð	
ð
 õ
ò@2òòòð ð
 .2Ø#ñ+JØ× Ñ ð+Jà$ð+Jð )ð+Jð ˜#˜s˜(‘^ dÑ*ð	+Jð
 ð+Jð 
�‰ò+Jó ô+JrI   r"  c                   óh   ‡ — e Zd Ze	 	 ddej
                  dededee	e
f   dz  def
ˆ fd„«       Zˆ xZS )	ÚAlwaysWrapNestedWrappedModuleNrr   r  rÐ   r  rÒ   c                 ó0  •— t         t        t        �  	 | t        j                  |||¬«      }|t        j                  k(  r|S |t        j
                  k(  rB|xs i }t        |fdt        i|¤Ž}|t        j                  k(  r|j                  t        «      }|S y)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.
        )rr   r  rÐ   r  rÒ   r  N)rß   r9  rd   rB   rF   rG   r‘   r   rL   rN   r›   r�   )rr   r  rÐ   r  rÒ   rm   r  rò   s          €rJ   rd   z"AlwaysWrapNestedWrappedModule.init   s£   ø€ ô Ü)Ô+Hñà
ØÜ'×/Ñ/Ø-Ø#Ø'ð ó 
ð 	ð œ\×1Ñ1Ò1ØˆLØœ|×5Ñ5Ò5Ø%Ò+¨ˆKÜ˜eÑXÔ6HÐXÈKÑXˆJØ¤>×#>Ñ#>Ò>Ø'Ÿ]™]¬;Ó7�
ØÐð 6rI   r7  )rC   rD   rE   rj   rx   r  rB   rL   rª   r£   r   r  rd   r  r   s   @rJ   r9  r9  ÿ  s^   ø„ Øð
 .2Ø#ñØ× Ñ ðà$ðð )ðð ˜#˜s˜(‘^ dÑ*ð	ð
 ôó ôrI   r9  c                   ó¦   ‡ — e Zd Zdej                  dededefˆ fd„Zedd„«       Z	e	 	 ddej                  de
ded	eeef   dz  def
d
„«       Zˆ xZS )ÚNonUniformReqGradNWMrr   r´   rÐ   rÒ   c                 ó¾  •‡‡‡— t         t        | �  «        ‰j                  «       | _        ‰j	                  «       | _        |t        j                  k(  }ˆˆˆfd„}|rt        j                  d«       t        j                  t        t        j                  dd«      |«       |t        j                   |t        t        j                  dd«      |«      «      t        t        j                  dd«      |«      «      «       |t        j                  t        t        j                  dd«      |«      t        t        j                  dd«      |«      «      «      «      | _        y )Nc                 ó&   •— ‰rt        | ‰fi ‰¤ŽS | S rŒ   r¶   r%  s    €€€rJ   r'  z2NonUniformReqGradNWM.__init__.<locals>._maybe_wrap5  r(  rI   r   rÖ   r7   rÕ   )rß   r"  r¾   r«   rº   rƒ   rL   rM   rh   rà   rk   r)  r³   rå   r*  r+  s	    ``  `  €rJ   r¾   z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óóó
ˆ�rI   Nc                 ó„   — | j                  «       D ]-  \  }}t        j                  ||«      rŒ|j                  d«       Œ/ y r7  )ru   ÚreÚmatchÚrequires_grad_)rm   Úreq_grad_maskÚnÚps       rJ   Ú_set_nonuniform_req_gradz-NonUniformReqGradNWM._set_nonuniform_req_gradL  s:   € à×*Ñ*Ó,ò 	(‰DˆAˆqÜ—8‘8˜M¨1Õ-Ø× Ñ  Õ'ñ	(rI   r  r  c                 óŠ  — t        j                  d«      }|t        j                  k(  r't	        | d||¬«      }t        j                  ||«       |S |t        j                  k(  rT|€i }t	        | fd||dœ|¤Ž}|t        j                  k(  r|j                  t        «      }t        j                  ||«       |S t        d|› �«      ‚)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.*Fr6  Tr  )r@  ÚcompilerB   rF   r<  rF  rG   rL   rN   r›   r�   r  )rr   r  rÐ   r  rÒ   Úreq_grad_patternÚ	ddp_modelr  s           rJ   rd   zNonUniformReqGradNWM.initR  sØ   € ô( Ÿ:™:Ð&9Ó:ÐØœ\×1Ñ1Ò1Ü,ØØØ!1Ø+ô	ˆIô !×9Ñ9¸)ÐEUÔVØÐØœ|×5Ñ5Ò5ØÐ"Ø �Ü-ØðàØ!1Ø+ñ	ð
 ñˆJð  ¤>×#>Ñ#>Ò>Ø'Ÿ]™]¬;Ó7�
Ü ×9Ñ9¸*ÐFVÔWØÐÜÐ7¸Ð7GÐHÓIÐIrI   re   r7  )rC   rD   rE   rx   r  r  rL   r¾   rj   rF  rB   rª   r£   r   rd   r  r   s   @rJ   r<  r<  !  s­   ø„ ð(
à× Ñ ð(
ð ð(
ð )ð	(
ð
 õ(
ðT ò(ó ð(ð
 ð
 .2Ø#ñ+JØ× Ñ ð+Jà$ð+Jð )ð+Jð ˜#˜s˜(‘^ dÑ*ð	+Jð
 ò+Jó ô+JrI   r<  c                   óˆ   ‡ — e Zd ZdZdej
                  dedefˆ fd„Zd„ Zd„ Z	d„ Z
d	„ Zed
ee   dedededef
d„«       Zˆ xZS )ÚModuleWithDelayz†This class wraps a :class:`FSDPTestModel` to optionally add a delay
    after computing the loss and/or before the gradient reduction.r*  Údelay_after_loss_msÚdelay_before_reduction_msc                 óL   •— t         ‰| �  «        || _        || _        || _        y rŒ   )rß   r¾   rM  rN  r*  )rU   r*  rM  rN  rò   s       €rJ   r¾   zModuleWithDelay.__init__…  s'   ø€ ô 	‰ÑÔØ#6ˆÔ Ø)BˆÔ&Øˆ�rI   c                 ó8   — | j                   j                  |«      S rŒ   )r*  rW   rT   s     rJ   rW   zModuleWithDelay.get_input�  s   € Ø�{‰{×$Ñ$ VÓ,Ð,rI   c                 ó$   — | j                  |«      S rŒ   r/  r0  s     rJ   r   zModuleWithDelay.forward“  r1  rI   c                 óB  — | j                   j                  ||«      }| j                  dkD  rst        st        r$t        j                  | j                  dz  «       |S t        r=t        j                  j                  t        | j                  t        «       z  «      «       |S ©Nr   éè  )r*  r\   rM  r3   r5   ÚtimeÚsleepr2   rh   r9   Ú_sleeprÍ   r0   r3  s       rJ   r\   zModuleWithDelay.get_loss–  sy   € Ø�{‰{×#Ñ# E¨6Ó2ˆØ×#Ñ# aÒ'Ý�8Ü—
‘
˜4×3Ñ3°dÑ:Ô;ð ˆõ Ü—
‘
×!Ñ!¤# d×&>Ñ&>ÔARÓATÑ&TÓ"UÔVàˆrI   c                 óÔ   ‡ ‡— t         j                  j                  Šˆˆ fd„}t        j                  d|«      5  ‰ j
                  j                  |«       d d d «       y # 1 sw Y   y xY w)Nc                  ó  •— ‰j                   dkD  rrt        r>t        j                  j	                  t        ‰j                   t        «       z  «      «       n.t        st        r"t        j                  ‰j                   dz  «        ‰| i |¤ŽS rS  )rN  r2   rh   r9   rW  rÍ   r0   r3   r5   rU  rV  )ra   rb   Úorig_reduce_scatterrU   s     €€rJ   Ú_delayed_reduce_scatterz=ModuleWithDelay.run_backward.<locals>._delayed_reduce_scatter£  sk   ø€ Ø×-Ñ-°Ò1ÝÜ—J‘J×%Ñ%Ü˜D×:Ñ:Ô=NÓ=PÑPÓQõõ ¥Ü—J‘J˜t×=Ñ=ÀÑDÔEÙ&¨Ð7°Ñ7Ð7rI   z'torch.distributed.reduce_scatter_single)rh   ÚdistributedÚreduce_scatter_singler   Úpatchr*  r`   )rU   r_   r[  rZ  s   `  @rJ   r`   zModuleWithDelay.run_backward   sW   ù€ Ü#×/Ñ/×EÑEÐõ	8ô �Z‰ZØ5Ð7Nó
ñ 	+ð �K‰K×$Ñ$ TÔ*÷	+÷ 	+ñ 	+ús   ¹AÁA'Úmodule_classÚ
model_argsÚmodel_kwargsc                ó<   — t         | j                  |i |¤Ž||«      S )aA  
        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()``.
        )rL  rd   )r_  rM  rN  r`  ra  s        rJ   rd   zModuleWithDelay.init²  s,   € ô* ØˆL×Ñ˜zÐ:¨\Ñ:ØØ%ó
ð 	
rI   )rC   rD   rE   rf   rk   rl   rÍ   r¾   rW   r   r\   r`   rj   ÚtyperQ   r   rd   r  r   s   @rJ   rL  rL  �  s‰   ø„ ñFð	à—	‘	ð	ð !ð	ð $'õ		ò-òòò+ð$ ð
Ø˜=Ñ)ð
àð
ð !ð
ð $'ð	
ð
 ò
ó ô
rI   rL  c                   ó~   — e Zd Zeej
                  ddddfdej                  dedede	e
ef   dz  ded	ed
efd„«       Zy)ÚNestedWrappedModuleWithDelayNFr   rr   r  rÐ   r  rÒ   rM  rN  c           
      óD   — t         j                  t        | ||||||¬«      S )N©rr   r  rÐ   r  rÒ   rM  rN  )rL  rd   r"  rg  s          rJ   rd   z!NestedWrappedModuleWithDelay.initÏ  s4   € ô ×#Ñ#ÜØØ)Ø-Ø#Ø'Ø 3Ø&?ð $ó 	
ð 		
rI   )rC   rD   rE   rj   rL   rN   rx   r  rB   rª   r£   r   r  rÍ   rd   rH   rI   rJ   re  re  Î  s€   „ Øð ,:×+FÑ+FØ-1Ø#Ø#$Ø)*ñ
Ø× Ñ ð
à$ð
ð )ð
ð ˜#˜s˜(‘^ dÑ*ð	
ð
 ð
ð !ð
ð $'ò
ó ñ
rI   re  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚDummyDDPc                 ó0   •— t         ‰| �  «        || _        y rŒ   )rß   r¾   r*  )rU   r*  rò   s     €rJ   r¾   zDummyDDP.__init__æ  s   ø€ Ü‰ÑÔØˆ�rI   c                 ó&   —  | j                   |i |¤ŽS rŒ   r/  ©rU   ra   rb   s      rJ   r   zDummyDDP.forwardê  s   € Øˆt�{‰{˜DÐ+ FÑ+Ð+rI   ©rC   rD   rE   r¾   r   r  r   s   @rJ   ri  ri  å  s   ø„ ôö,rI   ri  c                   óª   ‡ — e Zd Zdej                  dedededef
ˆ fd„Zd„ Z	d„ Z
e	 	 	 ddej                  d
ededeeef   d	z  dedefd„«       Zˆ xZS )ÚMixtureOfExpertsrr   r´   rÐ   Údelay_before_free_msrÒ   c                 ó   •— t         ‰| �  ||||¬«       || _        || _        || _        |t
        j                  k(  | _        |r"t        j                  d| j                  z   «       d}d}d}	t        t        j                  ||«      | j                  «      }
t        d„ |
j                  «       D «       «      | _        |
j                  «       D ]	  }d|_        Œ |rt        j                  d«       t        t        j                  ||«      | j                  «      }|rHt        j$                  j'                  |j                  «       g«      }t)        |
|fi |¤Ž}
t)        ||fi |¤Ž}t        j*                  t        t        j                  |	|«      | j                  «      ||
t        t        j                  ||	«      | j                  «      «      | _        y )	N)rr   r´   rÐ   rÒ   é*   rÔ   rô   rÖ   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrŒ   )Únumel)Ú.0rE  s     rJ   ú	<genexpr>z,MixtureOfExperts.__init__.<locals>.<genexpr>
  s   è ø€ Ò$L°1 Q§W¡W§YÑ$Lùó   ‚Tr   )rß   r¾   rr   rp  r´   rL   rM   r±   rh   rà   r«   r³   rk   rå   r  r“   Únum_expert_paramsÚexpertr\  Ú	new_groupr‘   r)  r*  )rU   rr   r´   rÐ   rp  rÒ   r  Úd_expertÚd_sharedÚd_inputry  rE  ÚsharedÚexpert_grouprò   s                 €rJ   r¾   zMixtureOfExperts.__init__ï  s’  ø€ ô 	‰ÑØØØ-Ø'ð	 	ô 	
ð ˆŒ
Ø$8ˆÔ!Ø"ˆŒØ.´.×2NÑ2NÑNˆÔÙä×Ñ˜b 4§9¡9™nÔ-ØˆØˆØˆÜ ¤§¡¨8°XÓ!>À×@SÑ@SÓTˆä!$Ñ$L¸×8IÑ8IÓ8KÔ$LÓ!LˆÔØ×"Ñ"Ó$ò 	ˆAØˆA�Hð	ñ ä×Ñ˜aÔ ä ¤§¡¨8°XÓ!>À×@SÑ@SÓTˆáä ×,Ñ,×6Ñ6Ø—‘“�óˆLô ˜& ,Ñ>°+Ñ>ˆFÜ˜& %Ñ7¨;Ñ7ˆFä—m‘mÜœBŸI™I g¨xÓ8¸$×:MÑ:MÓNØØÜœBŸI™I h°Ó8¸$×:MÑ:MÓNó	
ˆ�rI   c                 óf  ‡ ‡— ‰ j                   dkD  r„‰ j                  d   }t        |t        «      ret        j
                  j                  j                  j                  Šˆˆ fd„}t        j                  d|«      5  ‰ j                  |«      cd d d «       S ‰ j                  |«      S # 1 sw Y   ŒxY w)Nr   r8   c                  óø   •— t         r>t        j                  j                  t	        ‰j
                  t        «       z  «      «       n.t        st        r"t        j                  ‰j
                  dz  «        ‰| i |¤ŽS )NrT  )r2   rh   r9   rW  rÍ   rp  r0   r3   r5   rU  rV  )ra   rb   Úorig_reshardrU   s     €€rJ   Ú_delayed_reshardz2MixtureOfExperts.forward.<locals>._delayed_reshard)  s]   ø€ Ý ÜŸ
™
×)Ñ)Ü × 9Ñ 9Ô<MÓ<OÑ OÓPõõ "¥XÜŸ
™
 4×#<Ñ#<¸tÑ#CÔDá'¨Ð8°Ñ8Ð8rI   z.torch.distributed.fsdp._runtime_utils._reshard)rp  r*  r  r‘   rh   r\  ÚfsdpÚ_runtime_utilsÚ_reshardr   r^  )rU   rÿ   ry  rƒ  r‚  s   `   @rJ   r   zMixtureOfExperts.forward#  s•   ù€ Ø×$Ñ$ qÒ(Ø—[‘[ ‘^ˆFÜ˜&¤$Ô'Ü$×0Ñ0×5Ñ5×DÑD×MÑM�õ9ô —Z‘ZØDÐFVóñ *ð  Ÿ;™; q›>÷*ñ *ð
 �{‰{˜1‹~Ð÷*ð *ús   Á;B'Â'B0c                 ó¤  — |j                  «        | j                  s¨t        j                  «       5  | j	                  «       D ]v  }t        |d«      rŒ|j                  €Œ|j                  j                  | j                  «       t        j                  j                  |j                  | j                  ¬«       Œx 	 d d d «       y y # 1 sw Y   y xY w)Nry  rq   )r	  r´   rh   r”   r“   ÚhasattrÚgradÚdiv_rƒ   r\  Ú
all_reducerr   )rU   r_   rE  s      rJ   r`   zMixtureOfExperts.run_backward;  s£   € Ø�‰Œà�~Š~Ü—‘“ñ OØŸ™Ó*ò O�AÜ˜q (Ô+Ø Ø—v‘vÑ)ØŸ™Ÿ™ D§O¡OÔ4Ü×)Ñ)×4Ñ4°Q·V±VÀ4Ç:Á:Ð4ÕNñO÷Oð Oð ÷Oð Oús   ±-CÁACÃCNr  r  c                 ó  — |€i }|t         j                  k(  rt        | d|||¬«      S |t         j                  k(  r;t        | fd|||dœ|¤Ž}|t        j
                  k(  r|j                  t        «      }|S t        d|› �«      ‚)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Ð   rp  rÒ   Tr  )	rB   rF   ro  rG   rL   rN   r›   r�   r  )rr   r  rÐ   r  rÒ   rp  r  s          rJ   rd   zMixtureOfExperts.initG  s©   € ð4 ÐØˆKØœ\×1Ñ1Ò1Ü#ØØØ!1Ø%9Ø+ôð ð œ|×5Ñ5Ò5ä)ØðàØ!1Ø%9Ø+ñð ñˆJð  ¤>×#>Ñ#>Ò>Ø'Ÿ]™]¬;Ó7�
ØÐÜÐ7¸Ð7GÐHÓIÐIrI   )NFr   )rC   rD   rE   rx   r  r  rL   rÍ   r¾   r   r`   rj   rB   rª   r£   r   rd   r  r   s   @rJ   ro  ro  î  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rI   ro  c                   óš   ‡ — e Zd Z	 dddddœdedej
                  dz  ded	ed
ef
ˆ fd„Zdej                  dej                  fd„Z	d„ Z
ˆ xZS )ÚMLPNTFr7   )ÚbiasÚwith_bufferÚdim_multiplierÚdimrV   r�  r�  r‘  c                ó
  •— t         ‰| �  «        t        j                  |||z  ||¬«      | _        t        j                  ||z  |||¬«      | _        |r)| j                  dt        j                  |f|¬«      «       y d | _	        y )N)rV   r�  r‚   rõ   )
rß   r¾   rk   rå   Úin_projÚout_projrè   rh   Úrandnr‚   )rU   r’  rV   r�  r�  r‘  rò   s         €rJ   r¾   zMLP.__init__|  so   ø€ ô 	‰ÑÔÜ—y‘y  n°sÑ&:À6ÐPTÔUˆŒÜŸ	™	 .°3Ñ"6¸ÀFÐQUÔVˆŒÙØ× Ñ  ¬5¯;©;¸°vÀfÔ+MÕNàˆD�KrI   rÿ   rR   c                 óÔ   — | j                  |«      }t        j                  |«      }| j                  |«      }t        j                  |«      }| j                  �|| j                  z   }|S rŒ   )r”  ÚFÚrelur•  r‚   )rU   rÿ   Úzs      rJ   r   zMLP.forward�  sS   € Ø�L‰L˜‹OˆÜ�F‰F�1‹IˆØ�M‰M˜!ÓˆÜ�F‰F�1‹IˆØ�;‰;Ð"Ø�D—K‘K‘ˆAØˆrI   c                 ó„   — | j                   �4t        j                  j                  j	                  | j                   «       y y rŒ   )r‚   rh   rk   rd   Únormal_rÀ   s    rJ   Úreset_parameterszMLP.reset_parameters–  s+   € Ø�;‰;Ð"Ü�H‰H�M‰M×!Ñ! $§+¡+Õ.ð #rI   rŒ   )rC   rD   rE   rÍ   rh   rV   r  r¾   ri   r   r�  r  r   s   @rJ   rŽ  rŽ  {  sv   ø„ ð '+ðð
 Ø!Øòàðð —‘˜tÑ#ðð
 ðð ðð õð"˜Ÿ™ð ¨%¯,©,ó ö/rI   rŽ  c                   óF   ‡ — e Zd Zddœdedefˆ fd„Zdededed	d fd
„Zˆ xZS )ÚMLPStackF)Úwith_seq_parallelÚmlp_dimr   c                óÄ   •— t        |d¬«      t        |«      t        |d¬«      g}|r&|j                  t        j                  |d¬«      «       t	        ‰| �  |Ž  || _        y )Né   )r‘  F©r�  )rŽ  Úappendrk   Ú	LayerNormrß   r¾   r   )rU   r¡  r   Úmodulesrò   s       €rJ   r¾   zMLPStack.__init__œ  sX   ø€ ô �¨Ô*Ü�‹LÜ�¨Ô*ð	$
ˆñ Ø�N‰Nœ2Ÿ<™<¨°eÔ<Ô=Ü‰Ñ˜'Ñ"Ø!2ˆÕrI   Útp_meshÚdp_meshÚuse_activation_checkpointingrR   c           
      ó¶  — t        d¬«      t        d¬«      t        d¬«      t        d¬«      t        d¬«      | j                  rt        t        d«      ¬«      n	t        «       dœ}| j                  rt	        d¬«      |d<   t        | ||¬«       | D ]8  }t        |t        j                  «      rŒ|rt        |«       t        |fd	|i|¤Ž Œ: t        | fd	|i|¤Ž | S )
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  rk   r¦  r   r   )rU   r¨  r©  rª  r  r±  r*  s          rJ   ÚparallelizezMLPStack.parallelize¨  sÏ   € ô )¸%Ô@Ü)¸5ÔAÜ(¸%Ô@Ü)¸5ÔAÜ(¸%Ô@à×%Ò%ô *¼¸q»ÕBä Ó"ñ
Ðð ×!Ò!Ü$4À!Ô$DÐ˜SÑ!Ü˜4¨WÐGWÕXØò 	=ˆFÜ˜&¤"§,¡,Ô/ØÙ+Ü˜6Ô"Ü˜Ñ< WÐ<°Ó<ð	=ô 	�DÑ6˜wÐ6¨+Ò6ØˆrI   )	rC   rD   rE   rÍ   r  r¾   r   r³  r  r   s   @rJ   rŸ  rŸ  ›  sD   ø„ ØBGò 
3 ð 
3¸4õ 
3ðàðð ðð '+ð	ð 
÷rI   rŸ  c                   óž   ‡ — e Zd ZdZddedefˆ fd„Zdej                  de	ej                  ej                  f   ej                  z  fd„Z
ˆ xZS )	ÚDoubleLinearz”
    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         ‰| �  «        t        j                  ||«      | _        t        j                  ||«      | _        t        j                  «       | _        || _        y rŒ   )	rß   r¾   rk   rå   Úlin1Úlin2ÚReLUr™  r¶  )rU   r’  r¶  rò   s      €rJ   r¾   zDoubleLinear.__init__Î  sG   ø€ Ü‰ÑÔÜ—I‘I˜c 3Ó'ˆŒ	Ü—I‘I˜c 3Ó'ˆŒ	Ü—G‘G“IˆŒ	Ø!2ˆÕrI   rÿ   rR   c                 óÚ   — | j                   r@| j                  | j                  |«      «      | j                  | j                  |«      «      fS | j                  | j                  |«      «      S rŒ   )r¶  r™  r¸  r¹  r0  s     rJ   r   zDoubleLinear.forwardÕ  sQ   € ð ×!Ò!Ø—9‘9˜TŸY™Y q›\Ó*¨D¯I©I°d·i±iÀ³lÓ,CÐCÐCØ�y‰y˜Ÿ™ 1›Ó&Ð&rI   ©T)rC   rD   rE   rf   rÍ   r  r¾   rh   ri   rg   r   r  r   s   @rJ   rµ  rµ  È  sO   ø„ ññ
3˜Cð 3°Dõ 3ð'Ø—‘ð'à	ˆu�|‰|˜UŸ\™\Ð)Ñ	*¨U¯\©\Ñ	9÷'rI   rµ  Únew_all_gather_into_tensorc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )rx   Úall_gather_singleÚbarrier)r½  Úorig_all_gathers     rJ   Úpatch_all_gatherrÂ  ã  sO   è ø€ ä×,Ñ,€OÜ‡L�L„NØ7„DÔð1Ûä�‰ŒØ!0ŒÕøô 	�‰ŒØ!0ŒÕüó   ‚0A;³A · A;Á!A8Á8A;Únew_foreach_all_gatherc              #   ó:  K  — t         j                  j                  j                  j                  j
                  }t        j                  «        | t         j                  j                  j                  j                  _        	 d –— t        j                  «        |t         j                  j                  j                  j                  _        y # t        j                  «        |t         j                  j                  j                  j                  _        w xY w­wrŒ   )rh   r\  r„  Ú_fully_shardÚ_fsdp_param_groupÚforeach_all_gatherrx   rÀ  )rÄ  Úorig_foreach_all_gathers     rJ   Ú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              #   ó:  K  — t         j                  j                  j                  j                  j
                  }t        j                  «        | t         j                  j                  j                  j                  _        	 d –— t        j                  «        |t         j                  j                  j                  j                  _        y # t        j                  «        |t         j                  j                  j                  j                  _        w xY w­wrŒ   )rh   r\  r„  rÆ  rÇ  Úforeach_reducerx   rÀ  )rÌ  Úorig_foreach_foreach_reduces     rJ   Úpatch_foreach_reducerÐ    s¿   è ø€ ô 	×Ñ×Ñ×+Ñ+×=Ñ=×LÑLð  ô 	‡L�L„Nàô 
×Ñ×Ñ×'Ñ'×9Ñ9ÔHð
Ûä�‰Œà'ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕLøô 	�‰Œà'ô 	×Ñ×Ñ×+Ñ+×=Ñ=ÕLürË  Únew_reduce_scatter_tensorc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )rx   r]  rÀ  )rÑ  rZ  s     rJ   Úpatch_reduce_scatterrÓ    sP   è ø€ ä×4Ñ4ÐÜ‡L�L„NØ!:„DÔð9Ûä�‰ŒØ%8ŒÕ"øô 	�‰ŒØ%8ŒÕ"ürÃ  Únew_all_reducec              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )rx   r‹  rÀ  )rÔ  Úorig_all_reduces     rJ   Úpatch_all_reducer×    sJ   è ø€ ä—o‘o€OÜ‡L�L„NØ$„D„Oð*Ûä�‰ŒØ)Œ�øô 	�‰ŒØ)Œ�ürÃ  Únew_unshardc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )r   Úunshardrx   rÀ  )rØ  Úorig_unshards     rJ   Úpatch_unshardrÜ  +  óQ   è ø€ ô "×)Ñ)€LÜ‡L�L„NØ(„NÔð.Ûä�‰ŒØ!-ŒÕøô 	�‰ŒØ!-ŒÕürÃ  Únew_reshardc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )r   Úreshardrx   rÀ  )rÞ  r‚  s     rJ   Úpatch_reshardrá  8  rÝ  rÃ  Únew_post_backwardc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )r   Úpost_backwardrx   rÀ  )râ  Úorig_post_backwards     rJ   Úpatch_post_backwardræ  E  sR   è ø€ ô (×5Ñ5ÐÜ‡L�L„NØ#4„NÔ ð:Ûä�‰ŒØ'9ŒÕ$øô 	�‰ŒØ'9ŒÕ$ürÃ  Únew_backwardc              #   óú   K  — t         j                  }t        j                  «        | t         _        	 d –— t        j                  «        |t         _        y # t        j                  «        |t         _        w xY w­wrŒ   )r   r	  rx   rÀ  )rç  Úorig_backwards     rJ   Ú*patch_register_post_backward_hook_backwardrê  R  sT   è ø€ ô 1×9Ñ9€MÜ‡L�L„NØ,8Ô Ô)ð>Ûä�‰ŒØ0=Ô$Õ-øô 	�‰ŒØ0=Ô$Õ-ürÃ  rZ  ra   rb   c                 ó€   — t        |«      dkD  r|d   }nd|v r|d   }nt        d|› d|› �«      ‚ ||«        ||i |¤ŽS )Nr   r[   z,Cannot get reduce-scatter output from
args: z	
kwargs: )Úlenr|   )ÚclsrZ  ro   ra   rb   r[   s         rJ   Úreduce_scatter_with_assertrî  _  sa   € ô ˆ4ƒy�1‚}Ø�a‘‰Ø	�VÑ	Ø˜Ñ!‰äØ;¸D¸6ÀÈFÈ8ÐTó
ð 	
ñ ˆfÔÙ Ð/¨Ñ/Ð/rI   Úreplicated_moduleÚsharded_moduleÚprefixes_to_ignore.c                 óä  — t        |j                  «       |j                  «       d¬«      D �]Â  \  \  }}\  }}|}|D ]  }	|j                  |	d«      }Œ | j                  ||«       | j	                  |t
        «       t        |t
        «      st        d«      ‚|j                  |j                  }}
t        |«      t        d«      t        d«      fk(  rt        d«      ‚t        ||
|«      }| j                  |j                  «       |j                  «       «       |j                  €| j                  |j                  «       �Œ| j!                  |j                  «       t        |j                  |
|«      }| j	                  |j                  t
        «       t        |j                  t
        «      st        d«      ‚| j                  |j                  j                  «       |j                  «       «       �ŒÅ y )NTrs   Ú 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}   ru   ÚreplaceÚassertEqualÚassertIsInstancer!   r  r|   r°  Ú
placementsrg   r"   r    Úto_localr‰  ÚassertIsNoneÚassertIsNotNone)rí  rï  rð  rñ  Úreplicated_nameÚreplicated_paramÚsharded_nameÚsharded_paramÚclean_sharded_nameÚprefixr²  r÷  Úsharded_ref_paramÚsharded_ref_grads                 rJ   Úcheck_sharded_parityr  r  sÃ  € ô ORØ×*Ñ*Ó,Ø×'Ñ'Ó)ØôOó TÑJÑ+ˆÐ*Ñ-J¨l¸Mð
 *ÐØ(ò 	HˆFØ!3×!;Ñ!;¸FÀBÓ!GÑð	Hà�‰˜Ð);Ô<Ø×Ñ˜]¬GÔ4Ü˜-¬Ô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Ü Ð!NÓOÐOØ�‰˜×*Ñ*×3Ñ3Ó5Ð7G×7PÑ7PÓ7RÖSñ9TrI   znot-support-multithreadc                   ó@   ‡ — e Zd Zed„ «       Zˆ fd„Zd„ Zd„ Zd„ Zˆ xZ	S )ÚFSDPTestMultiThreadc                 ó   — t         S rŒ   ©ÚDEVICE_COUNTrÀ   s    rJ   rƒ   zFSDPTestMultiThread.world_size™  ó   € äÐrI   c                 óB   •— t         ‰| �  «        | j                  «        y rŒ   )rß   ÚsetUpÚ_spawn_threads©rU   rò   s    €rJ   r  zFSDPTestMultiThread.setUp�  s   ø€ Ü‰‰ŒØ×ÑÕrI   c                 ó    — t        | g|¢­i |¤ŽS rŒ   ©r-   rl  s      rJ   r-   z FSDPTestMultiThread.run_subtests¡  ó   € Ü˜DÐ2 4Ò2¨6Ñ2Ð2rI   c                 ó@   — t         j                  j                  «        y rŒ   ©rh   Ú_dynamoÚresetrÀ   s    rJ   ÚperThreadSetUpz"FSDPTestMultiThread.perThreadSetUp¤  ó   € Ü�‰×ÑÕrI   c                 ó@   — t         j                  j                  «        y rŒ   r  rÀ   s    rJ   ÚperThreadTearDownz%FSDPTestMultiThread.perThreadTearDown§  r  rI   )
rC   rD   rE   Úpropertyrƒ   r  r-   r  r  r  r   s   @rJ   r  r  —  s)   ø„ àñó ðôò3òörI   r  c            #       óT  — e Zd ZdZd„ Zd„ Zd„ Zd„ Zed„ «       Z		 	 	 	 	 	 	 d"d	e
j                  d
ededededz  dededz  dededeeef   dz  fd„Zddd e«       dddddddddfdee   dedededz  dededededz  dedz  dedz  dedededed eeef   dz  deeef   dz  f d!„Zy)#ÚFSDPTestMixinz“
    Mixin class containing shared test utilities for FSDP tests.
    Provides common helper methods for both FSDPTest and FSDPTestContinuous.
    c                 ó<   — | j                  ||j                  «       y rŒ   )rõ  rž   )rU   r  rž   s      rJ   Ú_check_cpu_offloadz FSDPTestMixin._check_cpu_offload±  s   € Ø×Ñ˜ j×&<Ñ&<Õ=rI   c                 ó<   — | j                  ||j                  «       y rŒ   )rõ  Úbackward_prefetch)rU   r  r  s      rJ   Ú_check_backward_prefetchz&FSDPTestMixin._check_backward_prefetch´  s   € Ø×ÑÐ*¨J×,HÑ,HÕIrI   c                 ó<   — | j                  ||j                  «       y rŒ   )rõ  Úforward_prefetch)rU   r  r"  s      rJ   Ú_check_forward_prefetchz%FSDPTestMixin._check_forward_prefetch·  s   € Ø×ÑÐ)¨:×+FÑ+FÕGrI   c                 ó    — t        | g|¢­i |¤ŽS rŒ   r  rl  s      rJ   r-   zFSDPTestMixin.run_subtestsº  r  rI   c                 ó  —  | |«      }||_         ||_        |j                  dd«      }t        d|j                   › d|j                  › �«       t
        dk7  r^t        j                  j                  «       |j                  k  r3t        j                  t        d|j                  › �   j                  «       	 |r`t        j                  j                  j                  j                   j#                  «       }t%        j&                  d|j                  ||¬«       nDt%        j&                  |j(                  t*        t-        |j                  «      |j                   ¬	«       d }
|j                   t2        z  }t4        st6        rt        j                  j9                  |«       |g}
t%        j:                  |
¬«       t        j<                  j?                  «        tA        «        |jC                  ||«       t        j<                  j?                  «        t%        j:                  |
¬«       t%        jD                  «        y # t.        $ r=}	d
|	j0                  d   v r&t        j                  t        d   j                  «       ‚ d }	~	ww xY w)NÚfake_pgFúdist init r=ú, world=r>   ú
multi-gpu-Úfake©Úbackendrƒ   r«   Ústore©Úinit_methodr,  rƒ   r«   Ú	recompiler   Úbackend_unavailable©Ú
device_ids)#r«   Ú	file_nameÚgetÚprintrƒ   r�   rh   ÚacceleratorÚdevice_countÚsysÚexitr.   Ú	exit_codeÚtestingÚ	_internalr\  r&  Ú	FakeStorerx   Úinit_process_groupr/  ÚDISTRIBUTED_BACKENDrÍ   ÚRuntimeErrorra   r  r2   r5   Úset_device_indexrÀ  r  r  r1   Úrun_testÚdestroy_process_group©rí  r«   Ú	test_namer4  Úpiperb   rU   r&  r-  Úer3  Ú	device_ids               rJ   Ú_runz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¤Ñ,ˆ	Ý�Ü×Ñ×.Ñ.¨yÔ9Ø�[ˆ
ô
 	�‰ 
Õ+ä�‰×ÑÔÜŒØ�‰�i Ô&Ü�‰×ÑÔä�‰ 
Õ+ä×"Ñ"Õ$øô1 ò 	Ø˜aŸf™f Q™iÑ'Ü—‘œÐ$9Ñ:×DÑDÔEàûð		ús   Â6B&H8 È8	I>É8I9É9I>NFrm   Ú	num_stepsÚautocastÚlrÚfsdp_cpu_offloadÚ
save_modelÚmixed_precisionÚenable_sharded_grad_scalerÚuse_pure_fp16Úsharded_grad_scaler_kwargsc           	      óö  — |xr |j                   }t        |j                  «       «      j                  }|
€i }
t	        d	d|i|
¤Ž}t
        j                  j                  |j                  «       |d¬«      }t        |«      D �]%  }|j                  «        t
        j                  j                  t        |¬«      5  |j                  j                  t        j                  t        «      «      }|	s|rMt        |t         «      s=t        |t
        j"                  «      r|j%                  «       }nt'        d„ |D «       «      } ||Ž }|rft        |t         «      rV|j(                  t*        vrD|j                  «       D ]1  }| j-                  |j                  t        j                  d«      «       Œ3 |j                  j/                  ||«      j1                  |«      }d d d «       |j3                  «      }|s*|	s(|j4                  t
        j6                  k7  r¦t9        d«      ‚|	r+| j-                  |j4                  t
        j:                  «       nnt        |t         «      r4|€t9        d«      ‚| j-                  |j4                  |j<                  «       n*| j-                  |j4                  t
        j6                  «       |j                  j?                  |«       |rTt        |t         «      rD|j                  «       D ]1  }| j-                  |j                  t        j                  d«      «       Œ3 |jA                  |«       |jC                  «        |s�ŒË|jE                  «       jG                  «       D ��ci c]  \  }}||jI                  «       “Œ }}}tK        |«       |jM                  |«       �Œ( t        |t         «      r|jO                  tP        jR                  «       jU                  «       S # 1 sw Y   �ŒxY wc c}}w )
NÚenabledgÍÌÌÌÌÌì?)rM  Úmomentum)rU  c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrŒ   )rœ   )ru  rÿ   s     rJ   rv  z9FSDPTestMixin._train_for_several_steps.<locals>.<genexpr>  s   è ø€ Ò%>°1 a§f¡f§hÑ%>ùrw  r>   zQloss data type should be float32, as the original parameter data type is float32.z'Expected mixed_precision to not be NonerH   )+Úoffload_paramsÚnextr“   rV   r   rh   ÚoptimÚSGDrz   Ú	zero_gradÚamprL  r�   r*  rW   r  r‘   ri   rœ   rg   r  r   rõ  r\   r›   ÚscalerÞ   Úfloat32r|   Úfloat16Úparam_dtyper`   ÚstepÚupdater�   r¨   Úcloner™   Úload_state_dictÚ_assert_stater   ÚIDLErv   )rU   rm   rK  rL  rM  rN  rO  rP  rQ  rR  rS  Úcpu_offload_paramsÚmodel_deviceÚsharded_grad_scalerrZ  r„   rZ   r[   rE  r_   ÚkÚvr�   s                          rJ   Ú_train_for_several_stepsz&FSDPTestMixin._train_for_several_stepsô  s@  € ð .ÒQÐ2B×2QÑ2QÐä˜E×,Ñ,Ó.Ó/×6Ñ6ˆØ%Ð-Ø)+Ð&Ü/ñ 
Ø.ð
Ø2Lñ
Ðô
 —‘—‘ × 0Ñ 0Ó 2°rÀC�ÓHˆÜ�yÓ!ó =	2ˆAØ�O‰OÔÜ—‘×#Ñ#¤K¸Ð#ÓBñ MàŸ™×.Ñ.¬u¯|©|¼KÓ/HÓI�Ù ¡_¼ZÈÌtÔ=TÜ! %¬¯©Ô6Ø %§
¡
£™ä %Ñ%>¸Ô%>Ó >˜Ù ˜�ñ 'Ü" 5¬$Ô/ð ×/Ñ/Ü>ñ?ð #×-Ñ-Ó/ò H˜à×(Ñ(¨¯©´5·<±<ÀÓ3FÕGðHð —|‘|×,Ñ,¨U°FÓ;×>Ñ>¸|ÓL�÷-Mð. '×,Ñ,¨TÓ2ˆDá"©=Ø—:‘:¤§¡Ò.Ü(ð:óð ñ
 !Ø×$Ñ$ T§Z¡Z´·±Õ?ä ¤tÔ,Ø&Ð.Ü,ØEóð ð ×$Ñ$ T§Z¡Z°×1LÑ1LÕMà×$Ñ$ T§Z¡Z´·±Ô?Ø�L‰L×%Ñ% dÔ+á!¤j°¼Ô&=Ø×)Ñ)Ó+ò D�Aà×$Ñ$ Q§X¡X¬u¯|©|¸EÓ/BÕCðDð  ×$Ñ$ UÔ+à×&Ñ&Ô(ãØ7<×7GÑ7GÓ7I×7OÑ7OÓ7Q×R©t¨q°!˜a §¡£™lÐR�
ÑRô ˜EÔ"Ø×%Ñ% jÖ1ð{=	2ô~ �eœTÔ"Ø×Ñ¤× 2Ñ 2Ô3Ø�{‰{‹}Ð÷Mñ Müón Ss   Â9DO(Í,O5Ï(O2	r8   TÚmodel_classr  rÐ   Úref_init_fnÚ	num_itersrž   r  r  r"  Úuse_orig_paramsÚinit_kwargsc                 óÈ  — |t         j                  k(  rt        d«      ‚|€i }d}| j                  j	                  «       } |j
                  | j                  t         j                  t        j                  fddi|¤Ž}|€Ct        rt        |t        gt        ¬«      }n-t        dk(  rt        |«      }nt        ||g|¬«      }n ||«      }|r|j                  «       }| j                  |||
du|||
|||¬«	      }t        |j                  «       «      }|j                  |||	|
||d	œ«       	  |j
                  | j                  |||fddi|¤Ž}t'        |t(        «      st)        || j                  fi |¤Ž}|r|j                  «       }|t        j*                  k(  r|j-                  t        «      }|duxr |j.                  }|xr |t        j*                  k(  }|xr |t        j*                  k7  }|rFt1        j2                  d«      }|j                  «       D ]  }| j5                  |j2                  |«       Œ  |r| j7                  t8        dt        › �«      n	t;        «       }|5  | j                  ||d||||
|||¬«
      } ddd«       |ry|r[t1        j2                  d«      }|j                  «       D ]  }| j5                  |j2                  |«       Œ   j-                  t        «      } t=        |«      }!t0        j>                  jA                  | d¬«       |
€|s| j5                  ||!dd¬«       yyy# t         $ r }t#        d
|› dt%        |«      › �«      |‚d}~ww xY w# 1 sw Y   ŒÞxY w)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)r3  Úoutput_devicer>   )rL  rM  rN  rP  rQ  rR  rS  )rž   r  r  rP  r"  rq  zInitializing z raised error zOAn FSDP-managed module with parameter CPU offloading enabled has parameters on F)rL  rM  rN  rO  rP  rQ  rR  rS  )Úcheck_dtypezFSDP did not match DDP)Úexact_deviceÚmsg)!rB   rF   r|   rn   r«   rd   rL   rM   r3   ÚDDPr�   rœ   rm  r¯   r“   rc  Ú	Exceptionr  r£   r  r‘   rN   r›   rX  rh   rV   rõ  ÚassertRaisesRegexrA  r   r°   r<  Úassert_close)"rU   rn  r  rÐ   ro  rp  rO  rž   r  r  rP  r"  rq  rQ  rR  rr  rS  r  rM  r«   rm   Ú	ref_modelÚref_lossÚ
ddp_paramsr  rH  rX  Úexpects_device_errorÚexpects_cpu_deviceÚ
cpu_devicer   ÚcontextÚ	fsdp_lossÚfsdp_unsharded_paramss"                                     rJ   Ú_test_fsdp_parityzFSDPTestMixin._test_fsdp_parityO  sÆ  € ðD œ\×1Ñ1Ò1Ü Ð!QÓRÐRØÐØˆKØˆØ×!Ñ!×&Ñ&Ó(ˆà �× Ñ Ø×ÑÜ× Ñ Ü×(Ñ(ñ
ð ð	
ð
 ñ
ˆð ÐÝÜØ¤{ 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Õ:ð;ñ $ð ×"Ñ"Üð%Ü%0 Mð3ôô “ð 	ð ñ 	Ø×5Ñ5ØØØØØ!,Ø%Ø /Ø+EØ+Ø+Eð 6ó ˆI÷	ñ  Øñ ÜŸ™ eÓ,ˆJØ#×.Ñ.Ó0ò ;�Ø× Ñ  §¡¨zÕ:ð;à!Ÿ™¤[Ó1ˆIÜ /°
Ó ;Ðô 	�‰×"Ñ" 8¨YÀEÐ"ÔJð Ð"©=Ø×ÑØØ%Ø!Ø,ð	 õ ð ,9Ð"øôK ò 	YÜ˜}¨[¨M¸ÌÈAËÀxÐPÓQÐWXÐXûð	Yú÷F	ð 	ús$   Ä)"L, ÉMÌ,	MÌ5MÍMÍM!)rt  NFNFFN)rC   rD   rE   rf   r  r   r#  r-   ÚclassmethodrJ  rk   rl   rÍ   r  Úfloatr   r   rª   r£   r   rm  rc  rQ   rB   rL   r   r   r   r†  rH   rI   rJ   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rI   r  c                   ót   ‡ — e Zd Zˆ fd„Zed„ «       Zed„ «       Zedefd„«       Zed„ «       Z	e
d„ «       Zˆ xZS )ÚFSDPTestc                 óh   •— t         ‰| �  «        dt        j                  d<   | j	                  «        y )NÚ0ÚTORCH_NCCL_DESYNC_DEBUG)rß   r  ÚosÚenvironÚ_spawn_processesr  s    €rJ   r  zFSDPTest.setUpû  s)   ø€ Ü‰‰Œð 14Œ�
‰
Ð,Ñ-Ø×ÑÕrI   c                 ó   — t         S rŒ   r  rÀ   s    rJ   rƒ   zFSDPTest.world_size  r	  rI   c                 ó>   — t         j                  j                  «       S rŒ   )rx   Údistributed_c10dÚ_get_default_grouprÀ   s    rJ   rn   zFSDPTest.process_group  s   € ä×$Ñ$×7Ñ7Ó9Ð9rI   rR   c                  ó   — yr7  rH   rÀ   s    rJ   Údestroy_pg_upon_exitzFSDPTest.destroy_pg_upon_exit  s   € ð rI   c                 ó*   — t         › | j                  › �S rŒ   )r/   r4  rÀ   s    rJ   r/  zFSDPTest.init_method  s   € ä�˜tŸ~™~Ð.Ð/Ð/rI   c                 óð  —  | |«      }||_         ||_        |j                  dd«      }t        d|j                   › d|j                  › �«       t
        j                  j                  «       |j                  k  r3t        j                  t        d|j                  › �   j                  «       	 |r`t
        j                  j                  j                  j                  j!                  «       }t#        j$                  d|j                  ||¬«       nDt#        j$                  |j&                  t(        t+        |j                  «      |j                   ¬«       d }
|j                   t0        z  }t2        st4        rt
        j                  j7                  |«       |g}
t#        j8                  |
¬«       t
        j:                  j=                  «        t?        «        |jA                  ||«       t
        j:                  j=                  «        t#        j8                  |
¬«       t#        jB                  «        y # t,        $ r=}	d	|	j.                  d
   v r&t        j                  t        d   j                  «       ‚ d }	~	ww xY w)Nr&  Fr'  r(  r)  r*  r+  r.  r0  r   r1  r2  )"r«   r4  r5  r6  rƒ   rh   r7  r8  r9  r:  r.   r;  r<  r=  r\  r&  r>  rx   r?  r/  r@  rÍ   rA  ra   r  r2   r5   rB  rÀ  r  r  r1   rC  rD  rE  s               rJ   rJ  z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¤Ñ,ˆ	Ý�Ü×Ñ×.Ñ.¨yÔ9Ø�[ˆ
ô
 	�‰ 
Õ+ä�‰×ÑÔÜŒØ�‰�i Ô&Ü�‰×ÑÔä�‰ 
Õ+ä×"Ñ"Õ$øô1 ò 	Ø˜aŸf™f Q™iÑ'Ü—‘œÐ$9Ñ:×DÑDÔEàûð		ús   Â-B&H/ È/	I5È88I0É0I5)rC   rD   rE   r  r  rƒ   rn   r  r–  r/  r‡  rJ  r  r   s   @rJ   rŠ  rŠ  ú  ss   ø„ ô ð ñó ðð ñ:ó ð:ð ð dò ó ðð ñ0ó ð0ð ñ4%ó ô4%rI   rŠ  c                   óŒ   ‡ — e Zd ZU dZeZeed<   ede	fd„«       Z
ede	fd„«       Zeˆ fd„«       Zˆ fd„Zˆ fd„Zed	„ «       Zˆ xZS )
ÚFSDPTestContinuouszú
    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ƒ   rR   c                 ó   — t         S rŒ   )r@  ©rí  s    rJ   Úbackend_strzFSDPTestContinuous.backend_strU  s   € ä"Ð"rI   c                 ó   — t         S rŒ   )r�   rœ  s    rJ   Údevice_typezFSDPTestContinuous.device_typeY  s   € äÐrI   c                 óJ  •— dt         j                  d<   t        j                  j	                  «       |k  r)t        j                  t        d|› �   j                  «       |t        z  }t        st        rt        j                  j                  |«       t        ‰| �9  |||«       y )NrŒ  r�  r)  )rŽ  r�  rh   r7  r8  r9  r:  r.   r;  r  r2   r5   rB  rß   Ú_init_pg)rí  r«   rƒ   Ú	rdvz_filerI  rò   s        €rJ   r¡  zFSDPTestContinuous._init_pg]  s}   ø€ ð
 14Œ�
‰
Ð,Ñ-ä×Ñ×)Ñ)Ó+¨jÒ8Ü�H‰H”Z *¨Z¨LÐ 9Ñ:×DÑDÔEàœ<Ñ'ˆ	Ý�Ü×Ñ×.Ñ.¨yÔ9ä‰Ñ˜˜z¨9Õ5rI   c                 óÌ   •— t         ‰| �  «        | j                  | j                  k7  rt	        j
                  «        t        j                  j                  «        t        «        y rŒ   )
rß   r  r«   ÚMAIN_PROCESS_RANKrx   rÀ  rh   r  r  r1   r  s    €rJ   r  zFSDPTestContinuous.setUpm  s>   ø€ Ü‰‰Œð �9‰9˜×.Ñ.Ò.Ü�L‰LŒNÜ�‰×ÑÔÜ�rI   c                 ó¸   •— | j                   | j                  k7  rt        j                  «        t        ‰| �  «        t        j                  j                  «        y rŒ   )	r«   r¤  rx   rÀ  rß   ÚtearDownrh   r  r  r  s    €rJ   r¦  zFSDPTestContinuous.tearDownw  s9   ø€ à�9‰9˜×.Ñ.Ò.Ü�L‰LŒNÜ‰ÑÔÜ�‰×ÑÕrI   c                 ó.   — | j                   j                  S rŒ   )rò   r  rÀ   s    rJ   rn   z FSDPTestContinuous.process_group~  s   € à�~‰~× Ñ Ð rI   )rC   rD   rE   rf   r  rƒ   rÍ   Ú__annotations__r‡  r£   r�  rŸ  r¡  r  r¦  r  rn   r  r   s   @rJ   rš  rš  L  sz   ø… ñð #€J�Ó"àð#˜Cò #ó ð#ð ð˜Cò ó ðð ó6ó ð6ôôð ñ!ó ô!rI   rš  Úcompile_compute_on_modulec                 ó@   ‡ ‡‡— ˆ fd„Š G d„ dt         «      Šˆˆfd„}|S )Nc                  ó¢   •— t        j                  j                  j                  | i |¤Ž ‰�t	        | d   ‰«      r| d   j                  «        y y )Nr   )rh   r\  r„  r   r  rH  )ra   rb   r©  s     €rJ   Ú!fully_shard_with_compiled_computez=compiled_fsdp_test.<locals>.fully_shard_with_compiled_compute„  sN   ø€ Ü×Ñ×Ñ×*Ñ*¨DÐ;°FÒ;Ø$Ð,´
Ø�‰GÐ.ô1
ð �‰G�O‰OÕð1
rI   c                   ó(   — e Zd Z e«       Z e«       Zy)ú*compiled_fsdp_test.<locals>.FullyShardModeN)rC   rD   rE   r   ÚEAGERÚCOMPILED_COMPUTErH   rI   rJ   ÚFullyShardModer®  ‹  s   „ Ù“ˆÙ›6ÑrI   r±  c                 ó4   •‡ — t        ‰ «      ˆˆˆ fd„«       }|S )Nc                  óÖ  •— t         j                  j                  j                  }‰D �]>  }|‰j                  k7  r"t        «       st        j                  dd¬«       Œ5t         j                  j                  j                  }t         j                  j                  «        |‰j                  k(  r|}n?|‰j                  k(  r"dt         j                  j                  _
        ‰}nt        d|› �«      ‚|‰j                  |j                  <    ‰| i |¤Ž t         j                  j                  «        |‰j                  |j                  <   |t         j                  j                  _
        �ŒA y )Nz0Inductor on GPU needs Triton and recent GPU archr8   )Ú
stacklevelr@   z!Need to implement FullyShardMode=)rh   r\  r„  r   r¯  r6   ÚwarningsÚwarnÚ	_inductorÚconfigÚcompile_threadsrÀ  r°  ÚNotImplementedErrorÚ__globals__rC   )	ra   rb   Úoriginal_fully_shardÚmodeÚoriginal_compile_threadsÚfully_shard_patchr±  r¬  Úfuncs	         €€€rJ   Úwrapperz6compiled_fsdp_test.<locals>.decorator.<locals>.wrapper�  s1  ø€ ä(-×(9Ñ(9×(>Ñ(>×(JÑ(JÐ Ø&ó R�Ø˜>×/Ñ/Ò/¼
¼Ü—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RrI   r
   )rÀ  rÁ  r±  r¬  s   ` €€rJ   Ú	decoratorz%compiled_fsdp_test.<locals>.decorator�  s"   ù€ Ü	ˆt‹õ	Ró 
ð	Rð> ˆrI   )r	   )r©  rÂ  r±  r¬  s   ` @@rJ   Úcompiled_fsdp_testrÃ  ƒ  s"   ú€ ôô"œô "õ!ðF ÐrI   c                   ó&   ‡ — e Zd Zdˆ fd„Zd„ Zˆ xZS )Ú
SkipModulec                 ó\   •— t         ‰| �  «        t        j                  ddd¬«      | _        y ©Né
   Fr¤  )rß   r¾   rk   rå   Úlinr  s    €rJ   r¾   zSkipModule.__init__¶  s"   ø€ Ü‰ÑÔÜ—9‘9˜R ¨%Ô0ˆ�rI   c                 ó$   — | j                  |«      S rŒ   )rÉ  r0  s     rJ   r   zSkipModule.forwardº  s   € Ø�x‰x˜‹{ÐrI   re   rm  r   s   @rJ   rÅ  rÅ  µ  s   ø„ õ1örI   rÅ  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚNestedLinearc                 óú   •— t         ‰| �  «        |r:t        t        j                  ddd¬«      j                  t        «      «      | _        y t        j                  ddd¬«      j                  t        «      | _        y rÇ  )rß   r¾   r   rk   rå   r›   r�   Únested_linear)rU   Ú	fsdp_wraprò   s     €rJ   r¾   zNestedLinear.__init__¿  sV   ø€ Ü‰ÑÔÙÜ!%¤b§i¡i°°B¸UÔ&C×&FÑ&FÄ{Ó&SÓ!TˆDÕä!#§¡¨2¨r¸Ô!>×!AÑ!AÄ+Ó!NˆDÕrI   c                 ó$   — | j                  |«      S rŒ   )rÎ  r0  s     rJ   r   zNestedLinear.forwardÆ  s   € Ø×!Ñ! !Ó$Ð$rI   rm  r   s   @rJ   rÌ  rÌ  ¾  s   ø„ ôOö%rI   rÌ  c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú	SkipModelc                 ó  •— t         ‰| �  «        t        j                  ddd¬«      j	                  t
        «      | _        t        «       j	                  t
        «      | _        t        t        |¬«      t
        ¬«      | _        y )NrÈ  Fr¤  )rÏ  )rI  )rß   r¾   rk   rå   r›   r�   ÚlinearrÅ  Úlinear_skipr   rÌ  rÎ  )rU   Údouble_nestrò   s     €rJ   r¾   zSkipModel.__init__Ë  sW   ø€ Ü‰ÑÔÜ—i‘i  B¨UÔ3×6Ñ6´{ÓCˆŒÜ%›<Ÿ?™?¬;Ó7ˆÔÜ!Ü ;Ô/¼;ô
ˆÕrI   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S rŒ   )rÔ  rÕ  rÎ  r0  s     rJ   r   zSkipModel.forwardÓ  s4   € Ø�K‰K˜‹NˆØ×Ñ˜QÓˆØ×Ñ˜qÓ!ˆØˆrI   rm  r   s   @rJ   rÒ  rÒ  Ê  s   ø„ ô
örI   rÒ  )FT)FFr¼  )rH   rŒ   )–Ú
contextlibrŽ  r@  r9  rU  Úunittestrµ  Úabcr   r   Úcollections.abcr   r   Úcopyr   Úenumr   r	   Ú	functoolsr   Útypingr   r   r   r   rh   Útorch.distributedr\  rx   Útorch.nnrk   Ú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)   ry  Ú*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   r8  r  r�   r@  r<   rB   rL   rl   rQ   r  rŠ   rŽ   r  r™   rŸ   r¦   r¬   r°   r³   r·   r¹   rÏ   r"  r9  r<  rL  re  ri  ro  rŽ  r)  rŸ  rµ  ÚcontextmanagerrÂ  rÊ  rÐ  rÓ  r×  rÜ  rá  ræ  rê  rî  rg   r£   r  ÚskipIfr  r  rŠ  rš  rc  rÃ  rÅ  rÌ  rÒ  rH   rI   rJ   ú<module>rö     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 €‡‚�Ð4Ó5ôÐ/ó ó 6ð÷&Lñ Lô^
O%ˆ}Ð2ô O%ôd4!˜Ð(?ô 4!ñn/°$¸±+ó /ôd�—‘ô ô	%�2—9‘9ô 	%ô�—	‘	õ rI   