Ë
    ÃÓ^j¢t  ã                   óF	  — U d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlZd dlmc mZ d dlmZ d dlmZ ddlmZ dd	lmZmZmZ dd
lmZ  ej6                  e«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z  ed¬«       G d„ d«      «       Z!dZ"e jF                   e!ddd«      e jH                   e!ddd«      e jJ                   e!ddd«      e jL                   e!ddd«      e jN                   e!dddd e"z  ¬!«      e jP                   e!d"ddd#e"z  ¬!«      e jR                   e!ddd$«      iZ*e+e e!f   e,d%<   ejZ                  e jL                  ej\                  e jH                  ej^                  e jF                  ej`                  e jJ                  iZ1e+ee f   e,d&<   ejZ                  e jP                  ej\                  e jP                  ej^                  e jN                  ej`                  e jN                  iZ2e+ee f   e,d'<   e jf                  d(e4fd)„«       Z5e jf                  d(efd*„«       Z6d+e7d(e fd,„Z8d-e9d(efd.„Z:d/ejv                  d(efd0„Z<dxd1ejz                  d2e7d(e7fd3„Z>dxd1ejz                  d2e7d(e7fd4„Z?d/ejv                  d(e7fd5„Z@d/ejv                  d(e7fd6„ZA G d7„ d8e«      ZB G d9„ d:e«      ZC G d;„ d<e«      ZDd=ZEd>ZFg d?¢g d@¢gZGg dA¢g dB¢gg dC¢g dD¢gg dE¢g dF¢ggZHg dG¢g dH¢g dI¢g dJ¢gZIg dK¢g dK¢g dL¢g dM¢gZJg dK¢g dK¢g dN¢g dO¢gZKg dP¢g dQ¢g dR¢g dS¢gZLg dT¢g dU¢g dV¢gZMejZ                  d=ej\                  dWej^                  dXej`                  dYiZNejZ                  dZej\                  d[ej^                  d\ej`                  d]iZOe+eePf   e,d^<   d_ZQejZ                  dej\                  d`ej^                  dej`                  diZRe+eePf   e,da<   d(ePfdb„ZSd(ePfdc„ZTdde7d(e7fde„ZUd(ePdz  fdf„ZVdge7d+e7dhedie7dje7d(ePfdk„ZWdge7d+e7dhed(eXePe7e7f   fdl„ZYdme7d+e7dhed(ePfdn„ZZ	 dyd+e7dhedoePd(e7fdp„Z[d/ejv                  d(ePfdq„Z\drejº                  j¼                  d(e7fds„Z_drejº                  j¼                  d(e7fdt„Z`	 	 dzdrejº                  j¼                  due7dz  dve4d(ePfdw„Zay){é    N)Ú	dataclass)ÚIntEnum)ÚAny)Úoptimization_hint)Únormalize_functioné   )Úir)Úget_dtype_sizeÚsnode_args_kwargsÚsympy_product)ÚVc                   ó$   — e Zd ZdZdZdZdZdZdZy)Ú	NCCL_COLLr   r   é   é   é   é   N)	Ú__name__Ú
__module__Ú__qualname__Ú
ALL_REDUCEÚ
ALL_GATHERÚREDUCE_SCATTERÚ
ALL_TO_ALLÚUNSUPPORTEDÚP2P© ó    úh/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/comm_analysis.pyr   r      s    „ Ø€JØ€JØ€NØ€JØ€KØ
�Cr   r   c                   ó   — e Zd ZdZdZdZdZy)ÚNVIDIA_GPU_TYPEr   r   r   r   N)r   r   r   ÚVOLTAÚAMPEREÚHOPPERÚ	BLACKWELLr   r   r   r!   r!   !   s   „ Ø€EØ€FØ€FØ�Ir   r!   c                   ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚInterconnectTyper   r   r   r   r   r   é   N)
r   r   r   ÚNVLINK_V100ÚNVLINK_A100ÚNVLINK_H100ÚNVLINK_B200ÚIB_HDRÚIB_NDRÚPCIEr   r   r   r'   r'   (   s%   „ Ø€KØ€KØ€KØ€KØ€FØ€FØ�Dr   r'   T)Úfrozenc                   ó>   — e Zd ZU dZeed<   eed<   eed<   dZeed<   y)ÚInterconnectProfilezIEmpirically calibrated interconnect parameters for saturation estimation.Úbus_bw_GBpsÚlatency_per_hop_usÚbase_latency_usr   Úmin_saturation_bytesN)r   r   r   Ú__doc__ÚfloatÚ__annotations__r6   Úintr   r   r   r2   r2   2   s"   … áSàÓØÓØÓØ !Ð˜#Ô!r   r2   i   ç      B@ç      D@ç      $@g      6@ç     €F@g      N@g      >@ç      ,@g      I@g      (@éd   )r6   g      &@éK   g      .@ÚINTERCONNECT_PROFILESÚ_GPU_TO_INTRAÚ_GPU_TO_INTERÚreturnc                  óÀ  — ddl } t        j                  j                  «       r!t        j                  j	                  «       dk  ry	 | j                  g d¢ddd¬«      }|j                  dk(  r"|j                  j                  d«      d   }d	|v S 	 	 t        j                  j                  dd
«      S # | j                  t        f$ r Y Œ8w xY w# t        t        f$ r Y yw xY w)zIDetect NVLink via nvidia-smi topology, falling back to peer access check.r   Nr   T)z
nvidia-smiÚtopoz-mr   )Úcapture_outputÚtextÚtimeoutÚLegendÚNVr   )Ú
subprocessÚtorchÚcudaÚis_availableÚdevice_countÚrunÚ
returncodeÚstdoutÚsplitÚTimeoutExpiredÚOSErrorÚcan_device_access_peerÚAssertionErrorÚRuntimeError)rM   ÚresultrG   s      r   Ú_has_nvlinkr\   a   sÝ   € ó ä�:‰:×"Ñ"Ô$¬¯
©
×(?Ñ(?Ó(AÀAÒ(EØðØ—‘Ú(ØØØð	  ó 
ˆð ×Ñ Ò!à—=‘=×&Ñ& xÓ0°Ñ3ˆDØ˜4�<Ðð "ðÜ�z‰z×0Ñ0°°AÓ6Ð6øð	 ×%Ñ%¤wÐ/ò Ùðûô
 œLÐ)ò Ùðús%   ÁAB0 ÂC Â0CÃCÃCÃCc                  óú  ‡— t         j                  j                  «       ržt         j                  j                  «       dkD  r}t         j                  j	                  d«      j
                  } | dk\  rt        j                  S | dk\  rt        j                  S | dk\  rt        j                  S | dk\  rt        j                  S t         j                  j                  j                  t         j                  j                  j                  «      xs dŠd‰v rt        j                  S d‰v rt        j                  S d	‰v rt        j                  S t        ˆfd
„dD «       «      rt        j                  S t        j                  S )Nr   é
   é	   é   é   Ú ÚV100ÚA100ÚH100c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr   )Ú.0ÚgpuÚgpu_infos     €r   ú	<genexpr>zget_gpu_type.<locals>.<genexpr>‘   s   øè ø€ ÒA ˆS�HŒ_ÑAùó   ƒ)ÚB100ÚB200ÚB300)rN   rO   rP   rQ   Úget_device_propertiesÚmajorr!   r%   r$   r#   r"   ÚutilsÚcollect_envÚget_gpu_inforR   Úany)rq   rj   s    @r   Úget_gpu_typerv   |   s"  ø€ ô ‡z�z×ÑÔ ¤U§Z¡Z×%<Ñ%<Ó%>ÀÒ%BÜ—
