+
    ˜°³jhK ã                   óÆ  a € R˜ t¦0 t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHt ^ RIH t  ^ R	I!H"t"H#t# ^ R
I$H%t% ^ RI&t&^ RI't&^ RI(t&^ RI)H*t+ ^ RI,H-t- ^ RI.H/t/ ^ RI0H1t1 ^ RI2H3t3 ^ RI4H5t5 ^ RI6H7t7 ^ RI8H9t9H:t:H;t;H<t<H=t=H>t>H?t?H@t@HAtAHBtBHCtCHDtDHEtE ^ RIFHGtGHHtHHItI RtJRtKRtLRtMRtNRtO]5'       d5   ^ RIPtPR™ F*  w  tQtR]PP¦                  ! ]Q4      '       g   K   R]T! 4       ]R&   K,  	  R R ltU]P¬                  ! ]W4      tX]XP³                  ]P´                  4       . RšOt[RR.t\]@;'       g    ]A;'       g    ]Dt] ! R R]#4      t^/ R]^! ^HR4      bR]^! ^IR4      bR]^! ^WR 4      bR!]^! ^JR"4      bR#]^! ^KR$4      bR%]^! ^MR&4      bR']^! ^PR(4      bR)]^! ^QR*4      bR+]^! ^RR,4      bR-]^! ^SR.4      bR/]^! ^TR04      bR1]^! ^UR24      bR]^! ^LR34      bR4]^! ^NR54      bR6]^! ^OR74      bR8]^! ^VR94      bR:]^! ^XR;4      bR<]^! ^YR=4      /Ct_] ! R> R?4      4       t`R@ taRA tbRB tcRC tdRD teRE tfRF tgRG RH lthRIR/RJ ltiRK RL ltjRM RN ltkRO tlRP tmRQ tnRR toRS tpRT tqRU trRV tsRW ttRX tuRY tvR›RZ ltwR[ txR\ ty]<! R] 4      tz] ^ k R^ t{R_ R` lt|R›Ra lt}R›Rb lt~Rc tRd Re lt€]=Rf^R]! ^Rg7      RRR3Rh l4       t�]C'       d   Rit‚M]ƒ! ]EP                  ! RjRk4      4      t‚RlRmRnRi/t…]B'       d   ^È]…Ro&   RœRp Rq llt†Rr Rs lt‡]Rt 4       tˆR�Ru Rv llt‰Rw Rx ltŠRs‹] ^k R›Ry Rz lltŒR{ R| lt�R›R} R~ lltŽ]B'       d,   ]�! ^]�! ^]&EP"                  EP%                  4       4      4      t“M^t“ ! R R€]E4      t” ! R� R‚]”4      t•Rƒ R„ lt–]EP.                  R… R† l4       t˜R‡ t™R]‚]“3Rˆ ltš ! R‰ RŠ]E4      t› ! R‹ RŒ]-EP8                  4      t� ! R� RŽ]-EP8                  4      tž]RžR� l4       tŸ ! R� R‘]&EP@                  EPB                  PŠ                  4      t¢ ! R’ R“]•4      t£ ! R” R•]E4      t¤ ! R– R—]¤4      t¥R# )Ÿé    N)ÚCallable)Úcontextmanager)Ú	dataclass)Ú	timedelta)ÚEnum)ÚpartialÚreduceÚwraps)ÚStringIO)ÚAnyÚ
NamedTuple)Úpatch)Ú
DeviceType)Ú_SymmetricMemory)Ú	trace_log)Ú_TORCHCOMM_AVAILABLE)Úcommon_utils)ÚFILE_SCHEMAÚfind_free_portÚIS_SANDCASTLEÚLazyValÚretry_on_connect_failuresÚskip_but_pass_in_sandcastleÚskip_but_pass_in_sandcastle_ifÚ	TEST_CUDAÚTEST_HPUÚTEST_WITH_ROCMÚTEST_WITH_TSANÚTEST_XPUÚTestCase)Ú_install_threaded_pgÚ_uninstall_threaded_pgÚProcessLocalGroupFÚncclTc                ó”   € V ^8„  d   QhR\         R\        R\        R\        P                  R\         R\         R\        P
                  /# )é   ÚbackendÚrankÚ
world_sizeÚdeviceÚ
store_pathÚ
group_nameÚreturn)ÚstrÚintÚtorchr*   Úc10dÚProcessGroup)Úformats   "Úk/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/testing/_internal/common_distributed.pyÚ__annotate__r5   R   sX   € ÷ ?ñ ?Üð?ä
ð?ô ð?ô �L‰Lð	?ô
 ð?ô ð?ô 
×Ññ?ó    c                ó,  € ^ RI HpHp \        P                  ! WB4      p\        V4      \        P                  R&   \        V4      \        P                  R&   \        P                  ! V VV R2\        P                  ! V R2V4      RR/R7      p	\        P                  ! \        P                  ! V R	2V4      V	P                  4       V	P                  4       4      p
V
P                  V	P                  4       \        P                  P                   P"                  V! V	4      4       V
P%                  \        P                  P                   P"                  4       V
P'                  V4       T! T
T TTT \)        V4       Uu/ uF  q»VbK  	  upR
7       V
# u upi )uN  Build a bare ProcessGroup whose backend is a torchcomms _BackendWrapper.

Creates a torchcomms comm of the requested ``backend`` (e.g. ``nccl``,
``ncclx``) and wraps it in ``_BackendWrapper``, then registers it as the
NCCL backend on a fresh ``ProcessGroup`` and publishes the group into
``c10d._world`` so name-based lookups (e.g. ``symm_mem.rendezvous(...,
group=group_name)``) resolve to it.

Callers are responsible for choosing a ``group_name`` (and matching
``store_path``) that is unique within the process â€” duplicates trip
``_register_pg_in_world`` and the underlying FileStore.
)Ú_BackendWrapperÚ_register_pg_in_worldÚTORCHCOMM_RANKÚTORCHCOMM_SIZEÚ_commz_tc/Úpersistent_storeÚtrue)ÚnameÚstoreÚhintsz_pg/)Úbackend_namer@   r,   Úbackend_configÚrank_mapping)Ú"torch.distributed.distributed_c10dr8   r9   r1   Ú	FileStorer.   ÚosÚenvironÚ
torchcommsÚnew_commÚPrefixStorer2   Úget_rankÚget_sizeÚ_register_backendÚ
get_deviceÚBackendTypeÚNCCLÚ_set_default_backendÚ_set_group_nameÚrange)r'   r(   r)   r*   r+   r,   r8   r9   Ú
file_storeÚtc_commÚpgÚrs   &&&&&&      r4   Úsetup_torchcomms_pgrY   R   sd  € ÷(ô
 —’ 
Ó7€Jä#& t£9„B‡J�JÐÑ Ü#& z£?„B‡J�JÐÑ ä×!Ò!ØØØˆ|˜5Ð!Ü×Ò * ¨TÐ2°JÓ?Ø! 6Ð*ô€Gô 
×	Ò	Ü×Ò˜J˜< tÐ,¨jÓ9Ø×ÑÓØ×ÑÓó
€Bð
 ×ÑØ×ÑÓÜ×Ñ×%Ñ%×*Ñ*Ù˜Ó ôð ×ÑœD×-Ñ-×9Ñ9×>Ñ>Ô?à×Ñ�zÔ"ÙØ
ØØØØÜ$)¨*Ô$5Ó6Ñ$5˜q˜’dÑ$5Ñ6õð €Iùò 7s   Å<FÚcudaÚxpuc                   ó,   a € ] tR t^œt o V 3R ltRtV tR# )ÚTestSkipc                ó2   <€ V ^8„  d   Qh/ S[ ;R&   S[;R&   # )r&   Ú	exit_codeÚmessage©r/   r.   )r3   Ú__classdict__s   "€r4   r5   ÚTestSkip.__annotate__œ   s   ø‡ ‚ Ù�Nñ á�Lò r6   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__©rb   s   @r4   r]   r]   œ   s   ø‡ ‡ „ r6   r]   Úbackend_unavailablez5Skipped because distributed backend is not available.Úsmall_worldsizez Skipped due to small world size.Úodd_worldsizezSkipped due to odd world size.Úno_cudazCUDA is not available.zmulti-gpu-1zNeed at least 1 CUDA devicezmulti-gpu-2zNeed at least 2 CUDA deviceszmulti-gpu-3zNeed at least 3 CUDA deviceszmulti-gpu-4zNeed at least 4 CUDA deviceszmulti-gpu-5zNeed at least 5 CUDA deviceszmulti-gpu-6zNeed at least 6 CUDA deviceszmulti-gpu-7zNeed at least 7 CUDA deviceszmulti-gpu-8zNeed at least 8 CUDA devicesz#c10d not compiled with NCCL supportÚ
skipIfRocmzTest skipped for ROCmÚno_peer_accessz'Test skipped because no GPU peer accessÚgenericzHTest skipped at subprocess level, look at subprocess log for skip reasonÚimporterrorz"Test skipped due to missing importÚno_acceleratorzaccelerator is not available.c                   óè   € ] tR t^»t/ t0 Rm]R&   ]! 4       ]R&   0 Rm]R&   0 Rm]R&   / t0 Rm]R&   0 Rm]R&   0 Rm]R&   0 Rm]R	&   ]! 4       ]R
&   ]'       d   R0]R&   ]'       d   R0]R&   Rt	R# Rt	R# )ÚDistTestCasesÚxcclÚallgather_coalescedr	   zsendrecv anysourcezcpu barrierÚgpurZ   ÚddpÚsubgroupÚpluginÚhcclÚhpur[   rd   N>   ÚmpiÚuccr$   rx   >   r�   r$   rx   >   r�   Úgloor$   rx   >   r�   r‚   r$   )
re   rf   rg   rh   Úskip_collectiveÚsetÚbackend_featurer   r   rj   rd   r6   r4   rw   rw   »   s“   † ð €OÚ-K€OÐ)Ñ*Ù #£€O�HÑÚ,C€OÐ(Ñ)Ú%<€O�MÑ"ð €OÚ<€O�EÑÚ5€O�FÑÚ<€O�EÑÚ"A€O�JÑÙ #£€O�HÑßØ"( ˆ˜ÑßØ"( ˆ˜Õó r6   rw   c                 ó   € V \         9   # ©N)ÚDDP_RANK_DEVICES©r*   s   &r4   Úrequires_ddp_rankrŠ   Ñ   s   € ØÔ%Ñ%Ð%r6   c                ó0   a € \        S 4      V 3R l4       pV# )z�Skips if the world size exceeds the number of GPUs, ensuring that if the
test is run, each rank has its own GPU via ``torch.cuda.device(rank)``.c                  ó   <€ \         '       gD   \        '       g8   \        '       g,   \        P                  ! \
        R ,          P                  4       \        \        P                  R,          4      p\         '       dR   \        P                  P                  4       V8  d/   \        P                  ! \
        RV 2,          P                  4       \        '       dR   \        P                  P                  4       V8  d/   \        P                  ! \
        RV 2,          P                  4       \        '       dR   \        P                  P                  4       V8  d/   \        P                  ! \
        RV 2,          P                  4       S! V / VB # )rp   Ú
WORLD_SIZEú
multi-gpu-)r   r   r   ÚsysÚexitÚ
TEST_SKIPSr_   r/   rG   rH   r0   rZ   Údevice_countr   r[   )ÚargsÚkwargsr)   Úfuncs   *, €r4   ÚwrapperÚskip_if_no_gpu.<locals>.wrapperÙ   sï   ø€ ç“	ŸX›X¯«Ü�HŠH”Z 	Õ*×4Ñ4Ô5ÜœŸ™ LÕ1Ó2ˆ
ß‹9œŸ™×0Ñ0Ó2°ZÔ?Ü�HŠH”Z *¨Z¨LÐ 9Õ:×DÑDÔEß‹8œŸ	™	×.Ñ.Ó0°:Ô=Ü�HŠH”Z *¨Z¨LÐ 9Õ:×DÑDÔEß‹8œŸ	™	×.Ñ.Ó0°:Ô=Ü�HŠH”Z *¨Z¨LÐ 9Õ:×DÑDÔEá�TÐ$˜VÑ$Ð$r6   ©r
   ©r•   r–   s   f r4   Úskip_if_no_gpurš   Õ   s"   ø€ ô ˆ4ƒ[ô%ó ð%ð €Nr6   c                 ó0   a € \        S 4      V 3R  l4       pV# )c                  óì   <€ \         P                  R ,          R8w  dQ   \        \         P                  R,          4      ^8  d,   \        P                  ! \
        R,          P                  4       S! V / VB # )ÚBACKENDr€   r�   rn   ©rG   rH   r/   r�   r�   r‘   r_   ©r“   r”   r•   s   *,€r4   r–   Ú(skip_if_small_worldsize.<locals>.wrapperñ   sR   ø€ ä�J‰J�yÕ! UÔ*´´B·J±J¸|Õ4LÓ0MÐPQÔ0QÜ�HŠH”ZÐ 1Õ2×<Ñ<Ô=á�TÐ$˜VÑ$Ð$r6   r˜   r™   s   f r4   Úskip_if_small_worldsizer¡   ð   ó    ø€ Ü
ˆ4ƒ[ô%ó ð%ð €Nr6   c                 ó0   a € \        S 4      V 3R  l4       pV# )c                  óú   <€ \         P                  R ,          R8w  dX   \        \         P                  R,          4      ^,          ^8X  d,   \        P                  ! \
        R,          P                  4       S! V / VB # )r�   r€   r�   ro   rž   rŸ   s   *,€r4   r–   Ú&skip_if_odd_worldsize.<locals>.wrapperü   sW   ø€ ä�J‰J�yÕ! UÔ*´´B·J±J¸|Õ4LÓ0MÐPQÕ0QÐUVÔ0VÜ�HŠH”Z Õ0×:Ñ:Ô;á�TÐ$˜VÑ$Ð$r6   r˜   r™   s   f r4   Úskip_if_odd_worldsizer¦   û   r¢   r6   c                 ó   a a€ VV 3R  lpV# )c                 ó6   <a € \        S 4      VV V3R  l4       pV# )c                  óÈ   <€ SR 8X  dT   \         P                  P                  4       S8  d1   \        P                  ! \
        RS 2,          P                  4       R# S! V / VB # ©r$   rŽ   N)r0   rZ   r’   r�   r�   r‘   r_   )r“   r”   r'   r•   Úns   *,€€€r4   r–   ÚCrequire_n_gpus_for_nccl_backend.<locals>.decorator.<locals>.wrapper  sM   ø€ à˜&Ô ¤U§Z¡Z×%<Ñ%<Ó%>ÀÔ%BÜ—’œ j°°Ð$4Õ5×?Ñ?Ö@á˜TÐ, VÑ,Ð,r6   r˜   )r•   r–   r'   r«   s   f €€r4   Ú	decoratorÚ2require_n_gpus_for_nccl_backend.<locals>.decorator  s    ù€ Ü	ˆt‹ö	-ó 
ð	-ð ˆr6   rd   )r«   r'   r­   s   ff r4   Úrequire_n_gpus_for_nccl_backendr¯     s   ù€ öð Ðr6   c                  ó   € R  p V # )c                 ó0   a € \        S 4      V 3R  l4       pV# )c                  ó    <€  ^ RI HpHp S! V / VB #   \         d0    \        P
                  ! \        R,          P                  4        R# i ; i)r   )ÚAutoModelForMaskedLMÚ
BertConfigrt   N)Útransformersr³   r´   ÚImportErrorr�   r�   r‘   r_   )r“   r”   r³   r´   r•   s   *,  €r4   r–   Ú?import_transformers_or_skip.<locals>.decorator.<locals>.wrapper  sA   ø€ ð>ßIá˜TÐ, VÑ,Ð,øÜô >Ü—’œ MÕ2×<Ñ<×=ð>ús   ƒ “6AÁAr˜   r™   s   f r4   r­   Ú.import_transformers_or_skip.<locals>.decorator  s    ø€ Ü	ˆt‹ô	>ó 
ð	>ð ˆr6   rd   )r­   s    r4   Úimport_transformers_or_skipr¹     s   € ò
ð Ðr6   c                 ó,  € \         '       d&   \        P                  P                  4       V 8¼  d   R # \        '       d&   \        P
                  P                  4       V 8¼  d   R # \        '       d&   \        P                  P                  4       V 8¼  d   R # R# )TF)r   r0   rZ   r’   r   r   r   r[   )Úxs   &r4   Úat_least_x_gpur¼   $  sY   € ßƒy”U—Z‘Z×,Ñ,Ó.°!Ô3Ùßƒx”E—I‘I×*Ñ*Ó,°Ô1Ùßƒx”E—I‘I×*Ñ*Ó,°Ô1ÙÙr6   c                ó$   € V ^8„  d   QhR\         /# ©r&   r-   ©Úbool)r3   s   "r4   r5   r5   .  s   € ÷ ñ ´ñ r6   c                 ój   € \        V ^ ,          RR4      p\        V 4      ^ 8X  g   Vf   R# V! V4       R# )r   Ú_handle_test_skipNFT)ÚgetattrÚlen)r“   ÚmsgrÂ   s   && r4   Ú_maybe_handle_skip_if_lt_x_gpurÆ   .  s5   € Ü  Q¥Ð)<¸dÓCÐÜ
ˆ4ƒy�A„~Ð*Ò2ÙÙ�cÔÙr6   Ú	allow_cpuc               ó   a a€ VV 3R lpV# )z±Skip if fewer than x accelerators available.

