Ë
    g^(h[9  ã                   óØ  — 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
 d dlZd dlmZ d dlmZ ddlmZ dd	lmZmZ  G d
„ de
«      Zg d¢Zdedefd„Zdedefd„Zdefd„Zdede	eeef      ddfd„Ze j:                   G d„ d«      «       Zdedej>                  j@                  jB                  de"de#deddfd„Z$de"de#de#ded eddfd!„Z%ded eddfd"„Z&d eddfd#„Z'ded eddfd$„Z(y)%é    N)Údefaultdict)Ú
ModuleType)ÚAnyÚOptionalÚProtocol)Ú
DeviceType)Ú
OrderedSeté   )Úbenchmarker)Úcreate_bandwidth_info_strÚget_num_bytesc                   ó    — e Zd Zdededefd„Zy)ÚBenchmarkCallableTypeÚtimesÚrepeatÚreturnc                  ó   — y ©N© )Úselfr   r   s      ú_/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/wrapper_benchmark.pyÚ__call__zBenchmarkCallableType.__call__   s   � ó    N)Ú__name__Ú
__module__Ú__qualname__ÚintÚfloatr   r   r   r   r   r      s   „ Ø=˜cÐ=¨3Ð=°5Ô=r   r   )ÚforeachÚpersistent_reductionÚ	pointwiseÚ	reductionÚ
split_scanÚtemplateÚsrc_coder   c                 ój   — t         D �cg c]  }d|› �| v sŒ|‘Œ }}t        |«      dk(  r|d   S yc c}w )z†
    Similar to get_kernel_category but use the source code. Call this API
    if we have not compile the src_code to module yet.
    z@triton_heuristics.r
   r   Úunknown)Ú_kernel_category_choicesÚlen)r%   ÚchÚchoicess      r   Ú"get_kernel_category_by_source_coder,      sM   € ô .öØÐ3FÀrÀdÐ1KÈxÒ1WŠð€Gð ô ˆ7ƒ|�qÒØ�q‰zÐàùòs   ‰0–0Ú
kernel_modc                 óx   — t         D �cg c]  }|| j                  v sŒ|‘Œ }}t        |«      dk(  r|d   S yc c}w )a  
    Given the module defining a triton kernel, return the category of the kernel.
    Category can be one of:
    - pointwise
    - reduction
    - persistent_reduction

    Currently we simply decide the category depending on what decorator is imported
    by the kernel.
    r
   r   r'   )r(   Ú__dict__r)   )r-   r*   r+   s      r   Úget_kernel_categoryr0   ,   sC   € ô 5ÖR�b¸¸j×>QÑ>QÒ8QŠrÐR€GÐRÜ
ˆ7ƒ|�qÒØ�q‰zÐàùò	 Ss   ‰7�7Úmodc                 óÖ   — ddl m} | j                  j                  «       D ��cg c]$  \  }}|j	                  d«      rt        ||«      r|‘Œ& }}}t        |«      dk(  sJ ‚|d   S c c}}w )Nr   )ÚCachingAutotunerÚtriton_r
   )Ú)torch._inductor.runtime.triton_heuristicsr3   r/   ÚitemsÚ
startswithÚ
isinstancer)   )r1   r3   ÚkÚvÚ	cand_lists        r   Úget_triton_kernelr<   >   sn   € ÝJð —L‘L×&Ñ&Ó(÷áˆAˆqØ�<‰<˜	Ô"¤z°!Ð5EÔ'Fò 	
ð€Iñ ô
 ˆy‹>˜QÒÐÐØ�Q‰<Ðùós   ¤)A%Úbenchmark_nameÚbenchmark_all_configsc                 ó®  ‡‡‡— ddl m} d}|j                  D �]$  Š‰j                  }t	        ‰d«      rt	        ‰d«      sŒ)t        ‰«      }t        ‰«      }‰j                  «       Št        |j                  j                  D �cg c]  }|j                  d«      r|‘Œ c}«      }|j                  j                  dd«      Š‰€t        ‰d|iŽd	z  Š	 dd
