Ë
    cQêj&1  ã                   óö   — d Z ddlZddlZ ed«      Zdd„Zd„ Zdd„Zdd„Zd„ Z	d	„ Z
ed
k(  rM e«       Z ede«       ddlmZ  eej                   «       ej"                  Z e
ee«      ZeD ]
  Z ee«       Œ yy)zïThis profiler result processor print out the kernel time spent on each Node of the model.
Example of importing profile result file from onnxruntime_perf_test:
    python profile_result_processor.py --input profile_2021-10-25_12-02-41.json
é    N)ÚScanÚLoopÚIfc                 ó„  — t        j                  «       }|j                  dddt        d¬«       |j                  ddt        dd¬	«       |j                  d
dt        dd¬	«       |j                  dddd¬«       |j                  d¬«       |j                  dddd¬«       |j                  d¬«       |j                  | «      S )Nz-iz--inputFz2Set the input file for reading the profile results)ÚrequiredÚtypeÚhelpz--thresholdg{®Gáz„?zfThreshold of run time ratio among all nodes. Nodes with larger ratio will show in top expensive nodes.)r   r   Údefaultr	   z
--providerÚcudazExecution provider to usez--kernel_time_onlyÚ
store_truez.Only include the kernel time and no fence time)r   Úactionr	   )Úkernel_time_onlyz-vz	--verbose)r   r   )Úverbose)ÚargparseÚArgumentParserÚadd_argumentÚstrÚfloatÚset_defaultsÚ
parse_args)ÚargvÚparsers     úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/profile_result_processor.pyÚparse_argumentsr      sç   € Ü×$Ñ$Ó&€Fà
×ÑØØØÜØAð ô ð ×ÑØØÜØØuð ô ð ×ÑØØÜØØ(ð ô ð ×ÑØØØØ=ð	 ô ð ×Ñ¨ÐÔ/à
×Ñ˜˜k°EÀ,ÐÔOØ
×Ñ ÐÔ&à×Ñ˜TÓ"Ð"ó    c                 ó²   — t        d| › d�«       t        | «      5 }t        j                  |«      }d d d «       t	        t
        «      sJ ‚|S # 1 sw Y   ŒxY w)Nzloading profile output z ...)ÚprintÚopenÚjsonÚloadÚ
isinstanceÚlist)Úprofile_fileÚopened_fileÚ	sess_times      r   Úload_profile_jsonr&   ;   sY   € Ü	Ð# L >°Ð
6Ô7ä	ˆlÓ	ð +˜{Ü—I‘I˜kÓ*ˆ	÷+ô �i¤Ô&Ð&Ð&ØÐ÷	+ð +ús   ›AÁAc                 óô  — i }i }i }d}d}| D ]Œ  }|d   dk(  r
|d   dk(  rd}|sŒ|d   dk(  sŒ!d	|v sŒ&d
|v sŒ+d|d
   v sŒ3|d   }|d
   d   }	|	t         v rŒI|	sd|› d�}	||v r||xx   |d	   z  cc<   ||xx   dz  cc<   n|d	   ||<   d||<   |	||<   ||d	   z  }ŒŽ |sdgS g }
|
j                  d|dz  d›d�«       |
j                  d«       |
j                  d«       t        |j                  «       d„ d¬«      D ]I  \  }}||z  }||k  rŒ||   }|t	        |«      z  }|
j                  |d›d|dz  d›d|d›d|d›d|› �	«       ŒK i }|j                  «       D ]!  \  }}	||   }|	|v r||	xx   |z  cc<   Œ|||	<   Œ# |
j                  d«       |
j                  d«       |
j                  d«       t        |j                  «       d „ d¬«      D ](  \  }	}||z  }|
j                  |d›d|dz  d›d|	› �«       Œ* |
S )!a<  Parse profile data and output nodes in two sections - nodes in the original order, and top expensive nodes.

    Args:
        sess_time (List[Dict]): profile data
        threshold (int, optional): Minimum ratio of duration among all. Defaults to 0.

    Returns:
        List[str]: lines of string for output.
    r   FÚcatÚSessionÚnameÚsession_initializationTÚKernelÚdurÚargsÚop_nameú(ú)é   zNo kernel record found!z%
