Ë
    ÄÓ^j:  ã                  óz  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ erd d	lmZ d d
lmZ d dlmZ d ad ad ag aded<   g Zded<   d ad aej                   G d„ d«      «       Z g a!ded<   d a"d a#d a$d a%ded<   d a&d a'ded<   d a(ded<   d a)ded<   d?d„Z*e G d„ d«      «       Z+d@d„Z, G d„ d«      Z-i Z.ded <   e G d!„ d"«      «       Z/e/ja                  d#g d$¢«       e/ja                  d%g d&¢«       e/ja                  d'g d(¢«       e/ja                  d)g d*¢«       e/ja                  d+g d,¢«       dAd-„Z1dBd.„Z2dCd/„Z3dDd0„Z4dEd1„Z5dBd2„Z6dFd3„Z7dGd4„Z8	 	 	 	 	 	 dHd5„Z9	 	 	 	 	 	 	 	 dId6„Z:d?d7„Z;dJd8„Z<e	dKd9„«       Z=dLd:„Z>dMd;„Z?e/ja                  d<g d=¢«       	 	 	 	 	 	 	 	 	 	 dNd>„Z@y)Oé    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚTYPE_CHECKING)Úconfig)Úget_benchmark_name)Ú
OrderedSet)ÚCallable)ÚConfig)ÚBaseSchedulerNodez#list[tuple[BaseSchedulerNode, int]]Únodes_num_elemz%list[tuple[BaseSchedulerNode, float]]Únode_runtimesc                  ó&   — e Zd ZU ded<   dZded<   y)ÚCppOuterLoopFusedCountÚintÚinner_kernel_numberr   Úlocal_buffer_numberN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © ó    úb/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/metrics.pyr   r   +   s   … àÓØ Ð˜Ô r   r   zlist[CppOuterLoopFusedCount]Ú!cpp_outer_loop_fused_inner_countsr   Únum_auto_chunkingÚcodegen_mix_order_reductionÚ#rejected_mix_order_reduction_fusionÚcodegen_nested_reductionc                 ó°   — da dadat        j	                  «        t
        j	                  «        dadat        j	                  «        da	da
dadadadadaday )Nr   )Úgenerated_kernel_countÚgenerated_cpp_vec_kernel_countÚnum_bytes_accessedr   Úclearr   Úir_nodes_pre_fusionÚcpp_to_dtype_countr   Únum_comprehensive_paddingÚ)num_matches_for_scatter_upon_const_tensorÚnum_loop_reorderingÚparallel_reduction_countr   r   r   r   r   r   r   Úresetr+   C   sv   € ð  ÐØ%&Ð"ØÐÜ×ÑÔÜ×ÑÔØÐØÐÜ%×+Ñ+Ô-Ø !ÐØ01Ð-ØÐØ ÐØ"#ÐØ*+Ð'Ø ÐØÑr   c                  óN   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   y	)
ÚCachedMetricsDeltasz]
    The subset of metrics we want update across cache hits, e.g., the
    FxGraphCache.
    r   r!   r"   r%   r&   r#   r(   N)r   r   r   Ú__doc__r   r   r   r   r-   r-   e   s-   … ñð
  ÓØ$'Ó'ØÓØÓØÓØ/2Ô2r   r-   c                 ón   — t        j                  t        «      D � cg c]  } | j                  ‘Œ c} S c c} w ©N)ÚdataclassesÚfieldsr-   Úname)Úfields    r   Úget_metric_fieldsr5   t   s&   € Ü$/×$6Ñ$6Ô7JÓ$KÖL˜5ˆE�J‹JÒLÐLùÒLs   œ2c                  ó2   — e Zd ZdZdd„Zdd„Zedd„«       Zy)	ÚCachedMetricsHelperz¯
    A helper class to help calculate and apply counter deltas for those
    metrics we want to save with cache entries (e.g., FxGraphCache) and
    apply on a cache hit.
    c                ód   — i | _         t        «       D ]  }t        «       |   | j                   |<   Œ y r0   )Úcached_metricsr5   Úglobals)ÚselfÚmetrics     r   Ú__init__zCachedMetricsHelper.__init__   s3   € Ø ˆÔÜ'Ó)ò 	<ˆFÜ*1«)°FÑ*;ˆD×Ñ Ò'ñ	<r   c                óz   — i }t        «       D ]"  }t        «       |   | j                  |   z
  ||<   Œ$ t        di |¤ŽS )Nr   )r5   r:   r9   r-   )r;   Údelta_metricsr<   s      r   Ú