Args:
    x: Minimum number of accelerators required.
    allow_cpu: If True, run the test on CPU-only machines (no accelerators).
c                 ó6   <a € \        S 4      VV V3R  l4       pV# )c                  ó´  <€ \         P                  P                  4       '       d,   \         P                  P                  4       S8¼  d	   S! V / VB # \        '       d,   \         P
                  P                  4       S8¼  d	   S! V / VB # \        '       d,   \         P                  P                  4       S8¼  d	   S! V / VB # S'       dE   \         P                  P                  4       '       g!   \        '       g   \        '       g	   S! V / VB # \        R S 2,          p\        WP                  4      '       g#   \        P                  ! VP                  4       R# R# )rŽ   N)r0   rZ   Úis_availabler’   r   r   r   r[   r‘   rÆ   r`   r�   r�   r_   )r“   r”   Ú	test_skiprÇ   r•   r»   s   *, €€€r4   r–   Ú4skip_if_lt_x_gpu.<locals>.decorator.<locals>.wrapper?  só   ø€ ä�z‰z×&Ñ&×(Ò(¬U¯Z©Z×-DÑ-DÓ-FÈ!Ô-KÙ˜TÐ, VÑ,Ð,ß‹xœEŸI™I×2Ñ2Ó4¸Ô9Ù˜TÐ, VÑ,Ð,ß‹xœEŸI™I×2Ñ2Ó4¸Ô9Ù˜TÐ, VÑ,Ð,ß¤%§*¡*×"9Ñ"9×";Ò";¿x»xÏ8Ë8Ù˜TÐ, VÑ,Ð,Ü" Z°¨sÐ#3Õ4ˆIÜ1°$×8IÑ8I×JÒJÜ—’˜×,Ñ,Ö-ñ Kr6   r˜   )r•   r–   rÇ   r»   s   f €€r4   r­   Ú#skip_if_lt_x_gpu.<locals>.decorator>  s    ù€ Ü	ˆt‹ö	.ó 
ð	.ð ˆr6   rd   )r»   rÇ   r­   s   fd r4   Úskip_if_lt_x_gpurÏ   6  s   ù€ öð" Ðr6   c                ó$   € V ^8„  d   QhR\         /# )r&   r«   ©r/   )r3   s   "r4   r5   r5   R  s   € ÷ ñ œ3ñ r6   c                ó   a € V 3R lpV# )a2  
Decorator to request a specific world size for a test. The test harness can
read this attribute to set the number of ranks to spawn. If there are fewer
than `n` CUDA devices available, the test should be skipped by the harness.

Usage:
    @require_world_size(3)
    def test_something(self):
        ...
c                 óš   <€ SV n         \        P                  P                  4       p\        P
                  ! VS8¬  R S RV 24      ! V 4      # )z	requires z GPUs, found )Ú_required_world_sizer0   rZ   r’   ÚunittestÚ
skipUnless)r•   Ú	availabler«   s   & €r4   r­   Ú&requires_world_size.<locals>.decorator^  sN   ø€ Ø$%ˆÔ!Ü—J‘J×+Ñ+Ó-ˆ	Ü×"Ò"Ø˜‰N˜i¨ s¨-¸	°{ÐCô
à
óð 	r6   rd   )r«   r­   s   f r4   Úrequires_world_sizerÙ   R  s   ø€ õð Ðr6   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r&   ÚobjÚdefaultr-   )r   r/   )r3   s   "r4   r5   r5   h  s!   € ÷ ñ ¤ð ¬sð ´sñ r6   c                ó   €  \        V R4      '       d,   \        V P                  4      '       d   V P                  4       MV P                  p\	        W4      pVP
                  p\        V4      #   \         d    Tu # i ; i)z˜
Returns the requested world size for the currently running unittest method on `obj`
if annotated via `@require_world_size(n)`, else returns `default`.
Ú_current_test_name)ÚhasattrÚcallablerÞ   Ú_testMethodNamerÃ   rÔ   r/   Ú	Exception)rÛ   rÜ   Ú	test_nameÚfnÚvalues   &&   r4   Úget_required_world_sizeræ   h  sx   € ð
ô �sÐ0×1Ò1´h¸s×?UÑ?U×6VÒ6Vð ×"Ñ"Ô$à×$Ñ$ð 	ô
 �SÓ$ˆØ×'Ñ'ˆÜ�5‹zÐøÜô ØŠðús   ‚A*A- Á-A=Á<A=c                 ó   a a€ V V3R  lpV# )c                 ó6   <a € \        S 4      VV V3R  l4       pV# )c                  ó^  <€ SR 8w  d	   S! V / VB # \         P                  P                  4       '       d,   \         P                  P                  4       S8¼  d	   S! V / VB # \        RS 2,          p\        WP                  4      '       g#   \        P                  ! VP                  4       R# R# rª   )
r0   rZ   rË   r’   r‘   rÆ   r`   r�   r�   r_   )r“   r”   rÌ   r'   r•   r»   s   *, €€€r4   r–   Ú9nccl_skip_if_lt_x_gpu.<locals>.decorator.<locals>.wrapper~  sŒ   ø€ à˜&Ô Ù˜TÐ, VÑ,Ð,Ü�z‰z×&Ñ&×(Ò(¬U¯Z©Z×-DÑ-DÓ-FÈ!Ô-KÙ˜TÐ, VÑ,Ð,Ü" Z°¨sÐ#3Õ4ˆIÜ1°$×8IÑ8I×JÒJÜ—’˜×,Ñ,Ö-ñ Kr6   r˜   )r•   r–   r'   r»   s   f €€r4   r­   Ú(nccl_skip_if_lt_x_gpu.<locals>.decorator}  s    ù€ Ü	ˆt‹ö	.ó 
ð	.ð ˆr6   rd   )r'   r»   r­   s   ff r4   Únccl_skip_if_lt_x_gpurì   |  s   ù€ öð Ðr6   c                 ó2  € V P                  4       pR V9  d   \        R4      hRV9  d   \        R4      hRV9  d   \        R4      hVR,          pVP                  R4      R
8X  d   TMVP                  R4      ^ ,          pWC9  d   \        RV RV 24      hR	# )Ú	iterationz(Expected 'iteration' in ddp_logging_dataÚ	has_errorz(Expected 'has_error' in ddp_logging_dataÚerrorz$Expected 'error' in ddp_logging_dataz
Exception raised from zDid not find expected z in ddp logging data error: Néÿÿÿÿ)Ú_get_ddp_logging_dataÚAssertionErrorÚfindÚsplit)Ú	model_DDPÚ
err_substrÚddp_logging_dataÚlogging_errÚactuals   &&   r4   Úverify_ddp_error_loggedrû   �  s·   € à ×6Ñ6Ó8ÐØÐ*Ô*ÜÐGÓHÐHØÐ*Ô*ÜÐGÓHÐHØÐ&Ô&ÜÐCÓDÐDØ" 7Õ+€Kð �?‰?Ð5Ó6¸"Ô<ñ 	à×ÑÐ8Ó9¸!Õ<ð ð
 Ô ÜØ$ V HÐ,HÈÈÐVó
ð 	
ñ !r6   c                ó0   a € \        S 4      V 3R l4       pV# )a6  
Convenience decorator to set/unset TORCH_NCCL_BLOCKING_WAIT flag. Note that use of
this decorator will override the setting of TORCH_NCCL_ASYNC_ERROR_HANDLING for
the particular test. After the test, both TORCH_NCCL_BLOCKING_WAIT and
TORCH_NCCL_ASYNC_ERROR_HANDLING will be restored to their original values.
c                  ó  <€  \         P                  R ,          p\         P                  R   \         P                  R,          pR\         P                  R&    S! V / VB pTVe   V\         P                  R &   Ve   V\         P                  R&   # #   \         d    Rp Lti ; i  \         d    Rp Loi ; i  R\         P                  R&   i ; i  Te   T\         P                  R &   Te   T\         P                  R&   i i ; i)ÚTORCH_NCCL_ASYNC_ERROR_HANDLINGNÚTORCH_NCCL_BLOCKING_WAITÚ1)rG   rH   ÚKeyError)r“   r”   Ú cached_nccl_async_error_handlingÚcached_nccl_blocking_waitÚretr•   s   *,   €r4   r–   Ú(with_nccl_blocking_wait.<locals>.wrapper«  s  ø€ ð	4Ü;=¿:¹:Ø1õ<Ð,ô —
‘
Ð<Ð=ð	9Ü46·J±JØ*õ5Ð%ð 69ŒB�J‰JÐ1Ñ2ð	SÙ˜Ð' Ñ'ˆCØð 0Ò;à4ô —
‘
Ð<Ñ=ð )Ò4Ø9R”—
‘
Ð5Ò6ð 5øô1 ô 	4à/3Ò,ð	4ûô ô 	-Ø(,Ò%ð	-ûð 69ŒB�J‰JÐ1Ò2ûð 0Ò;à4ô —
‘
Ð<Ñ=ð )Ò4Ø9R”—
‘
Ð5Ò6ð 5ús@   ƒ(B ¬B# Á	C ÂB ÂB Â#B3Â0B6 Â2B3Â3B6 Â6CÃ1C?r˜   r™   s   f r4   Úwith_nccl_blocking_waitr  £  s%   ø€ ô ˆ4ƒ[ô Só ð SðD €Nr6   c                ó   a € V 3R lpV# )zC
Runs a test for each distributed debug level specified in levels.
c                 ó4   <a € \        S 4      V V3R  l4       pV# )c                  ó  <€ \         P                  P                  R R4      pS Fa  pV\         P                  R &   \        P                  ! 4        S! V / VB p\        P
                  ! 4        Vf   KN  V\         P                  R &   Kc  	  X# )ÚTORCH_DISTRIBUTED_DEBUGN)rG   rH   Úgetr1   Úset_debug_level_from_envÚbarrier)r“   r”   Ú	old_levelÚlevelr  r•   Úlevelss   *,   €€r4   r–   Ú:with_dist_debug_levels.<locals>.decorator.<locals>.wrapper×  sq   ø€ äŸ
™
Ÿ™Ð'@À$ÓGˆIÛ�Ø8=”—
‘
Ð4Ñ5Ü×-Ò-Ô/Ù˜DÐ+ FÑ+�Ü—’”ØÔ(Ø<E”B—J‘JÐ8Ó9ñ  ð ˆJr6   r˜   )r•   r–   r  s   f €r4   r­   Ú)with_dist_debug_levels.<locals>.decoratorÖ  s    ù€ Ü	ˆt‹õ	ó 
ð	ð ˆr6   rd   )r  r­   s   f r4   Úwith_dist_debug_levelsr  Ñ  s   ø€ õ
ð$ Ðr6   c                  óJ   € \        \        P                  ! 4       '       * R 4      # )z+c10d was not compiled with the Gloo backend)r   r1   Úis_gloo_availablerd   r6   r4   Úrequires_gloor  ë  ó!   € Ü)Ü×"Ò"Ó$Ô$Ø5óð r6   c           	      ó4  € \         '       g   R  # \        P                  ! 4       '       g   \        R4      # \	        \
        P                  P                  P                  4       V 8  RV  R\
        P                  P                  P                  4        RV 24      # )c                 ó   € V # r‡   rd   )Úfs   &r4   Ú<lambda>Ú'requires_nccl_version.<locals>.<lambda>ô  s   € ™r6   ú+c10d was not compiled with the NCCL backendz0Requires NCCL version greater than or equal to: z	, found: z
, reason: )	r   r1   Úis_nccl_availabler   r   r0   rZ   r$   Úversion)r  rÅ   s   &&r4   Úrequires_nccl_versionr   ò  s„   € ß‹9ÙÐÜ×!Ò!×#Ò#Ü*Ø9ó
ð 	
ô .Ü�J‰J�O‰O×#Ñ#Ó%¨Ñ/Ø>¸w¸iÀyÔQV×Q[ÑQ[×Q`ÑQ`×QhÑQhÓQjÐPkÐkuÐvyÐuzÐ{ó
ð 	
r6   c                 ó   € \        RR4      # )zC
Require NCCL shrink support (NCCL available and version >= 2.27).
z Need NCCL 2.27+ for shrink_group)r&   é   )r   rd   r6   r4   Úrequires_nccl_shrinkr#     s   € ô ! Ð*LÓMÐMr6   c                  óJ   € \        \        P                  ! 4       '       * R 4      # )r  )r   r1   r  rd   r6   r4   Úrequires_ncclr%    r  r6   c                  óJ   € \        \        P                  ! 4       '       * R 4      # )z+c10d was not compiled with the XCCL backend)r   r1   Úis_xccl_availablerd   r6   r4   Úrequires_xcclr(    r  r6   c                  óJ   € \        \        P                  ! 4       '       * R 4      # )z*c10d was not compiled with the UCC backend)r   r1   Úis_ucc_availablerd   r6   r4   Úrequires_uccr+    ó!   € Ü)Ü×!Ò!Ó#Ô#Ø4óð r6   c                  óJ   € \        \        P                  ! 4       '       * R 4      # )z*c10d was not compiled with the MPI backend)r   r1   Úis_mpi_availablerd   r6   r4   Úrequires_mpir/    r,  r6   c                ó¦   € V f   \         p \        ;QJ d    R V  4       F  '       g   K   RM	  RM! R V  4       4      p\        V'       * RV  24      # )aª  
Decorator to skip tests if no accelerator communication backend (NCCL, XCCL, HCCL) is available.

Args:
    backends (Optional[List[str]]): Specific accelerator backends to check (e.g., ["nccl", "xccl", "hccl"]).
                                   If None, checks all supported accelerator backends (NCCL, XCCL, HCCL).

Returns:
    callable: A decorator that skips the test if no specified accelerator backend is available.
c              3   ó˜   "  € T F@  pR \         P                  R\         P                  RR /P                  VR 4      ! 4       x € KB  	  R# 5i)r$   rx   r~   c                  ó   € \         # r‡   )r   rd   r6   r4   r  Ú=requires_accelerator_dist_backend.<locals>.<genexpr>.<lambda>5  s   € �Hr6   c                  ó   € R # ©Frd   rd   r6   r4   r  r3  6  s   € ™ur6   N)r1   r  r'  r  )Ú.0r'   s   & r4   Ú	<genexpr>Ú4requires_accelerator_dist_backend.<locals>.<genexpr>1  sV   é € ð ñ  ˆGð	 ”D×*Ñ*Ø”D×*Ñ*ØÑ$ð	
÷ ‰#ˆg‘}Ó
%ð		&÷ 	(ð 	(ó
  ùs   ‚AA
TFz5No accelerator communication backend available among )ÚACCELERATOR_DIST_BACKENDSÚanyr   )ÚbackendsÚbackend_availables   & r4   Ú!requires_accelerator_dist_backendr=  #  s_   € ð ÒÜ,ˆç›ñ ñ  óŸŸšñ ñ  óó Ðô *ØÔØ
?À¸zÐJóð r6   c                  óº   € \         P                  P                  4       ;'       d&    \        P                  ! \
        P                  ^ 4      p \        V '       * R4      # )r   z"multicast support is not available)r0   rZ   rË   r   Úhas_multicast_supportr   ÚCUDAr   )r?  s    r4   Úrequires_multicast_supportrA  @  sO   € ä�
‰
×ÑÓ!÷ 	Gð 	GÜ×2Ò2´:·?±?ÀAÓFð ô *Ø!Ô!Ø,óð r6   c                  óº   € \         '       dO   \        '       dA   R R.p V  F4  pV\        P                  P	                  ^ 4      P
                  9   g   K3   R# 	  R# R# R# )Úgfx942Úgfx950TF)r   r   r0   rZ   Úget_device_propertiesÚgcnArchName)Ú	arch_listÚarchs     r4   Ú#evaluate_platform_supports_symm_memrI  K  sK   € ßƒyß‹>Ø! 8Ð,ˆIÛ!�Øœ5Ÿ:™:×;Ñ;¸AÓ>×JÑJÖJÚñ "ñ áár6   c                  ó   € \        4       # r‡   )rI  rd   r6   r4   r  r  Z  s   € Ô/Ô1r6   c                ón   € \         P                  ! \        \        R,          P                  4      ! V 4      # )z&Skips a test for ROCm multiprocess UTsrq   )rÕ   ÚskipIfr   r‘   r`   )r•   s   &r4   Úskip_if_rocm_multiprocessrM  ^  s#   € ä�?Š?œ>¬:°lÕ+C×+KÑ+KÔLÈTÓRÐRr6   c                ó>   € V ^8„  d   QhR\         \        R3,          /# )r&   rH  .)Útupler.   )r3   s   "r4   r5   r5   c  s   € ÷ ñ ¬¬s°C¨x­ñ r6   c                ó   a € V 3R lpV# )z4Skips a test for given ROCm archs - multiprocess UTsc                 óô   <€ R p\         '       dL   \        P                  P                  ^ 4      P                  P                  R4      ^ ,          pVS9   d   RS 2p\        P                  ! VR JV4      ! V 4      # )NÚ:z0skip_if_rocm_arch_multiprocess: test skipped on )r   r0   rZ   rE  rF  rõ   rÕ   rL  )r•   ÚreasonÚproprH  s   &  €r4   r­   Ú1skip_if_rocm_arch_multiprocess.<locals>.decoratorf  se   ø€ Øˆß‹>Ü—:‘:×3Ñ3°AÓ6×BÑB×HÑHÈÓMÈaÕPˆDØ�tŒ|ØKÈDÈ6ÐR�ä�Š˜v¨TÐ1°6Ô:¸4Ó@Ð@r6   rd   )rH  r­   s   f r4   Úskip_if_rocm_arch_multiprocessrV  c  s   ø€ õAð Ðr6   c                ó   a € V 3R lpV# )z:Skips a test for ROCm based on ROCm ver - multiprocess UTsc                 ó®  <€ R p\         '       d©   \        \        P                  P                  4      pVP                  R^R7      ^ ,          p\        ;QJ d#    . R VP                  R4       4       F  NK  	  5M! R VP                  R4       4       4      pVe   Se   V\        S4      8  d
   RV RS R2p\        P                  ! VR JV4      ! V 4      # )NÚ-©Úmaxsplitc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir‡   rÑ   ©r6  r»   s   & r4   r7  ÚLskip_if_rocm_ver_lessthan_multiprocess.<locals>.decorator.<locals>.<genexpr>z  ó   é € Ð&OÑ7N°!¤s¨1§v vÓ7Nùó   ‚Ú.z-skip_if_rocm_ver_lessthan_multiprocess: ROCm z is available but z	 required©	r   r.   r0   r  Úhiprõ   rO  rÕ   rL  ©r•   rS  Úrocm_versionÚrocm_version_tupler  s   &   €r4   r­   Ú9skip_if_rocm_ver_lessthan_multiprocess.<locals>.decoratoru  sÃ   ø€ Øˆß‹>ÜœuŸ}™}×0Ñ0Ó1ˆLØ'×-Ñ-¨c¸AÐ-Ó>¸qÕAˆLß!&¤Ñ&O°|×7IÑ7IÈ#Ô7NÓ&O§¡Ñ&O°|×7IÑ7IÈ#Ô7NÓ&OÓ!OÐà"Ò*Ø’?Ø%¬¨g«Ô6àHÐI[ÐH\Ð\nÐovÐnwð  xAð  B�ä�Š˜v¨TÐ1°6Ô:¸4Ó@Ð@r6   rd   ©r  r­   s   f r4   Ú&skip_if_rocm_ver_lessthan_multiprocessri  r  s   ø€ õAð Ðr6   c                ó   a € V 3R lpV# )zSSkips a test for ROCm if the version is at least the given tuple - multiprocess UTsc                 ó¦  <€ R p\         '       d¥   \        \        P                  P                  4      pVP                  R^R7      ^ ,          p\        ;QJ d#    . R VP                  R4       4       F  NK  	  5M! R VP                  R4       4       4      pSe   V\        S4      8¼  d
   RV RS R2p\        P                  ! VR JV4      ! V 4      # )NrY  rZ  c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir‡   rÑ   r]  s   & r4   r7  ÚKskip_if_rocm_ver_atleast_multiprocess.<locals>.decorator.<locals>.<genexpr>�  r_  r`  ra  z=skip_if_rocm_ver_atleast_multiprocess: known failure on ROCm z (>= Ú)rb  rd  s   &   €r4   r­   Ú8skip_if_rocm_ver_atleast_multiprocess.<locals>.decoratorŠ  s·   ø€ Øˆß‹>ÜœuŸ}™}×0Ñ0Ó1ˆLØ'×-Ñ-¨c¸AÐ-Ó>¸qÕAˆLß!&¤Ñ&O°|×7IÑ7IÈ#Ô7NÓ&O§¡Ñ&O°|×7IÑ7IÈ#Ô7NÓ&OÓ!OÐØÒ"Ð'9¼UÀ7»^Ô'KØXÐYkÐXlÐlqÐryÐqzÐz{Ð|�ä�Š˜v¨TÐ1°6Ô:¸4Ó@Ð@r6   rd   rh  s   f r4   Ú%skip_if_rocm_ver_atleast_multiprocessrp  ‡  s   ø€ õ	Að Ðr6   c                  ó<   € \        \        P                  R 8H  R4      # )Úwin32z8This unit test case is not supported on Windows platform)r   r�   Úplatformrd   r6   r4   Úskip_if_win32rt  ˜  s   € Ü)Ü�‰˜ÑØBóð r6   c                ó\   € V ^8„  d   QhR\         P                  R\        R\        R\        /# )r&   r*   ÚmajorÚminorr-   )r0   r*   r/   rÀ   )r3   s   "r4   r5   r5   Ÿ  s2   € ÷ Fñ F¤§¡ð F´cð FÄ#ð FÌ$ñ Fr6   c                óª   € V P                   R8w  d   R# \        P                  P                  e   R# \        P                  P                  V 4      W38¬  # )zÓ
