Ë
    g^(hø-  ã                   óB  — d dl 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 d dlmZmZmZmZ d dlmZ  ej(                  d«      Z ej,                  «       Z ej0                  d«      Zej5                  e«       ej7                  e«       ej9                  ej:                  «       d	e_         ed
«      Z ed«      Z  G d„ de!«      Z"ddee#   de$fd„Z%ddee#   de#fd„Z&dee$   de$fd„Z' G d„ d«      Z(	 ddee(   dedeeee f   geeee    f   f   fd„Z)y)é    N)ÚSequence)ÚLock)Údefault_timer)ÚAnyÚCallableÚOptionalÚTypeVar)Ú	ParamSpecÚstrobelight_function_profilerzB%(name)s, line %(lineno)d, %(asctime)s, %(levelname)s: %(message)sFÚ_PÚ_Rc                   ó   — e Zd ZdZy)ÚStrobelightCLIProfilerErrorzC
    Raised when an error happens during strobelight profiling
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úf/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_strobelight/cli_function_profiler.pyr   r       s   „ òr   r   ÚpidÚreturnc                 ó~   — d}| xs t        j                  «       } t        j                  |j                  | «      «      S )zFReturns the link to the process's namespace, example: pid:[4026531836]z/proc/{}/ns/pid)ÚosÚgetpidÚreadlinkÚformat)r   ÚPID_NAMESPACE_PATHs     r   Ú_pid_namespace_linkr   &   s3   € à*ÐØ
Ò
”—‘“€CÜ�;‰;Ð)×0Ñ0°Ó5Ó6Ð6r   c                 óˆ   — | xs t        j                  «       } t        | «      }t        ||j	                  d«      dz   d «      S )z"Returns the process's namespace idú[é   éÿÿÿÿ)r   r   r   ÚintÚfind)r   Úlinks     r   Ú_pid_namespacer'   -   s;   € à
Ò
”—‘“€CÜ˜sÓ#€DÜˆt�D—I‘I˜c“N QÑ&¨Ð,Ó-Ð-r   Úcommandc                 ó$   — dj                  | «      S )Nú )Újoin)r(   s    r   Ú_command_to_stringr,   4   s   € Ø�8‰8�GÓÐr   c                   ó  — e Zd ZdZ e«       Zddddddddddd	œ
d
ededede	dedede
ee	      de
ee	      dedefd„Zd"d„Zd#deddfd„Zd"d„Zd"d„Zdeddfd„Zdefd„Zdeeef   dej,                  d ej.                  de
e   fd!„Zy)$ÚStrobelightCLIFunctionProfileraŸ  
    Note: this is a Meta only tool.

    StrobelightCLIFunctionProfiler can be used to profile a python function and
    generate a strobelight link with the results. It works on meta servers but
    does not requries an fbcode target.
    When stop_at_error is false(default), error during profiling does not prevent
    the work function from running.

    Check function_profiler_example.py for an example.
    FiX  g    ÐcAzpytorch-strobelight-ondemandé<   Né   )
Ústop_at_errorÚmax_profile_duration_secÚsample_eachÚrun_user_nameÚtimeout_wait_for_running_secÚtimeout_wait_for_finished_secÚrecorded_env_variablesÚsample_tagsÚstack_max_lenÚasync_stack_max_lenr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   c       
         ó‚   — || _         || _        || _        || _        || _        || _        d | _        d | _        || _        y ©N)	r1   r2   r3   r4   r5   r6   Úcurrent_run_idÚprofile_resultr8   )Úselfr1   r2   r3   r4   r5   r6   r7   r8   r9   r:   s              r   Ú__init__z'StrobelightCLIFunctionProfiler.__init__H   sN   € ð +ˆÔØ(@ˆÔ%Ø&ˆÔØ*ˆÔØ,HˆÔ)Ø-JˆÔ*ð .2ˆÔØ37ˆÔØ&ˆÕr   r   c                 óà  — t        j                  «       }t        |«      }ddddddddt        | j                  «      › d	t        | j
                  d