get_deltaszCachedMetricsHelper.get_deltas„   sL   € ØˆÜ'Ó)ò 	TˆFÜ$+£I¨fÑ$5¸×8KÑ8KÈFÑ8SÑ$SˆM˜&Ò!ð	Tô #Ñ3 ]Ñ3Ð3r   c                ó`   — t        «       D ]!  }t        «       |xx   t        | |«      z  cc<   Œ# y r0   )r5   r:   Úgetattr)Údeltar<   s     r   Úapply_deltasz CachedMetricsHelper.apply_deltas‹   s-   € ä'Ó)ò 	8ˆFÜ‹I�fÓ¤¨°Ó!7Ñ7Ôñ	8r   N©ÚreturnÚNone)rF   r-   )rC   r-   rF   rG   )r   r   r   r.   r=   r@   ÚstaticmethodrD   r   r   r   r7   r7   x   s%   „ ñó<ó
4ð ò8ó ñ8r   r7   zdict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  ób   — e Zd ZU ded<   ded<   dZded<   dd„Zdd	„Zdd
„Zdd„Ze	dd„«       Z
y)ÚMetricTableÚstrÚ
table_nameú	list[str]Úcolumn_namesr   r   Únum_rows_addedc                óF  — | j                   t        «       vry  |«       }t        | j                  «      t        |«      k(  s(J t        | j                  «      › dt        |«      › �«       ‚t	        | j                  «      t	        |j                  «       «      k(  s6J t	        | j                  «      › dt	        |j                  «       «      › �«       ‚t        «       }|g| j                  D �cg c]  }||   ‘Œ	 c}z   }t        d„ |D «       «      sJ ‚| j                  |«       y c c}w )Nz v.s. c           	   3  ó\   K  — | ]$  }t        |t        t        t        d «      f«      –— Œ& y ­wr0   )Ú
isinstancerL   ÚfloatÚtype)Ú.0Úis     r   ú	<genexpr>z&MetricTable.add_row.<locals>.<genexpr>ª   s"   è ø€ ÒH¸q”:˜a¤#¤u¬d°4«jÐ!9×:ÑHùs   ‚*,)	rM   Úenabled_metric_tablesÚlenrO   r	   Úkeysr   ÚallÚ
_write_row)r;   Úrow_fnÚrow_dictÚbnÚcolumn_nameÚrows         r   Úadd_rowzMetricTable.add_row›   s  € Ø�?‰?Ô"7Ó"9Ñ9Øá“8ˆÜ�4×$Ñ$Ó%¬¨X«Ò6ð 	
Ü�4×$Ñ$Ó%Ð& f¬S°«]¨OÐ<ó	
Ð6ô ˜$×+Ñ+Ó,´
¸8¿=¹=»?Ó0KÒKð 	
Ü˜$×+Ñ+Ó,Ð-¨V´J¸x¿}¹}»Ó4OÐ3PÐQó	
ÐKô  Ó!ˆàˆd¸t×?PÑ?PÖQ°�h˜{Ó+ÒQÑQˆÜÑHÀCÔHÔHÐHÐHØ�‰˜Õùò Rs   Ã'Dc                ó"   — d| j                   › d�S )NÚmetric_table_z.csv)rM   )r;   s    r   Úoutput_filenamezMetricTable.output_filename­   s   € Ø˜tŸ™Ð/¨tÐ4Ð4r   c                óÒ   — | j                  «       }t        |d«      5 }t        j                  |d¬«      }|j	                  dg| j
                  z   «       d d d «       y # 1 sw Y   y xY w)NÚwú
©ÚlineterminatorÚ
model_name)rf   ÚopenÚcsvÚwriterÚwriterowrO   )r;   ÚfilenameÚfdro   s       r   Úwrite_headerzMetricTable.write_header°   s^   € Ø×'Ñ'Ó)ˆÜ�(˜CÓ ð 	@ BÜ—Z‘Z °4Ô8ˆFØ�O‰O˜\˜N¨T×->Ñ->Ñ>Ô?÷	@÷ 	@ñ 	@ús   �7AÁA&c                óÄ  — | j                  «       }| j                  dk(  r/t        j                  j	                  |«      s| j                  «        | xj                  dz  c_        t        |«      D ]&  \  }}t        |t        «      r|d›}n|€d}n|}|||<   Œ( t        |d«      5 }t        j                  |d¬«      }|j                  |«       d d d «       y # 1 sw Y   y xY w)Nr   é   z.6fÚ Úari   rj   )rf   rP   ÚosÚpathÚexistsrs   Ú	enumeraterS   rT   rm   rn   ro   rp   )r;   rb   rq   ÚidxÚorig_valÚnew_valrr   ro   s           r   r]   zMetricTable._write_row¶   sÌ   € Ø×'Ñ'Ó)ˆØ×Ñ !Ò#¬B¯G©G¯N©N¸8Ô,DØ×ÑÔà×Ò˜qÑ Õä& s›^ò 	‰MˆC�Ü˜(¤EÔ*Ø% c˜N‘ØÐ!Ø‘à"�ØˆC�ŠHð	ô �(˜CÓ ð 	! BÜ—Z‘Z °4Ô8ˆFØ�O‰O˜CÔ ÷	!÷ 	!ñ 	!ús   Â$)CÃCc                ó.   — t        | |«      }|t        | <   y r0   )rK   rI   )r3   rO   Útables      r   Úregister_tablezMetricTable.register_tableÊ   s   € ä˜D ,Ó/ˆØ).Ô  Ò&r   N)r^   z+Callable[[], dict[str, str | float | None]]rF   rG   )rF   rL   rE   )rb   zlist[str | float | None]rF   rG   )r3   rL   rO   rN   rF   rG   )r   r   r   r   rP   rc   rf   rs   r]   rH   r�   r   r   r   rK   rK   ”   s@   … àƒOØÓà€N�CÓóó$5ó@ó!ð( ò/ó ñ/r   rK   Úslow_fusion)Úkernel1_pathÚkernel1_latencyÚkernel2_pathÚkernel2_latencyÚfused_kernel_pathÚfused_kernel_latencyÚslow_down_ratioÚgraph_stats)Úgraph_idÚnum_nodes_before_fusionÚnum_nodes_after_fusionÚpersistent_red_perf)
Úkernel0_pathrƒ   r…   Úkernel3_pathÚkernel0_latencyr„   r†   Úkernel3_latencyÚ
size_hintsÚreduction_hintÚ'fusion_failure_due_to_indexing_mismatch)Úpre_grad_graph_idÚpost_grad_graph_idÚ
node1_nameÚ
node2_nameÚnode1_debug_strÚnode2_debug_strÚcommon_buffer_namesÚfailure_reasonÚkernel_metadata©Úkernel_nameÚkernel_pathÚkernel_categoryr“   r”   Úline_of_codeÚnum_loadÚ	num_storeÚnum_for_loopÚnum_atomic_addÚnum_argsÚxnumelÚynumelÚrnumelÚkernel_args_num_gbc                óž   — ddl m} ddlm} |j	                  | «      } ||«      }t        j                  |j                  j                  «      S )z±
    The kernel_module_code is the python module that contains kernel function code.
    kernel function is the proper triton kernel function annotated with
    @triton.jit
    ru   )ÚPyCodeCache)Úget_triton_kernel)Ú	codecacher®   Úwrapper_benchmarkr¯   ÚloadÚinspectÚ	getsourceÚfn)Úkernel_module_coder®   r¯   ÚmodÚkernels        r   Ú_parse_kernel_fn_coder¹   $  s@   € õ 'Ý4à
