Ë
    g^(h#6  ã                  ó  — 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mZmZmZ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 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%d5d„Z&e G d„ d«      «       Z'd6d„Z( G d„ d«      Z)i Z*ded<   e G d„ d«      «       Z+e+jY                  dg d¢«       e+jY                  dg d¢«       e+jY                  d g d!¢«       e+jY                  d"g d#¢«       e+jY                  d$g d%¢«       d7d&„Z-d8d'„Z.d9d(„Z/	 	 	 	 	 	 d:d)„Z0d;d*„Z1d8d+„Z2d<d,„Z3d=d-„Z4	 	 	 	 	 	 d>d.„Z5	 	 	 	 	 	 	 	 d?d/„Z6d5d0„Z7d@d1„Z8e	dAd2„«       Z9dBd3„Z:dCd4„Z;y)Dé    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚCallableÚcastÚOptionalÚTYPE_CHECKINGÚUnion)Úconfig)Úget_benchmark_name)Ú
OrderedSet)Ú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   © ó    úU/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/metrics.pyr   r   (   s   … àÓØ Ð˜Ô r   r   zlist[CppOuterLoopFusedCount]Ú!cpp_outer_loop_fused_inner_countsc                 ó    — da dadat        j	                  «        t
        j	                  «        dadat        j	                  «        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   Úresetr)   ;   s^   € ð ÐØ%&Ð"ØÐÜ×ÑÔÜ×ÑÔØÐØÐÜ%×+Ñ+Ô-Ø !ÐØ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+   U   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_fieldsr3   d   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 r.   )Úcached_metricsr3   Úglobals)ÚselfÚmetrics     r   Ú__init__zCachedMetricsHelper.__init__o   s3   € Ø ˆÔÜ'Ó)ò 	<ˆFÜ*1«)°FÑ*;ˆD×Ñ Ò'ñ	<r   c                óz   — i }t        «       D ]"  }t        «       |   | j                  |   z
  ||<   Œ$ t        di |¤ŽS )Nr   )r3   r8   r7   r+   )r9   Údelta_metricsr:   s      r   Ú
get_deltaszCachedMetricsHelper.get_deltast   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 r.   )r3   r8   Úgetattr)Údeltar:   s     r   Úapply_deltasz CachedMetricsHelper.apply_deltas{   s-   € ä'Ó)ò 	8ˆFÜ‹I�fÓ¤¨°Ó!7Ñ7Ôñ	8r   N©ÚreturnÚNone)rD   r+   )rA   r+   rD   rE   )r   r   r   r,   r;   r>   ÚstaticmethodrB   r   r   r   r5   r5   h   s%   „ ñó<ó
4ð ò8ó ñ8r   r5   zdict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  ój   — 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                óp  — | 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                  t        t        t           |«      «       y c c}w )Nz v.s. c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr.   )Ú
isinstancerJ   )Ú.0Úis     r   ú	<genexpr>z&MetricTable.add_row.<locals>.<genexpr>œ   s   è ø€ Ò3¨!”:˜a¤×%Ñ3ùs   ‚)rK   Úenabled_metric_tablesÚlenrM   r   Úkeysr   ÚallÚ
_write_rowr   ÚlistrJ   )r9   Ú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ˆÜÑ3¨sÔ3Ô3Ð3Ð3Ø�‰œœT¤#™Y¨Ó,Õ-ùò Rs   Ã'D3c                ó"   — d| j                   › d�S )NÚmetric_table_z.csv)rK   )r9   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)rc   ÚopenÚcsvÚwriterÚwriterowrM   )r9   ÚfilenameÚfdrl   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Ú Úarf   rg   )rc   rN   ÚosÚpathÚexistsrp   Ú	enumeraterQ   Úfloatrj   rk   rl   rm   )r9   r_   rn   ÚidxÚorig_valÚnew_valro   rl   s           r   rY   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 r.   )rI   rG   )r1   rM   Útables      r   Úregister_tablezMetricTable.register_table¼   s   € ä˜D ,Ó/ˆØ).Ô  Ò&r   N)r[   z4Callable[[], dict[str, Optional[Union[str, float]]]]rD   rE   )rD   rJ   rC   )r_   rL   rD   rE   )r1   rJ   rM   rL   rD   rE   )r   r   r   r   rN   r`   rc   rp   rY   rF   r   r   r   r   rI   rI   „   sP   … àƒOØÓà€N�CÓð.ØJð.à	ó.ó(5ó@ó!ð( ò/ó ñ/r   rI   Ú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
    rr   )Ú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.
    )rV   Ú