Returns True if the device's compute capability is (major, minor) or higher.
Error out if the device is not a CUDA device.
Returns False if device is a RoCM device.
Returns True if device is a non-CUDA device.
rZ   TF)Útyper0   r  rc  rZ   Úget_device_capability)r*   rv  rw  s   &&&r4   Úsm_is_or_higher_thanr{  Ÿ  sB   € ð ‡{�{�fÔÙä‡}�}×ÑÒ$áä�:‰:×+Ñ+¨FÓ3¸°~ÑEÐEr6   Ú	localhost)Úminutesc           	     óì   € \        4       pV'       dH   \        V\        ^R7      ,          4      p\        P                  P
                  P                  WWV4      # \        P                  ! V VVVVVR7      # )zD
Creates a TCP store. Retries if the chosen port is already in use.
)Úmilliseconds)Úwait_for_workersÚ	use_libuv)r   r/   r   r0   ÚclassesÚ	dist_c10dÚTCPStorer1   )	Úaddrr)   Ú	is_masterÚtimeoutr€  Ú	jit_classr�  ÚportÚtimeout_milliseconds	   &&&&&&&  r4   Úcreate_tcp_storer‹  °  sn   € ô Ó€DßÜ! '¬IÀ1Ô,EÕ"EÓFÐÜ�}‰}×&Ñ&×/Ñ/Ø˜
Ð/Bó
ð 	
ô �}Š}ØØØØØ-Øô
ð 	
r6   iô  Ú!DISTRIBUTED_TESTS_DEFAULT_TIMEOUTÚ300Útest_ddp_uneven_inputsi�  Útest_DistributedDataParallelÚtest_join_kwargsc                ó$   € V ^8„  d   QhR\         /# )r&   Ú	lazy_initr¿   )r3   s   "r4   r5   r5   Þ  s   € ÷ 
ñ 
¬Tñ 
r6   c                 ó¶   € \         P                  R 8X  g   V f"   \        P                  P	                  RVR7      # \        P                  P	                  WR7      # )rr  z	127.0.0.1)Úhostnamer’  ©Ú	interfacer’  )r�   rs  r1   ÚProcessGroupGlooÚcreate_devicer•  s   &&r4   r˜  r˜  Þ  sY   € Ü
‡|�|�wÔ )Ò"3Ü×$Ñ$×2Ñ2Ø ¨Ið 3ó 
ð 	
ô ×$Ñ$×2Ñ2Øð 3ó 
ð 	
r6   c                ó$   € V ^8„  d   QhR\         /# r¾   rÑ   )r3   s   "r4   r5   r5   é  s   € ÷ Iñ IœCñ Ir6   c                 ób   € \         P                  V P                  R 4      R,          \        4      # ©ra  rñ   )ÚTIMEOUT_OVERRIDEr  rõ   ÚTIMEOUT_DEFAULT)Útest_ids   &r4   Úget_timeoutrŸ  é  s#   € Ü×Ñ §¡¨cÓ 2°2Õ 6¼ÓHÐHr6   c               #   óF  "  € \        4       \        4       r\        P                  \        P                  r2 Wu\        n        \        n        \        P                  \        P                  3x € W#u\        n        \        n        R #   Y#u\        n        \        n        i ; i5ir‡   )r   r�   ÚstdoutÚstderr)Únew_outÚnew_errÚold_outÚold_errs       r4   Úcaptured_outputr§  í  sa   é € ä“z¤8£:ˆWÜ—z‘z¤3§:¡:ˆWð2Ø!(ÐŒŒ
”C”JÜ�j‰jœ#Ÿ*™*Ð$Ò$à!(ÐŒŒ
”C–Jø ÐŒŒ
”C•Jüs   ‚3B!¶8B Á.B!ÂBÂB!c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r&   r(   r)   Ú
num_inputsrÑ   )r3   s   "r4   r5   r5   ø  s!   € ÷ (ñ (¤Sð (´cð (Äsñ (r6   c                óª  € RR R llpR R lp\        V^R7      \        V^R7      \        V^R7      \        V^R7      \        V^R7      \        V^R7      3 UUu. uF_  p\        V4       Uu. uF  pV! W ,          V,           W!,          4      NK!  	  up\        V4       Uu. uF  qd! WRV,          4      NK  	  up3NKa  	  upp# u upi u upi u uppi )zÖ
Generate a number of basic test cases for sparse reduction.
These cover tensors with a varying number of sparse dimensions and a varying
number of dense dimensions. The only reduction operation we support is sum.
c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r&   r(   r)   Úsparse_dimsÚ
dense_dimsrÑ   )r3   s   "r4   r5   Ú0simple_sparse_reduce_tests.<locals>.__annotate__ÿ  s(   € ÷ 
?ñ 
?”sð 
?¬ð 
?¼#ð 
?Ìsñ 
?r6   c           	      ó8  € \         P                  ! \         P                  ! V ^,           4      ^V ^,           34      pV.\        V4       Uu. uF  p^NK  	  up,           p\        V^,
          4       FH  p\         P                  ! V\         P
                  ! ^V ^,           4      34      pVP                  V4       KJ  	  \         P                  ! V ^,           .\        V4       Uu. uF  p^NK  	  up,           4      p\         P                  ! WGV4      # u upi u upi ©é   )	r0   ÚreshapeÚarangerT   ÚcatÚzerosÚappendÚonesÚsparse_coo_tensor)r(   r)   r¬  r­  ÚindicesÚ_ÚshapeÚvaluess   &&&&    r4   ÚgenerateÚ,simple_sparse_reduce_tests.<locals>.generateÿ  sÛ   € ô —-’-¤§¢¨T°A­XÓ 6¸¸DÀ1½H¸ÓFˆØ�¬5°Ô+<Ó=Ñ+< a£Ñ+<Ñ=Õ=ˆÜ�{ Q•Ö'ˆAÜ—i’i ¬%¯+ª+°a¸À½Ó*BÐ CÓDˆGØ�L‰L˜Ö$ñ (ô —’˜T A�X˜J´U¸:Ô5FÓ)GÑ5F°«!Ñ5FÑ)GÕGÓHˆÜ×&Ò& w¸Ó>Ð>ùò  >ùò *Hs   ÁDÃ#D
c                ó$   € V ^8„  d   QhR\         /# ©r&   r)   rÑ   )r3   s   "r4   r5   r®    s   € ÷ 
ñ 
¤Cñ 
r6   c           
      ó|   € \        \        P                  \        V4       Uu. uF
  q ! W!4      NK  	  up4      # u upi r‡   )r	   ÚoperatorÚaddrT   )rä   r)   r(   s   && r4   Úcompute_sumÚ/simple_sparse_reduce_tests.<locals>.compute_sum  s6   € ÜÜ�L‰L¼EÀ*Ô<MÓNÑ<M°D˜2˜dÖ/Ñ<MÑNó
ð 	
ùÚNs   ¢9
)r¬  )r­  )r±  r   )r   rT   )r(   r)   r©  r½  rÄ  rä   Úis   &&&    r4   Úsimple_sparse_reduce_testsrÇ  ø  sÛ   € ÷
?õ
ô �H¨!Ô,Ü�H¨!Ô,Ü�H¨!Ô,Ü�H¨Ô+Ü�H¨Ô+Ü�H¨Ô+ñ
ôñ
ˆBô	 ˜zÔ*óá*�Añ �:Õ$ qÕ(¨*Õ*AÖBÙ*ñô @EÀZÔ?PÓQÑ?P¸!ˆ[˜¨*Õ4Ö5Ñ?PÑQó	
ñ
òð ùòùò Rùós$   ÁCÁ.%CÂCÂ"C
Â9CÃ
Cc                ó0   € V ^8„  d   QhR\         R\        /# )r&   r)   r'   ra   )r3   s   "r4   r5   r5   $  s   € ÷ ñ ¤Sð ´3ñ r6   c           
     ó   € \         P                  P                  4       p\        '       d   \         P                  P                  4       p\
        '       d   \         P                  P                  4       p\        V4      p^pW8”  d	   W ,          p\        V 4       Uu/ uF&  pV\        W5V,          V^,           V,           4      bK(  	  ppV# u upi )zìMultigpu tests are designed to simulate the multi nodes with multi
GPUs on each node. Nccl backend requires equal #GPUs in each process.
On a single node, all visible GPUs are evenly
divided to subsets, each process only uses a subset.
)	r0   rZ   r’   r   r   r   r[   rT   Úlist)r)   r'   ÚnGPUsÚvisible_devicesÚnGPUs_per_processrÆ  Úrank_to_GPUs   &&     r4   Úinit_multigpu_helperrÏ  $  s·   € ô �J‰J×#Ñ#Ó%€EßƒxÜ—	‘	×&Ñ&Ó(ˆßƒxÜ—	‘	×&Ñ&Ó(ˆÜ˜E“l€Oð ÐØÔØ!Õ/Ðô �zÔ"óá"ˆAð 	
Œ4�Ð$5Õ 5¸¸Q½ÐBSÕ8SÐTÓUÒUÙ"ð ð ð Ðùò	s   Â,Cc                ó6   € V ^8„  d   QhR\         R,          RR/# )r&   Úinit_methodNr-   ©r.   )r3   s   "r4   r5   r5   @  s   € ÷ 
ñ 
¬S°4­Zð 
À4ñ 
r6   c                 ó¬  € \         P                  ! 4       s\        P                  \        P
                  R &   \        P                  ! \        P                  P                  \        P                  R4      4       \        P                  ! \        P                  P                  \        P                  R4      4       \        P                  P                  \        P                  R4      p\        P                  ! V4       V e   V \        P
                  R&   R# \        \        P                  P                  VR4      ,           \        P
                  R&   R# )ÚTEMP_DIRr  Útest_dirÚinit_dirNÚINIT_METHODÚshared_init_file)
ÚtempfileÚTemporaryDirectoryÚtmp_dirr?   rG   rH   ÚmkdirÚpathÚjoinr   )rÑ  Úinit_dir_paths   & r4   Úinitialize_temp_directoriesrà  @  sÀ   € ä×)Ò)Ó+€GÜ$Ÿ\™\„B‡J�JˆzÑÜ‡H‚HŒR�W‰W�\‰\œ'Ÿ,™,¨	Ó2Ô3Ü‡H‚HŒR�W‰W�\‰\œ'Ÿ,™,¨
Ó3Ô4Ü—G‘G—L‘L¤§¡¨zÓ:€MÜ‡H‚Hˆ]ÔàÒØ$/Œ�
‰
�=Ó!ä$/´"·'±'·,±,ØÐ-ó3
õ %
Œ�
‰
�=Ó!r6   c                ó   € V ^8„  d   QhRR/# ©r&   r-   Nrd   )r3   s   "r4   r5   r5   Q  s   € ÷ ñ ˜$ñ r6   c                  óB   € \         e   \         P                  4        R # R # r‡   )rÛ  Úcleanuprd   r6   r4   Úcleanup_temp_dirrå  Q  s   € ÜÒÜ�‰Öñ r6   c                ó¦   € V ^8„  d   QhR\         P                  P                  R\         P                  P                  R\        R,          R\
        /# )r&   ÚprocessÚcompletion_queuer‡  Nr-   )r0   ÚmultiprocessingÚProcessÚQueuer/   r   )r3   s   "r4   r5   r5   V  sR   € ÷ Kñ KÜ×"Ñ"×*Ñ*ðKä×+Ñ+×1Ñ1ðKô �4�ZðKô 	ñ	Kr6   c                óÎ  € Vf   ^xM\        ^
\        ^xV^,          4      4      p\        P                  ! 4       p  VP                  VR7      #   \        P
                   dJ    T P                  4       '       g1   TP                  4       '       d   \        RT P                   24      u #  Mi ; iTf   K{  \        P                  ! 4       T,
          pYR8”  g   KŸ  \        RT R24      # )z¯Get result from the completion_queue associated with process.