z  «      › d|› d|› �g}| j                  r;|j                  d«       |j                  dj                  | j                  «      «       t        j                  dt        |«      «       t        j                  |d¬«      }|j                  j                  d«      }t        j                  d|«       |j                   dk7  rt#        d|› �«      ‚t%        j&                  d|«      x}r t        |j)                  d«      «      | _        y t#        d|› �«      ‚)NÚstrobeclientÚrunz
--profilerÚpyperfz--eventÚcyclesz--asyncz--sample-intervalz--duration-msiè  z--pidú:z--sample-tagsú,úrunning command: %sT©Úcapture_outputúutf-8úoutput:
{%s}r   z:failed to start strobelight profiling, error in run_async:zINFO Run Id: (-?\d+)r"   z9failed to start strobelight profiling, unexpected result )r   r   r'   r$   r3   r2   r8   Úappendr+   ÚloggerÚdebugr,   Ú
subprocessrC   ÚstderrÚdecodeÚ
returncoder   ÚreÚsearchÚgroupr=   )r?   Ú	processIdÚ	namespacer(   ÚresultÚoutputÚmatchs          r   Ú
_run_asyncz)StrobelightCLIFunctionProfiler._run_asyncb   sW  € Ü—I‘I“Kˆ	Ü" 9Ó-ˆ	àØØØØØØØÜ�4×#Ñ#Ó$Ð%ØÜ�4×0Ñ0°4Ñ7Ó8Ð9ØØˆk˜˜9˜+Ð&ð
ˆð  ×ÒØ�N‰N˜?Ô+Ø�N‰N˜3Ÿ8™8 D×$4Ñ$4Ó5Ô6ä�‰Ð*Ô,>¸wÓ,GÔHÜ—‘ ¸Ô=ˆØ—‘×%Ñ% gÓ.ˆÜ�‰�_ fÔ-à×Ñ Ò!Ü-ØLÈVÈHÐUóð ô —I‘IÐ5°vÓ>Ð>ˆ5Ð>Ü"% e§k¡k°!£nÓ"5ˆDÔØä)ØGÈÀxÐPó
ð 	
r   Úcounterc                 óD  — |dkD  rt        d«      ‚ddd| j                  › g}t        j                  dt	        |«      «       t        j                  |d¬«      }|j                  j                  d	«      }t        j                  d
|«       |j                  dk7  rt        d|› �«      ‚t        j                  d|«      x}rU|j                  d«      }|dk(  ry |dk(  r*t        j                  d«       | j                  |dz   «       y t        d|› d�«      ‚t        d|› d�«      ‚)Né   z*wait_for_running called more than 20 timesrB   ÚgetRunStatusú--run-idrH   TrI   rK   rL   r   zAfailed to start strobelight profiling, error in wait_for_running:zProfile run status: (.*)r"   ÚRUNNINGÚ	PREPARINGé
   zunexpected z phaseúunexpected output
: r*   )r   r=   rN   rO   r,   rP   rC   rQ   rR   rS   rT   rU   rV   ÚtimeÚsleepÚ_wait_for_running)r?   r]   r(   rY   rZ   r[   Úcurrent_statuss          r   rh   z0StrobelightCLIFunctionProfiler._wait_for_running‹   s#  € Ø�RŠ<Ü-Ø<óð ð " >°:À$×BUÑBUÐAVÐXˆÜ�‰Ð*Ô,>¸wÓ,GÔHÜ—‘ ¸Ô=ˆØ—‘×%Ñ% gÓ.ˆÜ�‰�_ fÔ-à×Ñ Ò!Ü-ØSÐTZÐS[Ð\óð ô —I‘IÐ8¸&ÓAÐAˆ5ÐAØ"Ÿ[™[¨›^ˆNØ Ò*ØØ ;Ò.Ü—
‘
˜2”Ø×&Ñ& w°¡{Ô3Øä1°KÀÐ?OÈvÐ2VÓWÐWä)Ð,AÀ&ÀÈÐ*KÓLÐLr   c                 óî  — dddt        | j                  «      g}t        j                  dt	        |«      «       t        j                  |d¬«      }|j                  j                  d«      }t        j                  d|«       |j                  d	k7  rt        d
|› �«      ‚t        j                  d|«      x}r2|j                  d«      }|j                  d«      ry t        d|› d�«      ‚t        d|› d�«      ‚)NrB   ÚstopRunra   rH   TrI   rK   rL   r   z<failed to stop strobelight profiling, return code is not 0 :úINFO ::1:(.*)r"   zSuccess!z*failed to stop strobelight profiling, got z resultre   r*   )Ústrr=   rN   rO   r,   rP   rC   rQ   rR   rS   r   rT   rU   rV   Ú__contains__)r?   r(   rY   rZ   r[   ri   s         r   Ú	_stop_runz(StrobelightCLIFunctionProfiler._stop_run©   sï   € Ø! 9¨j¼#¸d×>QÑ>QÓ:RÐSˆÜ�‰Ð*Ô,>¸wÓ,GÔHÜ—‘ ¸Ô=ˆØ—‘×%Ñ% gÓ.ˆÜ�‰�_ fÔ-à×Ñ Ò!Ü-ØNÈvÈhÐWóð ô —I‘I˜o¨vÓ6Ð6ˆ5Ð6Ø"Ÿ[™[¨›^ˆNØ×*Ñ*¨:Ô6Øä1Ø@ÀÐ@PÐPWÐXóð ô *Ð,AÀ&ÀÈÐ*KÓLÐLr   c                 óà  — dddt        | j                  «      g}t        j                  dt	        |«      «       t        j                  |d¬«      }|j                  j                  d«      }t        j                  d|«       |j                  d	k7  rt        d
|› �«      ‚t        j                  d|«      x}rg|j                  d«      }|j                  d«      r&t        j                   d«       | j#                  «        y |j                  d«      st        d|› �«      ‚g | _        t        j&                  d|«      D ]2  }| xj$                  |d	   z  c_        t        j)                  |d	   «       Œ4 y )NrB   r`   ra   rH   TrI   rK   rL   r   z<failed to extract profiling results, return code is not 0 : rl   r"   zProfile run status: PROCESSINGrd   z!Profile run finished with SUCCESSz9failed to extract profiling results, unexpected response zF(Total samples(.*)|GraphProfiler(.*)|Icicle view \(python stack\)(.*)))rm   r=   rN   rO   r,   rP   rC   rQ   rR   rS   r   rT   rU   rV   rn   rf   rg   Ú_get_resultsr>   ÚfindallÚinfo)r?   r(   rY   rZ   r[   ri   Úitems          r   rq   z+StrobelightCLIFunctionProfiler._get_resultsÀ   sK  € Ø! >°:¼sÀ4×CVÑCVÓ?WÐXˆÜ�‰Ð*Ô,>¸wÓ,GÔHÜ—‘ ¸Ô=ˆØ—‘×%Ñ% gÓ.ˆÜ�‰�_ fÔ-à×Ñ Ò!Ü-ØNÈvÈhÐWóð ô —I‘I˜o¨vÓ6Ð6ˆ5Ð6Ø"Ÿ[™[¨›^ˆNØ×*Ñ*Ð+KÔLÜ—
‘
˜2”Ø×!Ñ!Ô#ØØ#×0Ñ0Ð1TÔUÜ1ØOÐPVÈxÐXóð ð !ˆÔÜ—J‘JØUØó
ò 	!ˆDð ×Ò 4¨¡7Ñ*ÕÜ�K‰K˜˜Q™Õ ñ	!r   Úcollect_resultsc                 óì   — 	 | j                  «        t        j                  d«       t        j                  d«       |sy | j	                  «        y # t
        $ r t        j                  dd¬«       Y y w xY w)Nzstrobelight profiling stoppedzcollection stoppedzerror during stop_strobelightT©Úexc_info)ro   rN   rs   rO   rq   Ú	ExceptionÚwarning)r?   ru   s     r   Ú_stop_strobelight_no_throwz9StrobelightCLIFunctionProfiler._stop_strobelight_no_throwß   s`   € ð	Kà�N‰NÔÜ�K‰KÐ7Ô8ä�L‰LÐ-Ô.á"Øà×ÑÕøÜò 	KÜ�N‰NÐ:ÀTˆNÖJð	Kús   ‚<A ¿A Á A3Á2A3c                 ó,  — d}	 | j                  «        d}t        j                  d| j                  «       | j	                  «        t        j                  d«       y# t
        $ r. t        j                  dd¬«       |r| j                  d¬«       Y yw xY w)NFTzstrobelight run id is: %szstrobelight profiling runningzerror during start_strobelight:rw   ©ru   )r\   rN   rs   r=   rh   ry   rz   r{   )r?   Ústrobelight_starteds     r   Ú_start_strobelightz1StrobelightCLIFunctionProfiler._start_strobelightò   s…   € Ø#Ðð	Ø�O‰OÔØ"&ÐÜ�K‰KÐ3°T×5HÑ5HÔIØ×"Ñ"Ô$Ü�K‰KÐ7Ô8Øøäò 	Ü�N‰NÐ<ÀtˆNÔLÙ"Ø×/Ñ/ÀÐ/ÔFÙð		ús   „AA Á4BÂBÚwork_functionÚargsÚkwargsc                 ó`  — d | _         d | _        t        j                  j	                  d«      x}�r$|s4| j
                  rt        d«      ‚t        j                  d«        ||i |¤ŽS | j                  «       }|s]| j
                  r)t        j                  j                  «        t        d«      ‚ ||i |¤Ž}t        j                  j                  «        |S 	 t        j                  d«       t        «       } ||i |¤Ž}t        «       }||z
  }	t        j                  d|	«       | j                  d¬«       t        j                  j                  «        |S y # t        $ rN}
