Ë
    ÃÓ^j"  ã                  óÂ   — d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	Z	ddl
mZ ej                   G d„ d	«      «       Z G d
„ d«      Zdd„Zdd„Z G d„ d«      Zdd„Zy)aN  
Dynamo profiling implementation.

This module provides profiling functionality for Dynamo, including:
- ProfileMetrics: Class for collecting and aggregating performance metrics like
  execution time, operator counts, and fusion statistics
- ProfileResult: Class for analyzing and reporting profiling results
- Utilities for tracking missed/uncaptured operations
- Functions for instrumenting FX graphs with profiling capabilities

The profiler helps measure and optimize the performance of Dynamo-compiled code
by tracking both captured and total operations, timing, and graph statistics.
é    )ÚannotationsN)ÚAny)ÚSelfé   )Ú
print_oncec                  ón   — e Zd ZU dZded<   dZded<   dZded<   dZded<   dd	„Zdd
„Z	dd„Z
dd„Zdd„Zy)ÚProfileMetricsg        ÚfloatÚmicrosecondsr   ÚintÚ	operatorsÚfusionsÚgraphsc                óÀ   — | xj                   |j                   z  c_         | xj                  |j                  z  c_        | xj                  |j                  z  c_        | S ©N©r   r   r   ©ÚselfÚothers     úa/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_dynamo/profiler.pyÚ__iadd__zProfileMetrics.__iadd__"   sB   € Ø×Ò˜U×/Ñ/Ñ/ÕØ�Š˜%Ÿ/™/Ñ)�Ø�Š˜Ÿ™Ñ%�Øˆó    c                óô   — t        |t        «      st        dt        |«      › �«      ‚t        | j                  |j                  z   | j
                  |j
                  z   | j                  |j                  z   «      S )NzExpected ProfileMetrics, got )Ú
isinstancer	   ÚAssertionErrorÚtyper   r   r   r   s     r   Ú__add__zProfileMetrics.__add__(   sd   € Ü˜%¤Ô0Ü Ð#@ÄÀeÃÀÐ!NÓOÐOÜØ×Ñ × 2Ñ 2Ñ2Ø�N‰N˜UŸ_™_Ñ,Ø�L‰L˜5Ÿ=™=Ñ(ó
ð 	
r   c           	     ó  — t        |t        «      rt        |||«      }t        | j                  t	        d|j                  «      z  | j
                  t	        d|j
                  «      z  | j                  t	        d|j                  «      z  «      S )Nr   )r   r   r	   r   Úmaxr   r   r   s     r   Ú__truediv__zProfileMetrics.__truediv__1   sp   € Ü�eœSÔ!Ü" 5¨%°Ó7ˆEÜØ×Ñ¤ A u×'9Ñ'9Ó :Ñ:à�N‰NœS  E§O¡OÓ4Ñ4à�L‰Lœ3˜q %§-¡-Ó0Ñ0ó