t        dt         t"           dt         t"           dt         t"           dt$        dt$        fˆfd„}	| d›d|dd j'                  «       › d|dd › �}
|r…t	        ‰d«      sJ ‚‰j)                  ‰«      }t+        |
«       |j-                  «       D ]G  \  }}t+        d |	||j.                  |j0                  |j2                  «      › d|j4                  › �«       ŒI n€t7        j8                  ˆˆfd„d¬«      }t        |j:                  «      dk(  sJ d«       ‚|j:                  d   }t+         |	||j.                  |j0                  |j2                  |
› d�¬«      «       |dz  }�Œ' |dk(  rt+        d«       yyc c}w ) aX  
    An experimental API used only when config.benchmark_kernel is true.

    Run the kernel benchmarks for all the kernels cached in PyCodeCache.
    Used in the compiled modules.

    Put this method here rather than codegen it for convenience since its implementation
    does not change based on different graph modules being compiled.
    r   )ÚPyCodeCacheÚget_argsÚcallÚ
in_out_ptrÚkernel_num_gbNÚnum_in_out_argsg    eÍÍAÚmsÚn_regsÚn_spillsÚsharedÚprefixr   c                 ó‚   •— t        d„ |||fD «       «      sd|d›d|d›d|d›d�}nd}‰| d	z  z  }t        | ‰|||¬
«      S )Nc              3   ó$   K  — | ]  }|d u –— Œ
 y ­wr   r   )Ú.0Úxs     r   ú	<genexpr>z>benchmark_all_kernels.<locals>.get_info_str.<locals>.<genexpr>s   s   è ø€ ÒE Q�q˜D”yÑEùs   ‚ú  Ú3z regs  z	 spills  Ú8z shared memÚ g     @�@)rJ   Úsuffix)Úanyr   )rF   rG   rH   rI   rJ   Úkernel_detail_strÚgb_per_sÚnum_gbs          €r   Úget_info_strz+benchmark_all_kernels.<locals>.get_info_strl   sl   ø€ ô ÑE¨6°8¸VÐ*DÔEÔEà˜ ˜
 '¨(°1¨°Y¸vÀa¸jÈÐTñ "ð %'Ð!à  c¡Ñ*ˆHÜ,Ø�F˜H¨VÐ<Môð r   Ú20ú é   é
   r>   rP   z @ c                  ó&   •— ‰j                  ‰ «      S r   )rB   )Úargsr-   s   €€r   ú<lambda>z'benchmark_all_kernels.<locals>.<lambda>‹   s   ø€ °:·?±?À4Ó3H€ r   é(   )Úrepr
   z.Autotuner should have selected the best config)rJ   zpNo kernel with benchmark functionality found. Make sure you run inductor with config.benchmark_kernel being True)rS   )Útorch._inductor.codecacher@   ÚmodulesÚkeyÚhasattrr<   r0   rA   r)   ÚfnÚ	arg_namesr7   Úinductor_metaÚgetr   r   r   r   ÚstrÚupperr>   Úprintr6   rG   rH   rI   Úconfigr   Úbenchmark_gpuÚ	launchers)r=   r>   r@   ÚnfoundÚ