When the process finished without putting a result or the timeout expired an exception instance will be returned©r‡  zExited with zProcess timed out after Ús)
ÚmaxÚminÚtimer  ÚqueueÚEmptyÚis_aliveÚemptyÚRuntimeErrorÚexitcode)rç  rè  r‡  Úqueue_timeoutÚ
start_timeÚelapseds   &&&   r4   Ú%retrieve_result_from_completion_queuerû  V  sË   € ð #š?‘C´°B¼¸CÀÈAÅÓ8NÓ0O€MÜ—’“€Jà
ð	GØ#×'Ñ'°Ð'Ó>Ð>øÜ�{‰{ô 	Gð ×#Ñ#×%Ò%Ð*:×*@Ñ*@×*BÒ*BÜ# l°7×3CÑ3CÐ2DÐ$EÓFÒFùð	Gúð ÔÜ—i’i“k JÕ.ˆGØÖ Ü#Ð&>¸w¸iÀqÐ$IÓJÐJs   »A Á*B+Á8B+ÂB+Â*B+c                   ó²  a a€ ] tR tRt oR&t^
tV3R lR lt]V3R lR l4       t]V3R lR l4       t	R t
R'V3R	 lV 3R
 llltV3R lV 3R lltV3R lV 3R lltV3R lR ltV3R lR ltV3R lR lt ! R R]4      t]V3R lR l4       t]V3R lR l4       tV3R lR ltV3R lR ltV3R lR  ltV3R! lR" lt]V3R# lR$ l4       tR%tVtV ;t# )(ÚMultiProcessTestCasei‚  c                ó    <€ V ^8„  d   QhRS[ /# r¾   r¿   )r3   rb   s   "€r4   r5   Ú!MultiProcessTestCase.__annotate__‹  s   ø€ ÷ ñ ©ñ r6   c                ó   € R # r5  rd   ©Úselfs   &r4   Ú_should_stop_test_suiteÚ,MultiProcessTestCase._should_stop_test_suite‹  s   € Ùr6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   r¿   )r3   rb   s   "€r4   r5   rÿ  ”  s   ø€ ÷ ñ ¡dñ r6   c                ó   € R # )Trd   r  s   &r4   Údestroy_pg_upon_exitÚ)MultiProcessTestCase.destroy_pg_upon_exit“  s   € ár6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÑ   )r3   rb   s   "€r4   r5   rÿ  ˜  ó   ø€ ÷ "ñ "™Cñ "r6   c                ó   € \         # r‡   ©ÚDEFAULT_WORLD_SIZEr  s   &r4   r)   ÚMultiProcessTestCase.world_size—  ó   € ä!Ð!r6   c                óX   a€ \        S4      V3R  l4       p\        P                  ! W 4      # )c                 ór   <€ V P                   V P                  8X  d   V P                  S4       R # S! 4        R # r‡   )r(   ÚMAIN_PROCESS_RANKÚ_join_processes©r  rä   s   &€r4   r–   Ú1MultiProcessTestCase.join_or_run.<locals>.wrapperœ  s(   ø€ à�y‰y˜D×2Ñ2Ô2Ø×$Ñ$ RÖ(á–r6   ©r
   ÚtypesÚ
MethodType©r  rä   r–   s   &f r4   Újoin_or_runÚ MultiProcessTestCase.join_or_run›  ó,   ø€ Ü	ˆr‹ô	ó 
ð	ô ×Ò Ó.Ð.r6   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# ©r&   Úmethod_nameÚ
methodNamer-   NrÒ  )r3   rb   s   "€r4   r5   rÿ  ©  ó%   ø€ ÷ ñ ÙðÙ8;ðà	ñr6   c                óþ   <€ VR 8w  d   Tp\         SV `  V4        \        W4      p\        WV P	                  V4      4       R#   \
         d/   pTR 8w  d   \        RT P                   RT 24      Th Rp?R# Rp?ii ; i©ÚrunTestzno such test method in ú: N©ÚsuperÚ__init__rÃ   Úsetattrr  ÚAttributeErrorÚ
ValueErrorÚ	__class__©r  r  r   rä   Úer,  s   &&&  €r4   r(  ÚMultiProcessTestCase.__init__©  ó‡   ø€ ð
 ˜Ô"Ø$ˆKÜ‰Ñ˜Ô%ð		Ü˜Ó+ˆBÜ�D t×'7Ñ'7¸Ó';Ö<øÜô 	Ø˜YÔ&ô !Ø-¨d¯n©nÐ-=¸RÀ
¸|ÐLóàðõ 'ûð	úó   ›&A ÁA<Á#A7Á7A<c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  ¼  s   ø€ ÷ ñ �tñ r6   c                ó  <€ \         SV `  4        / V n        . V n        . V n        V P
                  V n        \        P                  ! R R7      ;_uu_ 4       pVP                  V n
        RRR4       / V n        R#   + '       g   i     L; i)F©ÚdeleteN)r'  ÚsetUpÚspecial_return_code_checksÚskip_return_code_checksÚ	processesr  r(   rÙ  ÚNamedTemporaryFiler?   Ú	file_nameÚpid_to_pipe)r  r  r,  s   & €r4   r6  ÚMultiProcessTestCase.setUp¼  sj   ø€ Ü‰‰Œð 13ˆÔ'ð .0ˆÔ$àˆŒØ×*Ñ*ˆŒ	Ü×(Ò(°×6Õ6¸!ØŸV™VˆDŒN÷ 7ð ˆÖ÷ 7×6ús   ÁA8Á8B	c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  Î  s   ø€ ÷ ñ ˜$ñ r6   c                óx   <€ \         SV `  4        V P                   F  pVP                  4        K  	  . V n        R # r‡   )r'  ÚtearDownr9  Ú	terminate)r  Úpr,  s   & €r4   r@  ÚMultiProcessTestCase.tearDownÎ  s.   ø€ Ü‰ÑÔØ—”ˆAØ�K‰KŽMñ  ð ˆŽr6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   rÿ  Ø  ó   ø€ ÷ (ñ (¡Cñ (r6   c                óN   € V P                  4       P                  R 4      R,          # r›  ©Úidrõ   r  s   &r4   rÞ   Ú'MultiProcessTestCase._current_test_nameØ  s   € à�w‰w‹y�‰˜sÓ# BÕ'Ð'r6   c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  Ü  s   ø€ ÷ +ñ +¨ñ +r6   c                ó  € . V n         \        \        V P                  4      4       Fß  p\        P
                  P                  4       w  r4V! V P                  P                  R \        V4      ,           VV P                  4       V P                  V3R\        V RR4      /R7      pVP                  4        \        P                  RW%P                   4       W0P"                  VP                   &   V P                   P%                  V4       Ká  	  R# )úprocess Úfake_pgF)Útargetr?   r“   r”   úStarted process %s with pid %sN)r9  rT   r/   r)   r0   ré  ÚPiper,  Ú_runr.   rÞ   r;  rÃ   ÚstartÚloggerÚinfoÚpidr<  r¶  )r  Úprocr(   Úparent_connÚ
child_connrç  s   &&    r4   Ú_start_processesÚ%MultiProcessTestCase._start_processesÜ  sÐ   € ØˆŒÜœ#˜dŸo™oÓ.Ö/ˆDÜ&+×&;Ñ&;×&@Ñ&@Ó&BÑ#ˆKÙØ—~‘~×*Ñ*Ø¤# d£)Õ+àØ×+Ñ+Ó-Ø—N‘NØð	ð œw t¨Y¸Ó>ðôˆGð �M‰MŒOÜ�K‰KÐ8¸$ÇÁÔLØ,7×Ñ˜WŸ[™[Ñ)Ø�N‰N×!Ñ! 'Ö*ó% 0r6   c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  ò  s   ø€ ÷ $ñ $ $ñ $r6   c                óÜ   €  \         P                  P                  R 4       \         P                  P	                  R 4      P
                  pV P                  V4       R#   \         d     LIi ; i)ÚspawnN)r0   ré  Úset_start_methodrö  Úget_contextrê  rY  )r  rV  s   & r4   Ú_spawn_processesÚ%MultiProcessTestCase._spawn_processesò  s[   € ð	Ü×!Ñ!×2Ñ2°7Ô;ô ×$Ñ$×0Ñ0°Ó9×AÑAˆØ×Ñ˜dÖ#øô	 ô 	Ùð	ús   ‚A ÁA+Á*A+c                   ó   € ] tR tRt^tRtR# )ÚMultiProcessTestCase.Eventiû  rd   N)re   rf   rg   rh   ÚGET_TRACEBACKrj   rd   r6   r4   ÚEventrc  û  s   † ØŒr6   re  c                ó    <€ V ^8„  d   QhRS[ /# )r&   r(   rÑ   )r3   rb   s   "€r4   r5   rÿ  ÿ  s   ø€ ÷ ñ ¹ñ r6   c                óÀ  € \         P                  R V4        \        P                  P	                  W.4      pW9   Ed   V P
                  '       d   \         P                  RV4       R# V P                  4       p\         P                  RWB4       V\        P                  P                  8X  d•   \        P                  ! RR7      ;_uu_ 4       p\        P                  ! V4       VP                  4        VP!                  ^ 4       V P#                  VP%                  4       4       \         P                  RV4       RRR4       W9   g   EK4  R#   + '       g   i     L; i)z*Starting event listener thread for rank %sz:Pipe closed for process %s, stopping event listener threadNzReceived event %s on process %szr+)ÚmodezProcess %s sent traceback)rS  Údebugré  Ú
connectionÚwaitÚclosedÚrecvrT  rý  re  rd  rÙ  r:  ÚfaulthandlerÚdump_tracebackÚflushÚseekÚsendÚread)Úparent_pipeÚsignal_piper(   Úready_pipesÚeventÚtmp_files   &&&   r4   Ú_event_listenerÚ$MultiProcessTestCase._event_listenerþ  sý   € ä�‰ÐAÀ4ÔHØÜ)×4Ñ4×9Ñ9¸;Ð:TÓUˆKàÕ)Ø×%×%Ð%Ü—L‘LØTØôñ à#×(Ñ(Ó*�Ü—‘Ð=¸uÔKàÔ0×6Ñ6×DÑDÔDä!×4Ò4¸$×?Õ?À8Ü$×3Ò3°HÔ=à Ÿ™Ô(Ø Ÿ™ aÔ(Ø#×(Ñ(¨¯©«Ô9äŸ™Ð$?ÀÔF÷ @ð ×)Ù÷ @×?ús   ÃA-EÅE	c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# ©r&   r(   rã   r;  r-   Nra   )r3   rb   s   "€r4   r5   rÿ    s-   ø€ ÷ .ñ .Ùð.Ù#&ð.Ù36ð.à	ñ.r6   c                óP   € V ! V4      pWn         W6n        VP                  W$4       R # r‡   )r(   r;  Úrun_test©Úclsr(   rã   r;  rt  r”   r  s   &&&&&, r4   rQ  ÚMultiProcessTestCase._run  s#   € ñ �9‹~ˆØŒ	Ø"ŒØ�‰�iÖ-r6   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r&   rã   r-   NrÒ  )r3   rb   s   "€r4   r5   rÿ  &  s   ø€ ÷ 7ñ 7¡#ð 7°tñ 7r6   c                ó€  € \         P                  P                  R R7      w  r4\        P                  ! \
        P                  W#V P                  3RR7      pVP                  4        \        P                  R8w  d5   \        P                  R8w  d    \         P                  P                  R4       R\        P                  R&   \        P                   ! 4         \#        W4      ! 4        Ve   VP=                  R
4       Vf   \?        R4      hVPA                  4        VPC                  4        V PD                  '       d    \F        PH                  ! 4        R
# R
#   \$        P&                   dX   p\(        P+                  RT P                  TT4       \        P,                  ! \.        R	,          P0                  4        R
p?L×R
p?i\2         d�    \(        P5                  R\6        P8                  ! 4       T P                  \
        P:                  4       TP=                  \6        P8                  ! 4       4       \        P,                  ! \
        P:                  4        ELsi ; i  Te   TP=                  R
4       Tf   \?        R4      hTPA                  4        TPC                  4        i ; i  \>        \J        3 d     R
# i ; i)F)ÚduplexT)rN  r“   Údaemonrr  Údarwinr   ÚTORCH_SHOW_CPP_STACKTRACESz4Process %s skipping test %s for following reason: %srs   Nz;Caught exception: 
%s exiting process %s with exit code: %sz-Expected event_listener_thread to not be None)&r0   ré  rP  Ú	threadingÚThreadrý  ry  r(   rR  r�   rs  Ú_CÚ'_set_print_stack_traces_on_fatal_signalrG   rH   r   Úset_rng_seedrÃ   rÕ   ÚSkipTestrS  rT  r�   r‘   r_   râ   rð   Ú	tracebackÚ
format_excÚTEST_ERROR_EXIT_CODErr  ró   rÞ  Úcloser  r1   Údestroy_process_groupr+  )r  rã   rt  Úsignal_recv_pipeÚsignal_send_pipeÚevent_listener_threadÚses   &&&    r4   r~  ÚMultiProcessTestCase.run_test&  s  € ä-2×-BÑ-B×-GÑ-GÈuÐ-GÓ-UÑ*ÐÜ )× 0Ò 0Ü'×7Ñ7Ø°·±Ð;Øô!
Ðð
 	×#Ñ#Ô%Ü�<‰<˜7Ô"¤s§|¡|°xÔ'?ô �H‰H×<Ñ<¸TÔBà36Œ�
‰
Ð/Ñ0Ü×!Ò!Ô#ð	 Ü�DÔ$Ô&ð(  Ò+Ø ×%Ñ% dÔ+à$Ò,Ü$Ð%TÓUÐUØ!×&Ñ&Ô(à×ÑÔà×$×$Ð$ðô ×*Ò*Ö,ñ	 %øô9 × Ñ ô 	6Ü�K‰KØFØ—	‘	ØØô	ô �HŠH”Z 	Õ*×4Ñ4×5Ñ5ûÜô 		@Ü�L‰LØNÜ×$Ò$Ó&Ø—	‘	Ü$×9Ñ9ô	ð ×ÑœY×1Ò1Ó3Ô4Ü�HŠHÔ)×>Ñ>×?ð		@ûð  Ò+Ø ×%Ñ% dÔ+à$Ò,Ü$Ð%TÓUÐUØ!×&Ñ&Ô(à×ÑÕûô #¤JÐ/ô ÚðúsQ   ÃE Ä?J( ÅIÅ-AF?Æ:I Æ?IÇBIÉI ÉIÉI ÉAJ%Ê(J=Ê<J=c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  _  s   ø€ ÷ &ñ &°ñ &r6   c                óÐ  € . p\        V P                  4       Fn  w  r#VP                  e   K  V P                  VP                  ,          p VP                  \        P                  P                  4       VP                  W$34       Kp  	  V F…  w  rT VP                  ^4      '       dS   VP                  '       d   \        P                  RV4       KG  VP!                  4       p\        P#                  RWV4       Ko  \        P#                  RV4       K‡  	  R #   \         d    \        P                  RT4        EK$  i ; i  \         d    \        P                  RT4        KØ  i ; i)Nz>Encountered error while trying to get traceback for process %sz5Pipe closed for process %s, cannot retrieve tracebackz)Process %s timed out with traceback: 