ð 	
r   c                ó>   — | j                   d›d| j                  d›d�S )Nz4.0%z ops z time©r   r   ©r   s    r   Ú__str__zProfileMetrics.__str__<   s%   € Ø—.‘. Ð& e¨D×,=Ñ,=¸dÐ+CÀ5ÐIÐIr   c                ó2   — | j                   | j                  gS r   r"   r#   s    r   ÚtocsvzProfileMetrics.tocsv?   s   € Ø—‘ × 1Ñ 1Ð2Ð2r   N©r   r   Úreturnr   )r   r	   r(   r	   )r   r   r(   r	   ©r(   Ústr)r(   zlist[float])Ú__name__Ú
__module__Ú__qualname__r   Ú__annotations__r   r   r   r   r   r    r$   r&   © r   r   r	   r	      sC   … à€L�%ÓØ€IˆsÓØ€GˆSÓØ€FˆCƒOóó
ó	
óJô3r   r	   c                  óD   — e Zd Z	 	 	 	 	 	 	 	 dd„Zdd„Zd	d„Zd
d„Zdd„Zy)ÚProfileResultc                ó^   — |xs
 t        «       | _        |xs
 t        «       | _        || _        y r   )r	   ÚcapturedÚtotalÚunique_graphs)r   r3   r4   r5   s       r   Ú__init__zProfileResult.__init__D   s*   € ð )1Ò(D´NÓ4DˆŒØ%*Ò%>¬nÓ.>ˆŒ
Ø"/ˆÕr   c                óÀ   — | xj                   |j                   z  c_         | xj                  |j                  z  c_        | xj                  |j                  z  c_        | S r   ©r3   r4   r5   r   s     r   r   zProfileResult.__iadd__K   sB   € Ø�Š˜Ÿ™Ñ'�Ø�
Š
�e—k‘kÑ!�
Ø×Ò˜e×1Ñ1Ñ1ÕØˆr   c                ó4   — | j                   | j                  z  S r   )r3   r4   r#   s    r   ÚpercentzProfileResult.percentQ   s   € Ø�}‰}˜tŸz™zÑ)Ð)r   c                óæ   — | j                   d›d| j                  j                  d›d| j                  j                  d›d| j                  j                  d›d�t        | j                  «       «      z   S )NÚ2z graphs z graph calls Ú4ú/z = )r5   r3   r   r   r4   r*   r:   r#   s    r   r$   zProfileResult.__str__T   sj   € à×!Ñ! !Ð$ H¨T¯]©]×-AÑ-AÀ!Ð,DÀMØ�}‰}×&Ñ& qÐ)¨¨4¯:©:×+?Ñ+?ÀÐ*BÀ#ðGä�$—,‘,“.Ó!ñ"ð	
r   c                óØ   — | j                   | j                  j                  | j                  j                  | j                  j                  g| j                  «       j                  «       z   S r   )r5   r3   r   r   r4   r:   r&   r#   s    r   r&   zProfileResult.tocsv[   sU   € à×ÑØ�M‰M× Ñ Ø�M‰M×#Ñ#Ø�J‰J× Ñ ð	
ð
 �L‰L‹N× Ñ Ó"ñ#ð 	#r   N)r3   r	   r4   r	   r5   r   r(   ÚNoner'   )r(   r	   r)   )r(   ú	list[Any])r+   r,   r-   r6   r   r:   r$   r&   r/   r   r   r1   r1   C   s;   „ ð0Ø&ð0Ø/=ð0ØNQð0à	ó0óó*ó
ô#r   r1   c                 óF   — t         j                  j                  d«      dk(  S )NÚTORCHDYNAMO_PRINT_MISSINGÚ1)ÚosÚenvironÚgetr/   r   r   Úshould_print_missingrH   d   s   € Ü�:‰:�>‰>Ð5Ó6¸#Ñ=Ð=r   c                ó¢   — t        d„ | D «       «      ry | D �cg c]  }d|vsŒd|vsŒ|‘Œ } }t        ddj                  | dd  «      «       y c c}w )Nc              3  ó$   K  — | ]  }d |v –— Œ
 y­w)z/torch/autograd/profiler.pyNr/   )Ú.0Úxs     r   ú	<genexpr>z print_missing.<locals>.<genexpr>i   s   è ø€ Ò
=°!Ð(¨AÔ-Ñ
=ùs   ‚z	<built-inzsite-packages/torch/ÚMISSINGz >> éýÿÿÿ)Úanyr   Újoin)ÚstackrL   s     r   Úprint_missingrS   h   s]   € Ü
Ñ
=°uÔ
=Ô=ØàöØ˜[°Ò1Ð6LÐTUÒ6UŠð€Eð ô ˆy˜&Ÿ+™+ e¨B¨C jÓ1Õ2ùòs   ˜	A¢A§Ac                  ó,   — e Zd ZU dZded<   dd„Zdd„Zy)	ÚProfilerr   r   r5   c                ó¦   — t         j                  j                  t         j                  j                  j                  gt        «       ¬«      | _        y )N)Ú
activitiesÚ
with_stack)ÚtorchÚprofilerÚprofileÚProfilerActivityÚCPUrH   Úprofr#   s    r   r6   zProfiler.__init__t   s9   € Ü—N‘N×*Ñ*ÜŸ™×7Ñ7×;Ñ;Ð<Ü+Ó-ð +ó 
ˆ�	r   c           	     óÌ  — d}d}d}d}d}d}d}t        | j                  j                  «       d„ ¬«      }|D ]ß  }	|	j                  dk(  r!|	j                  j
                  }|dz  }|dz  }Œ3|	j                  j                  |k\  r”|	j                  j
                  }|	j                  j
                  |k  r#|dz  }||	j                  j                  «       z  }nt        «       rt        |	j                  «       |dz  }||	j                  j                  «       z  }ŒàŒá t        j                  }