t        j                  dd¬	«       | j                  d¬«       t        j                  j                  «        |
‚d }
~
ww xY w)
NFzconcurrent runs not supportedz%failed to start strobelight profilingzcollection startedzwork function took %s secondsTr}   zwork function throw exceptionrw   )r=   r>   r.   Ú_lockÚacquirer1   r   rN   rz   r   ÚreleaserO   Útimerrs   r{   ry   )r?   r€   r�   r‚   ÚlockedÚstartedrY   ÚstartÚendÚ
total_timeÚerrors              r   Úprofilez&StrobelightCLIFunctionProfiler.profile  sˆ  € ð #ˆÔØ"ˆÔä3×9Ñ9×AÑAÀ%ÓHÐHˆ6ÑHÙØ×%Ò%Ü5Ð6UÓVÐVä—‘Ð>Ô?Ù$ dÐ5¨fÑ5Ð5à×-Ñ-Ó/ˆGÙØ×%Ò%Ü2×8Ñ8×@Ñ@ÔBÜ5Ø?óð ñ '¨Ð7°Ñ7�Ü.×4Ñ4×<Ñ<Ô>Ø�ðÜ—‘Ð1Ô2Ü›�Ù&¨Ð7°Ñ7�Ü“g�Ø  5™[�
Ü—‘Ð;¸ZÔHØ×/Ñ/ÀÐ/ÔEÜ.×4Ñ4×<Ñ<Ô>Ø�ð øô ò Ü—‘Ð>È�ÔNØ×/Ñ/ÀÐ/ÔFÜ.×4Ñ4×<Ñ<Ô>Ø�ûð	ús   ÃA=E Å	F-ÅA	F(Æ(F-)r   N)r   )r   r   r   r   r   r„   Úboolr$   Úfloatrm   r   Úlistr@   r\   rh   ro   rq   r{   r   r   r   r   r�   r‚   rŽ   r   r   r   r.   r.   8   s2  „ ñ
ñ ‹F€Eð
 $Ø(/Ø Ø;Ø,.Ø-/Ø6:Ø+/Ø Ø#&ò'ð ð'ð #&ð	'ð
 ð'ð ð'ð '*ð'ð (+ð'ð !)¨¨c©Ñ 3ð'ð ˜d 3™iÑ(ð'ð ð'ð !ó'ó4'
ñRM¨ð M°Tó Mó<Mó.!ð>KàðKð 
óKð& Dó ð (Ø% b¨" fÑ-ð(Ø68·g±gð(ØIKÏÉð(à	�"‰ô(r   r.   Úprofilerr‚   c                 óˆ   ‡ — ‰ st        di |¤ŽŠ dt        t        t        f   dt        t        t        t           f   fˆ fd„}|S )Nr€   r   c                 ó¢   •‡ — t        j                  ‰ «      dt        j                  dt        j                  dt
        t           fˆˆ fd„«       }|S )Nr�   r‚   r   c                  ó0   •—  ‰j                   ‰g| ¢­i |¤ŽS r<   )rŽ   )r�   r‚   r’   r€   s     €€r   Úwrapper_functionz@strobelight.<locals>.strobelight_inner.<locals>.wrapper_function;  s    ø€ à#�8×#Ñ# MÐC°DÒC¸FÑCÐCr   )Ú	functoolsÚwrapsr   r�   r‚   r   r   )r€   r–   r’   s   ` €r   Ústrobelight_innerz&strobelight.<locals>.strobelight_inner8  sN   ù€ ô 