×
Ñ
Ð-Ó
.€CÙ˜sÓ#€Fô ×Ñ˜VŸY™YŸ\™\Ó*Ð*r   c                ó4   — t        | j                  «       «      S )zJ
    Return the line of code for the kernel excluding the decorators.
    )rZ   Ú
splitlines)Úproper_kernel_fn_codes    r   Ú_parse_kernel_line_of_coder½   4  s   € ô Ð$×/Ñ/Ó1Ó2Ð2r   c                ón   — |dk(  ry t        j                  d| «      }|sJ d«       ‚|j                  d«      S )NÚforeachzsize_hints=(\[[0-9, ]*\]),zsize_hints missing!ru   ©ÚreÚsearchÚgroup)r¶   r¢   Úms      r   Ú_parse_size_hintsrÅ   ;  s;   € Ø˜)Ò#àÜ
�	‰	Ð/Ð1CÓD€AÙÐ#Ð#Ó#ˆ1Ø�7‰7�1‹:Ðr   c                ól   — | dvry t        j                  d|«      }|sJ d«       ‚|j                  d«      S )N)Ú	reductionÚpersistent_reductionz$reduction_hint=ReductionHint\.(\w*),z/reduction_hint not found in kernel source code!ru   rÀ   )r¢   r¶   rÄ   s      r   Ú_parse_reduction_hintrÉ   D  s<   € ØÐCÑCØÜ
�	‰	Ð9Ð;MÓN€AÙÐ?Ð?Ó?ˆ1Ø�7‰7�1‹:Ðr   c                ó$   — | j                  |«      S r0   )Úcount)r¼   Úpatterns     r   Ú_count_patternrÍ   L  s   € Ø ×&Ñ& wÓ/Ð/r   c                óÚ   — | j                  «       d   }|j                  d«      sJ ‚|j                  d«      }|j                  d«      }||dz   | }|j                  d«      }t	        |«      S )Nr   údef ú(z):ru   ú,)r»   Ú
startswithÚindexÚsplitrZ   )r¼   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsrÚ   P  sm   € Ø$×/Ñ/Ó1°!Ñ4€HØ×Ñ˜vÔ&Ð&Ð&Ø—‘˜sÓ#€IØ�n‰n˜TÓ"€GØ˜	 A™¨Ð0€HØ�N‰N˜3Ó€EÜˆu‹:Ðr   c                ó.   — | j                  d«      }| |d S )z
    Skip decorators.
    rÏ   N)rÓ   )Úkernel_fn_codeÚ	start_poss     r   Ú_parse_proper_kernel_fn_coderÞ   Z  s!   € ð ×$Ñ$ VÓ,€IØ˜)˜*Ð%Ð%r   c                ón   — t        j                  |› d�| «      }|rt        |j                  d«      «      S y )Nz
 = ([\d]+)ru   )rÁ   rÂ   r   rÃ   )r¼   Únumel_arg_namerÄ   s      r   Ú_parse_numelrá   b  s3   € Ü