kernel_keyÚtriton_kernelÚkernel_categoryÚarg_nameÚnum_in_out_ptrsrY   Úkernel_descÚbench_resultÚlauncherrF   r_   r-   rX   s                 @@@r   Úbenchmark_all_kernelsrz   J   s‡  ú€ õ 6à€FØ!×)Ñ)ó Aˆ
Ø—^‘^ˆ
Ü�z :Ô.´g¸jÈ&Ô6QØä)¨*Ó5ˆÜ-¨jÓ9ˆØ×"Ñ"Ó$ˆÜð !.× 0Ñ 0× :Ñ :öàØ×&Ñ& |Ô4ò òó
ˆð ×,Ñ,×0Ñ0°À$ÓGˆØˆ>Ü" DÐJ¸/ÑJÈSÑPˆFð ñ	Üð	äœS‘Mð	ô œs‘mð	ô œS‘Mð		ô
 ð	ô õ	ð( ˜bÐ!  ?°2°AÐ#6×#<Ñ#<Ó#>Ð"?¸qÀÈCÈRÀÐ@QÐRð 	ñ !Ü˜:Ð'>Ô?Ð?Ð?Ø%×;Ñ;¸DÓAˆLÜ�+ÔØ ,× 2Ñ 2Ó 4ò ‘�˜"ÜØ™ b¨(¯/©/¸8×;LÑ;LÈhÏoÉoÓ^Ð_Ð_bÐck×crÑcrÐbsÐtõñô
 ×*Ñ*Ô+HÈbÔQˆBÜ�}×.Ñ.Ó/°1Ò4ð Ø@óÐ4ð %×.Ñ.¨qÑ1ˆHÜÙØØ—O‘OØ×%Ñ%Ø—O‘OØ)˜]¨!Ð,ôôð 	�!‰ŠðCAðD �‚{ÜØ~õ	
ð ùòss   ÂI
c                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)ÚProfileEventÚcategoryre   Úself_device_time_msÚcountN)r   r   r   rk   Ú__annotations__r   r   r   r   r|   r|   ¡   s   … àƒMØ	ƒHØÓð „Lr   r|   Ú
event_listÚwall_time_msÚnrunsÚdevice_namec                 óÎ  ‡ ‡‡‡‡	‡
‡— dt         j                  j                  j                  dt        fˆfd„Š
t        t        «      Š	dt         j                  j                  j                  dt        dd fˆ	ˆ
ˆfd„}|D ]µ  }|j                  rJ d«       ‚|j                  t        j                  k(  rŒ4d}|j                  j                  d«      r\|j                  j                  d	«      rd
}n>|j                  j                  d«      rd}n |j                  j                  d«      rd}nd} |||«       Œ· dt        dt        t           dt        fˆˆfd„Šdˆ	ˆ ˆˆˆfd„} |«        y )NÚevr   c                 ó(   •— | j                   dz  ‰z  S )zV
        ev.self_device_time_total is in microsecond. Convert to millisecond.
        éè  )Úself_device_time_total)r†   rƒ   s    €r   Úget_self_device_timez6parse_profile_event_list.<locals>.get_self_device_time²   s   ø€ ð ×(Ñ(¨4Ñ/°%Ñ7Ð7r   r}   c                 ó†   •— t        || j                   ‰| «      | j                  ‰z  ¬«      }‰|   j                  |«       y )N)r}   re   r~   r   )r|   re   r   Úappend)r†   r}   Ú
profile_evÚ
all_eventsrŠ   rƒ   s      €€€r   Ú	add_eventz+parse_profile_event_list.<locals>.add_event¼   sB   ø€ ô "ØØ—‘Ù 4°RÓ 8Ø—(‘(˜UÑ"ô	
ˆ
ð 	�8Ñ×#Ñ# JÕ/r   z!Don't support the legacy profilerr'   r4   Ú
triton_poiÚtriton_pointwiseÚ
triton_redÚtriton_reductionÚ
triton_perÚtriton_persistent_reductionÚtriton_unknownÚprofile_eventsc           	      ó¼  •— ‰syddl m } |j                  d„ d¬«       g }d}t        d| › d�«       |D ]]  }||j                  z  }|j                  ‰z  d	z  d
›d�}|j	                  |j
                  d d |j                  |j                  |g«       Œ_ |j	                  d|d|‰z  d	z  d