%sz6Could not retrieve traceback for timed out process: %s)Ú	enumerater9  r÷  r<  rU  rr  rý  re  rd  r¶  ÚConnectionErrorrS  Ú	exceptionÚpollrl  rT  rm  rð   )r  ÚpipesrÆ  rç  Úpiper(   rŽ  s   &      r4   Ú_get_timedout_process_tracebackÚ4MultiProcessTestCase._get_timedout_process_traceback_  s&  € ØˆÜ# D§N¡NÖ3‰JˆAØ×ÑÔ'Ø×'Ñ'¨¯©Õ4�ðØ—I‘IÔ2×8Ñ8×FÑFÔGØ—L‘L ! Ö+ñ 4ó  ‰JˆDðà—9‘9˜Q—<’<Ø—{—{�{ÜŸ™ØSØ ôñ !à $§	¡	£�IÜ—L‘LØEÀtöô —L‘LØPÐRVöó!  øô 'ô Ü×$Ñ$ØXØ÷ð ðûô4 #ô Ü× Ñ ØTØ÷ðús6   Á;DÂ(E Â;E Ã&E Ã;E Ä!D=Ä<D=Å !E%Å$E%c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  ‡  s   ø€ ÷ *ñ * Tñ *r6   c                óf  € \        V P                  4       4      p\        P                  ! 4       pR p  \        V P                  4       F{  w  rVVP
                  \        P                  8X  g   K&  \        RV RVP
                   R24       \        P                  P                  4       pV F  pVP                  4        K  	  Rp M	  V'       d   MÍ\        ;QJ d&    R V P                   4       F  '       d   K   R M	  RM! R V P                   4       4      '       d   M~\        P                  ! 4       V,
          p	W’8”  dD   V P                  4        \        RV R24       V P                   F  pVP                  4        K  	  M\        P                  ! R4       EKk  \        P                  ! 4       V,
          p
V P!                  W4       V P"                  P%                  4        F  pVP'                  4        K  	  R	#   T P"                  P%                  4        F  pTP'                  4        K  	  i ; i)
FTúProcess z terminated with exit code z", terminating remaining processes.c              3   ó<   "  € T F  qP                   R Jx € K  	  R # 5ir‡   )r÷  )r6  rB  s   & r4   r7  Ú7MultiProcessTestCase._join_processes.<locals>.<genexpr>�  s   é € ÐF±~°!—z‘z¨Õ-³~ùs   ‚zTiming out after z" seconds and killing subprocesses.gš™™™™™¹?N)rŸ  rH  rñ  rš  r9  r÷  rý  r�  Úprintr0   ré  Úactive_childrenrA  Úallr   ÚsleepÚ_check_return_codesr<  r¼  r‘  )r  rä   r‡  rù  Úsubprocess_errorrÆ  rB  r¨  Úacrú  Úelapsed_timerŸ  s   &&          r4   r  Ú$MultiProcessTestCase._join_processes‡  sž  € Ü˜dŸg™g›iÓ(ˆÜ—Y’Y“[ˆ
Ø Ðð&	Øä% d§n¡nÖ5‘D�Að —z‘zÔ%9×%NÑ%NÖNÜØ& q cÐ)DÀQÇZÁZÀLÐPrÐsôô +0×*?Ñ*?×*OÑ*OÓ*Q˜Û"1˜BØŸL™LžNñ #2à+/Ð(Ùñ 6÷ $Øç“3ÑF°t·~²~ÓF—3—3’3ÑF°t·~²~ÓF×FÒFØäŸ)š)›+¨
Õ2�ØÔ$Ø×8Ñ8Ô:ÜØ+¨G¨9Ð4VÐWôð "Ÿ^œ^˜ØŸ™žñ ,àä—
’
˜3—äŸ9š9›;¨Õ3ˆLØ×$Ñ$ RÔ6ð ×(Ñ(×/Ñ/Ö1�Ø—
‘
–ó 2ø˜×(Ñ(×/Ñ/Ö1�Ø—
‘
–ò 2ús+   ²7G= Á.A G= ÃG= ÃG= Ã9$G= ÄB,G= Ç=3H0c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÿ  ³  s   ø€ ÷ J
ñ J
°tñ J
r6   c           
     ó~  € V P                   '       g   \        P                  R4       R# V P                   ^ ,          p\        V P                   4       UUu. uF)  w  rEVP                  \
        P                  8X  g   K&  WE3NK+  	  pppV'       de   RpV FQ  w  rHV P                  VP                  ,          P                  4       p	VRV R\
        P                   RV	 R2,          pKS  	  \        V4      h\        V P                   4       F%  w  rEVP                  e   K  \        RV RV R	24      h	  WP                  9   d   R# \        P                  4        F|  p
VP                  V
P                  8X  g   K   \        '       d3   \        P!                  R
V P#                  4       V
P$                  4        R# \&        P(                  ! V
P$                  4      h	  ^ pWP*                  9   d   V P*                  V,          pV P-                  VP                  VRV RVP                   RVP                   2R7       R# u uppi )zŽ
Checks that the return codes of all spawned processes match, and skips
tests if they returned a return code indicating a skipping condition.
z<Note: no subprocesses were spawned, test was likely skipped.NÚ r¤  z exited with error code z and exception:
Ú
ú terminated or timed out after ú secondsú6Skipping %s on sandcastle for the following reason: %szExpected exit code z	 but got z
 for pid: )rÅ   )r9  rS  Úwarningrš  r÷  rý  r�  r<  rU  rm  rö  r8  r‘   r¼  r_   r   rT  rH  r`   rÕ   r�  r7  ÚassertEqual)r  rä   r®  Úfirst_processrÆ  rB  Úerrored_processesrð   rç  Úerror_messageÚskipÚexpected_return_codes   &&&         r4   r«  Ú(MultiProcessTestCase._check_return_codes³  s  € ð �~�~ˆ~Ü�N‰NØNôñ àŸ™ qÕ)ˆô " $§.¡.Ô1ô
á1‘�Ø�z‰zÔ1×FÑFÑFô ˆQ‹FÙ1ð 	ñ 
÷
 ØˆEÛ/‘
�à $× 0Ñ 0°·±Õ =× BÑ BÓ D�ØØ˜q˜cÐ!9Ô:N×:cÑ:cÐ9dð e'Ø'4 o°Rð9õ’ñ 0ô ˜uÓ%Ð%ô ˜dŸn™nÖ-‰DˆAØ�z‰zÔ!Ü"Ø˜q˜cÐ!@ÀÀÈhÐWóð ñ .ð ×-Ñ-Ô-Ùä×%Ñ%Ö'ˆDØ×%Ñ%¨¯©Ö7ß “=ô
 —K‘KØPØŸ™›	ØŸ™ôò
 ä"×+Ò+¨D¯L©LÓ9Ð9ñ (ð"  !Ðð ×0Ñ0Ô0Ø#'×#BÑ#BÀ2Õ#FÐ à×ÑØ×"Ñ"Ø Ø%Ð&:Ð%;¸9À]×E[ÑE[ÐD\Ð\fÐgt×gxÑgxÐfyÐzð 	ö 	
ùóg
s   Á#H9Á=H9c                ó    <€ V ^8„  d   QhRS[ /# r¾   r¿   )r3   rb   s   "€r4   r5   rÿ     s   ø€ ÷ ñ ™4ñ r6   c                ó    € V P                   ^ 8H  # )r   )r(   r  s   &r4   r†  ÚMultiProcessTestCase.is_masterÿ  s   € à�y‰y˜A‰~Ðr6   )r;  r<  r9  r(   r8  r7  rñ   ©r$  r$  )re   rf   rg   rh   r  r�  r  Úpropertyr  r)   r  r(  r6  r@  rÞ   rY  r`  r   re  Ústaticmethodry  ÚclassmethodrQ  r~  r   r  r«  r†  rj   rk   Ú__classcell__©r,  rb   s   @@r4   rý  rý  ‚  s  ù‡ € ØÐð
 Ð÷ð ð ÷ó ðð ÷"ó ð"ò/÷õ ÷&ó ÷$ó ÷(ð (÷+ð +÷,$ð $ô�ô ð ÷ó ðð< ÷.ó ð.÷7ð 7÷r&ð &÷P*ð *÷XJ
ð J
ðX ÷ó ÷ð r6   rý  c                   óZ   a a€ ] tR tRt oV 3R ltR tV3R lR ltR	R ltR tRt	Vt
V ;t# )
ÚDistributedTestBasei	  c                ó�   <€ \         SV `  4        \        V P                  4      \        P
                  R &   V P                  4        R# )r�   N)r'  r6  r.   r)   rG   rH   r`  ©r  r,  s   &€r4   r6  ÚDistributedTestBase.setUp
  s/   ø€ Ü‰‰ŒÜ#& t§¡Ó#7Œ�
‰
�<Ñ Ø×ÑÖr6   c                óÌ   €  \         P                  P                  4         \        P
                  ! V P                  4       R #   \         d     L0i ; i  \         d     R # i ; ir‡   )r0   Údistributedr’  ró   rG   Úremover;  ÚOSErrorr  s   &r4   r@  ÚDistributedTestBase.tearDown  sU   € ð	Ü×Ñ×3Ñ3Ô5ð	Ü�IŠI�d—n‘nÖ%øô ô 	Ùð	ûô ô 	Úð	ús"   ‚A ¡ A ÁAÁAÁA#Á"A#c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   Ú DistributedTestBase.__annotate__  s   ø€ ÷ ñ ¡ñ r6   c                ó<   € R V9   d   R# RV9   d   R# RV9   d   R# R# ©rZ   r$   r   r~   r[   rx   r‚   rd   )r  r*   s   &&r4   r'   ÚDistributedTestBase.backend  s$   € Ø�VÔÙØ�fŒ_ÙØ�fŒ_Ùár6   c                ó4  € Vf   V P                   p\        P                  ! V4      P                  4       p\        P                  P                  V P                  V4      p\        P                  P                  V P                  V4      VV P                  VR7       RV P                  V4      9   g   RV P                  V4      9   d¬   \        P                  P                  4       pV'       dh   VP                  p\        P                  ! V RV P                   24      p\        P                  ! V4       \        P                  P                  V4       M\!        RV P                  V4       R24      h\        P                  P"                  P%                  4       # )N©r'   r)   r(   r@   r$   rx   rR  úEExpected to find an accelerator when initializing process group with ú backend, but got None)r)   r0   Úget_device_moduler’   rÎ  rF   r;  Úinit_process_groupr'   r(   ÚacceleratorÚcurrent_acceleratorry  r*   Úset_default_deviceÚset_device_indexrö  Údistributed_c10dÚ_get_default_group)r  r*   r)   Únum_visible_devicesr@   rÝ  Údevice_types   &&&    r4   Ú	create_pgÚDistributedTestBase.create_pg#  sE  € ØÒØŸ™ˆJÜ#×5Ò5°fÓ=×JÑJÓLÐÜ×!Ñ!×+Ñ+¨D¯N©NÐ<OÓPˆÜ×Ñ×,Ñ,Ø—L‘L Ó(Ø!Ø—‘Øð	 	-ô 	
ð �T—\‘\ &Ó)Ô)¨V°t·|±|ÀFÓ7KÔ-KÜ×+Ñ+×?Ñ?ÓAˆKßØ)×.Ñ.�ÜŸš¨¨°Q°t·y±y°kÐ&BÓC�Ü×(Ò(¨Ô0Ü×!Ñ!×2Ñ2°6Õ:ä"ðØ!Ÿ\™\¨&Ó1Ð2Ð2HðJóð ô × Ñ ×1Ñ1×DÑDÓFÐFr6   c                ó¬   € \         P                  ! V4      P                  4       p\        V P                  4       Uu/ uF  q3W2,          .bK  	  up# u upi r‡   ©r0   rÛ  r’   rT   r)   ©r  r*   rã  rÆ  s   &&  r4   Úrank_to_deviceÚ"DistributedTestBase.rank_to_device<  óH   € Ü#×5Ò5°fÓ=×JÑJÓLÐÜ6;¸D¿O¹OÔ6LÓMÑ6L°�AÕ+Ð,Ò,Ñ6LÑMÐMùÒMó   ¼Ard   r‡   )re   rf   rg   rh   r6  r@  r'   rå  rê  rj   rk   rÆ  rÇ  s   @@r4   rÉ  rÉ  	  s+   ù‡ € õ ò
÷ð ôG÷2Nò Nr6   rÉ  c                ót   € V ^8„  d   QhR\         \        \        \        ,          3,          R\        R\        /# )r&   Úsubtest_configÚtest_fnÚtest_kwargs)Údictr.   rÊ  r   r   )r3   s   "r4   r5   r5   A  s5   € ÷ ñ äœœd¤3�i˜Õ(ðô ðô
 ñr6   c           	     ó,  € \        VP                  4       4      pV Uu. uF  qf^ ,          NK  	  ppV Uu. uF  qf^,          NK  	  pp\        P                  ! V!   F—  p	\	        \        WyRR7      4      p
V P                  ! R/ V
B ;_uu_ 4        \        P                  P                  4        V! V/ VBV
B  \        P                  P                  4        RRR4       \        P                  ! 4        K™  	  R# u upi u upi   + '       g   i     L5; i)a0  
Runs a test function given by ``test_fn`` as a subtest according to the
configurations specified by ``subtest_config``. This amortizes the
costly setup overhead (including process spawn and initializing the
process group) over the subtests.

Args:
    subtest_config (Dict[str, List[Any]]): A mapping from subtest
        keyword argument name to a list of its possible values.
    test_fn (Callable): A callable that runs the actual test.
    test_args: Positional arguments to pass to ``test_fn``.
    test_kwargs: Keyword arguments to pass to ``test_fn``.
T)ÚstrictNrd   )rÊ  ÚitemsÚ	itertoolsÚproductrò  ÚzipÚsubTestr0   Ú_dynamoÚresetr1   r  )Úcls_instrï  rð  Ú	test_argsrñ  Úsubtest_config_itemsÚitemÚsubtest_config_keysÚsubtest_config_valuesr¼  Úsubtest_kwargss   &&&*,      r4   Úrun_subtestsr  A  sÞ   € ô* 9=¸^×=QÑ=QÓ=SÓ8TÐÙ:NÓ%OÑ:N°$¨1§g gÑ:NÐÐ%OÙBVÓ-WÑBV¸$°1¯g¨gÑBVÐÐ-WÜ×#Ò#Ð%:Ô;ˆäœcÐ"5ÀdÔKÓLˆØ×ÒÑ/ ×/Ó/Ü�M‰M×ÑÔ!Ù�YÐ@ +Ð@°Ò@Ü�M‰M×ÑÔ!÷ 0ô 	�ŠŽó <ùò &PùÚ-W÷ 0×/ús   žC9µC>ÂADÄDc                ó$   € V ^8„  d   QhR\         /# r¾   r¿   )r3   s   "r4   r5   r5   d  s   € ÷ ñ ”ñ r6   c                 óv   €  \         P                  ! . RORR7      P                  ^ 8H  #   \         d     R# i ; i)zð
If shell command `fi_info -p efa -t FI_EP_RDM` returns exit code 0 then we assume that the machine has
Libfabric EFA interfaces and EFA software components installed,
see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html.
F)Úcheck)Úfi_infoz-pÚefaz-tÚ	FI_EP_RDM)Ú
subprocessÚrunÚ
returncodeÚFileNotFoundErrorrd   r6   r4   Úhas_efar  c  sA   € ðä�NŠNÚ;À5ôç‰jØñð	
øô ô ØÙðús   ‚&) ©8·8c                 ó.   € \        4       '       d   RR.# R# )aw  
If the machine has Libfabric EFA interfaces and EFA software components installed it may cause
'RuntimeError: In operator() at tensorpipe/common/ibv.h:172 "": Operation not supported' if tensorpipe
uses InfiniBand transport, so we exclude it from tensorpipe transports,
see https://github.com/pytorch/pytorch/issues/73885 and https://github.com/pytorch/pytorch/issues/65022
ÚshmÚuvN)r  rd   r6   r4   Útp_transportsr  w  s   € ô $ŸIšIˆE�4ˆ=Ð/¨4Ð/r6   c                ój   a aa€ S f   \        \        VSR7      # R o\        S 4      VV V3R l4       pV# )z#
Wrapper to use with a test method
)r‡  r)   c                 ó  a aaa€ \        4       o\        P                  ! 4       pV3R  loVVV 3R lp. p\        S 4       F>  p\        P
                  ! W5SV3R7      pVP                  4        VP                  V4       K@  	  V# )c                  ó>   <€ S \         P                  P                  8H  # r‡   ©r1   rá  Ú_world©Úworlds   €r4   Úworld_is_validÚaspawn_threads_and_init_comms.<locals>._run_test_method_with_multi_threads.<locals>.world_is_valid�  ó   ø€ ØœD×1Ñ1×8Ñ8Ñ8Ð8r6   c                 ó¨  <€ \         P                  ! R V SVR7        S! 4        S! 4       '       d   \         P                  ! 4        R# R#   \         dU   p\        P                  P                  T \        P                  ! 4       34       \        P                  ! T4        Rp?L€Rp?ii ; i  S! 4       '       d   \         P                  ! 4        i i ; i)Úthreaded©r'   r(   r)   r@   N)r1   rÜ  ÚBaseExceptionÚMultiThreadedTestCaseÚexception_queueÚputr�   Úexc_infor#   Úexception_handler’  )r(   Úworld_pgr@   ÚexÚcallbackr  r)   s   &&& €€€r4   ÚworkerÚYspawn_threads_and_init_comms.<locals>._run_test_method_with_multi_threads.<locals>.worker“  s¤   ø€ Ü×#Ò#Ø"¨¸*ÈEõð
1Ù”
ñ "×#Ò#Ü×.Ò.Ö0ñ $øô !ô ä%×5Ñ5×9Ñ9¸4ÄÇÂÃÐ:PÔQÜ!×2Ò2Ø÷ñ ûðûñ "×#Ò#Ü×.Ò.Õ0ð $ús*   �A
 Á
B)ÁA
B$ÂB, Â$B)Â)B, Â,%C©rN  r“   )r!   r1   Ú	HashStorerT   rˆ  r‰  rR  r¶  )	r)   r(  Úglobal_storer)  Úthreadsr(   Útr  r  s	   ff     @@r4   Ú#_run_test_method_with_multi_threadsÚIspawn_threads_and_init_comms.<locals>._run_test_method_with_multi_threadsŒ  sj   û€ Ü$Ó&ˆÜ—~’~Ó'ˆõ	9÷	1ð  ˆÜ˜*Ö%ˆDÜ× Ò ¨¸EÀ<Ð5PÔQˆAØ�G‰GŒIØ�N‰N˜1Öñ &ð
 ˆr6   c                 ó\  <a aa€ \         P                  P                  P                  R 4        S! SVVVV 3R l4      p\        P                  VS4       \         P                  P                  P                  R4       R#   \         P                  P                  P                  R4       i ; i)Tc                  ó   <€ S! S.S O5/ SB # r‡   rd   )r“   r•   r”   r  s   €€€€r4   r  Ú?spawn_threads_and_init_comms.<locals>.wrapper.<locals>.<lambda>±  s   ø€ ¡D¨Ð$?°Ò$?¸Ò$?r6   FN)r0   rŠ  Ú_distributed_c10dÚ_set_thread_isolation_moder!  Ú_join_threads)r  r“   r”   r.  r0  r•   r)   s   fjl €€€r4   r–   Ú-spawn_threads_and_init_comms.<locals>.wrapper«  sv   û€ ô 	�‰×"Ñ"×=Ñ=¸dÔCð	IÙ9Ø×?óˆGô "×/Ñ/°¸Ô>ä�H‰H×&Ñ&×AÑAÀ%ÖHøŒE�H‰H×&Ñ&×AÑAÀ%ÕHús   ¯&B  Â +B+)r   Úspawn_threads_and_init_commsr
   )r•   r‡  r)   r–   r0  s   f&f @r4   r9  r9  �  sD   ú€ ð ‚|ÜÜ(°'Àjô
ð 	
òô> ˆ4ƒ[ö
Ió ð
Ið €Nr6   c                   ó:  a a€ ] tR tRt oRt]P                  ! 4       tRtR t	RV3R lV 3R lllt
R tR tV3R lV 3R	 lltV 3R
 ltR t]R 4       tR t]R 4       t]R 4       t]V3R lR l4       t]V3R lR l4       tRR^ /R lltRR^ /R lltRtVtV ;t# )r!  i»  a  
Test runner that runs all tests with the in-proc process group using
multiple threads with the threaded process group.

Each test spawns world_size threads and run the test method in each thread.

Difference from regular MultiProcess test runner:
Must explicitly defines SetUp and call self._spawn_threads() to run the tests.
Cannot use setUp / tearDown (must use perThreadSetup / perThreadShutdown)
    to set up / tear down each thread when running each test.
No global state possible
    How bad of a limitation is this?
