
    h3                        S SK r S SKrS SKrS SKrS SKJr   SS jrS rS rS r	S r
   SS jrS	 rS
 rS r\S:X  a  \" 5       r\" S\5        S SKJr  \" \R(                  5        \R*                  (       d!  \R,                  (       d   S5       e\" \5      rO\R*                  rS SKJr  \" \\5      r\ H  r\" \5        M     gg)    N)TensorProtoc           	         [         R                  " 5       nUR                  SSS[        SS9  UR                  SSS[        SS9  UR                  S	S
S[        SSS9  UR                  SSS[        SSS9  UR                  SS[        SSS9  UR                  SS[        SSS9  UR                  SS[        SSS9  UR                  SS[
        SSS9  UR                  SS[        SSS9  UR                  SS[        S S S9  UR                  S!S[        S S"S9  UR                  S#S[        S S$S9  UR                  S%SS&/ S'QS(S)9  UR                  S*S+SS,S-S.9  UR                  SS/9  UR                  S0S[        S1S2S9  UR                  S3SS,S4S.9  UR                  SS59  UR                  S6SS,S7S.9  UR                  SS89  UR                  S9S:SS,S;9  UR                  SS<9  UR                  U 5      $ )=Nz-iz--inputFz2Set the input file for reading the profile results)requiredtypehelpz-mz--modelzIonnx model path to run profiling. Required when --input is not specified.z-bz--batch_size   zbatch size of input)r   r   defaultr   z-sz--sequence_length    zsequence length of inputz--past_sequence_lengthzpast sequence length for gpt2z--global_lengthz&number of global tokens for longformerz	--samplesi  z\number of samples to test. Set it large enough to reduce the variance of performance result.z--thresholdg{Gz?zfThreshold of run time ratio among all nodes. Nodes with larger ratio will show in top expensive nodes.z--thread_numznumber of threads to usez--input_ids_namez"input name for input IDs, for bertz--segment_ids_namez$input name for segment IDs, for bertz--input_mask_namez'input name for attention mask, for bertz--dummy_inputsr	   )bertgpt2
longformerr	   zEType of model inputs. The default will create dummy inputs with ones.)r   r	   choicesr   z-gz	--use_gpu
store_truezuse GPU)r   actionr   )use_gpuz
--providercudazExecution provider to usez--basic_optimizationz_Enable only basic graph optimizations. By default, all optimizations are enabled in OnnxRuntime)basic_optimizationz--kernel_time_onlyz.Only include the kernel time and no fence time)kernel_time_onlyz-vz	--verbose)r   r   )verbose)argparseArgumentParseradd_argumentstrintfloatset_defaults
parse_args)argvparsers     [/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/profiler.pyparse_argumentsr"      s   $$&F
A   X   "   '    ,   5   k   u   '   1   3   6   9T   kE,U^_
&
(   n	   51
=	   /
kE,O
&T""    c           	          SSK Jn  U" U UUU(       + USS9nU H  nUR                  S U5      n	M     UR                  5       n
U
$ )Nr   )create_onnxruntime_sessionT)enable_all_optimizationnum_threadsenable_profiling)benchmark_helperr%   runend_profiling)onnx_model_pathr   providerr   
thread_num
all_inputsr%   sessioninputs_profile_files              r!   run_profiler4      sV    ;($6 6G KKf%  ((*Lr#   c                 ~    [        U R                  S5      5      [        :X  a  [        X R                  S5      5      $ S $ )Nvalue)r   
WhichOneofr   getattr)dims    r!   get_dim_from_type_protor:      s2    489P4QUX4X73w/0b^bbr#   c                     U R                   R                  R                   Vs/ s H  n[        U5      PM     sn$ s  snf N)tensor_typeshaper9   r:   )
type_protods     r!   get_shape_from_type_protorA      s4    0:0F0F0L0L0P0PQ0P1#A&0PQQQs   ;c                 8   0 nU R                  5        GHc  n[        UR                  5      n/ n[        U5       H-  u  p[	        U	[
        5      (       d  M  UR                  U5        M/     [        U5      S:  a    g[        U5      S:  a  XUS   '   [        U5      S:  a  X&US   '   UR                  R                  R                  n
U
[        R                  [        R                  [        R                  4;   d   eU
[        R                  :X  a  [        R                  O3U
[        R                  :X  a  [        R                   O[        R"                  n[        R$                  " XkS9nXUR&                  '   GMf     [)        U5       Vs/ s H  oPM     nnU$ s  snf )zCreate dummy inputs for ONNX model.

Args:
    onnx_model (OnnxModel): ONNX model
    batch_size (int): batch size
    sequence_length (int): sequence length
    samples (int): number of samples

Returns:
    List[Dict]: list of inputs
   Nr   r   dtype)'get_graph_inputs_excluding_initializersrA   r   	enumerate
isinstancer   appendlenr=   	elem_typer   FLOATINT32INT64numpyfloat32int64int32onesnamerange)
onnx_model
batch_sizesequence_lengthsamplesdummy_inputsgraph_inputr>   symbol_dimsir9   rK   	data_typedatar2   r/   s                  r!   create_dummy_inputsr`      s[    L!IIK)+*:*:;&FA#s##""1% '
 {a{a$.+a.!{a$3+a.!$$00::	[..0A0A;CTCTUUUU K--- MM!*k.?.?!?%++U[[ 	
 zz%1)-[%%&/ L2 ).g71,J7 8s   Fc                 J    SSK JnJn  U" XXV5      u  pnU" UUUSSU	U
USS9	nU$ )a  Create dummy inputs for BERT model.

Args:
    onnx_model (OnnxModel): ONNX model
    batch_size (int): batch size
    sequence_length (int): sequence length
    samples (int): number of samples
    input_ids_name (str, optional): Name of graph input for input IDs. Defaults to None.
    segment_ids_name (str, optional): Name of graph input for segment IDs. Defaults to None.
    input_mask_name (str, optional): Name of graph input for attention mask. Defaults to None.

Returns:
    List[Dict]: list of inputs
r   )find_bert_inputsgenerate_test_data{   F)
test_casesseedr   	input_idssegment_ids
input_maskrandom_mask_length)bert_test_datarb   rc   )rV   rW   rX   rY   input_ids_namesegment_ids_nameinput_mask_namerb   rc   rg   rh   ri   r/   s                r!   create_bert_inputsro      sG    . D)9*Vf)x&IJ# 
J r#   c                    UUUX#-   S.n0 nU R                  5        GH,  n[        UR                  5      n[        U5       H5  u  p[	        U
[
        5      (       d  M  X;  a  [        SU
 35      eXZ   X'   M7     UR                  R                  R                  nU[        R                  [        R                  [        R                  4;   d   eU[        R                  :X  a  [        R                  O3U[        R                  :X  a  [        R                  O[        R                   n[        R"                  " XS9nXUR$                  '   GM/     ['        U5       Vs/ s H  oPM     nnU$ s  snf )a  Create dummy inputs for GPT-2 model.

Args:
    onnx_model (OnnxModel): ONNX model
    batch_size (int): batch size
    sequence_length (int): sequence length
    past_sequence_length (int): past sequence length
    samples (int): number of samples

Raises:
    RuntimeError: symbolic is not supported. Use the tool convert_to_onnx.py to export ONNX model instead.

Returns:
    List[Dict]: list of inputs
)rW   seq_lenpast_seq_lentotal_seq_lensymbol is not supported: rD   )rF   rA   r   rG   rH   r   RuntimeErrorr=   rK   r   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   )rV   rW   rX   past_sequence_lengthrY   symbolsrZ   r[   r>   r]   r9   rK   r^   r_   r2   r/   s                   r!   create_gpt2_inputsrx     s@   $ !",(?	G L!IIK)+*:*:;&FA#s##%&)B3%'HII&|EH '  $$00::	[..0A0A;CTCTUUUU K--- MM!*k.?.?!?%++U[[ 	
 zz%1)-[%%&# L& ).g71,J7 8s   E)c                 2   XS.n0 nU R                  5        GH\  n[        UR                  5      n[        U5       H5  u  p[	        U
[
        5      (       d  M  X;  a  [        SU
 35      eXZ   X'   M7     UR                  R                  R                  nU[        R                  [        R                  [        R                  4;   d   eU[        R                  :X  a  [        R                  O3U[        R                  :X  a  [        R                  O[        R                   nSUR"                  ;   a   [        R$                  " XS9nSUSS2SU24'   O[        R&                  " XS9nXUR"                  '   GM_     [)        U5       Vs/ s H  oPM     nnU$ s  snf )a  Create dummy inputs for Longformer model.

Args:
    onnx_model (OnnxModel): ONNX model
    batch_size (int): batch size
    sequence_length (int): sequence length
    global_length (int): number of global tokens
    samples (int): number of samples

Raises:
    RuntimeError: symbolic is not supported. Use the tool convert_longformer_to_onnx.py to export ONNX model instead.

Returns:
    List[Dict]: list of inputs
)rW   rX   rt   globalrD   r   N)rF   rA   r   rG   rH   r   ru   r=   rK   r   rL   rM   rN   rO   rP   rQ   rR   rT   zerosrS   rU   )rV   rW   rX   global_lengthrY   rw   rZ   r[   r>   r]   r9   rK   r^   r_   r2   r/   s                   r!   create_longformer_inputsr}   ;  s_     (LGL!IIK)+*:*:;&FA#s##%&)B3%'HII&|EH '  $$00::	[..0A0A;CTCTUUUU K--- MM!*k.?.?!?%++U[[ 	 {''';;u6D&'DN]N"#::e5D)-[%%&- L0 ).g71,J7 8s   Fc           	         U R                   S:  a  U R                   O[        R                  " SS9nS[        R                  ;  a  [        U5      [        R                  S'   SSKJn  SSKJ	n  U" U" U R                  5      5      nS nU R                  S:X  aN  [        UU R                  U R                  U R                  U R                   U R"                  U R$                  5      nOU R                  S:X  a8  ['        UU R                  U R                  U R(                  U R                  5      nOsU R                  S	:X  a8  [+        UU R                  U R                  U R,                  U R                  5      nO+[/        X@R                  U R                  U R                  5      n[1        U R                  U R2                  U R4                  U R6                  U R                   U5      nU$ )
Nr   F)logicalOMP_NUM_THREADS)load)	OnnxModelr   r   r   )r.   psutil	cpu_countosenvironr   onnxr   rV   r   modelrZ   ro   rW   rX   rY   rl   rm   rn   rx   rv   r}   r|   r`   r4   r   r-   r   )argsr'   r   r   rV   r/   r3   s          r!   r*   r*   j  s   %)__q%8$//f>N>NW\>]K 

*(+K(8

$%$4

+,JJF"'OO  LL!!  

 
		f	$'OO  %%LL

 
		l	*-OO  LL

 )__dFZFZ\`\h\hi


L r#   __main__	Arguments)setup_loggerzMrequires either --model to run profiling or --input to read profiling results)process_resultsr<   )NNN)r   r   rO   r   r   r   r"   r4   r:   rA   r`   ro   rx   r}   r*   __name__	argumentsprintr)   r   r   inputr   r3   profile_result_processorr   resultsline r#   r!   <module>r      s     	   I#X&cR'^ &R-`,^3l z!I	+y!-""#??o oo9~ 8lI6Gd # r#   