Ë
    P/æjª2  ã                  ó¤  — 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 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„ Z#e G d„ d«      «       Z$d„ Z% G d„ d«      Z&i Z'ded<   e G d„ d«      «       Z(e(jS                  dg d¢«       e(jS                  dg d¢«       e(jS                  dg d ¢«       e(jS                  d!g d"¢«       e(jS                  d#g d$¢«       d%„ Z*d&„ Z+d'„ Z,d(„ Z-d)„ Z.d*„ Z/d+„ Z0d,„ Z1d-„ Z2d.„ Z3d/„ Z4e	d3d0„«       Z5d1„ Z6d2„ Z7y)4é    )ÚannotationsN)Ú	dataclass)Ú	lru_cache)ÚDictÚListÚSetÚTupleÚTYPE_CHECKING)Úconfig)Úget_benchmark_name)Ú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   © ó    úZ/root/repos/pocs/video-evals/.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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_reorderingr   r   r   Úresetr'   8   sX   € ð ÐØ%&Ð"ØÐÜ×ÑÔÜ×ÑÔØÐØÐÜ%×+Ñ+Ô-Ø !ÐØ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)   P   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_fieldsr1   _   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_metricsr1   Úglobals)ÚselfÚmetrics     r   Ú__init__zCachedMetricsHelper.__init__j   s3   € Ø ˆÔÜ'Ó)ò 	<ˆFÜ*1«)°FÑ*;ˆD×Ñ Ò'ñ	<r   c                óz   — i }t        «       D ]"  }t        «       |   | j                  |   z
  ||<   Œ$ t        di |¤ŽS )Nr   )r1   r6   r5   r)   )r7   Údelta_metricsr8   s      r   Ú
get_deltaszCachedMetricsHelper.get_deltaso   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,   )r1   r6   Úgetattr)Údeltar8   s     r   Úapply_deltasz CachedMetricsHelper.apply_deltasv   s-   € ä'Ó)ò 	8ˆFÜ‹I�fÓ¤¨°Ó!7Ñ7Ôñ	8r   N)ÚreturnÚNone)rA   r)   )r?   r)   )r   r   r   r*   r9   r<   Ústaticmethodr@   r   r   r   r3   r3   c   s%   „ ñó<ó
4ð ò8ó ñ8r   r3   zDict[str, MetricTable]ÚREGISTERED_METRIC_TABLESc                  óX   — e Zd ZU ded<   ded<   dZded<   d„ Zd	„ Zd
„ Zd„ Ze	d„ «       Z
y)ÚMetricTableÚstrÚ
table_namez	List[str]Úcolumn_namesr   r   Únum_rows_addedc                ó  — | 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  }| j                  |«       y c c}w )Nz v.s. )rH   Úenabled_metric_tablesÚlenrI   ÚsetÚkeysr   Ú
_write_row)r7   Úrow_fnÚrow_dictÚrowÚcolumn_names        r   Úadd_rowzMetricTable.add_row†   s  € Ø�?‰?Ô"7Ó"9Ñ9Øá“8ˆÜ�4×$Ñ$Ó%¬Øó*
ò 
ð 	<ä�$×#Ñ#Ó$Ð% V¬C°«M¨?Ð;ó	<ð 
ô �4×$Ñ$Ó%¬Ø�M‰M‹Oó*
ò 
ð 	Cä�$×#Ñ#Ó$Ð% V¬C°·±³Ó,@Ð+AÐBó	Cð 
ô
 Ó ð