�	‰	�^Ð$ KÐ0Ð2GÓH€AÙÜ�1—7‘7˜1“:‹Ðàr   c                ój   — t        j                  d| «      }|rt        |j                  d«      «      S 	 y)z�
    inductor meta looks like:
        inductor_meta={... 'mutated_arg_names': [], 'no_x_dim': False, 'kernel_num_gb': 2.0},
    z.kernel_num_gb.:\s*([0-9.]+)ru   N)rÁ   rÂ   rT   rÃ   )rÜ   r¢   rÄ   s      r   Ú_parse_kernel_args_num_gbrã   j  s5   € ô 	�	‰	Ð1°>ÓB€AÙÜ�Q—W‘W˜Q“ZÓ Ð ð	ð r   c           
     óê   ‡ ‡‡‡‡‡‡‡	— ddl m}  ||«      Št        ‰|«      Št        |‰«      Š	t	        |«      Št        ‰«      Št        ‰«      Št        d«      j                  ˆˆˆˆ ˆˆˆˆ	fd„«       y)zå
    An utility to log kernel metadata. We may parse metadata from kernel source code here.

    It's fine to parse the generated kernel code here since the logging is
    disabled by default. It would hurt compilation time.
    ru   )Ú"get_kernel_category_by_source_coderž   c                 óÚ   •— ‰‰‰ ‰‰‰t        ‰d«      t        ‰d«      t        ‰d«      t        ‰d«      t        ‰«      t        ‰d«      t        ‰d«      t        ‰d«      t        ‰‰ «      dœS )	Nztl.loadztl.storezfor ztl.atomic_addr©   rª   r«   rŸ   )rÍ   rÚ   rá   rã   )r¢   rÜ   Úkernel_line_of_coder    r¡   r¼   r”   r“   s   €€€€€€€€r   ú<lambda>z%log_kernel_metadata.<locals>.<lambda>•  s   ø€ Ø&Ø&Ø.Ø$Ø,Ø/Ü&Ð'<¸iÓHÜ'Ð(=¸zÓJÜ*Ð+@À&ÓIÜ,Ð-BÀOÓTÜ#Ð$9Ó:Ü"Ð#8¸(ÓCÜ"Ð#8¸(ÓCÜ"Ð#8¸(ÓCÜ";Ø ó#ñ