‘
×0Ñ0°Ó3×9Ñ9ˆØ�BŠ;Ü"×,Ñ,Ð,Ø�AŠ:Ü"×)Ñ)Ð)Ø�AŠ:Ü"×)Ñ)Ð)Ø�AŠ:Ü"×(Ñ(Ð(ä�{‰{×&Ñ&×3Ñ3´E·K±K×4KÑ4K×4OÑ4OÓPÒVÐTV€HØ�ÑÜ×$Ñ$Ð$Ø	�8Ñ	Ü×%Ñ%Ð%Ø	�8Ñ	Ü×%Ñ%Ð%Ü	ÓAÐ(@ÔAÔ	AÜ×(Ñ(Ð(ä×%Ñ%Ð%r   Ú
group_sizec                 óŒ  — t         j                  j                  «       rt         j                  j                  «       nd}t	        «       }t        j                  | |z  «      dk(  r>t        «       st        j                  S t        j                  |t        j                  «      S t        j                  |t        j                  «      S )zEAuto-detect interconnect type from GPU generation and group topology.r`   r   )rN   rO   rP   rQ   rv   ÚmathÚceilr\   r'   r/   rC   Úgetr*   rD   r-   )rw   Úgpus_per_nodeÚgpu_gens      r   Údetect_interconnectr~   —   sˆ   € ä16·±×1HÑ1HÔ1J”E—J‘J×+Ñ+Ô-ÐPQ€MÜ‹n€GÜ‡y�y�˜mÑ+Ó,°Ò1ÜŒ}Ü#×(Ñ(Ð(Ü× Ñ  Ô*:×*FÑ*FÓGÐGÜ×Ñ˜WÔ&6×&=Ñ&=Ó>Ð>r   Úkernel_namec                 ó4  ‡ — ‰ €J ‚d‰ v rt         j                  S d‰ v rt         j                  S d‰ v rt         j                  S t	        ˆ fd„dD «       «      rt         j
                  S t	        ˆ fd„dD «       «      rt         j                  S t         j                  S )NÚ
all_reduceÚ
all_gatherÚreduce_scatterc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrg   r   ©rh   Úcommr   s     €r   rk   z7get_collective_type_from_kernel_name.<locals>.<genexpr>ª   s   øè ø€ ÒH TˆT�[Ô ÑHùrl   )Ú
all_to_allÚalltoallc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrg   r   r…   s     €r   rk   z7get_collective_type_from_kernel_name.<locals>.<genexpr>¬   s   øè ø€ ÒM TˆT�[Ô ÑMùrl   )ÚisendÚirecvÚ	batch_p2p)r   r   r   r   ru   r   r   r   )r   s   `r   Ú$get_collective_type_from_kernel_namer�   ¢   s‹   ø€ ØÐ"Ð"Ð"Ø�{Ñ"Ü×#Ñ#Ð#Ø	˜Ñ	$Ü×#Ñ#Ð#Ø	˜[Ñ	(Ü×'Ñ'Ð'Ü	ÓHÐ-GÔHÔ	HÜ×#Ñ#Ð#Ü	ÓMÐ-LÔMÔ	MÜ�}‰}Ðä×$Ñ$Ð$r   Únodec                 óˆ   — t        | t        j                  «      st        d| › �«      ‚| j                  }|€J ‚t        |«      S )Nz!node is not a collective kernel: )Ú
isinstancer	   Ú_CollectiveKernelÚ
ValueErrorÚpython_kernel_namer�   )rŽ   Únames     r   Úget_collective_typer•   ²   sG   € Ü�dœB×0Ñ0Ô1ÜÐ<¸T¸FÐCÓDÐDà×"Ñ"€DØÐÐÐÜ/°Ó5Ð5r   ÚsizeÚfallbackc                 ó¸   — t        | «      }t        |t        j                  «      rt	        |«      S t
        j                  j                  j                  ||¬«      S )N©r—   )	r   r�   ÚsympyÚIntegerr:   r   ÚgraphÚsizevarsr   )r–   r—   Únumels      r   Úget_ir_node_size_numelrŸ   »   sD   € Ü˜$Ó€EÜ�%œŸ™Ô'Ü�5‹zÐÜ�7‰7×Ñ×-Ñ-¨e¸hÐ-ÓGÐGr   c                 ój   — t        j                  t        j                  | d«      }t	        ||¬«      }|S )Nr   r™   )Ú	functoolsÚreduceÚoperatorÚmulr   )r–   r—   rž   r[   s       r   Úget_fx_node_size_numelr¥   Â   s+   € Ü×ÑœXŸ\™\¨4°Ó3€EÜ˜u¨xÔ8€FØ€Mr   c                 ó´   — d}| j                   D ]F  }t        |j                  j                  «      }||t	        |j                  j
                  «      z  z  }ŒH |S )Nr   )ÚinputsrŸ   Úlayoutr–   r
   Údtype)rŽ   Úsz_bytesÚinprž   s       r   Úget_collective_input_size_bytesr¬   È   sQ   € Ø€HØ�{‰{ò =ˆÜ& s§z¡z§¡Ó7ˆØ�EœN¨3¯:©:×+;Ñ+;Ó<Ñ<Ñ<‰ð=ð €Or   c                 ó¼   — t        | t        j                  «      r5t        | t        j                  «      sddlm}  || j                  d   «      S t        d| › �«      ‚)Nr   ©Ú_get_group_size_by_nameéÿÿÿÿzUnsupported collective type: )r�   r	   r‘   Ú_WaitKernelÚ"torch.distributed.distributed_c10dr¯   Úconstant_argsÚ	TypeError)rŽ   r¯   s     r   Úget_collective_group_sizerµ   Ð   sK   € Ü�$œ×,Ñ,Ô-´jÀÄrÇ~Á~Ô6VÝNá& t×'9Ñ'9¸"Ñ'=Ó>Ð>äÐ7¸°vÐ>Ó?Ð?r   c                   ó   — e Zd ZdZdZdZy)ÚNCCL_HWr   r   r   N)r   r   r   ÚNVLINKÚPCIÚNETr   r   r   r·   r·   Þ   s   „ Ø€FØ