ˆð 	¸×9JÑ9JÖK¨+�˜Ó%ÒKÑKˆØ�‰˜Õùò Ls   Ã'D
c                ó"   — d| j                   › d�S )NÚmetric_table_z.csv)rH   )r7   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)rX   ÚopenÚcsvÚwriterÚwriterowrI   )r7   ÚfilenameÚfdra   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Ú Úar[   r\   )rX   rJ   ÚosÚpathÚexistsre   Ú	enumerateÚ
isinstanceÚfloatr_   r`   ra   rb   )r7   rS   rc   ÚidxÚorig_valÚnew_valrd   ra   s           r   rP   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,   )rF   rD   )r/   rI   Útables      r   Úregister_tablezMetricTable.register_tableµ   s   € ä˜D ,Ó/ˆØ).Ô  Ò&r   N)r   r   r   r   rJ   rU   rX   re   rP   rC   ru   r   r   r   rF   rF      s@   … àƒOØÓà€N�CÓòò$5ò@ò!ð( ñ/ó ñ/r   rF   Ú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)Úkernel1_nameÚkernel2_namerx   rz   Ú
size_hintsÚreduction_hintÚspeedupÚ'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
    rg   )Ú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.
    )rM   Ú
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!rg   ©Ú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!rg   r³   )r•   r©   r·   s      r   Ú_parse_reduction_hintr¼   ,  s<   € ØÐCÑCØÜ
�	‰	Ð9Ð;MÓN€AÙÐ?Ð?Ó?ˆ1Ø�7‰7�1‹:Ðr   c                ó$   — | j                  |«      S r,   )Úcount)r¯   Úpatterns     r   Ú_count_patternrÀ   4  s   € Ø ×&Ñ& wÓ/Ð/r   c                óÚ   — | j                  «       d   }|j                  d«      sJ ‚|j                  d«      }|j                  d«      }||dz   | }|j                  d«      }t	        |«      S )Nr   údef ú(z):rg   ú,)r®   Ú
startswithÚindexÚsplitrM   )r¯   Údef_lineÚ	start_idxÚend_idxÚdecl_csvÚcompss         r   Ú_count_argsrÍ   8  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Ñ   B  s!   € ð ×$Ñ$ VÓ,€IØ˜)˜*Ð%Ð%r   c                ón   — t        j                  |› d�| «      }|rt        |j                  d«      «      S y )Nz
 = ([\d]+)rg   )r´   rµ   r   r¶   )r¯   Únumel_arg_namer·   s      r   Ú_parse_numelrÔ   J  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.]+)rg   N)r´   rµ   ro   r¶   )rÏ   r•   r·   s      r   Ú_parse_kernel_args_num_gbrÖ   R  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.
    rg   )Ú"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>y  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_tablerU   )
r“   r”   r©   rØ   r•   rÏ   rÚ   r¯   r†   r…   s
   ``  @@@@@@r   Úlog_kernel_metadatarÝ   e  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)	rD   ÚitemsrL   rX   rj   rk   rl   Úunlinkre   )r/   rt   rc   s      r   Úpurge_old_log_filesrá   �  sb   € ô 0×5Ñ5Ó7ò !‰ˆˆeØÔ(Ó*Ò*Ø×,Ñ,Ó.ˆHÜ�w‰w�~‰~˜hÔ'Ü—	‘	˜(Ô#à×ÑÕ ñ!r   c                 óÔ   — t         j                  } 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   rL   rN   rÇ   ÚstriprD   Úadd)Ú
config_strÚenabledr/   s      r   rL   rL   ž  su   € ä×-Ñ-€Jä‹e€GØ× Ñ  Ó%ò ˆØ�z‰z‹|ˆÙØàÔ,Ñ,ð	9à ˜vÐ%7Ð8ó	9Ø,à�‰�DÕðð €Nr   c                ó   — | t        «       v S r,   )rL   ©r/   s    r   Úis_metric_table_enabledré   ®  s   € ØÔ(Ó*Ð*Ð*r   c                ó:   — | t         v sJ d| › d�«       ‚t         |    S )NzMetric table z is not defined)rD   rè   s    r   rÜ   rÜ   ²  s*   € ØÔ+Ñ+ÐR¨}¸T¸FÀ/Ð-RÓRÐ+Ü# DÑ)Ð)r   )rA   zSet[str])8Ú
__future__r   r`   r-   r¦   rj   r´   r   Ú	functoolsr   Útypingr   r   r   r	   r
   Útorch._inductorr   Útorch._inductor.utilsr   Útorch._inductor.schedulerr   r   r   r    r   r   r   r"   r#   r   r   r$   r%   r&   r'   r)   r1   r3   rD   rF   ru   r¬   r°   r¸   r¼   rÀ   rÍ   rÑ   rÔ   rÖ   rÝ   rá   rL   ré   rÜ   r   r   r   ú<module>rñ      sÛ  ðæ "ã 
Û Û Û 	Û 	Ý !Ý ß 8Õ 8å "Ý 4ñ Ý;ð Ð Ø!"Ð ØÐ ð ð ð ó ð 8:€Ð4Ó 9ð Ð ð Ð ð ×Ñ÷!ð !ó ð!ð CEÐ !Ð#?Ó DàÐ Ø,-Ð )àÐ òð0 ÷3ð 3ó ð3òM÷8ñ 8ð2 46Ð Ð0Ó 5ð ÷8/ð 8/ó ð8/ðv × Ñ Øòôð × Ñ Øòôð × Ñ Øòôð × Ñ Ø-ò	ôð × Ñ Øòôò6+ò 3òòò0òò&òòò&'òT!ð òó ðò+ó*r   