Top expensive kernels with Time% >= éd   ú.2fú:ú@----------------------------------------------------------------u&   Total(Î¼s)	Time%	Calls	Avg(Î¼s)	Kernelc                 ó   — | d   S ©Nr2   © ©Úxs    r   ú<lambda>z&parse_kernel_results.<locals>.<lambda>x   s
   € È1ÈQÉ4€ r   ©ÚkeyÚreverseÚ10dú	ç      Y@ú5.2fÚ5dú8.1fz
Group kernel time by operator:u   Total(Î¼s)	Time%	Operatorc                 ó   — | d   S r8   r9   r:   s    r   r<   z&parse_kernel_results.<locals>.<lambda>�   s
   € À1ÀQÁ4€ r   )Ú_NODES_TYPE_CONTAINING_SUBGRAPHÚappendÚsortedÚitemsr   )r%   Ú	thresholdÚkernel_name_to_op_nameÚkernel_timeÚkernel_freqÚtotalÚsession_initÚitemÚkernel_namer/   ÚlinesÚdurationÚratioÚcallsÚavg_timeÚop_times                   r   Úparse_kernel_resultsrY   E   s¹  € ð  ÐØ€KØ€KØ€EØ€LØò !ˆà�‰;˜)Ò#¨¨V©Ð8PÒ(PØˆLÙØà�‰;˜(Ó" u°¢}¸À4ºÈIÐY]Ð^dÑYeÒLeØ˜v™,ˆKà˜6‘l 9Ñ-ˆGØÔ9Ñ9Øñ Ø˜k˜]¨!Ð,�à˜kÑ)Ø˜KÓ(¨D°©KÑ7Ó(Ø˜KÓ(¨AÑ-Ô(à+/°©;�˜KÑ(Ø+,�˜KÑ(Ø6=Ð& {Ñ3à�T˜%‘[Ñ ‰Eð5!ñ8 Ø)Ð*Ð*ð €EØ	‡L�LÐ9¸)Àc¹/È#Ð9NÈaÐPÔQØ	‡L�L�ÔØ	‡L�LÐ=Ô>Ü!'¨×(9Ñ(9Ó(;ÁÐY]Ô!^ò jÑˆ�XØ˜5Ñ ˆØ�9ÒØà˜KÑ(ˆØœe E›lÑ*ˆØ�‰˜ �~ R¨°©°dÐ';¸2¸eÀB¸ZÀrÈ(ÐSWÈÐXZÐ[fÐZgÐhÕiðjð €GØ 6× <Ñ <Ó >ò (Ñˆ�WØ˜{Ñ+ˆØ�gÑØ�GÓ Ñ(Ôà'ˆG�GÒð(ð 