dt        _        |dz  }t        t        ||||z
  |¬«      t        |||dz
  ¬«      |
¬	«      S )
Nr   éÿÿÿÿc                ó.   — | j                   j                  S r   )Ú
time_rangeÚstart)rL   s    r   ú<lambda>z"Profiler.results.<locals>.<lambda>ƒ   s   € ¸!¿,¹,×:LÑ:L€ r   )ÚkeyÚTORCHDYNAMOr   )r   r   r   r   r   r8   )Úsortedr^   ÚeventsÚnamerb   Úendrc   Ú
elapsed_usrH   rS   rR   rU   r5   r1   r	   )r   Úcaptured_regionsÚcaptured_opsÚcaptured_microsecondsÚ	total_opsÚtotal_microsecondsÚlast_op_end_timeÚcaptured_region_end_timerh   Úer5   s              r   ÚresultszProfiler.resultsz   sr  € ØÐØˆØ !ÐØˆ	ØÐàÐØ#%Ð Ü˜Ÿ	™	×(Ñ(Ó*Ñ0LÔMˆØò 	ˆAØ�v‰v˜Ò&Ø+,¯<©<×+;Ñ+;Ð(Ø  AÑ%Ð à˜Q‘‘	Ø—‘×#Ñ#Ð'7Ò7Ø#$§<¡<×#3Ñ#3Ð Ø—<‘<×#Ñ#Ð'?Ò?Ø  AÑ%�LØ)¨Q¯\©\×-DÑ-DÓ-FÑFÑ)Ü)Ô+Ü! !§'¡'Ô*Ø˜Q‘�	Ø" a§l¡l×&=Ñ&=Ó&?Ñ?Ñ"àð!	ô$ !×.Ñ.ˆØ!"ŒÔà�Q‰ˆ	äÜ#Ø2Ø&Ø$Ð'7Ñ7Ø'ô	ô !Ø/Ø#Ø! A™ôð
 (ô
ð 	
r   N)r(   r@   )r(   r1   )r+   r,   r-   r5   r.   r6   rt   r/   r   r   rU   rU   q   s   … Ø€M�3Óó
ô.
r   rU   c                óF   ‡ — dˆ fd„}t         xj                  dz  c_        |S )Nc                 óŒ   •— t         j                  j                  d«      5   ‰j                  | Ž cd d d «       S # 1 sw Y   y xY w)Nrf   )rY   rZ   Úrecord_functionÚforward)ÚargsÚgms    €r   Ú_wrappedz%fx_insert_profiling.<locals>._wrapped¬   s8   ø€ Ü�^‰^×+Ñ+¨MÓ:ñ 	%Ø�2—:‘:˜tÐ$÷	%÷ 	%ò 	%ús	   ¡:ºAr   )ry   r   r(   r   )rU   r5   )rz   Úexample_inputsr{   s   `  r   Úfx_insert_profilingr}   «   s    ø€ õ%ô ×Ò˜aÑÕØ€Or   )r(   Úbool)rR   z	list[str]r(   r@   )rz   ztorch.fx.GraphModuler|   rA   r(   r   )Ú__doc__Ú
__future__r   ÚdataclassesrE   Útypingr   Útyping_extensionsr   rY   Úutilsr   Ú	dataclassr	   r1   rH   rS   rU   r}   r/   r   r   ú<module>r†      sf   ðñõ #ã Û 	Ý Ý "ã å ð ×Ñ÷$3ð $3ó ð$3÷N#ñ #óB>ó3÷7
ñ 7
ôtr   