€CØ
�Cr   r·   c                   ó   — e Zd ZdZdZy)Ú	NCCL_ALGOr   r   N)r   r   r   ÚTREEÚRINGr   r   r   r¼   r¼   ä   s   „ Ø€DØ�Dr   r¼   c                   ó   — e Zd ZdZdZdZy)Ú
NCCL_PROTOr   r   r   N)r   r   r   ÚLLÚLL128ÚSIMPLEr   r   r   rÀ   rÀ   é   s   „ à	
€BØ€EØ�Fr   rÀ   r   r   )g333333@r?   çÍÌÌÌÌÌ @)gffffff@r?   rÄ   )ç333333ã?g      ô?ç      @)rÅ   çffffffþ?g333333@)ç      ð?rÇ   rÆ   )rÈ   g      @gÍÌÌÌÌÌ@)g      @g      !@r?   )gš™™™™™@rÆ   r?   )ç     €C@rÉ   gffffff4@)gÍÌÌÌÌìU@g     €6@g      3@)g      a@r>   g     €A@)g      q@g     €V@ç     €Q@)ç      4@rË   rË   )çš™™™™YB@rÌ   rÌ   )r<   r<   r<   )rÌ   rÌ   g      =@)gÍÌÌÌÌÌK@gìQ¸…«?@rË   )g     €:@g     €2@r=   )ç      8@gš™™™™™7@gÍÌÌÌÌÌ1@)gš™™™™YC@g33333³D@r;   )rÊ   gffffffE@rÍ   )rÈ   rÈ   rÈ   rÈ   çÍÌÌÌÌÌì?çš™™™™™é?çffffffæ?rÐ   rÐ   rÐ   rÅ   ç      à?çš™™™™™Ù?rÒ   rÑ   rÅ   rÐ   rÏ   rÎ   rÈ   rÈ   rÈ   rÈ   rÈ   )rÈ   rÈ   rÈ   rÈ   rÈ   rÎ   rÏ   rÏ   rÏ   rÐ   rÅ   rÅ   rÅ   rÅ   rÅ   rÅ   rÏ   rÎ   rÎ   rÎ   rÎ   rÈ   rÈ   rÈ   )rÎ   rÎ   rÎ   rÎ   rÎ   rÎ   rÎ   rÏ   rÐ   rÅ   rÅ   rÑ   rÑ   rÑ   rÑ   rÅ   rÐ   rÏ   rÐ   rÐ   rÏ   rÎ   rÎ   rÎ   r`   é   é    g      ^@ç      n@g      w@g     €†@Ú_GPU_NVLINK_BWrÍ   ç      9@Ú_GPU_INTER_NODE_BWc                  óÀ   — t         j                  j                  j                  } | �t	        | «      S t        «       st        S t        j                  t        «       d«      S )zEReturn intra-node bandwidth in GB/s. Config overrides auto-detection.rÕ   )
rN   Ú	_inductorÚconfigÚintra_node_bwr8   r\   Ú_PCIE_INTRA_NODE_BWrÖ   r{   rv   ©Úoverrides    r   Úget_intra_node_bwrà   «  sG   € ä�‰×%Ñ%×3Ñ3€HØÐÜ�X‹ÐÜŒ=Ü"Ð"Ü×Ñœl›n¨eÓ4Ð4r   c                  ó    — t         j                  j                  j                  } | �t	        | «      S t
        j                  t        «       d«      S )zOReturn inter-node (IB/RoCE) bandwidth in GB/s. Config overrides auto-detection.r×   )rN   rÚ   rÛ   Úinter_node_bwr8   rØ   r{   rv   rÞ   s    r   Úget_inter_node_bwrã   µ  s<   € ä�‰×%Ñ%×3Ñ3€HØÐÜ�X‹ÐÜ×!Ñ!¤,£.°$Ó7Ð7r   Únc                 ó@   — | dk  ryd}| dkD  r| dz  } |dz  }| dkD  rŒ|S )z4Integer log2, matching NCCL's log2i (floor of log2).r   r   r   )rä   Úrs     r   Ú_log2irç   ½  s:   € àˆA‚vØØ	€AØ
ˆaŠ%Ø	ˆa‰ˆØ	ˆQ‰ˆð ˆa‹%ð €Hr   c                 óH  — | j                   }|€J ‚t        |dd«      }|j                  d   }ddlm}  ||«      }t
        j                  j                  |«      }t        j                  d|› �«      }t        |«      }t        | «      \  }	}
d|v r|	dd  |	d   z   }	t
        j                  j                  ||¬	«      5 } ||	i |
¤Ž}t
        j                  j                  j                  j                  |«       d d d «       j                   }|dk  ry |d
z  }|S # 1 sw Y   Œ"xY w)Nr“   rb   r°   r   )Ú_resolve_process_groupzcuda:Úall_gather_into_tensor_outr   ©ÚgroupÚdeviceç     @�@)rŽ   Úgetattrr³   r²   ré   rN   ÚdistributedÚget_rankrí   Úevalr   Ú_time_estimatorÚopsÚ_c10d_functionalÚwait_tensorÚdefaultÚestimated_time)ÚsnodeÚkernelÚpy_kernel_nameÚpg_nameré   ÚpgÚrankrí   ÚfnÚargsÚkwargsÚtime_estimatorÚwÚest_time_usÚest_time_mss                  r   Ú/estimate_nccl_collective_runtime_nccl_estimatorr  È  s+  € Ø�Z‰Z€FØÐÐÐÜ˜VÐ%9¸2Ó>€NØ×"Ñ" 2Ñ&€GÝIá	 Ó	(€BÜ×!Ñ!×*Ñ*¨2Ó.€Dô �\‰\˜E $ ˜.Ó)€Fä	ˆnÓ	€BÜ$ UÓ+�L€Dˆ&ð $ ~Ñ5Ø�A�Bˆx˜$˜q™'Ñ!ˆä	×	Ñ	×	*Ñ	*°¸FÐ	*Ó	Cð :À~Ù�Ð˜ÑˆÜ�	‰	×"Ñ"×.Ñ.×6Ñ6°qÔ9÷:ð !×/Ñ/€Kð �Q‚ØØ Ñ#€KØÐ÷:ð :ús   Â;<DÄD!ÚnBytesÚcollÚalgoÚprotoc                 ó,
  — t         j                  j                  «       rt         j                  j                  «       nd}t	        j
                  ||z  «      }|}t        «       }|dk  r|dz
  nd}	t        «       }
t        «       }t        j                  |d«      }t        |«      }|t        j                  t        j                  fv }|t        j                   k(  r|dkD  ry|dkD  r|ry|dk(  r|
}n|r|}n	|dk  r|
n|}|r>|dkD  r9ddt#        d|dz
  dz  «      z  z   }||z  }|dkD  rt%        | d	«      d	z  d
z  }||z  }|}|dk(  r|nd}t&        |   |	   }|t(        j*                  k(  r$|t        j,                  k(  rt#        ||dz  «      }�n|t(        j*                  k(  r0|t        j                   k(  rt#        |dz  |t.        |   |	   z  «      }n×|t(        j0                  k(  r#|t        j,                  k(  rt#        |dz  |«      }n¡|t(        j0                  k(  r9|t        j                   k(  r&|dk(  rdnd}t#        ||z  |t2        |   |	   z  «      }nU|t(        j0                  k(  rB|t        j4                  k(  r/|t6        j8                  k(  rt#        |dz  |t:        |   |	   z  «      }|dk  ry|t6        j8                  k(  r	d|dz
  z  }n[|t6        j<                  t6        j>                  fv r|dz
  }n3|t6        j@                  k(  r	d|dz
  z  }n|t6        jB                  k(  rd}ny|t(        j0                  k(  r|t6        j8                  k(  r|dz  }n$|t(        j*                  k(  r|d|z  |z  z  }n|dz  }|dk  ry|t        jD                  k(  rtF        jH                  ntF        jJ                  }tL        |   |   }tN        |   |   |   }tN        tF        jP                     |   |   }|dkD  rdnd}|t        j4                  k(  r
|dkD  r|dz  }t%        ||«      }|t(        j*                  k(  r9|dk(  rdn|t6        j8                  k(  rd|dz
  z  n|dz
  }|||z
  |z  ||z  z   z  }nP|t(        j0                  k(  r=|t6        j8                  k(  r*|d|t%        |d«      z  dz
  |z  tS        |«      |z  z   z  z  }|t(        j0                  k(  rE|t6        j8                  k(  r2| dk\  rtS        | dz	  «      nd}d|cxk  rdk  rn n|tT        |   |   z  }|| d|z  z  z   }|S )a  Compute NCCL estimated time in us for a given (algo, proto) pair.

    Mirrors ncclTopoTuneModel bandwidth/latency computation and
    ncclTopoGetAlgoTime from NCCL tuning.cc. Returns -1 if the
    (algo, proto) combination is disabled for this configuration.
    r`   r   r   g      ð¿g¤p=