‡L�LÐ3Ô4Ø	‡L�L�ÔØ	‡L�LÐ.Ô/Ü# G§M¡M£O¹ÐQUÔVò IÑˆ�Ø˜5Ñ ˆØ�‰˜ �~ R¨°©°dÐ';¸2¸g¸YÐGÕHðIð €Lr   c                 ód  — g }i }i }i }d}| D ]ò  }|d   dk(  sŒd|v sŒd|v sŒd|d   v sŒ|d   j                  dd	«      j                  d
d	«      j                  dd	«      }	d|d   v r=|d   d   dk(  rd}
n|d   d   dk(  rd}
n|d   d   dk(  rd}
|	|vr
||	<   n||	   
k(  sJ ‚|rŒš|d   d   }|t        v rŒ«|	|v r||	xx   |d   z  cc<   ||	xx   dz  cc<   n|d   ||	<   d||	<   |j                  |	«       ||d   z  }Œô g d¢}d}|D ]d  }	||	   }||	   }|t        |«      z  }||z  dz  }|j	                  |	d	«      }||z  }|j                  |d›d|d›d|d›d|d›d|d›d|d›d|	› �«       Œf |j                  d|dz  d›d �«       |j                  d!«       |j                  d"«       t        |j                  «       d#„ d$¬%«      D ]d  \  }	}||z  }||k  rŒ||	   }|t        |«      z  }||z  dz  }|j	                  |	d	«      }|j                  |d›d|d›d|d›d|d›d|d›d|	› �«       Œf |S )&až  Parse profile data and output nodes in two sections - nodes in the original order, and top expensive nodes.

    Args:
        sess_time (List[Dict]): profile data
        kernel_time_only (bool, optional): Only include items for kernel time. Defaults to False.
        threshold (int, optional): Minimum ratio of duration among all. Defaults to 0.

    Returns:
        List[str]: lines of string for output.
    r   r(   ÚNoder-   r.   r/   r*   Ú_kernel_timeÚ Ú_fence_beforeÚ_fence_afterÚproviderÚCPUExecutionProviderÚCPUÚCUDAExecutionProviderÚCUDAÚDmlExecutionProviderÚDMLr2   )z
Nodes in the original order:r6   u3   Total(Î¼s)	Time%	Acc %	Avg(Î¼s)	Calls	Provider	Nodeg        rB   r@   rA   rC   rE   rD   Ú8sz#
Top expensive nodes with Time% >= r3   r4   r5   r6   u-   Total(Î¼s)	Time%	Avg(Î¼s)	Calls	Provider	Nodec                 ó   — | d   S r8   r9   r:   s    r   r<   z$parse_node_results.<locals>.<lambda>Ý   s
   € ÀqÈÁt€ r   Tr=   )ÚreplacerG   rH   r   ÚgetrI   rJ   )r%   r   rK   Únode_name_listÚ	node_timeÚ	node_freqÚnode_providerrO   rQ   Ú	node_nameÚdevicer/   rS   Úbefore_percentagerT   rV   rW   Ú