c                óX   a€ \        S4      V3R  l4       p\        P                  ! W 4      # )c                 óˆ   <€ V P                   V P                  8X  d   V P                  V P                  S4       R # S! 4        R # r‡   )r(   ÚMAIN_THREAD_RANKr7  r.  r  s   &€r4   r–   Ú2MultiThreadedTestCase.join_or_run.<locals>.wrapperÏ  s.   ø€ à�y‰y˜D×1Ñ1Ô1Ø×"Ñ" 4§<¡<°Ö4á–r6   r  r  s   &f r4   r  Ú!MultiThreadedTestCase.join_or_runÎ  r  r6   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# r  rÒ  )r3   rb   s   "€r4   r5   Ú"MultiThreadedTestCase.__annotate__Ø  r!  r6   c                óþ   <€ VR 8w  d   Tp\         SV `  V4        \        W4      p\        WV P	                  V4      4       R#   \
         d/   pTR 8w  d   \        RT P                   RT 24      Th Rp?R# Rp?ii ; ir#  r&  r-  s   &&&  €r4   r(  ÚMultiThreadedTestCase.__init__Ø  r0  r1  c                ó   € R # r‡   rd   r  s   &r4   ÚperThreadSetUpÚ$MultiThreadedTestCase.perThreadSetUpë  s   € ár6   c                ó   € R # r‡   rd   r  s   &r4   ÚperThreadTearDownÚ'MultiThreadedTestCase.perThreadTearDownï  s   € Ùr6   c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rA  ò  s   ø€ ÷ 	7ñ 	7�tñ 	7r6   c                óz   <€ \         SV `  4        V P                  V n        . V n        R\
        P                  R&   R# )zy
setUp only set up things in the main thread, if you want to configure things
in the spawned threads, use perThreadSetUp
r   r‡  N)r'  r6  r=  r(   r.  rG   rH   rË  s   &€r4   r6  ÚMultiThreadedTestCase.setUpò  s1   ø€ ô
 	‰‰ŒØ×)Ñ)ˆŒ	ØˆŒà36Œ�
‰
Ð/Ó0r6   c                ó2   <€ \         SV `  4        . V n        R# )z
tearDown only set up things in the main thread, if you want to configure things
in the spawned threads, use perThreadTearDown
N)r'  r@  r.  rË  s   &€r4   r@  ÚMultiThreadedTestCase.tearDowný  s   ø€ ô
 	‰ÑÔØˆŽr6   c                ó  a€ \         P                  P                  P                  R4       V P                  p\        4       o\        P                  ! 4       V P                  n	        V3R lpV! 4       '       g   \        R4      h\        V P                  4       Ff  p\        P                  ! V P                  P                  WV P                  3R7      pVP!                  4        V P"                  P%                  V4       Kh  	  R# )z[
class method to spawn threads and run test, use this method in the SetUp of your TestCase
Tc                  ó>   <€ S \         P                  P                  8H  # r‡   r  r  s   €r4   r  Ú<MultiThreadedTestCase._spawn_threads.<locals>.world_is_valid  r  r6   zInvalid worldr+  N)r0   rŠ  r5  r6  rÞ   r!   r1   r,  r,  r-  rö  rT   r)   rˆ  r‰  rQ  rR  r.  r¶  )r  rã   r  r(   r/  r  s   &    @r4   Ú_spawn_threadsÚ$MultiThreadedTestCase._spawn_threads  s¶   ø€ ô 	�‰×"Ñ"×=Ñ=¸dÔCØ×+Ñ+ˆ	ä$Ó&ˆÜ&*§n¢nÓ&6ˆ�‰Ô#õ	9ñ ×ÒÜ˜Ó/Ð/ä˜$Ÿ/™/Ö*ˆDÜ× Ò Ø—~‘~×*Ñ*°)À4Ç?Á?Ð1SôˆAð �G‰GŒIØ�L‰L×Ñ Ö"ó +r6   c                ó  € V ! V4      pW%n         \        VR 4      '       dY   \        P                  ! 4       Vn        \
        P                  VP                  n        \
        P                  VP                  n	        VP                  WV4       R# )Ú_tlsN)r(   rß   rˆ  ÚlocalrU  r    Ú
_precisionÚ	precisionÚ_rel_tolÚrel_tolÚrun_test_with_threaded_pg)r€  rã   r(   r)   r”   r  s   &&&&, r4   rQ  ÚMultiThreadedTestCase._run  sa   € á�9‹~ˆØŒ	ô �4˜× Ò Ü!ŸšÓ)ˆDŒIÜ"*×"5Ñ"5ˆD�I‰IÔÜ (× 1Ñ 1ˆD�I‰IÔà×&Ñ& y¸
ÖCr6   c                óþ  € \         P                  ! RVVV P                  P                  R7       V P	                  4         \        W4      ! 4        \         P                  ! 4        V P                  4        R#   \         dQ   pT P                  P                  T\        P                  ! 4       34       \        P                  ! T4        Rp?L}Rp?ii ; i  \         P                  ! 4        T P                  4        i ; i)zT
Run the current test associated with `test_name` using the threaded process group.
r  r  N)r1   rÜ  r,  r-  rE  rÃ   r   r"  r#  r�   r$  r#   r%  r’  rH  )r  rã   r(   r)   r'  s   &&&& r4   r[  Ú/MultiThreadedTestCase.run_test_with_threaded_pg,  sÂ   € ô 	×ÒØØØ!Ø—.‘.×-Ñ-õ		
ð 	×ÑÔð		%Ü�DÔ$Ô&ô ×&Ò&Ô(Ø×"Ñ"Ö$øô ô 	Ø× Ñ ×$Ñ$ d¬C¯LªL«NÐ%;Ô<Ü×.Ò.Ø÷ñ ûð	ûô ×&Ò&Ô(Ø×"Ñ"Õ$ús+   Á A7 Á7CÂACÃC ÃCÃC Ã'C<c           
     óÐ  € \         p \        V4       Fm  w  rEVP                  \        ^ V4      4       VP	                  4       '       g   K8  \
        P                  P                  V\        \        RV R24      R334       Ko  	  \        P                  ! 4        . pV P                  P                  4       '       g.   V P                  P                  4       pVP                  V4       KM   \        4        \        P                   P"                  P%                  R4       V P'                  WcV4       R#   \        4        \        P                   P"                  P%                  R4       i ; i)r   zRank failed to join in under rµ  NF)r�  rš  rÞ  rï  rô  r!  r"  r#  ÚTimeoutErrorr#   rû  rõ  r  r¶  r"   r0   rŠ  r5  r6  r«  )r€  r.  rä   r‡  ÚidxÚthreadÚfailed_ranksÚfailures   &&&     r4   r7  Ú#MultiThreadedTestCase._join_threadsC  s  € ä!ˆð	IÜ(¨Ö1‘�Ø—‘œC  7›OÔ,Ø—?‘?×$Ô$Ü)×9Ñ9×=Ñ=àä ,Ü ,Ø&CÀGÀ9ÈHÐ$Uó!"ð !%ðð	öñ  2ô ×#Ò#Ô%ØˆLØ×)Ñ)×/Ñ/×1Ò1Ø×-Ñ-×1Ñ1Ó3�Ø×#Ñ# GÖ,ð 2ô #Ô$Ü�H‰H×&Ñ&×AÑAÀ%ÔHà×Ñ °rÖ:øô #Ô$Ü�H‰H×&Ñ&×AÑAÀ%ÕHús   ˆ>D0 ÁA/D0 Â;-D0 Ä05E%c                ó  € R pRpV EFY  w  rgV^,          p\        V\        P                  4      '       d;   \        P	                  RVVV4       V^ 8  d   \
        R,          P                  pKg  Ki  \        V\        4      '       d*   RV RV R2p	\        P                  V	4       \        V	4      h\        V\        4      '       dM   R P                  \        P                  ! V!  4      p	\        P                  RW–4       VRV RV	 R2,          pEK
  \        V\        4      '       g   EK#  \        VP                   4      \"        J g   EKC  V^ 8  g   EKM  VP                   pEK\  	  \%        V4      ^ 8”  d   \        V4      hV^ 8”  d~   \
        P'                  4        Fc  p
WZP                  8X  g   K  \(        '       d%   \        P	                  R	VV
P*                  4        R
# \        P                  ! V
P*                  4      h	  R
# R
# )r²  z3Thread %s skipping test %s for following reason: %srs   zThread r´  z	 seconds
z'Caught exception: 
%s exiting thread %sz exited with exception:
r³  r¶  Nrñ   )Ú
isinstancerÕ   r�  rS  rT  r‘   r_   r`  rð   rö  râ   rÞ  rŽ  Úformat_exceptionÚ
SystemExitry  Úcoder/   rÄ   r¼  r   r`   )r€  rc  r‡  rä   Ú	error_msgÚ	skip_coder(   r$  ÚexcrÅ   r¼  s   &&&&       r4   r«  Ú)MultiThreadedTestCase._check_return_codesa  sš  € ð ˆ	Øˆ	Ü*‰NˆDØ˜1•+ˆCÜ˜#œx×0Ñ0×1Ò1Ü—‘ØIØØØô	ð ˜q”=Ü *¨9Õ 5× ?Ñ ?’Iñ !ä˜C¤×.Ò.Ø ˜vÐ%DÀWÀIÈZÐX�Ü—‘˜SÔ!Ü" 3Ó'Ð'Ü˜C¤×+Ò+Ø—g‘gœi×8Ò8¸(ÑCÓD�Ü—‘ÐGÈÔSØ˜w t fÐ,EÀcÀUÈ"ÐMÕM“	Ü˜C¤×,Õ,Ü˜Ÿ™“>¤SÖ(¨Y¸¯]Ø #§¡“Iñ+ +ô0 ˆy‹>˜AÔÜ˜yÓ)Ð)à�qŒ=Ü"×)Ñ)Ö+�Ø§¡Ö.ß$“}äŸ™ØTØØ ŸL™Lôò
 ä&×/Ò/°·±Ó=Ð=ó ,ñ r6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÑ   )r3   rb   s   "€r4   r5   rA  ”  r
  r6   c                ó   € \         # r‡   r  r  s   &r4   r)   Ú MultiThreadedTestCase.world_size“  r  r6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   rA  ˜  rE  r6   c                óN   € V P                  4       P                  R 4      R,          # r›  rG  r  s   &r4   rÞ   Ú(MultiThreadedTestCase._current_test_name—  s   € ð �w‰w‹y�‰˜sÓ# BÕ'Ð'r6   r(   c               óP   € V P                   V8X  d   V P                  WV4       R# R# )z¡
The reason why we have this util function instead of
self.assertEqual is all threads are sharing one CPU RNG
so the assertion result is only reliable on rank 0
N)r(   r¸  ©r  r»   ÚyrÅ   r(   s   &&&&$r4   ÚassertEqualOnRankÚ'MultiThreadedTestCase.assertEqualOnRankœ  s%   € ð �9‰9˜ÔØ×Ñ˜Q 3Ö'ñ r6   c               óN   € V P                   V8X  d   V P                  W4       R # R # r‡   )r(   ÚassertNotEqualrv  s   &&&&$r4   ÚassertNotEqualOnRankÚ*MultiThreadedTestCase.assertNotEqualOnRank¥  s!   € Ø�9‰9˜ÔØ×Ñ Ö%ñ r6   )rU  r(   r.  rñ   rÂ  r‡   )re   rf   rg   rh   Ú__doc__rò  rë  r"  r=  r  r(  rE  rH  r6  r@  rR  rÅ  rQ  r[  r7  r«  rÃ  r)   rÞ   rx  r|  rj   rk   rÆ  rÇ  s   @@r4   r!  r!  »  sÓ   ù‡ € ñð —k’k“m€OàÐò/÷õ ò&ò÷	7ó 	7õò#ð. ñDó ðDò%ð. ñ;ó ð;ð: ñ/>ó ð/>ðb ÷"ó ð"ð ÷(ó ð(ñ(¸õ (ñ&¸1÷ &õ &r6   r!  c                   óP   a a€ ] tR tRt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚSaveForwardInputsModuleiª  c                óh   <€ V ^8„  d   QhRS[ S[P                  S[P                  3,          RS[RR/# ©r&   Úforward_inputsÚcast_forward_inputsr-   N©rò  ÚnnÚModuler0   ÚTensorrÀ   )r3   rb   s   "€r4   r5   Ú$SaveForwardInputsModule.__annotate__«  s;   ø€ ÷ 7ñ 7á™RŸY™Y©¯©Ð4Õ5ð7ñ "ð7ð 
ñ	7r6   c                ót   <€ \         SV `  4        \        P                  ! ^d^d4      V n        Wn        W n        R# )éd   N)r'  r(  r†  ÚLinearÚlrƒ  r„  ©r  rƒ  r„  r,  s   &&&€r4   r(  Ú SaveForwardInputsModule.__init__«  s.   ø€ ô
 	‰ÑÔÜ—’˜3 Ó$ˆŒØ,ÔØ#6Ö r6   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# ©r&   r»   r-   ©r0   rˆ  )r3   rb   s   "€r4   r5   r‰  µ  s'   ø€ ÷ Tñ T™Ÿ™ð T©%¯,©,ñ Tr6   c                óÊ   € WP                   V &   T P                  V P                  '       d4   VP                  V P                  P                  P
                  4      4      # T4      # r‡   )rƒ  r�  r„  ÚtoÚweightÚdtype©r  r»   s   &&r4   ÚforwardÚSaveForwardInputsModule.forwardµ  sJ   € Ø$%×Ñ˜DÑ!Ø�v‰v°4×3K×3KÐ3K�a—d‘d˜4Ÿ6™6Ÿ=™=×.Ñ.Ó/ÓSÐSÐQRÓSÐSr6   )r„  rƒ  r�  ©	re   rf   rg   rh   r(  r˜  rj   rk   rÆ  rÇ  s   @@r4   r€  r€  ª  s!   ù‡ € ÷7ó 7÷T÷ Tð Tr6   r€  c                   óP   a a€ ] tR tRt oV3R lV 3R lltV3R lR ltRtVtV ;t# )ÚSaveForwardInputsModeliº  c                óh   <€ V ^8„  d   QhRS[ S[P                  S[P                  3,          RS[RR/# r‚  r…  )r3   rb   s   "€r4   r5   Ú#SaveForwardInputsModel.__annotate__»  s;   ø€ ÷ -ñ -á™RŸY™Y©¯©Ð4Õ5ð-ñ "ð-ð 
ñ	-r6   c                óp   <€ \         SV `  4        \        W4      V n        \        W4      V n        Wn        R # r‡   )r'  r(  r€  Úc1Úc2rƒ  rŽ  s   &&&€r4   r(  ÚSaveForwardInputsModel.__init__»  s.   ø€ ô
 	‰ÑÔÜ)¨.ÓNˆŒÜ)¨.ÓNˆŒØ,Ör6   c                óN   <€ V ^8„  d   QhRS[ P                  RS[ P                  /# r‘  r’  )r3   rb   s   "€r4   r5   rž  Å  s#   ø€ ÷ #ñ #™Ÿ™ð #©%¯,©,ñ #r6   c                ó^   € WP                   V &   V P                  V P                  V4      4      # r‡   )rƒ  r¡  r   r—  s   &&r4   r˜  ÚSaveForwardInputsModel.forwardÅ  s'   € Ø$%×Ñ˜DÑ!Ø�w‰w�t—w‘w˜q“zÓ"Ð"r6   )r   r¡  rƒ  rš  rÇ  s   @@r4   rœ  rœ  º  s   ù‡ € ÷-ó -÷#÷ #ð #r6   rœ  c              #   ó°  "  € V'       g    \         P                  P                  V 4       \         P                  P                  4       ;p'       d   VP                  MR pVf   \
        P                  ! V4      pR\        P                  R&   R\        P                  R&   V'       dx   V'       dX   \         P                  P                  P                  P                  P                  4       p\
        P                  ! RVV VR7       M\
        P                  ! W VR7       \         P                  P!                  4        \         P                  P"                  P$                  P'                  4         Rx € \         P                  P!                  4        \         P                  P"                  P$                  P'                  4        V'       d   \
        P(                  ! 4        R# R#   \         P                  P!                  4        \         P                  P"                  P$                  P'                  4        T'       d   \
        P(                  ! 4        i i ; i5i)	ÚcpuNr|  ÚMASTER_ADDRÚ6789ÚMASTER_PORTÚfakerØ  )r'   r(   r)   )r0   rÝ  rà  rÞ  ry  r1   Úget_default_backend_for_devicerG   rH   ÚtestingÚ	_internalrÎ  rM  Ú	FakeStorerÜ  rú  rû  ÚutilsÚcountersÚclearr’  )r(   r)   r'   Úinit_pgrM  Úaccrä  r@   s   &&&&&   r4   Ú_dynamo_dist_per_rank_initrµ  Ê  s‡  é € ÷ Ü×Ñ×*Ñ*¨4Ô0ô "×-Ñ-×AÑAÓCÐC�SÖCˆ�ŠÈ%ð ð ‚Ü×5Ò5°kÓBˆà +„B‡J�Jˆ}ÑØ &„B‡J�Jˆ}ÑßßÜ—M‘M×+Ñ+×7Ñ7×?Ñ?×IÑIÓKˆEÜ×#Ò#ØØ%ØØö	ô ×#Ò#¨GÈ:ÕVÜ	‡M�M×ÑÔÜ	‡M�M×Ñ× Ñ ×&Ñ&Ô(ð)Ûä�‰×ÑÔÜ�‰×Ñ×$Ñ$×*Ñ*Ô,ßÜ×&Ò&Ö(ñ øô 	�‰×ÑÔÜ�‰×Ñ×$Ñ$×*Ñ*Ô,ßÜ×&Ò&Õ(ð üs4   ‚AIÁAIÂ&IÂ.B?IÅ.G# Å2A1IÇ#A0IÉIc                   óV   a a€ ] tR tRt oRt]V 3R l4       t]V 3R l4       tRtVt	V ;t
# )Ú#DynamoDistributedSingleProcTestCaseiñ  z“
Test harness for single-process dynamo distributed tests,
initializes dist process group.

Prefer this for simple tests, as it's easier to debug.
c           	     óè  <€ \         SV `  4        V P                  P                  \        P
                  ! \        P                  R RRR/4      4       ^ V n        \        P                  P                  4       P                  pV RV P                   2V n        WP                  9   d   RMV P                  .V n        \        P                   ! \        P"                  ! V4      V P                  ^R7       R# )r¨  r|  rª  Ú12355rR  N©r(   r)   )r'  Ú
