Ë
    øÿæiÑ  ã                  óÂ   — 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     úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torch/_dynamo/profiler.pyÚ__iadd__zProfileMetrics.__iadd__"   sB   € Ø×Ò˜U×/Ñ/Ñ/ÕØ�Š˜%Ÿ/™/Ñ)�Ø�Š˜Ÿ™Ñ%�Øˆó    c                óÊ   — t        |t        «      sJ ‚t        | j                  |j                  z   | j                  |j                  z   | j                  |j                  z   «      S r   )Ú
isinstancer	   r   r   r   r   s     r   Ú__add__zProfileMetrics.__add__(   sS   € Ü˜%¤Ô0Ð0Ð0ÜØ×Ñ × 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__0   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   r1   r2   r3   s       r   Ú__init__zProfileResult.__init__C   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   ©r1   r2   r3   r   s     r   r   zProfileResult.__iadd__J   sB   € Ø�Š˜Ÿ™Ñ'�Ø�
Š
�e—k‘kÑ!�
Ø×Ò˜e×1Ñ1Ñ1ÕØˆr   c                ó4   — | j                   | j                  z  S r   )r1   r2   r!   s    r   ÚpercentzProfileResult.percentP   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 = )r3   r1   r   r   r2   r(   r8   r!   s    r   r"   zProfileResult.__str__S   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   )r3   r1   r   r   r2   r8   r$   r!   s    r   r$   zProfileResult.tocsvZ   sU   € à×ÑØ�M‰M× Ñ Ø�M‰M×#Ñ#Ø�J‰J× Ñ ð	
ð
 �L‰L‹N× Ñ Ó"ñ#ð 	#r   N)r1   r	   r2   r	   r3   r   r&   ÚNoner%   )r&   r	   r'   )r&   ú	list[Any])r)   r*   r+   r4   r   r8   r"   r$   r-   r   r   r/   r/   B   s;   „ ð0Ø&ð0Ø/=ð0ØNQð0à	ó0óó*ó
ô#r   r/   c                 óF   — t         j                  j                  d«      dk(  S )NÚTORCHDYNAMO_PRINT_MISSINGÚ1)ÚosÚenvironÚgetr-   r   r   Úshould_print_missingrF   c   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>h   s   è ø€ Ð
=±u°!Ð(¨AÔ-±uùs   ‚z	<built-inzsite-packages/torch/ÚMISSINGz >> éýÿÿÿ)Úanyr   Újoin)ÚstackrJ   s     r   Úprint_missingrQ   g   s_   € Ü
Ñ
=±uÓ
=Ô=ØáóÙˆa˜[°Ò1Ð6LÐTUÒ6UŠ�5ð 
ð ô ˆ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   r3   c                ó¦   — t         j                  j                  t         j                  j                  j                  gt        «       ¬«      | _        y )N)Ú
activitiesÚ
with_stack)ÚtorchÚprofilerÚprofileÚProfilerActivityÚCPUrF   Úprofr!   s    r   r4   zProfiler.__init__s   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)rJ   s    r   Ú<lambda>z"Profiler.results.<locals>.<lambda>‚   s   € ¸!¿,¹,×:LÒ:Lr   )ÚkeyÚTORCHDYNAMOr   )r   r   r   r   r   r6   )Úsortedr\   ÚeventsÚnamer`   Úendra   Ú
elapsed_usrF   rQ   rP   rS   r3   r/   r	   )r   Úcaptured_regionsÚcaptured_opsÚcaptured_microsecondsÚ	total_opsÚtotal_microsecondsÚlast_op_end_timeÚcaptured_region_end_timerf   Úer3   s              r   ÚresultszProfiler.resultsy   sm  € ØÐØˆØ !ÐØˆ	ØÐàÐØ#%Ð Ü˜Ÿ	™	×(Ñ(Ó*Ñ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&   r/   )r)   r*   r+   r3   r,   r4   rr   r-   r   r   rS   rS   p   s   … Ø€M�3Óó
ô.
r   rS   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)Nrd   )rW   rX   Úrecord_functionÚforward)ÚargsÚgms    €r   Ú_wrappedz%fx_insert_profiling.<locals>._wrapped«   s/   ø€ Ü�^‰^×+Ñ+¨MÕ:Ø�2—:‘:˜tÐ$÷ ;×:Ò:ús	   ¡:ºAr   )rw   r   r&   r   )rS   r3   )rx   Úexample_inputsry   s   `  r   Úfx_insert_profilingr{   ª   s    ø€ õ%ô ×Ò˜aÑÕØ€Or   )r&   Úbool)rP   z	list[str]r&   r>   )rx   ztorch.fx.GraphModulerz   r?   r&   r   )Ú__doc__Ú
__future__r   ÚdataclassesrC   Útypingr   Útyping_extensionsr   rW   Úutilsr   Ú	dataclassr	   r/   rF   rQ   rS   r{   r-   r   r   Ú<module>r„      sf   ðñõ #ã Û 	Ý Ý "ã å ð ×Ñ÷#3ð #3ó ð#3÷L#ñ #óB>ó3÷7
ñ 7
ôtr   