×£è?gq=
×£pÍ?rÈ   ra   i€ðúgÃõ(\�ÂÅ?r   rÑ   g      î?gyå5”×Ð?g9Žã8Žãè?gq=
×£pí?g        g      @é@   r(   é   rî   )+rN   rO   rP   rQ   ry   rz   rv   rà   rã   Ú_GPU_NCHANNELSr{   r~   r'   r.   r-   rÀ   rÂ   ÚminÚmaxÚllMaxBwsr¼   r¾   rÁ   ÚperChMaxRingLL128Bwsr½   ÚperChMaxTreeLL128BwsrÃ   r   r   ÚperChMaxTreeBwsr   r   r   r   r/   r·   r¹   r¸   ÚbaseLatÚhwLatrº   rç   ÚtreeCorrectionFactor) r  rw   r  r	  r
  r|   ÚnNodesÚnRanksÚcompCapIndexÚindex2ÚbwIntraÚbwInterÚ	nChannelsÚinterconnectÚis_ibÚbwÚnic_efficiencyÚ
multi_railÚbusBwÚindex1ÚllMaxBwÚfactorÚnstepsÚ	bandwidthÚintraHwÚlatÚintraLatÚinterLatÚnetOverheadÚnInterStepsÚlogSizeÚtime_uss                                    r   Ú_nccl_algo_timer2  é  s  € ô 27·±×1HÑ1HÔ1J”E—J‘J×+Ñ+Ô-ÐPQ€MÜ�Y‰Y�z MÑ1Ó2€FØ€FÜ“>€LØ! Qš;ˆV�aŠZ¨A€Fô
  Ó!€GÜÓ!€GÜ×"Ñ" <°Ó3€Iô ' zÓ2€LØÔ-×4Ñ4Ô6F×6MÑ6MÐNÐN€Eð ”
× Ñ Ò Ø�AŠ:ØØ�AŠ:™%Øð �‚{Ø‰Ù	Ø‰à !š‰W¨ˆñ �˜!’ð  ¤s¨3°¸!±¸qÑ0@Ó'AÑ AÑAˆØ
ˆnÑˆð �AŠ:Ü˜f jÓ1°JÑ>À4ÑGˆJØ�*ÑˆBà€Eà# qš[‰\¨a€FÜ�vÑ˜vÑ&€GàŒy�~‰~Ò %¬:¯=©=Ò"8Ü�G˜U S™[Ó)ŠØ	”—‘Ò	 E¬Z×-=Ñ-=Ò$=ÜØ�]Ñ#ØÔ,¨\Ñ:¸6ÑBÑBó
‰ð 
”—‘Ò	 E¬Z¯]©]Ò$:Ü�E˜YÑ'¨Ó1‰Ø	”—‘Ò	 E¬Z×-=Ñ-=Ò$=Ø$¨šk‘¨}ˆÜØ�F‰NØÔ,¨\Ñ:¸6ÑBÑBó
‰ð 
”—‘Ò	 E¬Z×->Ñ->Ò$>Ø”9×'Ñ'Ò'Ü˜ ™ i´/À,Ñ2OÐPVÑ2WÑ&WÓXˆEð �‚zØð Œy×#Ñ#Ò#Ø�f˜q‘jÑ!‰Ø	”)×*Ñ*¬I×,@Ñ,@ÐAÑ	AØ˜!‘‰Ø	”×%Ñ%Ò	%Ø�f˜q‘jÑ!‰Ø	”—‘Ò	Ø‰àð Œy�~‰~Ò $¬)×*>Ñ*>Ò">Ø˜C‘K‰	Ø	”—‘Ò	Ø˜S 6™\¨FÑ2Ñ3‰	à˜C‘Kˆ	à�A‚~Øð *Ô-=×-BÑ-BÒBŒg�kŠkÌÏÉ€GÜ
�$‰-˜Ñ
€CÜ�W‰~˜dÑ# EÑ*€HÜ”W—[‘[Ñ! $Ñ'¨Ñ.€Hà !š‘#¨€KØ”
×!Ñ!Ò! f¨q¢jØ�sÑˆÜ�8˜[Ó)€HàŒy�~‰~Òð ˜Š{ñ à&*¬i×.BÑ.BÒ&B�!�v ‘zÒ"ÈÐQRÉ
ð 	ð
 	�˜Ñ$¨Ñ0°;ÀÑ3IÑIÑI‰Ø	”—‘Ò	Ø”9×'Ñ'Ò'Ø�1Øœ3˜v q›>Ñ)¨AÑ-°Ñ9¼FÀ6»NÈXÑ<UÑUññ ˆCð Œy�~‰~Ò $¬)×*>Ñ*>Ò">Ø)/°2ª”&˜ 1™Ô%¸1ˆØ�Ô˜"ÕØÔ-¨eÑ4°WÑ=Ñ=ˆIà�F˜f yÑ0Ñ1Ñ1€GØ€Nr   c           	      óª  — t        d«      }t        j                  }t        j                  }t        j
                  t        j                  fD ]�  }|t        j
                  k(  r|t        j                  k7  rŒ*t        j                  t        j                  t        j                  fD ]&  }t        | ||||«      }d|cxk  r|k  sŒn Œ!|}|}|}Œ( Œƒ |||fS )zêFind the best (algo, proto) for a given collective and return (time_us, algo, proto).

    Iterates all supported (algo, proto) combinations and picks the one with
    minimum estimated time, mirroring NCCL's algorithm selection.
    Úinfr   )r8   r¼   r¾   rÀ   rÁ   r½   r   r   rÂ   rÃ   r2  )	r  rw   r  Ú	best_timeÚ	best_algoÚ