setUpClassÚ_exit_stackÚenter_contextr   rò  rG   rH   r(   r0   rÝ  rÞ  ry  r*   Ú
device_idsr1   rÜ  r¬  )r€  r*   r,  s   & €r4   r»  Ú.DynamoDistributedSingleProcTestCase.setUpClassù  s¸   ø€ ä‰ÑÔà�‰×%Ñ%Ü�JŠJÜ—
‘
à! ;Ø! 7ðóô	
ð ˆŒÜ×"Ñ"×6Ñ6Ó8×=Ñ=ˆØ�x˜q §¡ 
Ð+ˆŒ
Ø!'¯:©:Ô!5™¸C¿H¹H¸:ˆŒÜ×ÒÜ×/Ò/°Ó7¸c¿h¹hÐST÷	
r6   c                óN   <€ \         P                  ! 4        \        SV `  4        R # r‡   )r1   r’  r'  ÚtearDownClass©r€  r,  s   &€r4   rÁ  Ú1DynamoDistributedSingleProcTestCase.tearDownClass  s   ø€ ä×"Ò"Ô$Ü‰ÑÖr6   rd   )re   rf   rg   rh   r~  rÅ  r»  rÁ  rj   rk   rÆ  rÇ  s   @@r4   r·  r·  ñ  s7   ù‡ € ñð ô
ó ð
ð( ô ó ÷ ð  r6   r·  c                   ó\   a € ] tR tRt o Rt]V 3R lR l4       t]V 3R lR l4       tRt	V t
R# )	Ú"DynamoDistributedMultiProcTestCasei  a  
Use this for tests that actually run on multiple GPUs.

Decorate tests with @skip_if_lt_x_gpu(ngpu)

Note: MultiProcTestCase spawns processes per test and is slow.
Prefer MultiThreadedTestCase for most tests. Perhaps use this one
sparingly for integration tests.
c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÑ   )r3   rb   s   "€r4   r5   Ú/DynamoDistributedMultiProcTestCase.__annotate__   s   ø€ ÷ 0ñ 0™Cñ 0r6   c                ó>   € \         P                  P                  4       # r‡   )r0   rÝ  r’   r  s   &r4   r)   Ú-DynamoDistributedMultiProcTestCase.world_size  s   € ä× Ñ ×-Ñ-Ó/Ð/r6   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# r|  ra   )r3   rb   s   "€r4   r5   rÇ  $  s-   ø€ ÷ 	.ñ 	.Ùð	.Ù#&ð	.Ù36ð	.à	ñ	.r6   c                ó¢   € \         P                  ! \        P                  ! 4       4       V ! V4      pWn        W6n        VP                  W$4       R # r‡   )r   Ú
addHandlerÚloggingÚNullHandlerr(   r;  r~  r  s   &&&&&, r4   rQ  Ú'DynamoDistributedMultiProcTestCase._run#  s<   € ô 	×ÒœW×0Ò0Ó2Ô3ñ �9‹~ˆØŒ	Ø"ŒØ�‰�iÖ-r6   )r;  r(   N)re   rf   rg   rh   r~  rÃ  r)   rÅ  rQ  rj   rk   rl   s   @r4   rÅ  rÅ    s2   ø‡ € ñð ÷0ó ð0ð ÷	.ó ö	.r6   rÅ  c                   ó’  a a€ ] tR tRt oRtRtRtRt]! ^xR7      t	Rt
Rt]V3R lR l4       t]V3R lR l4       t]RR	 l4       t]R
 4       t]V3R lR l4       t]R 4       t]V3R lR l4       t]V3R lR l4       t]V 3R l4       t]R 4       t]V 3R l4       tV3R lV 3R lltR tRV3R lV 3R llltV3R ltRtVtV ;t# ) ÚMultiProcContinuousTesti0  N)ÚsecondsFc                ó.   <€ V ^8„  d   QhRS[ R,          /# râ  rÒ  )r3   rb   s   "€r4   r5   Ú$MultiProcContinuousTest.__annotate__A  s   ø€ ÷ ñ ™C $�Jñ r6   c                ó   € R# )z„
ProcessGroup backend str.
To be customized by sub test classes, e.g. "nccl".
Otherwise we return None -- lazily decided by tensor.
Nrd   )r€  s   &r4   Úbackend_strÚ#MultiProcContinuousTest.backend_str@  ó   € ñ r6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   rÔ  K  s   ø€ ÷  ñ  ™Cñ  r6   c                ób   € \         P                  P                  4       pVf   R# VP                  # )Nr§  )r0   rÝ  rÞ  ry  )r€  Úcurr_devices   & r4   rä  Ú#MultiProcContinuousTest.device_typeJ  s+   € ä×'Ñ'×;Ñ;Ó=ˆØÒÙØ×ÑÐr6   c                ó   € R# )zs
ProcessGroup init options.
To be customized by sub test classes, e.g. ProcessGroupNCCLOpTest
Here we return None.
Nrd   )r€  Úhigh_priority_streams   &&r4   ÚoptsÚMultiProcContinuousTest.optsQ  rØ  r6   c           	     óR  € Vf   \        R4      h\        V4      \        P                  R&   \        P
                  ! W24      p\        P                  ! V P                  4       VVVV P                  4       V P                  R7       \        P                  P                  4       V n        R # )Nz!Expected rdvz_file to not be NoneÚ
LOCAL_RANK)r'   r)   r(   r@   Ú
pg_optionsr‡  )ró   r.   rG   rH   r1   rF   rÜ  rÖ  rß  r‡  rá  râ  rW   )r€  r(   r)   Ú	rdvz_filer@   s   &&&& r4   Ú_init_pgÚ MultiProcContinuousTest._init_pgZ  s   € àÒÜ Ð!DÓEÐEô $' t£9Œ�
‰
�<Ñ Ü—’˜yÓ5ˆä×ÒØ—O‘OÓ%Ø!ØØØ—x‘x“zØ—K‘Kõ	
ô ×&Ñ&×9Ñ9Ó;ˆŽr6   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r&   rž  r-   NrÒ  )r3   rb   s   "€r4   r5   rÔ  o  s   ø€ ÷ ñ ©ð ¸4ñ r6   c                óÞ   € VP                  R ^R7      R,          pV ! V4      pV P                  Vn        V P                  Vn        \        WC4      p\        P
                  ! 4        V! R/ VB  R# )ra  rZ  Nrñ   rd   )Úrsplitr(   r)   rÃ   r   rŒ  )r€  rž  r”   rã   r  rð  s   &&,   r4   Ú_run_test_given_idÚ*MultiProcContinuousTest._run_test_given_idn  s_   € ð —N‘N 3°�NÓ3°BÕ7ˆ	á�9‹~ˆØ—H‘HˆŒ	ØŸ.™.ˆŒÜ˜$Ó*ˆô 	×!Ò!Ô#ñ 	Ñ�&Ôr6   c                ó\  a€ R p^ Tu;8:  d   V8  g   M \        RV RV 24      hWn        W n        Rp V P                  WV4       \        P                  R4        TP                  4       p
\        P                  RT
 24       T
f   MPTe(   TP                  \        P                  ! T4      4       KY   T P!                  T
4       TP                  T
4       K~  \        P                  R4       T'       g   \4        P6                  ! 4        R# R#   \         dV   p\        TRR4      o\        T3R l\        P                  4        4       R4      p	T	'       d   T	P                  p Rp?EL#h Rp?ii ; i  \"         Ed-   p\%        T\        P                  4      '       d   TP                  T4        Rp?EK[  \%        T\        4      '       dt   \        TRR4      o\        T3R	 l\        P                  4        4       R4      p	T	'       d7   TP                  \        P                  ! T	P                  4      4        Rp?EKä  Rp\&        P(                  ! 4       pR
P+                  \,        P.                  ! T!  4      p\1        RT 24      pY�n        TP                  T4        Rp?EKJ  Rp?ii ; i)Fz*Expected 0 <= rank < world_size, got rank=z, world_size=Nrj  c              3   óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5ir‡   ©r_   ©r6  Úvr_   s   & €r4   r7  Ú7MultiProcContinuousTest._worker_loop.<locals>.<genexpr>‘  s   øé € ÐLÑ/�q·;±;À)Ñ3K—’Ó/ùó   ƒ$š
$zSetup completeTz	Got test c              3   óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5ir‡   rî  rï  s   & €r4   r7  rñ  ·  s   øé € ÐTÑ$7˜q¿;¹;È)Ñ;SŸšÓ$7ùrò  r²  zException in worker process:
zTerminating ...)ró   r(   r)   rå  ri  rÃ   Únextr‘   r¼  r`   rS  ri  r  r#  rÕ   r�  rê  r   rg  r�   r$  rÞ  rŽ  rh  rö  Ú	__cause__r1   r’  )r€  r(   r)   rä  Ú
task_queuerè  Úraised_exceptionÚinit_skip_reasonr'  Ú
skip_entryrž  r$  Útb_strÚenhanced_exr_   s   &&&&&&        @r4   Ú_worker_loopÚ$MultiProcContinuousTest._worker_loop~  s>  ø€ à Ðà�TÖ&˜JÖ&Ü Ø<¸T¸FÀ-ÐPZÈ|Ð\óð ð ŒØ#Œð  Ðð	Ø�L‰L˜¨9Ô5ô 	�‰Ð%Ô&ð Ø —n‘nÓ&ˆGÜ�L‰L˜9 W IÐ.Ô/àŠØð  Ò+Ø ×$Ñ$¤X×%6Ò%6Ð7GÓ%HÔIÙð2Ø×&Ñ& wÔ/Ø ×$Ñ$ WÖ-ô> 	�‰Ð&Ô'÷
  Ü×&Ò&Ö(ñ  øôE ô 		Ü  F¨DÓ1ˆIÜÜLœJ×-Ñ-Ô/ÓLØóˆJ÷ Ø#-×#5Ñ#5Ö àûð		ûô> !õ 2Ü˜b¤(×"3Ñ"3×4Ò4Ø$×(Ñ(¨Ô,ÞÜ˜b¤*×-Ò-ä '¨¨F°DÓ 9�Iô "&ÜT¤J×$5Ñ$5Ô$7ÓTØó"�J÷ "Ø(×,Ñ,¬X×->Ò->¸z×?QÑ?QÓ-RÔSæ à#'Ð äŸ<š<›>�ØŸ™¤×!;Ò!;¸XÑ!FÓG�ä*Ð-KÈFÈ8Ð+TÓU�Ø(*Ô%Ø ×$Ñ$ [×1Ó1ûð72úsD   µD Â6"E3 ÄE0ÄA	E+Å*E+Å+E0Å3J+Å?1J&Æ7BJ&É AJ&Ê&J+c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÔ  Ô  s   ø€ ÷ Nñ N¨Tñ Nr6   c                óv  € . V n         . V n        . V n        \        P                  ! R R7      ;_uu_ 4       pVP
                  V n        RRR4        \        P                  P                  R4       \        \        V4      4       EF  p\        P                  P                  4       p\        P                  P                  4       p\        P                  P                  V P                  R\!        V4      ,           RW1V P                  WE3R7      pVP#                  4        V P                   P%                  V4       V P                  P%                  V4       V P                  P%                  V4       \&        P)                  RW6P*                  4       EK  	  R#   + '       g   i     ELW; i  \         d     ELHi ; i)Fr4  Nr]  rL  T)rN  r?   r…  r“   rO  )r9  Útask_queuesÚcompletion_queuesrÙ  r:  r?   rä  r0   ré  r^  rö  rT   r/   rë  rê  rü  r.   rR  r¶  rS  ri  rU  )r€  r)   r  r(   rö  rè  rç  s   &&     r4   r`  Ú(MultiProcContinuousTest._spawn_processesÓ  sI  € àˆŒØˆŒØ "ˆÔä×(Ò(°×6Õ6¸!ØŸF™FˆCŒM÷ 7ð
	Ü×!Ñ!×2Ñ2°7Ô;ô
 œ#˜j›/×*ˆDÜ×.Ñ.×4Ñ4Ó6ˆJÜ$×4Ñ4×:Ñ:Ó<ÐÜ×+Ñ+×3Ñ3Ø×'Ñ'Ø¤# d£)Õ+ØØ¨¯©°zÐTð	 4ó ˆGð �M‰MŒOØ�M‰M× Ñ  Ô)Ø�O‰O×"Ñ" :Ô.Ø×!Ñ!×(Ñ(Ð)9Ô:Ü�L‰LÐ9¸4ÇÁ×Mó +÷ 7×6Ð6ûô ô 	âð	ús   µFÁF) ÆF&	Æ)F8Æ7F8c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r&   rä  r-   )r.   r/   )r3   rb   s   "€r4   r5   rÔ  ô  s   ø€ ÷ ñ ©#ð ±#ñ r6   c                ó`  € \         P                  ! V RR4      p\        V\        4      '       d(   \        P                  V 4      pVP                  V4      pMV P                  pVR8X  dF   \        P                  ! V4      P                  4       pV^ 8X  d   \        P                  ! RV R24      hV# )z’
Get world_size, handling both class variable and property definitions.
Properties are instance-level and need special handling in class methods.
r)   NzNo z devices availableéþÿÿÿ)ÚinspectÚgetattr_staticrg  rÃ  ÚobjectÚ__new__Úfgetr)   r0   rÛ  r’   rÕ   r�  )r€  rä  Úworld_size_attrÚtemp_instancer)   s   &&   r4   Ú_get_world_sizeÚ'MultiProcContinuousTest._get_world_sizeó  s™   € ô "×0Ò0°°lÀDÓIˆÜ�o¤x×0Ò0ô #ŸN™N¨3Ó/ˆMØ(×-Ñ-¨mÓ<‰JàŸ™ˆJð ˜ÔÜ×0Ò0°Ó=×JÑJÓLˆJØ˜QŒÜ×'Ò'¨#¨k¨]Ð:LÐ(MÓNÐNàÐr6   c                ó$   <€ \         SV `  4        R# )zì
Class-scope test fixture. Run once for entire test class, before any test starts.
Note: Process spawning is deferred to setUp to support instantiate_device_type_tests,
which calls setUpClass during class creation before any tests run.
N)r'  r»  rÂ  s   &€r4   r»  Ú"MultiProcContinuousTest.setUpClass  s   ø€ ô 	‰ÑÖr6   c                ó¶  € V P                   P                  RR4      '       d   R# V P                   P                  RV P                  4      p\        V\        4      '       d   VP                  V 4      pMC\        V\        4      '       d   VP                  V 4      pM\        V4      '       d	   V! 4       pMTpV P                  V4      V n
        \        V P                  4      '       d   V P                  4       MV P                  pVe   R\        P                  R\        P                  R\        P                  R\        P                   /pVP                  V4      pVe(   V! 4       '       g   \"        P$                  ! R	V R