percentager`   rU   s                       r   Úparse_node_resultsrs   ”   sB  € ð €NØ€IØ€IØ€MØ€EØò !!ˆØ�‰;˜&Ó  U¨d¢]°vÀ²~È)ÐW[Ð\bÑWcÒJcà�V‘×$Ñ$ ^°RÓ8×@Ñ@ÀÐRTÓU×]Ñ]Ð^lÐnpÓqð ð ˜T &™\Ñ)Ø˜‘< 
Ñ+Ð/EÒEØ"‘FØ˜&‘\ *Ñ-Ð1HÒHØ#‘FØ˜&‘\ *Ñ-Ð1GÒGØ"�Fà MÑ1Ø/5�M )Ò,à(¨Ñ3°vÒ=Ð=Ð=Ù!Øà˜6‘l 9Ñ-ˆGØÔ9Ñ9Øà˜IÑ%Ø˜)Ó$¨¨U©Ñ3Ó$Ø˜)Ó$¨Ñ)Ô$à'+¨E¡{�	˜)Ñ$Ø'(�	˜)Ñ$Ø×%Ñ% iÔ0à�T˜%‘[Ñ ‰EðC!!òH€Eð
 ÐØ#ò 	
ˆ	Ø˜YÑ'ˆØ˜)Ñ$ˆØœe E›lÑ*ˆØ Ñ&¨%Ñ/ˆ
Ø ×$Ñ$ Y°Ó3ˆØ˜ZÑ'ÐØ�‰Ø˜ˆn˜B˜z¨$Ð/¨rÐ2CÀDÐ1IÈÈHÐUYÈ?ÐZ\Ð]bÐceÐ\fÐfhÐiqÐrtÐhuÐuwð  yBð  xCð  Dõ	
ð	
ð 
‡L�LÐ7¸	ÀC¹ÈÐ7LÈAÐNÔOØ	‡L�L�ÔØ	‡L�LÐEÔFÜ% i§o¡oÓ&7¹^ÐUYÔZò 	tÑˆ	�8Ø˜5Ñ ˆØ�9ÒØà˜)Ñ$ˆØœe E›lÑ*ˆØ Ñ&¨%Ñ/ˆ
Ø ×$Ñ$ Y°Ó3ˆØ�‰˜ �~ R¨
°4Ð'8¸¸8ÀD¸/ÈÈEÐRTÈ:ÐUWÐX`ÐacÐWdÐdfÐgpÐfqÐrÕsð	tð €Lr   c                 ó2  — i }i }d}i }i }i }i }d}i }	| D �]  }
|
d   dk(  sŒd|
v sŒd|
v sŒd|
d   v sŒ|
d   d   }|t         v rŒ0d|
d   vr-d|
d	   v r%||v r||xx   |
d   z  cc<   n|
d   ||<   ||
d   z  }Œd|
d   j                  dd
«      }||	v r|	|xx   dz  cc<   nd|	|<   |› d|› �}||v r||xx   |
d   z  cc<   ||xx   dz  cc<   n|
d   ||<   d||<   ||v r||xx   |
d   z  cc<   n|
d   ||<   ||v r||xx   |
d   z  cc<   ||xx   dz  cc<   n|
d   ||<   d||<   ||
d   z  }�Œ d
dg}|j                  d«       |j                  d«       t        |j	                  «       d„ d¬«      D ]h  \  }}|j                  |d«      }||z  }||z   }|||z   z  }||   }||z  }|j                  |d›d|dz  d›d|d›d|dz  d›d|d›d|d›d|d›d|› �«       Œj |d
dgz  }|j                  d«       |j                  d«       t        |j	                  «       d„ d¬«      D ]n  \  }}|j                  d«      }|d   }|d   }|j                  dd
«      }||   }||z  }|||   z  }|j                  |d›d|dz  d›d|d›d|d›d|d›d|› �«       Œp |S ) z™Group results by operator name.

    Args:
        sess_time (List[Dict]): profile data

    Returns:
        List[str]: lines of string for output.
    r   r(   r[   r-   r.   r/   r`   Úfencer*   r]   r2   r5   zGrouped by operatorr6   uM   Total(Î¼s)	Time%	Kernel(Î¼s)	Kernel%	Calls	AvgKernel(Î¼s)	Fence(Î¼s)	Operatorc                 ó   — | d   S r8   r9   r:   s    r   r<   z$group_node_results.<locals>.<lambda>0  s
   € ÈQÈqÉT€ r   Tr=   r@   rA   rB   rC   Ú11drD   z14.1fzGrouped by provider + operatoru<   Kernel(Î¼s)	Provider%	Calls	AvgKernel(Î¼s)	Provider	Operatorc                 ó   — | d   S r8   r9   r:   s    r   r<   z$group_node_results.<locals>.<lambda>>  s   € ÐRSÐTUÑRV€ r   ÚExecutionProviderz9.2frg   )rG   rj   rH   rI   rJ   Úsplitri   )r%   Úop_kernel_timeÚop_kernel_recordsÚtotal_kernel_timeÚprovider_op_kernel_timeÚprovider_op_kernel_recordsÚprovider_kernel_timeÚop_fence_timeÚtotal_fence_timeÚprovider_counterrQ   r/   r`   r>   rS   rM   Ú
fence_timeÚkernel_time_ratioÚ
total_timeÚ
time_ratioÚkernel_callsÚavg_kernel_timeÚpartsÚshort_eprV   Úprovider_time_ratios                             r   Úgroup_node_resultsr�   ë   s7  € ð €NØÐØÐà ÐØ!#ÐØÐà€MØÐàÐØó +-ˆØ�‰;˜&Ó  U¨d¢]°vÀ²~È)ÐW[Ð\bÑWcÒJcØ˜6‘l 9Ñ-ˆGð Ô9Ñ9Øà  f¡Ñ-Ø˜d 6™lÑ*Ø -Ñ/Ø% gÓ.°$°u±+Ñ=Ô.à15°e±˜ gÑ.Ø$¨¨U©Ñ3Ð$Øà˜F‘|×'Ñ'¨
°BÓ7ˆHØÐ+Ñ+Ø  Ó*¨aÑ/Ô*à-.Ð  Ñ*à�J˜a ˜yÐ)ˆCØÐ-Ñ-Ø'¨Ó,°°U±Ñ;Ó,Ø*¨3Ó/°1Ñ4Ô/à/3°E©{Ð'¨Ñ,Ø23Ð*¨3Ñ/àÐ/Ñ/Ø$ XÓ.°$°u±+Ñ=Ô.à15°e±Ð$ XÑ.à˜.Ñ(Ø˜wÓ'¨4°©;Ñ6Ó'Ø! 'Ó*¨aÑ/Ô*à*.¨u©+�˜wÑ'Ø-.Ð! 'Ñ*à  e¡Ñ,ÒðW+-ðZ Ð&Ð'€EØ	‡L�L�ÔØ	‡L�LÐgÔhÜ & ~×';Ñ';Ó'=Á>Ð[_Ô `ò 	
Ñˆ�Ø"×&Ñ& w°Ó2ˆ
Ø'Ð*;Ñ;ÐØ  :Ñ-ˆ
ØÐ#4Ð7GÑ#GÑHˆ
Ø(¨Ñ1ˆØ%¨Ñ4ˆØ�‰Ø˜#Ð˜b ¨eÑ!3°DÐ 9¸¸KÈÐ;LÈBÐO`ÐchÑOhÐimÐNnÐnpÐq}ð  Að  qBð  BDð  ETð  UZð  D[ð  []ð  ^hð  ilð  ]mð  moð  pwð  oxð  yõ	
ð	
ð 
ˆbÐ2Ð3Ñ3€EØ	‡L�L�ÔØ	‡L�LÐTÔUÜ"Ð#:×#@Ñ#@Ó#BÉÐ`dÔeò 

Ñˆˆ[Ø—	‘	˜#“ˆØ˜‘8ˆØ˜‘(ˆØ×#Ñ#Ð$7¸Ó<ˆØ*¨3Ñ/ˆØ%¨Ñ-ˆØ)Ð,@ÀÑ,JÑJÐØ�‰Ø˜3Ð˜rÐ"5¸Ñ"=¸dÐ!CÀ2ÀeÈBÀZÈrÐRaÐbgÐQhÐhjÐksÐtvÐjwÐwyð  {Bð  zCð  Dõ	
ð

ð €Lr   c                 ó¬   — t        | «      }t        ||j                  «      }|t        ||j                  |j                  «      z  }|t        |«      z  }|S ©N)r&   rY   rK   rs   r   r�   )r#   r.   Úprofile_recordsrS   s       r   Úprocess_resultsr‘   M  sO   € Ü'¨Ó5€Oä  °$·.±.ÓA€Eà	Ô °×1FÑ1FÈÏÉÓWÑW€Eà	Ô Ó0Ñ0€Eà€Lr   Ú__main__Ú	Arguments)Úsetup_loggerr�   )r   )Fr   )Ú__doc__r   r   Ú	frozensetrG   r   r&   rY   rs   r�   r‘   Ú__name__Ú	argumentsr   Úbenchmark_helperr”   r   Úinputr#   ÚresultsÚliner9   r   r   ú<module>r�      s    ðñó
 Û á"+Ð,BÓ"CÐ ó'#òTóLó^Tòn_òD	ð ˆzÒÙÓ!€IÙ	ˆ+�yÔ!å-á�×"Ñ"Ô#à—?‘?€Lá˜l¨IÓ6€Gàò ˆÙˆd�ñð r   