best_protor	  r
  Úts	            r   Ú_nccl_best_algo_timer9  ~  sº   € ô �e“€IÜ—‘€IÜ—‘€Jä—‘¤§¡Ð0ò 	#ˆà”9—>‘>Ò! d¬i×.BÑ.BÒ&BØÜ —m‘m¤Z×%5Ñ%5´z×7HÑ7HÐIò 	#ˆEÜ ¨
°D¸$ÀÓFˆAØ�AÔ!˜	Ö!Ø�	Ø �	Ø"‘
ñ	#ð		#ð �i Ð+Ð+r   Útensor_storage_size_bytesc                 óŠ   — |dk  ry|t         j                  k(  ryt        | ||«      \  }}}|dk  s|t        d«      k(  ry|dz  S )aX  Returns estimated NCCL collective runtime in milliseconds (ms).

    Uses a multi-algorithm, multi-protocol model aligned with NCCL's
    ncclTopoTuneModel and ncclTopoGetAlgoTime (tuning.cc). Evaluates
    Ring and Tree algorithms across LL, LL128, and SIMPLE protocols,
    selecting the (algo, proto) pair that minimizes estimated time.
    r   r   r4  rî   )r   r   r9  r8   )r:  rw   r  r1  Ú_s        r   Ú%estimate_nccl_collective_runtime_implr=  š  sU   € ð �Q‚ØàŒy×$Ñ$Ò$Øä(Ð)BÀJÐPTÓU�M€GˆQ�Ø�‚{�g¤ u£Ò-ØØ�VÑÐr   Útarget_efficiencyc                 óú  — t         j                  t         j                  t         j                  f}||v sJ d|› d|› �«       ‚| dk  ryt        t        | «         }|t         j                  t         j                  fv r| dz
  }n|t         j                  k(  r	d| dz
  z  }ny|j                  ||j                  z  z   }|dz  }|j                  dz  }|d|z
  z  }	t        |	|z  |z  «      }