24      h\&        P)                  RV P*                   RV P                   RV 24       V P-                  V P                  4       RV n        R# )zÅ
Lazily spawn worker processes on first test run.
This supports instantiate_device_type_tests which calls setUpClass during
class creation (before any tests run), when spawning would be premature.
Ú_processes_spawnedFNrä  r$   r‚   r€   rx   z	Backend 'z' is not availablezTesting class z on Ú T)Ú__dict__r  rä  rg  rÅ  Ú__func__rÃ  r
  rà   r  r)   rÖ  r1   r  r  r.  r'  rÕ   r�  rS  rT  re   r`  r  )r€  Údevice_type_attrrä  r'   Úbackend_checksÚcheck_fns   &     r4   Ú_ensure_processes_spawnedÚ1MultiProcContinuousTest._ensure_processes_spawned  s‚  € ð �<‰<×ÑÐ0°%×8Ò8Ùð
 Ÿ<™<×+Ñ+¨M¸3¿?¹?ÓKÐÜÐ&¬×4Ò4Ø*×3Ñ3°CÓ8‰KÜÐ(¬(×3Ò3ð +×/Ñ/°Ó4‰KÜÐ&×'Ò'Ù*Ó,‰Kà*ˆKð ×,Ñ,¨[Ó9ˆŒô (0°·±×'@Ò'@�#—/‘/Ô#ÀcÇoÁoˆØÒàœ×.Ñ.Øœ×.Ñ.Ø”t×,Ñ,Øœ×.Ñ.ð	ˆNð &×)Ñ)¨'Ó2ˆHØÒ#©H¯JªJÜ×'Ò'¨)°G°9Ð<NÐ(OÓPÐPä�‰Ø˜SŸ\™\˜N¨$¨s¯~©~Ð.>¸aÀ¸}ÐMô	
ð 	×Ñ˜SŸ^™^Ô,Ø!%ˆÖr6   c                ó  <€ V P                   P                  RR4      '       g   \        SV `  4        R# \        P                  RV P                   R24       V P                   F  pVP                  R4       K  	  V P                   F  pVP                  4        K  	   \        P                  ! V P                  4       \        P                  RV P                    R24       \        SV `  4        R#   \         d     L@i ; i)z{
Class-scope test fixture. Run once for entire test class, after all tests finish.
Tear down the process group if spawned.
r  FNzJoining z workerszClass z	 finished)r  r  r'  rÁ  rS  ri  r)   r   r#  r9  rÞ  rG   rÏ  rä  rÐ  rT  re   )r€  rö  rç  r,  s   &  €r4   rÁ  Ú%MultiProcContinuousTest.tearDownClassH  sÇ   ø€ ð �|‰|×ÑÐ 4°e×<Ò<Ü‰GÑ!Ô#Ùä�‰�x §¡Ð/¨xÐ8Ô9àŸ/œ/ˆJØ�N‰N˜4Ö ñ *ð —}”}ˆGØ�L‰LŽNñ %ð	Ü�IŠI�c—m‘mÔ$ô 	�‰�f˜SŸ\™\˜N¨)Ð4Ô5Ü‰ÑÖøô	 ô 	Ùð	ús   Â C2 Ã2D Ã?D c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   rÔ  g  s   ø€ ÷ &ñ &�tñ &r6   c                óÌ  <€ \         SV `  4        V P                  P                  4        V P                  V n        V P                  P                  '       d(   \        P                  ! RV P                  4        24      h\        V P                  4       FM  w  r\        P                  RV RV P                  4        24       VP                  V P                  4       4       KO  	  R# )z%
Test fixture. Run before each test.
zPrevious test failed, skipping zSending Rank r%  N)r'  r6  r,  r  r  r(   Úpoison_pillrÕ   r�  rH  rš  r   rS  ri  r#  )r  rÆ  rö  r,  s   &  €r4   r6  ÚMultiProcContinuousTest.setUpg  sª   ø€ ô 	‰‰Œð 	�‰×0Ñ0Ô2ð ×*Ñ*ˆŒ	ð �>‰>×%×%Ð%Ü×#Ò#Ð&EÀdÇgÁgÃiÀ[Ð$QÓRÐRô ' t×'7Ñ'7Ö8‰MˆAÜ�L‰L˜=¨¨¨2¨d¯g©g«i¨[Ð9Ô:Ø�N‰N˜4Ÿ7™7›9Ö%ó 9r6   c                óX   a€ \        S4      V3R  l4       p\        P                  ! W 4      # )c           	      óF  <€ V P                   V P                  8X  Ed}   \        P                  R V P	                  4        24       Rp\        \        V P                  V P                  4      4       EF  w  pw  r4\        W4\        V P	                  4       4      R7      pVe   K3  \        V\        P                  4      '       d   TpKW  \        V\        4      '       dV   \        P                  RV RV P	                  4        RV P                   P"                   24       RV P                   n        TpKÂ  WPP	                  4       8w  d    \'        RV RV P	                  4        24      h\        P                  R	V R
V P	                  4        24       EK!  	  Ve   VhR# S! 4        R# )zWaiting for workers to finish Nrí  zDetected failure from Rank z in: z(, skipping rest of tests in Test class: TzExpected rv == self.id(), got z != zMain proc detected rank z
 finished )r(   r  rS  ri  rH  rš  rø  r9  r  rû  rŸ  rg  rÕ   r�  r   r·  r,  re   r  ró   )r  Údeferred_exceptionrÆ  rB  rè  Úrvrä   s   &     €r4   r–   Ú>MultiProcContinuousTest._worker_run_main_wait.<locals>.wrapper}  ss  ø€ à�y‰y˜D×2Ñ2Õ2Ü—‘Ð=¸d¿g¹g»i¸[ÐIÔJð &*Ð"Ü09Ü˜Ÿ™¨×(>Ñ(>Ó?÷1Ñ,�AÑ,˜ô ?Ø´[ÀÇÁÃÓ5Kô�Bð *Ò5á Ü! "¤h×&7Ñ&7×8Ò8Ø-/Ð*Ù Ü! "¤m×4Ò4ÜŸ™Ø9¸!¸¸EÀ$Ç'Á'Ã)Àð MEØEIÇ^Á^×E\ÑE\ÐD]ð_ôð 6:˜Ÿ™Ô2Ø-/Ð*Ù ð ŸW™W›Y”Ü,Ø<¸R¸DÀÀTÇWÁWÃYÀKÐPóð ô —L‘LØ2°1°#°ZÀÇÁÃ	¸{ÐK÷ñ51ð< &Ò1Ø,Ð,ñ 2ñ –r6   r  r  s   &f r4   Ú_worker_run_main_waitÚ-MultiProcContinuousTest._worker_run_main_wait|  s-   ø€ Ü	ˆr‹ô(	ó 
ð(	ôT ×Ò Ó.Ð.r6   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# r  rÒ  )r3   rb   s   "€r4   r5   rÔ  ®  r!  r6   c                óþ   <€ VR 8w  d   Tp\         SV `  V4        \        W4      p\        WV P	                  V4      4       R#   \
         d/   pTR 8w  d   \        RT P                   RT 24      Th Rp?R# Rp?ii ; ir#  )r'  r(  rÃ   r)  r&  r*  r+  r,  r-  s   &&&  €r4   r(  Ú MultiProcContinuousTest.__init__®  s‡   ø€ ð
 ˜Ô"Ø$ˆKÜ‰Ñ˜Ô%ð		Ü˜Ó+ˆBÜ�D t×'AÑ'AÀ"Ó'EÖFøÜô 	Ø˜YÔ&ô !Ø-¨d¯n©nÐ-=¸RÀ
¸|ÐLóàðõ 'ûð	úr1  c                óp   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[R,          ;R&   S[;R&   S[;R&   S[;R&   # )r&   r)   r(   Nrä  r‡  r  r  )r/   r.   r   rÀ   )r3   rb   s   "€r4   r5   rÔ  0  sV   ø‡ ‚ ñ Ññ	 ñ �Nñ ñ �T�zÑ ñ ñ Ñ/ñ ñ Ññ ñ Ñ$ò r6   rº  rñ   r  r5  rÂ  )re   rf   rg   rh   r  r)   r(   rä  r   r‡  r  r  rÅ  rÖ  rä  rß  rå  rê  rü  r`  r  r»  r  rÁ  r6  r&  r(  ri   rj   rk   rÆ  rÇ  s   @@r4   rÑ  rÑ  0  s1  ù‡ € àÐà€Jà€Dà €Iá"¨3Ô/€Gà€Kà$Ðà÷ó ðð ÷ ó ð ð óó ðð ñ<ó ð<ð& ÷ó ðð ñR)ó ðR)ðh ÷Nó ðNð> ÷ó ðð. ôó ðð ñ1&ó ð1&ðf ô ó ð ÷<&ó &ò*,/÷dõ ÷} … r6   rÑ  c                   ó´   a a€ ] tR tRt o]t]V3R lR l4       t]V3R lR l4       t	V3R lR lt
]V 3R l4       tV3R	 lV 3R
 lltR tV3R ltRtVtV ;t# )ÚC10dTorchCommsTestBaseiÂ  c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   Ú#C10dTorchCommsTestBase.__annotate__Æ  s   ø€ ÷ ñ ™3ñ r6   c                ó<   € R V 9   d   R# RV 9   d   R# RV 9   d   R# R# rÕ  rd   r‰   s   &r4   r'   ÚC10dTorchCommsTestBase.backendÅ  s$   € à�VÔÙØ�fŒ_ÙØ�fŒ_Ùár6   c                ó    <€ V ^8„  d   QhRS[ /# r¾   rÒ  )r3   rb   s   "€r4   r5   r/  Ñ  s   ø€ ÷ (ñ (™Cñ (r6   c                ól   € V P                   p\        V4      '       d   V! 4       pV P                  V4      # r‡   )rä  rà   r'   )r€  rä  s   & r4   rÖ  Ú"C10dTorchCommsTestBase.backend_strÐ  s,   € à—o‘oˆÜ�K× Ò Ù%›-ˆKØ�{‰{˜;Ó'Ð'r6   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r&   r*   r-   NrÒ  )r3   rb   s   "€r4   r5   r/  ×  s   ø€ ÷ Qñ Q±3ð Q¸4ñ Qr6   c                óÎ   € R \         R\        R\        R\        R\        R\
        /pV P                  V4      pW29   d(   W#,          '       g   V P                  RV R24       R# R# R# )	r‚   rx   r$   ÚrcclÚncclxÚrcclxztorchcomms z backend is not availableN)ÚTORCHCOMM_HAS_GLOOÚTORCHCOMM_HAS_XCCLÚTORCHCOMM_HAS_NCCLÚTORCHCOMM_HAS_RCCLÚTORCHCOMM_HAS_NCCLXÚTORCHCOMM_HAS_RCCLXr'   ÚskipTest)r  r*   Úbackend_flagsrB   s   &&  r4   Ú_skip_if_backend_unavailableÚ3C10dTorchCommsTestBase._skip_if_backend_unavailable×  sj   € àÔ&ØÔ&ØÔ&ØÔ&ØÔ(ØÔ(ð
ˆð —|‘| FÓ+ˆØÔ(°×1LÔ1LØ�M‰M˜K¨ ~Ð5NÐOÖPñ 2MÑ(r6   c                óÈ  <€ R \         P                  P                  n        R\        P
                  R&   \        \        4       4      \        P
                  R&   \        V4      \        P
                  R&   \        V4      \        P
                  R&   V\        P
                  R&   \        SV `%  WV4       V P                  4       pRV9   g   RV9   d’   \         P                  P                  4       pV'       d]   \         P                  ! VP                   R	V 24      p\         P                  ! V4       \         P                  P!                  V4       R# \#        R
V R24      hR# )Tr|  r¨  rª  r:   r;   ÚTORCHCOMM_STORE_PATHr$   rx   rR  rÙ  rÚ  N)r0   rÎ  ÚconfigÚuse_torchcommsrG   rH   r.   r   r'  rå  rÖ  rÝ  rÞ  r*   ry  rß  rà  rö  )r€  r(   r)   rä  r'   rÝ  r*   r,  s   &&&&   €r4   rå  ÚC10dTorchCommsTestBase._init_pgä  s  ø€ à26Œ×Ñ× Ñ Ô/Ø$/Œ�
‰
�=Ñ!Ü$'¬Ó(8Ó$9Œ�
‰
�=Ñ!Ü'*¨4£yŒ�
‰
Ð#Ñ$Ü'*¨:£Œ�
‰
Ð#Ñ$Ø-6Œ�
‰
Ð)Ñ*Ü‰Ñ˜¨9Ô5à—/‘/Ó#ˆØ�WÔ ¨'Ô 1Ü×+Ñ+×?Ñ?ÓAˆKßÜŸš¨×)9Ñ)9Ð(:¸!¸D¸6Ð&BÓC�Ü×(Ò(¨Ô0Ü×!Ñ!×2Ñ2°6Ö:ä"Ø[Ð\cÐ[dÐdzÐ{óð ñ !2r6   c                ó   <€ V ^8„  d   QhRR/# râ  rd   )r3   rb   s   "€r4   r5   r/  ú  s   ø€ ÷ ñ �tñ r6   c                óþ   <€ V P                   P                  p\        P                  R V P	                  4       V4       \        V4      '       d   V! 4       pV P                  \        V4      4       \        SV `%  4        R# )z&Setting up test: %s on device type: %sN)
r,  rä  rS  ri  rH  rà   rB  r.   r'  r6  )r  rä  r,  s   & €r4   r6  ÚC10dTorchCommsTestBase.setUpú  sW   ø€ Ø—n‘n×0Ñ0ˆÜ�‰Ð=¸t¿w¹w»yÈ+ÔVÜ�K× Ò Ù%›-ˆKØ×)Ñ)¬#¨kÓ*:Ô;Ü‰‰Žr6   c                ó¬   € \         P                  ! V4      P                  4       p\        V P                  4       Uu/ uF  q3W2,          .bK  	  up# u upi r‡   rè  ré  s   &&  r4   rê  Ú%C10dTorchCommsTestBase.rank_to_device	  rì  rí  c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # rÀ  rÑ   )r3   rb   s   "€r4   r5   r/  Â  s   ø‡ ‚ ÙÑ(ò r6   rd   )re   rf   rg   rh   r  r)   rÄ  r'   rÅ  rÖ  rB  rå  r6  rê  ri   rj   rk   rÆ  rÇ  s   @@r4   r-  r-  Â  sh   ù‡ € Ø(€Jà÷ó ðð ÷(ó ð(÷Qð Qð ôó ð÷*ó òN÷A … r6   r-  c                óŠ   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   ^\         9   d   \        P                  R,          ;R&   # )r&   ÚPLATFORM_SUPPORTS_SYMM_MEMNrÛ  )Ú__conditional_annotations__rÀ   rÙ  rÚ  )r3   s   "r4   r5   r5      s?   € × Ñ ÷lò œDñ ñm ÷t 3Ò 2Œ×	$Ñ	$ tÕ	+Ñ 2òu r6   ))r‚   r:  )rx   r;  )r$   r<  )r9  r?  )r8  r>  )r$   rx   r~   r‡   )NFr°  )NTF)§rQ  rn  Ú	functoolsr  rö  rÍ  ré  rÂ  rG   rò  r
  r�   rÙ  rˆ  rñ  rŽ  r  rÕ   Úcollections.abcr   Ú
contextlibr   Údataclassesr   Údatetimer   Úenumr   r   r	   r
   Úior   Útypingr   r   Úunittest.mockr   r0   Útorch._dynamo.test_caseÚtorch.cuda.ncclÚtorch.distributedrÎ  r1   Útorch.nnr†  Útorch._C._autogradr   Útorch._C._distributed_c10dr   Útorch._logging._internalr   rE   r   Útorch.testing._internalr   Ú$torch.testing._internal.common_utilsr   r   r   r   r   r   r   r   r   r   r   r   r    Ú5torch.testing._internal.distributed.multi_threaded_pgr!   r"   r#   r:  r;  r<  r=  r>  r?  rI   Ú_backendÚ_flagÚis_backend_builtÚglobalsrY   Ú	getLoggerre   rS  ÚsetLevelÚINFOr9  rˆ   ÚHAS_ACCELERATORr]   r‘   rw   rŠ   rš   r¡   r¦   r¯   r¹   r¼   rÆ   rÏ   rÙ   ræ   rì   rû   r  r  r  r   r#  r%  r(  r+  r/  r=  rA  rI  rP  rM  rV  ri  rp  rt  r{  r‹  r�  r/   Úgetenvrœ  r˜  rŸ  r§  rÇ  rÏ  rÛ  rà  rå  rû  rð  rï  rZ   r’   r  rý  rÉ  r  Úcacher  r  r9  r!  r‡  r€  rœ  rµ  rú  Ú	test_caser·  rÅ  rÑ  r-  r5   )rQ  s   @r4   Ú<module>rp     sV  øð÷ Ð Û Û Û Û Û Û Û 	Û Û Û 
Û Û Û Û Û Û Ý $Ý %Ý !Ý Ý ß ,Ñ ,Ý ß "Ý ã Û Û Ý  Ý Ý )Ý 7Ý .Ý CÝ 0÷÷ ÷ õ ÷ñ ð Ð ØÐ ØÐ ØÐ ØÐ ØÐ ßÛó‰ˆ�%ð ×&Ò& x×0Ô0Ø#‰G‹I�eÓñõ?ðD 
×	Ò	˜8Ó	$€Ø ‡��—‘Ô â4Ð Ø˜E�?Ð Ø×3Ð3˜x×3Ð3¨8€ôˆzô ð
Ø™8Ø
ÐCóðð ‘x Ð$FÓGð	ð
 ‘X˜bÐ"BÓCðð ‰x˜Ð4Ó5ðð ‘8˜BÐ =Ó>ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‘8˜BÐ >Ó?ðð ‰H�RÐ>Ó?ðð  ‘(˜2Ð6Ó7ð!ð" ‘h˜rÐ#LÓMð#ð$ ‰xØ
ÐVóð%ð* ‘8˜BÐ DÓEð+ð, ‘h˜rÐ#BÓCñ-€
ð4 ÷*ð *ó ð*ò*&òò6òòòò õð Uô õ8õ,ò(ò"
ò,+ò\ò4ò
òNòòòòôò:òñ $+Ù1ó$Ð ó ò
Sõ
ôô*ò"õFð" à	ØØÙ˜aÔ ØØØó
ó ð
÷: à�Oá˜"Ÿ)›)Ð$GÈÓOÓP€Oà˜cØ" CðÐ ÷ Ø+.ÐÐ'Ñ(÷
õIð ñ2ó ð2÷(õXð2 /3€Ó 2÷
õ"÷
K÷6 Ù˜Q¡ A u§z¢z×'>Ò'>Ó'@Ó AÓBÑàÐô˜8ô ôN5NÐ.ô 5NõpðD ‡‚ôó ðò&0ð 
�Ð3Eô7ôtl&˜Hô l&ô^T˜bŸišiô Tô #˜RŸYšYô #ð  ó#)ó ð#)ôL  ¨%¯-ª-×*AÒ*A×*JÑ*Jô   ôF.Ð)<ô .ô8O˜hô OôdBNÐ4ö BNr6   