splitlines)Úproper_kernel_fn_codes    r   Ú_parse_kernel_line_of_coder»   &  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!rr   ©Ú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!rr   r¾   )r    r´   rÂ   s      r   Ú_parse_reduction_hintrÇ   6  s>   € ð ÐCÑCØÜ
�	‰	Ð9Ð;MÓN€AÙÐ?Ð?Ó?ˆ1Ø�7‰7�1‹:Ðr   c                ó$   — | j                  |«      S r.   )Úcount)rº   Úpatterns     r   Ú_count_patternrË   @  s   € Ø ×&Ñ& wÓ/Ð/r   c                óÚ   — | j                  «       d   }|j                  d«      sJ ‚|j                  d«      }|j                  d«      }||dz   | }|j                  d«      }t	        |«      S )Nr   údef ú(z):rr   ú,)r¹   Ú
startswithÚindexÚsplitrV   )rº   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsrØ   D  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Ü   N  s!   € ð ×$Ñ$ VÓ,€IØ˜)˜*Ð%Ð%r   c                ón   — t        j                  |› d�| «      }|rt        |j                  d«      «      S y )Nz
 = ([\d]+)rr   )r¿   rÀ   r   rÁ   )rº   Únumel_arg_namerÂ   s      r   Ú_parse_numelrß   V  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.]+)rr   N)r¿   rÀ   ry   rÁ   )rÚ   r    rÂ   s      r   Ú_parse_kernel_args_num_gbrá   ^  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.
    rr   )Ú"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_tabler`   )
rž   rŸ   r´   rã   r    rÚ   rå   rº   r’   r‘   s
   ``  @@@@@@r   Úlog_kernel_metadatarè   s  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)	rG   ÚitemsrU   rc   ru   rv   rw   Úunlinkrp   )r1   r~   rn   s      r   Úpurge_old_log_filesrì   Ÿ  sb   € ô 0×5Ñ5Ó7ò !‰ˆˆeØÔ(Ó*Ò*Ø×,Ñ,Ó.ˆHÜ�w‰w�~‰~˜hÔ'Ü—	‘	˜(Ô#à×ÑÕ ñ!r   c                 ó4   — t        t        j                  «      S r.   )Úenabled_metric_tables_implr   rU   r   r   r   rU   rU   ®  s   € Ü%¤f×&BÑ&BÓCÐCr   c                óÂ   — t        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   rJ   rÒ   ÚstriprG   Úadd)Ú
config_strÚenabledr1   s      r   rî   rî   ²  sq   € äœ‰oÓ€GØ× Ñ  Ó%ò ˆØ�z‰z‹|ˆÙØØÔ/Ñ/ð 	
Ø   Ð&8Ð9ó	
Ð/ð 	�‰�DÕðð €Nr   c                ó   — | t        «       v S r.   )rU   ©r1   s    r   Úis_metric_table_enabledrö   À  s   € ØÔ(Ó*Ð*Ð*r   c                ó:   — | t         v sJ d| › d�«       ‚t         |    S )NzMetric table z is not defined)rG   rõ   s    r   rç   rç   Ä  s*   € ØÔ+Ñ+ÐR¨}¸T¸FÀ/Ð-RÓRÐ+Ü# DÑ)Ð)r   rC   )rD   rL   )r´   rJ   rD   rJ   )rº   rJ   rD   r   )r´   rJ   r    rJ   rD   úOptional[str])r    rJ   r´   rJ   rD   rø   )rº   rJ   rÊ   rJ   rD   r   )rÚ   rJ   rD   rJ   )rº   rJ   rÞ   rJ   rD   zOptional[int])rÚ   rJ   r    rJ   rD   zOptional[float])rž   rJ   rŸ   rJ   r´   rJ   rD   rE   )rD   úOrderedSet[str])rò   rJ   rD   rù   )r1   rJ   rD   Úbool)r1   rJ   rD   rI   )<Ú
__future__r   rk   r/   r±   ru   r¿   r   Ú	functoolsr   Útypingr   r   r   r	   r
   Útorch._inductorr   Útorch._inductor.utilsr   Útorch.utils._ordered_setr   Útorch._inductor.schedulerr   r   r    r!   r   r   r   r#   r$   r   r   r%   r&   r'   r(   r)   r+   r3   r5   rG   rI   r   r·   r»   rÃ   rÇ   rË   rØ   rÜ   rß   rá   rè   rì   rU   rî   rö   rç   r   r   r   ú<module>r     s<  ðÞ "ã 
Û Û Û 	Û 	Ý !Ý ß AÕ Aå "Ý 4Ý /ñ Ý;ð Ð Ø!"Ð ØÐ ð ð ð ó ð 8:€Ð4Ó 9ð Ð ð Ð ð ×Ñ÷!ð !ó ð!ð CEÐ !Ð#?Ó DàÐ Ø,-Ð )àÐ ð Ð ó!ð4 ÷3ð 3ó ð3óM÷8ñ 8ð2 46Ð Ð0Ó 5ð ÷:/ð :/ó ð:/ðz × Ñ Øòôð × Ñ Øòôð × Ñ Øòôð" × Ñ Ø-ò	ôð × Ñ Øòôó6+ó 3óðØðØ.1ðàóó0óó&óðØðØ*-ðàóð*)Øð)Ø#&ð)Ø<?ð)à	ó)óX!óDð ò
ó ð
ó+ô*r   