t        |
|j                  «      S )	zäCompute min message size for target BW efficiency using empirical profiles.

    Uses per-interconnect profiles calibrated to real NCCL behavior (algorithm,
    protocol, channel selection) rather than the analytical model.
    zUnsupported collective z, expected one of r   r   r   g�íµ ÷Æ°>g    eÍÍArÈ   )r   r   r   r   rB   r~   r5   r4   r3   r:   r  r6   )rw   r  r>  Ú
_SUPPORTEDÚprofiler(  Útotal_latency_usÚ	latency_sÚbw_bytes_per_sÚ	eff_ratioÚ	min_bytess              r   Úcompute_min_saturation_bytesrG  °  s  € ô ×&Ñ&¬	×(@Ñ(@Ä)×BVÑBVÐW€JØ�:Ñð Ø
! $ Ð'9¸*¸ÐFóÐð �Q‚Øä#Ô$7¸
Ó$CÑD€Gà”	×$Ñ$¤i×&>Ñ&>Ð?Ñ?Ø˜a‘‰Ø	”×%Ñ%Ò	%Ø�j 1‘nÑ%‰àà×.Ñ.°¸'×:TÑ:TÑ1TÑTÐØ  4Ñ'€IØ×(Ñ(¨3Ñ.€NØ! SÐ+<Ñ%<Ñ=€IÜ�I 	Ñ)¨NÑ:Ó;€IÜˆy˜'×6Ñ6Ó7Ð7r   c                 ó^   — t        | «      }t        | «      }t        | «      }t        |||«      S )zûReturns estimated NCCL collective runtime in milliseconds (ms).

    Uses the multi-algorithm, multi-protocol analytical model aligned with
    NCCL's tuning.cc to select the best (algo, proto) pair for the given
    collective size and topology.
    )r¬   rµ   r•   r=  )rŽ   r:  rw   r  s       r   Ú estimate_nccl_collective_runtimerI  Ø  s8   € ô !@ÀÓ EÐÜ*¨4Ó0€JÜ˜tÓ$€DÜ0Ø! :¨tóð r   Úfx_nodec                 ó<  ‡‡— dŠ| j                   | j                  }}t        |«      }|j                  dd«       dt        j
                  dt        fd„Šdt        j                  j                  fˆˆfd„}t        j                  t        j                  j                  |||f«       | j                  j                  dd«      }‰�|€y	t        |t        t        f«      rt!        ˆfd
