
    ^jt                     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     ::""$

(?(?(AA(E(	   
 !==&&x03D4< "zz00A66	 %%w/ 
 L) s%   AB0 C 0CCCCc                     t         j                  j                         rt         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SH_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"    zz UZZ%<%<%>%B

00399B;",,,A:")))A:")))A:"((({{&&33EKK4K4K4O4OPVTVH$$$	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1H1H1JEJJ++-PQMnGyy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     HTT[ Hrl   )
all_to_allalltoallc              3   &   K   | ]  }|v  
 y wrg   r   r   s     r   rk   z7get_collective_type_from_kernel_name.<locals>.<genexpr>   s     MTT[ Mrl   )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    dB001<TF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%'5z77--eh-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3Eux8F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{{ =&szz7EN3::+;+;<<<= Or   c                     t        | t        j                        r5t        | t        j                        sddlm}  || j                  d         S t        d|        )Nr   _get_group_size_by_namez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@)gU@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      =@)gK@gQ?@r   )g     :@g     2@r=   )      8@g7@g1@)gYC@g33333D@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3HX=""lne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3H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:    Av	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+   ZZFV%92>N""2&GI		(B!!**2.D \\E$.)F	n	B$U+LD& $~5ABx$q'!				*	*F	*	C :~		""..66q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      gp=
ף?gq=
ףp?r   ra   ig(\?r   r   g      ?gy5?g98?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1H1H1JEJJ++-PQMYYzM12FF>L!Q;VaZAF
  !G!G""<3I 'z2L-446F6M6MNNE 
   A:A:% {	!W ! s3!q0@'A AA
n A:fj1J>4GJ*BE#q[\aFvv&Gy~~%:=="8GUS[)		EZ-=-=$=]#,\:6BB
 
	EZ]]$:EY'1		EZ-=-=$=$k}FN,\:6BB
 
	EZ->->$>9'''i/,2OPV2W&WXE z y###fqj!	)**I,@,@A	A!	%%	%fqj!		 y~~$)*>*>">CK			S6\F23	CK	A~ *-=-B-BBgkkG
$-
CW~d#E*HW[[!$'.H!#K
!!!fqjs8[)Hy~~ { &*i.B.B&B!vz"QR
 	
 	$0;3III		9'''13vq>)A-9F6NX<UU C y~~$)*>*>">)/2&1%1"-e4W==IFfy011G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 )zFind 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>>!di.B.B&B mmZ%5%5z7H7HI 	#E
D$FA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$$$()BJPTUMGQ{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 )	zCompute 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    eAr   )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    &&	(@(@)BVBVWJ: 
!$'9*F Q#$7
$CDG	$$i&>&>??a	%%	%j1n%..':T:T1TT 4'I((3.N!S+<%<=II	)N:;Iy'6677r   c                 ^    t        |       }t        |       }t        |       }t        |||      S )zReturns 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0J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!    %affh/.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    ((,,ud+'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3NL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 JJudJ J J-588== - 	v !!%.Jj0 *tUm, 
%/
 
 %% 
J	-#J/ %% r   c                 B    ddl m} t        |       } ||       s|S |dz  S )zEstimate 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<419<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 )zReturns 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    !UXX]]+%affUm44!U\\* 6qvvx @A177AHH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%	oof-G --+1+>+>f~+N(	(	ELL 		c 	c 	 1::1^A&:	:!'!6!6yBW!X	;^^"ejj33444..V / 
 		BI--A!dE]+ FAII..::BB1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 &&&"LD&G$VL%9:J(4Jgnnejj&;&;<<</0C0C0EFD6EDL 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  $" " "    "5dD$"G  "5dD$"G  "5dD$"G  "5dD$"G0dDsSy 0dDrCx .tT4@F t,.AAB   +77,88,88/;;	:tO%556  +22,33,33/66	:tO%556  T  4 &o & &4?C ?,< ?%c %i % 6bii 6I 6H Hs HS H s S "))  @BII @# @g  
  
 	 	 	 		, 	 	  	  	66qR p 1ABr	 5EEu	0_e+,   
 4DDt	4 D%/0 55 585 8c c edl BRRR R 	R
 R Rj,,, , 5#s?	,8"03;D
2  # 8 8
 8  8 		 8P299  ,& ,&3 ,&^=UXX]] =s =  !%#fXX]]f:f f 	fr   