€ r   N)	r±   rå   rÉ   rÅ   r¹   rÞ   r½   Úget_metric_tablerc   )
r    r¡   r¶   rå   r¢   rÜ   rç   r¼   r”   r“   s
   ``  @@@@@@r   Úlog_kernel_metadatarê     sp   ÿ€ õ Fá8Ð9KÓL€OÜ*¨?Ð<NÓO€NÜ"Ð#5°ÓG€JÜ*Ð+=Ó>€Nä8¸ÓHÐô 5Ð5JÓKÐäÐ&Ó'×/Ñ/÷	
ò 	
õr   c                 óþ   — t         j                  «       D ]f  \  } }| t        «       v sŒ|j                  «       }t        j
                  j                  |«      rt	        j                  |«       |j                  «        Œh y)z»
    Purge the old log file at the beginning when the benchmark script runs.
    Should do it in the parent process rather than the child processes running
    each individual model.
    N)	rI   ÚitemsrY   rf   rx   ry   rz   Úunlinkrs   )r3   r€   rq   s      r   Úpurge_old_log_filesrî   «  sb   € ô 0×5Ñ5Ó7ò !‰ˆˆeØÔ(Ó*Ò*Ø×,Ñ,Ó.ˆHÜ�w‰w�~‰~˜hÔ'Ü—	‘	˜(Ô#à×ÑÕ ñ!r   c                 ó4   — t        t        j                  «      S r0   )Úenabled_metric_tables_implr   rY   r   r   r   rY   rY   º  s   € Ü%¤f×&BÑ&BÓCÐCr   c                ó´   — t        «       }| j                  d«      D ]9  }|j                  «       }|sŒ|t        v sJ d|› d�«       ‚|j	                  |«       Œ; |S )NrÑ   zMetric table name z is not registered)r	   rÔ   ÚstriprI   Úadd)Ú
config_strÚenabledr3   s      r   rð   rð   ¾  sl   € ä)›|€GØ× Ñ  Ó%ò ˆØ�z‰z‹|ˆÙØØÔ/Ñ/ð 	
Ø   Ð&8Ð9ó	
Ð/ð 	�‰�DÕðð €Nr   c                ó   — | t        «       v S r0   )rY   ©r3   s    r   Úis_metric_table_enabledrø   Ì  s   € ØÔ(Ó*Ð*Ð*r   c                ó:   — | t         v sJ d| › d�«       ‚t         |    S )NzMetric table z is not defined)rI   r÷   s    r   ré   ré   Ð  s*   € ØÔ+Ñ+ÐR¨}¸T¸FÀ/Ð-RÓRÐ+Ü# DÑ)Ð)r   Úkernel_autotune©r¡   r    Útriton_configÚ
latency_msc                óL   ‡ ‡‡‡— t        d«      j                  ˆˆˆ ˆfd„«       y )Nrú   c                 ó$   •— ‰‰t        ‰ «      ‰dœS )Nrû   )rL   )r   r    r¡   Úlatencys   €€€€r   rè   z,log_kernel_autotune_result.<locals>.<lambda>ä  s   ø€ Ø&Ø&Ü  ›[Ø!ñ	
€ r   )ré   rc   )r¡   r    r   r   s   ````r   Úlog_kernel_autotune_resultr  à  s   û€ ô Ð&Ó'×/Ñ/ö	
õr   rE   )rF   rN   )r¶   rL   rF   rL   )r¼   rL   rF   r   )r¶   rL   r¢   rL   rF   ú
str | None)r¢   rL   r¶   rL   rF   r  )r¼   rL   rÌ   rL   rF   r   )rÜ   rL   rF   rL   )r¼   rL   rà   rL   rF   z
int | None)rÜ   rL   r¢   rL   rF   zfloat | None)r    rL   r¡   rL   r¶   rL   rF   rG   )rF   úOrderedSet[str])rô   rL   rF   r  )r3   rL   rF   Úbool)r3   rL   rF   rK   )
r¡   rL   r    rL   r   r   r   rT   rF   rG   )AÚ
__future__r   rn   r1   r³   rx   rÁ   r   Ú	functoolsr   Útypingr   Útorch._inductorr   Útorch._inductor.utilsr   Útorch.utils._ordered_setr	   Úcollections.abcr
   Ú%torch._inductor.runtime.triton_compatr   Útorch._inductor.schedulerr   r!   r"   r#   r   r   r   r%   r&   r   r   r'   r(   r)   r   r*   r   r   r   r+   r-   r5   r7   rI   rK   r�   r¹   r½   rÅ   rÉ   rÍ   rÚ   rÞ   rá   rã   rê   rî   rY   rð   rø   ré   r  r   r   r   ú<module>r     s™  ðÞ "ã 
Û Û Û 	Û 	Ý !Ý Ý  å "Ý 4Ý /ñ Ý(å<Ý;ð Ð Ø!"Ð ØÐ ð ð ð ó ð 8:€Ð4Ó 9ð Ð ð Ð ð ×Ñ÷!ð !ó ð!ð CEÐ !Ð#?Ó DàÐ Ø,-Ð )àÐ ØÐ �3Ó ð Ð à#$Ð ˜SÓ $Ø+,Ð # SÓ ,Ø !Ð ˜#Ó !óðD ÷3ð 3ó ð3óM÷8ñ 8ð2 46Ð Ð0Ó 5ð ÷8/ð 8/ó ð8/ðv × Ñ Øòôð × Ñ Øòôð × Ñ Øòôð" × Ñ Ø-ò	ôð × Ñ Øòôó6+ó 3óóó0óó&óðØðØ*-ðàóð*)Øð)Ø#&ð)Ø<?ð)à	ó)óX!óDð ò
ó ð
ó+ó*ð
 × Ñ Øòôð
Øð
Ø#&ð
Ø06ð
ØAFð
à	ô
r   