�‰˜Ó	'ð	D¤B§G¡Gð 	D´r·y±yð 	DÄXÌbÁ\õ 	Dó 
(ð	Dð  Ðr   r   )r.   r   r   r   r   )r’   r‚   r™   s   `  r   Ústrobelightrš   2  sI   ø€ ñ Ü1Ñ;°FÑ;ˆð Ü¤¤B Ñ'ð ä	”"”hœr‘lÐ"Ñ	#õ ð Ðr   r<   )*r—   Úloggingr   rT   rP   rf   Úcollections.abcr   Ú	threadingr   Útimeitr   r‡   Útypingr   r   r   r	   Útyping_extensionsr
   Ú	getLoggerrN   ÚStreamHandlerÚconsole_handlerÚ	FormatterÚ	formatterÚsetFormatterÚ
addHandlerÚsetLevelÚINFOÚ	propagater   r   ry   r   r$   rm   r   r'   r,   r.   rš   r   r   r   ú<module>r«      sW  ðó Û Û 	Û 	Û Û Ý $Ý Ý )ß 3Ó 3Ý 'ð 
ˆ×	Ñ	Ð:Ó	;€à'�'×'Ñ'Ó)€ØˆG×ÑØHó€	ð × Ñ ˜YÔ 'à × Ñ �/Ô "Ø ‡��—‘Ô Ø€Ô áˆtƒ_€ÙˆTƒ]€ô )ô ñ7˜X c™]ð 7°có 7ñ.˜ ™ð .°ó .ð ¨¡ð °#ó ÷rñ rðv :>ñØÐ5Ñ6ðØILðàˆx˜˜B˜ÑÐ  (¨2¨x¸©|Ð+;Ñ"<Ð<Ñ=ôr   