›d�g«       t         ||dd‰j                  «       › d�ddg¬«      «       |S )Nç        r   )Útabulatec                 ó   — | j                   S r   )r~   )r†   s    r   r`   zCparse_profile_event_list.<locals>.report_category.<locals>.<lambda>á   s   € ¨2×+AÑ+A€ r   T)re   Úreversez
  == z category kernels == éd   ú.2fú%éx   ÚTotalrS   ÚKernelzSelf z
 TIME (ms)ÚCountÚPercent)Úheaders)rš   Úsortrm   r~   rŒ   re   r   rl   )	r}   r—   rš   ÚrowsÚ
total_timer†   Úpercentr„   r‚   s	          €€r   Úreport_categoryz1parse_profile_event_list.<locals>.report_categoryÛ   s  ø€ ÙØå%à×ÑÑ AÈ4ÐÔPàˆØˆ
Ü�˜�zÐ!6Ð7Ô8Ø ò 	SˆBØ˜"×0Ñ0Ñ0ˆJØ×/Ñ/°,Ñ>ÀÑDÀSÐIÈÐKˆGØ�K‰K˜Ÿ™  ˜ r×'=Ñ'=¸r¿x¹xÈÐQÕRð	Sð 	�‰Ø�j "¨°lÑ)BÀSÑ)HÈÐ(MÈQÐ&OÐPô	
ô 	ÙØàØ˜K×-Ñ-Ó/Ð0°
Ð;ØØð	ôô
	
ð Ðr   c                  ó  •— g d¢} t        ‰j                  «       «      j                  t        | «      «      sJ t        ‰j                  «       «      › «       ‚i }d}| D ]  }|‰v sŒ ‰|‰|   «      }|||<   ||z  }Œ |‰z  dz  d›d�}‰
r t	        d‰
j                  «       › d|› �«       nt	        d«       t	        d	‰d
›d�«       d‰	› �}| D ]&  }|j                  |d«      ‰z  dz  d›d�}|d|› �z  }Œ( |d|› d‰d
›d�z  }t	        |«       y )N)r‘   r“   r•   r–   r'   r™   r�   rž   rŸ   z
Percent of time when z
 is busy: zNo device detectedzTotal wall time ú.3fz mszOutput for tabulate: z, rF   )r	   ÚkeysÚissubsetÚlistrm   rl   rj   )Úcategory_listÚper_category_wall_timeÚtotal_device_msr}   Ú_timeÚdevice_busy_percentÚtabulate_liner©   rŽ   r=   r„   rª   r‚   s           €€€€€r   Úreportz(parse_profile_event_list.<locals>.reportú   sz  ø€ ò
ˆô ˜*Ÿ/™/Ó+Ó,×5Ñ5´jÀÓ6OÔPð 	
Ü�J—O‘OÓ%Ó&Ð'ó	
ÐPð "$ÐØˆØ%ò 	)ˆHØ˜:Ò%Ù'¨°*¸XÑ2FÓG�Ø38Ð& xÑ0Ø 5Ñ(‘ð		)ð "1°<Ñ!?À#Ñ!EÀcÐ JÈ!ÐLÐÙÜØ)¨+×*;Ñ*;Ó*=Ð)>¸jÐI\ÐH]Ð^õô Ð&Ô'äÐ  ¨cÐ 2°#Ð6Ô7ð 0°Ð/?Ð@ˆØ%ò 	,ˆHà)×-Ñ-¨h¸Ó<¸|ÑKÈcÑQÐRUÐVÐVWÐXð ð ˜r ' ˜^Ñ+‰Mð		,ð
 	˜2Ð1Ð2°"°\À#Ð4FÀbÐIÑIˆäˆmÕr   )r   N)ÚtorchÚautogradÚprofiler_utilÚ	EventListr   r   r¯   rk   Ú	is_legacyÚdevice_typer   ÚCPUre   r7   r|   )r=   r�   r‚   rƒ   r„   r�   r†   r}   r¶   rŽ   rŠ   rª   s   ` ```    @@@r   Úparse_profile_event_listr¾   «   s6  þ€ ð8Ü�N‰N×(Ñ(×2Ñ2ð8ä	õ8ô 1<¼DÓ0A€Jð
0Ü�N‰N×(Ñ(×2Ñ2ð
0äð
0ð 
÷
0ð ò  ˆØ—<’<ÐDÐ!DÓDÐØ�>‰>œZŸ^™^Ò+ààˆØ�6‰6×Ñ˜YÔ'Ø�v‰v× Ñ  Ô.Ø-‘Ø—‘×"Ñ" <Ô0Ø-‘Ø—‘×"Ñ" <Ô0Ø8‘à+�á�"�hÕð# ð&¤#ð ´t¼LÑ7Ið Ìeö ÷>*ñ *ñX …Hr   r   r   Úbenchmark_compiled_module_fnc                 ó   — t         j                  j                  d¬«      5 } |||¬«       d d d «       t        j                  «       › d�}j                  |«       t        d|› d�«       t        d|› �«       |j                  d¬«      }t        |j                  d	d
¬«      «       t        ||| ||z  |j                  «       y # 1 sw Y   Œ™xY w)NT)Úrecord_shapes©r   r   z/compiled_module_profile.jsonz4Profiling result for a compiled module of benchmark ú:z+Chrome trace for the profile is written to )Úgroup_by_input_shaper‰   r]   )Úsort_byÚ	row_limit)r·   ÚprofilerÚprofileÚtempfileÚ
gettempdirÚexport_chrome_tracerm   Úkey_averagesÚtabler¾   Ú
use_device)r‚   r   r   r=   r¿   ÚpÚpathr�   s           r   Úperf_profilerÑ   )  sÍ   € ô 
�‰×	Ñ	¨dÐ	Ó	3ð A°qÙ$¨5¸Õ@÷Aô ×!Ñ!Ó#Ð$Ð$AÐB€DØ×Ñ˜$ÔÜ	Ð@ÀÐ@PÐPQÐ
RÔSÜ	Ð7¸°vÐ
>Ô?Ø—‘°T�Ó:€JÜ	ˆ*×
Ñ
Ð#;ÀrÐ
Ó
JÔKÜØ˜
 L°%¸&±.À!Ç,Á,õ÷Að Aús   ¡CÃCc                 ó–  — dd l }dd l}dd l}|j                  |«      }|j                  j                  |«      }|j                  j                  |j                  j                  |«      «      d   }t        j                  «       }t        j                  j                  «       j                  d«      }	|j                  j                  |d|	› d�«      }
d|› d|› d�}dd	d
dddddddddddd|
dd|g}	 |j                  |d¬«       t        d| › d�«       t        d|
› �«       y # |j                   $ r}t        d|› �«       Y d }~y d }~ww xY w)Nr   z%Y%m%d_%H%M%SÚncu_output_z.ncu-repz import sys; sys.path.insert(0, 'z	'); from zO import benchmark_compiled_module; benchmark_compiled_module(times=1, repeat=1)Úncuz--target-processesÚallz--replay-modeÚkernelz--kernel-name-baseÚfunctionz--print-unitsÚbasez--setÚfullz--import-sourceÚyesz--force-overwritez--exportÚpythonú-cT)Úcheckz%
NCU profiling results for benchmark rÃ   zNCU report has been written to z!NCU profiling failed with error: )ÚinspectÚosÚ
subprocessÚgetfilerÐ   ÚdirnameÚsplitextÚbasenamerÉ   rÊ   ÚdatetimeÚnowÚstrftimeÚjoinÚrunrm   ÚCalledProcessError)r=   r¿   rÞ   rß   rà   Úmodule_fileÚ
module_dirÚmodule_nameÚncu_dirÚ	timestampÚ
ncu_outputÚ
python_cmdÚncu_cmdÚes                 r   Úncu_analyzerrô   >  sc  € ó ÛÛà—/‘/Ð">Ó?€KØ—‘—‘ Ó-€JØ—'‘'×"Ñ" 2§7¡7×#3Ñ#3°KÓ#@ÓAÀ!ÑD€Kä×!Ñ!Ó#€GÜ×!Ñ!×%Ñ%Ó'×0Ñ0°ÓA€IØ—‘—‘˜g¨°Y°K¸xÐ'HÓI€Jà,¨Z¨Lð 9Ø�ð ;ð	;ð ð 	ØØØØØØØØØØØØØØØØØØð'€Gð,Ø�‰�w dˆÔ+ÜÐ6°~Ð6FÀaÐHÔIÜÐ/°
¨|Ð<Õ=øà×(Ñ(ò ÜÐ1°!°Ð5Ô6Üûðús   Ã00D! Ä!EÄ0EÅEc                 óœ  — t         j                  j                  «       sJ ‚t         j                  j                  j	                  d¬«        | dd¬«       t        j                  «       › d�}t         j                  j                  j                  |«       t         j                  j                  j	                  d ¬«       t        d|› �«       y )	Ni † )Úmax_entriesr]   r
   rÂ   z/memory_snapshot.pickle)Úenabledz0The collect memory snapshot has been written to )	r·   ÚcudaÚis_availableÚmemoryÚ_record_memory_historyrÉ   rÊ   Ú_dump_snapshotrm   )r¿   Úsnapshot_paths     r   Úcollect_memory_snapshotrþ   r  s™   € ô �:‰:×"Ñ"Ô$Ð$Ð$ä	‡J�J×Ñ×,Ñ,¸Ð,Ô@Ù  r°!Õ4Ü×*Ñ*Ó,Ð-Ð-DÐE€MÜ	‡J�J×Ñ×$Ñ$ ]Ô3Ü	‡J�J×Ñ×,Ñ,°TÐ,Ô:Ü	Ð<¸]¸OÐ
LÕMr   c                 ój  — ddl }|j                  «       }|j                  dddd¬«       |j                  dd	dd
¬«       |j                  dddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  «       }|j                  rt        | |j                  «       yd}d}t        j                  j                  «       rt        j                  j                  «         |||¬«      dz  }t        j                  j                  «       r1t        j                  j                  «       }t        d|dz  d›d�«       t        j                  j                  «       r|j                  rt        |«       |j                  rt!        |||| |«       |j"                  rt%        | |«       yy)zM
    This is the function called in __main__ block of a compiled module.
    r   Nz--benchmark-kernelsz-kÚ
store_truez,Whether to benchmark each individual kernels)ÚactionÚhelpz--benchmark-all-configsrÜ   z8Whether to benchmark each individual config for a kernelz	--profilez-pz&Whether to profile the compiled modulez--cuda-memory-snapshotzÏ
            Whether to collect CUDA memory snapshot. Refer to
            "https://pytorch.org/blog/understanding-gpu-memory-1/
            for details about how to visualize the collected snapshot
        z--ncuzWhether to run ncu analysisr]   rÂ   rˆ   zPeak GPU memory usage g    €„.Ar¬   z MB)ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚbenchmark_kernelsrz   r>   r·   rø   rù   Úreset_peak_memory_statsÚmax_memory_allocatedrm   Úcuda_memory_snapshotrþ   rÈ   rÑ   rÔ   rô   )	r=   r¿   r  Úparserr_   r   r   r‚   Úpeak_mems	            r   Úcompiled_module_mainr    s¬  € ó à×$Ñ$Ó&€FØ
×ÑØØØØ;ð	 ô ð ×ÑØ!ØØØGð	 ô ð ×ÑØØØØ5ð	 ô ð ×ÑØ Øðð ô ð ×ÑØØØ*ð ô ð
 ×ÑÓ€Dà×ÒÜ˜n¨d×.HÑ.HÕIàˆØˆä�:‰:×"Ñ"Ô$Ü�J‰J×.Ñ.Ô0Ù3¸%ÈÔOÐRVÑVˆä�:‰:×"Ñ"Ô$Ü—z‘z×6Ñ6Ó8ˆHÜÐ*¨8°c©>¸#Ð*>¸cÐBÔCä�:‰:×"Ñ"Ô$¨×)BÒ)BÜ#Ð$@ÔAà�<Š<ÜØØØØØ,ôð �8Š8Ü˜Ð)EÕFð r   ))Údataclassesrå   rÉ   Úcollectionsr   Útypesr   Útypingr   r   r   r·   Útorch.autogradr   Útorch.utils._ordered_setr	   Úruntime.benchmarkingr   Úruntime.runtime_utilsr   r   r   r(   rk   r,   r0   r<   Údictrz   Ú	dataclassr|   r¸   r¹   rº   r   r   r¾   rÑ   rô   rþ   r  r   r   r   ú<module>r     sª  ðÛ Û Û Ý #Ý ß *Ñ *ã Ý %Ý /å -ß Kô>˜Hô >òÐ ð°ð ¸ó ð Jð °3ó ð$	˜:ó 	ðT
ØðT
Ø08¸¸cÀ3¸h¹Ñ0HðT
à	óT
ðn ×Ñ÷ð ó ðð{Øð{à—‘×,Ñ,×6Ñ6ð{ð ð{ð ð	{ð
 ð{ð 
ó{ð|Øðàðð ðð ð	ð
 #8ðð 
óð*1Øð1Ø7Lð1à	ó1ðh
NØ"7ð
Nà	ó
NðEGØðEGØ7LðEGà	ôEGr   