„|D «       «      }‰|z   S t        |t        j
                  «      r ‰|«      }‰|z   S y	)zSEstimate the size of a collective operation in bytes, including inputs and outputs.NÚoutr8  rE   c                 ó`   — t        | j                  «       «      t        | j                  «      z  S rg   )r¥   r–   r
   r©   )r8  s    r   Útensor_bytesz1estimate_fx_collective_size.<locals>.tensor_bytesñ  s!   € Ü% a§f¡f£hÓ/´.ÀÇÁÓ2IÑIÐIr   r«   c                 ó’   •— | j                   j                  dd «      }t        |t        j                  «      sy ‰€dŠ‰ ‰|«      z  Šy )NÚvalr   )Úmetar{   r�   rN   ÚTensor)r«   Úinp_valÚinput_bytesrN  s     €€r   Úadd_inp_bytesz2estimate_fx_collective_size.<locals>.add_inp_bytesô  sD   ø€ Ø—(‘(—,‘,˜u dÓ+ˆÜ˜'¤5§<¡<Ô0Øð ÐØˆKØ‘| GÓ,Ñ,‰r   rP  r   c              3   ód   •K  — | ]'  }t        |t        j                  «      sŒ ‰|«      –— Œ) y ­wrg   )r�   rN   rR  )rh   r8  rN  s     €r   rk   z.estimate_fx_collective_size.<locals>.<genexpr>  s'   øè ø€ ò 
Ø !´:¸aÄÇÁÕ3N‰L˜�Oñ
ùs   ƒ0£0)r   r  ÚdictÚpoprN   rR  r:   ÚfxÚNodeÚpytreeÚtree_map_onlyrQ  r{   r�   ÚlistÚtupleÚsum)rJ  r   r  rU  Ú
output_valÚoutput_bytesrT  rN  s         @@r   Úestimate_fx_collective_sizerb  ç  s  ù€ à€Kà—<‘< §¡ˆ&€DÜ�&‹\€Fð ‡J�Jˆu�dÔðJœŸ™ð J¬ó Jð-œ5Ÿ8™8Ÿ=™=ö -ô ×ÑÜ�‰�‰ØØ	ˆvˆôð —‘×!Ñ! %¨Ó.€JàÐ˜jÐ0Øô �*œt¤U˜mÔ,Üó 
Ø%/ô
ó 
ˆð ˜Ñ%Ð%ô 
�J¤§¡Ô	-Ù# JÓ/ˆð ˜Ñ%Ð%ð r   c                 óB   — ddl m} t        | «      } || «      s|S |dz  S )z×Estimate the memory footprint of a collective operation in bytes.

    This returns the total bytes that need to be live concurrently in memory.
    For all_reduce, we divide by 2 since it can be done in-place.
    r   )Úis_all_reduce_tensorr   )Ú#torch._inductor.fx_passes.bucketingrd  rb  )rJ  Úis_all_reducer–   s      r   Ú'estimate_fx_collective_memory_footprintrg    s)   € õô ' wÓ/€DÙ$ WÔ-ˆ4Ð<°4¸1±9Ð<r   Úoverride_sizeÚuse_nccl_estimatorc                 ó†  ‡ ‡‡‡‡— ddl m} ‰ j                  t        j                  j
                  j                  j                  u rd}‰€t        ‰ «      }n‰}t        ‰ j                  t        «      rJ ‚t        ‰ j                  ‰ j                  ‰ j                  d¬«      }|€J ‚|\  ŠŠddlm}  |‰d   «      Š |‰«      }t        ‰ j                  t        j                   j"                  «      sJ ‚t%        ‰ j                  j'                  «       «      }d	t(        dz  fˆˆ ˆˆˆfd
„}	|r |	«       }
|
�|
S t+        |||«      S )zÌReturns estimated NCCL collective runtime in milliseconds (ms).

    Tries the NCCL simulator first (if available and enabled), falls back
    to the multi-algo/proto analytical model from tuning.cc.
    r   r®   FNT)r   r  Únormalize_to_only_use_kwargs)Ú_resolve_group_nameÚ
group_namerE   c                  ó"  •‡‡— ddl m} m}  | ‰«      }t        j                  j
                  j                  |«      |j                  k(  ry t        j                  d«      }	 |j                  |«      }|j                  sy t        j                  ‰‰f«      \  }}dt        j                  fˆfd„Šdt        dt        fˆˆfd„Š|D �cg c]
  } ‰|«      ‘Œ }}t        j                   ||«      \  }}	‰j"                  }
t%        |
t        j&                  j(                  «      sJ ‚t        j                  j+                  ||¬«      5 } |
|i |	¤Ž}t%        |t,        t.        f«      r;|D ]5  }t        j0                  j2                  j4                  j7                  |«       Œ7 n3t        j0                  j2                  j4                  j7                  |«       d d d «       j8                  }|dk  ry |d	z  }|S # t        $ r Y y w xY wc c}w # 1 sw Y   Œ6xY w)
Nr   )ré   ÚBackendrO   rE   c                 ó>   •— t        j                  ‰€| n‰g||¬«      S )N)r©   rí   )rN   Úempty)r–   r©   rí   rh  s      €r   Ú_tensorzVestimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimate.<locals>._tensor^  s&   ø€ Ü—;‘;Ø%Ð-‘°M°?ØØôð r   Úec                 ó  •— t        | t        j                  j                  «      r ‰| j                  d   «      S t        | t        j
                  «      r6 ‰t        | j                  «       «      g| j                  | j                  «      S | S )NrP  )
r�   rN   rY  rZ  rQ  rR  r¥   r–   r©   rí   )rs  rr  Úto_real_tensors    €€r   ru  z]estimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimate.<locals>.to_real_tensore  sa   ø€ Ü˜!œUŸX™XŸ]™]Ô+Ù% a§f¡f¨U¡mÓ4Ð4Ü˜!œUŸ\™\Ô*ÙÔ 6°q·v±v³xÓ @ÐAÀ1Ç7Á7ÈAÏHÉHÓUÐUØˆHr   rë   rî   )r²   ré   ro  rN   rð   Údistributed_c10dÚget_backendÚFAKErí   Ú_get_backendrZ   Úsupports_time_estimater[  Útree_flattenrR  r   Útree_unflattenÚtargetr�   Ú_opsÚ
OpOverloadró   r]  r^  rô   rõ   rö   r÷   rø   )ré   ro  rý   rí   ÚbackendÚ	flat_argsÚflat_args_pytree_specÚaÚ	real_argsÚreal_kwargsrÿ   r  r  r8  r  r  rr  ru  r   rJ  rm  r  rh  s                   @@€€€€€r   Ú_nccl_estimatezEestimate_nccl_collective_runtime_from_fx_node.<locals>._nccl_estimateK  sß  ú€ çVá# JÓ/ˆÜ×Ñ×-Ñ-×9Ñ9¸"Ó=ÀÇÁÒMàä—‘˜fÓ%ˆð	Ø—o‘o fÓ-ˆGð ×-Ò-Øä+1×+>Ñ+>ÀÀf¸~Ó+NÑ(ˆ	Ð(ð	¬E¯L©Lõ 	ð	œcð 	¤cö 	ð 1:Ö:¨1‘^ AÕ&Ð:ˆ	Ð:Ü!'×!6Ñ!6°yÐBWÓ!XÑˆ	�;à�^‰^ˆÜ˜"œeŸj™j×3Ñ3Ô4Ð4Ð4Ü×Ñ×.Ñ.Ø˜Vð /ó 
ð 		BàÙ�IÐ- Ñ-ˆAä˜!œd¤E˜]Ô+Øò F�AÜ—I‘I×.Ñ.×:Ñ:×BÑBÀ1ÕEñFô —	‘	×*Ñ*×6Ñ6×>Ñ>¸qÔA÷		Bð %×3Ñ3ˆð ˜Š?ØØ! CÑ'ˆØÐøôU ò 	Ùð	üò* ;÷
		Bð 		Bús%   Á!G1 ÃH ÅBHÇ1	G=Ç<G=ÈH)r²   r¯   r}  rN   rô   rõ   Úall_to_all_singler÷   rb  r�   Ústrr   r   r  re  rl  r~  r  r�   r”   r8   r=  )rJ  rh  ri  r¯   r:  Úopt_args_kwargsrl  rw   r  r†  r  r   rm  r  s   ``         @@@r   Ú-estimate_nccl_collective_runtime_from_fx_noderŠ  $  s+  ü€ õ Kà‡~�~œŸ™×3Ñ3×EÑE×MÑMÑMð #ÐàÐÜ$?ÀÓ$HÑ!à$1Ð!ä˜'Ÿ.™.¬#Ô.Ð.Ð.Ü(Ø�‰Ø�\‰\Ø�~‰~Ø%)ô	€Oð Ð&Ð&Ð&Ø"�L€Dˆ&åGá$ V¨LÑ%9Ó:€JÙ(¨Ó4€JÜ�g—n‘n¤e§j¡j×&;Ñ&;Ô<Ð<Ð<Ü/°·±×0CÑ0CÓ0EÓF€Dð6œE D™L÷ 6ñ 6ñp Ù$Ó&ˆØÐ"ØÐä0Ø! :¨tóð r   )i   )rÎ   )NT)br¡   Úloggingry   r£   Údataclassesr   Úenumr   Útypingr   rš   rN   Útorch.utils._pytreerr   Ú_pytreer[  Ú%torch.fx.experimental.symbolic_shapesr   Útorch.fx.operator_schemasr   rb   r	   r
   r   r   Úvirtualizedr   Ú	getLoggerr   Úlogr   r!   r'   r2   Ú_MBr+   r*   r,   r)   r.   r-   r/   rB   rW  r9   r"   r#   r$   r%   rC   rD   Ú	lru_cacheÚboolr\   rv   r:   r~   rˆ  r�   ÚIRNoder•   ÚSizerŸ   r¥   r¬   rµ   r·   r¼   rÀ   Ú
_NUM_ALGOSÚ_NUM_PROTOSr  r  r  r  r  r  r  r  rÖ   r8   rÝ   rØ   rà   rã   rç   r  r2  r^  r9  r=  rG  rI  rY  rZ  rb  rg  rŠ  r   r   r   ú<module>r�     sS  ðÜ Û Û Û Ý !Ý Ý ã ã ß $Ð $Ý CÝ 8å ß CÑ CÝ ð €g×Ñ˜Ó!€ô�ô ô�gô ô�wô ñ �$Ô÷"ð "ó ð"ð €ð × Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ× Ñ Ñ"5°d¸DÀ$Ó"GØ×ÑÑ0Øˆd�D¨s°S©yôð ×ÑÑ0Øˆd�D¨r°C©xôð ×ÑÑ.¨t°T¸4Ó@ðFÐ �tÐ,Ð.AÐAÑBó ð  ×ÑÐ+×7Ñ7Ø×ÑÐ,×8Ñ8Ø×ÑÐ,×8Ñ8Ø×ÑÐ/×;Ñ;ð	:€ˆt�OÐ%5Ð5Ñ6ó ð ×ÑÐ+×2Ñ2Ø×ÑÐ,×3Ñ3Ø×ÑÐ,×3Ñ3Ø×ÑÐ/×6Ñ6ð	:€ˆt�OÐ%5Ð5Ñ6ó ð ×Ñð�Tò ó ðð4 ×Ñð&�oò &ó ð&ð4? Cð ?Ð,<ó ?ð%°cð %¸ió %ð 6˜bŸi™ið 6¨Ió 6ñH §¡ð H°sð HÈSó Hñ §¡ð °sð ÈSó ð¨"¯)©)ð ¸ó ð@ B§I¡Ið @°#ó @ôˆgô ô�ô ô
�ô ð €
Ø€ò âð	€ò 	Úðò 	Úðò 	Úðð	€ò, ÚÚÚð	€ò ÚÚÚð	Ð ò ÚÚÚð	Ð ò ÚÚÚð	€òò6ò6ðqRÐ ðp ×Ñ˜1Ø×Ñ˜AØ×Ñ˜BØ×Ñ˜rð	€ð ×Ñ˜5Ø×Ñ˜EØ×Ñ˜EØ×Ñ˜uð	0€��_ eÐ+Ñ,ó ð Ð ð
 ×Ñ˜4Ø×Ñ˜DØ×Ñ˜DØ×Ñ˜tð	4Ð �D˜¨%Ð/Ñ0ó ð5˜5ó 5ð8˜5ó 8ðˆcð �có ð¸eÀd¹ló ðBRØðRàðRð ðRð ð	Rð
 ðRð óRðj,Øð,àð,ð ð,ð ˆ5�#�sˆ?Ñó	,ð8Ø"ðØ03ðØ;Dðà
óð2  #ñ 8Øð 8à
ð 8ð ð 8ð 	ó	 8ðP¨2¯9©9ð ¸ó ð,&¨¯©¯©ð ,&¸3ó ,&ð^=°U·X±X·]±]ð =Àsó =ð  !%Ø#ñfØ�X‰X�]‰]ðfà˜‘:ðfð ðfð ô	fr   