Ë
    ÝÍ:jö3  ã                   ór  — d dl Z d dlZd dlZd dlZd dlmZ 	 dd„Zd„ Zd„ Zd„ Z	d„ Z
	 	 	 dd„Zd	„ Zd
„ Zd„ Zedk(  r{ e«       Z ede«       d dlmZ  eej(                  «       ej*                  sej,                  sJ d«       ‚ ee«      Znej*                  Zd dlmZ  eee«      ZeD ]
  Z ee«       Œ yy)é    N)ÚTensorProtoc                 ó^  — t        j                  «       }|j                  dddt        d¬«       |j                  dddt        d¬«       |j                  d	d
dt        dd¬«       |j                  dddt        dd¬«       |j                  ddt        dd¬«       |j                  ddt        dd¬«       |j                  ddt        dd¬«       |j                  ddt
        dd¬«       |j                  ddt        dd¬«       |j                  ddt        d d ¬«       |j                  d!dt        d d"¬«       |j                  d#dt        d d$¬«       |j                  d%dd&g d'¢d(¬)«       |j                  d*d+dd,d-¬.«       |j                  d¬/«       |j                  d0dt        d1d2¬«       |j                  d3dd,d4¬.«       |j                  d¬5«       |j                  d6dd,d7¬.«       |j                  d¬8«       |j                  d9d:dd,¬;«       |j                  d¬<«       |j                  | «      S )=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{®Gáz„?zfThreshold of run time ratio among all nodes. Nodes with larger ratio will show in top expensive nodes.z--thread_numéÿÿÿÿz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     úv/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/transformers/profiler.pyÚparse_argumentsr"      sÖ  € Ü×$Ñ$Ó&€Fà
×ÑØØØÜØAð ô ð ×ÑØØØÜØXð ô ð ×ÑØØØÜØØ"ð ô ð ×ÑØØØÜØØ'ð ô ð ×ÑØ ØÜØØ,ð ô ð ×ÑØØÜØØ5ð ô ð ×ÑØØÜØØkð ô ð ×ÑØØÜØØuð ô ð ×ÑØØÜØØ'ð ô ð ×ÑØØÜØØ1ð ô ð ×ÑØØÜØØ3ð ô ð ×ÑØØÜØØ6ð ô ð ×ÑØØØÚ9ØTð ô ð ×Ñ˜˜k°EÀ,ÐU^ÐÔ_Ø
×Ñ ÐÔ&à
×ÑØØÜØØ(ð ô ð ×ÑØØØØnð	 ô ð ×Ñ¨5ÐÔ1à
×ÑØØØØ=ð	 ô ð ×Ñ¨ÐÔ/à
×Ñ˜˜k°EÀ,ÐÔOØ
×Ñ ÐÔ&à×Ñ˜TÓ"Ð"ó    c                 ó‚   — ddl m}  || ||| |d¬«      }|D ]  }|j                  d |«      }	Œ |j                  «       }
|
S )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   �   s[   € Ý;á(ØØØØ$6Ð 6ØØô€Gð ò &ˆØ�K‰K˜˜fÓ%‰ð&ð ×(Ñ(Ó*€LØÐr#   c                 ó~   — t        | j                  d«      «      t        k(  rt        | | j                  d«      «      S d S )NÚvalue)r   Ú
WhichOneofr   Úgetattr)Údims    r!   Úget_dim_from_type_protor:   °   s4   € Ü48¸¿¹ÈÓ9PÓ4QÔUXÒ4XŒ7�3˜Ÿ™ wÓ/Ó0ÐbÐ^bÐbr#   c                 óz   — | j                   j                  j                  D �cg c]  }t        |«      ‘Œ c}S c c}w ©N)Útensor_typeÚshaper9   r:   )Ú
type_protoÚds     r!   Úget_shape_from_type_protorA   ´   s.   € Ø0:×0FÑ0F×0LÑ0L×0PÑ0PÖQ¨1Ô# AÕ&ÒQÐQùÒQs   £8c                 ó   — i }| j                  «       D �]Z  }t        |j                  «      }g }t        |«      D ]'  \  }}	t	        |	t
        «      sŒ|j                  |«       Œ) t        |«      dkD  r yt        |«      dkD  r|||d   <   t        |«      dkD  r|||d   <   |j                  j                  j                  }
|
t        j                  t        j                  t        j                  fv sJ ‚|
t        j                  k(  rt        j                  n2|
t        j                  k(  rt        j                   nt        j"                  }t        j$                  ||¬«      }|||j&                  <   �Œ] t)        |«      D �cg c]  }|‘Œ }}|S c c}w )a  Create 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`   ¸   sj  € ð €LØ!×IÑIÓKó .ˆÜ)¨+×*:Ñ*:Ó;ˆØˆÜ Ó&ò 	&‰FˆAˆsÜ˜#œsÕ#Ø×"Ñ" 1Õ%ð	&ô
 ˆ{Ó˜aÒÙÜˆ{Ó˜aÒØ$.ˆE�+˜a‘.Ñ!Üˆ{Ó˜aÒØ$3ˆE�+˜a‘.Ñ!à×$Ñ$×0Ñ0×:Ñ:ˆ	Øœ[×.Ñ.´×0AÑ0AÄ;×CTÑCTÐUÑUÐUÐUð œK×-Ñ-Ò-ô �MŠMà!*¬k×.?Ñ.?Ò!?”%—+’+ÄUÇ[Á[ð 	ô
 �z‰z˜% yÔ1ˆØ)-ˆ�[×%Ñ%Ó&ð/.ô2 ).¨g«Ö7 1’,Ð7€JÐ7ØÐùò 8s   Å>	Fc                 óV   — ddl m}m}  || |||«      \  }	}
} ||||dd|	|
|d¬«	      }|S )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   â   sN   € ÷. Dá)9¸*ÀnÐVfÐhwÓ)xÑ&€Iˆ{˜JÙ#ØØØØØØØØØ ô
€Jð Ðr#   c                 óÊ  — |||||z   dœ}i }| j                  «       D �]%  }t        |j                  «      }t        |«      D ]0  \  }	}
t	        |
t
        «      sŒ|
|vrt        d|
› �«      ‚||
   ||	<   Œ2 |j                  j                  j                  }|t        j                  t        j                  t        j                  fv sJ ‚|t        j                  k(  rt        j                  n2|t        j                  k(  rt        j                  nt        j                   }t        j"                  ||¬«      }|||j$                  <   �Œ( t'        |«      D �cg c]  }|‘Œ }}|S c c}w )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     sT  € ð$ !Ø"Ø,Ø(Ð+?Ñ?ñ	€Gð €LØ!×IÑIÓKó .ˆÜ)¨+×*:Ñ*:Ó;ˆÜ Ó&ò 	,‰FˆAˆsÜ˜#œsÕ#Ø˜gÑ%Ü&Ð)BÀ3À%Ð'HÓIÐIà& s™|�E˜!’Hð	,ð  ×$Ñ$×0Ñ0×:Ñ:ˆ	Øœ[×.Ñ.´×0AÑ0AÄ;×CTÑCTÐUÑUÐUÐUð œK×-Ñ-Ò-ô �MŠMà!*¬k×.?Ñ.?Ò!?”%—+’+ÄUÇ[Á[ð 	ô
 �z‰z˜% yÔ1ˆØ)-ˆ�[×%Ñ%Ó&ð#.ô& ).¨g«Ö7 1’,Ð7€JÐ7ØÐùò 8s   Å	E c                 ó"  — ||dœ}i }| j                  «       D �]V  }t        |j                  «      }t        |«      D ]0  \  }	}
t	        |
t
        «      sŒ|
|vrt        d|
› �«      ‚||
   ||	<   Œ2 |j                  j                  j                  }|t        j                  t        j                  t        j                  fv sJ ‚|t        j                  k(  rt        j                  n2|t        j                  k(  rt        j                  nt        j                   }d|j"                  v r#t        j$                  ||¬«      }d|dd…d|…f<   nt        j&                  ||¬«      }|||j"                  <   �ŒY t)        |«      D �cg c]  }|‘Œ }}|S c c}w )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}   ;  st  € ð  (¸OÑL€Gà€LØ!×IÑIÓKó .ˆÜ)¨+×*:Ñ*:Ó;ˆÜ Ó&ò 	,‰FˆAˆsÜ˜#œsÕ#Ø˜gÑ%Ü&Ð)BÀ3À%Ð'HÓIÐIà& s™|�E˜!’Hð	,ð  ×$Ñ$×0Ñ0×:Ñ:ˆ	Øœ[×.Ñ.´×0AÑ0AÄ;×CTÑCTÐUÑUÐUÐUð œK×-Ñ-Ò-ô �MŠMà!*¬k×.?Ñ.?Ò!?”%—+’+ÄUÇ[Á[ð 	ð �{×'Ñ'Ñ'Ü—;‘;˜u¨IÔ6ˆDØ&'ˆD’�N�]�NÐ"Ò#ä—:‘:˜e¨9Ô5ˆDØ)-ˆ�[×%Ñ%Ó&ð-.ô0 ).¨g«Ö7 1’,Ð7€JÐ7ØÐùò 8s   Å?	Fc           	      óÂ  — | j                   dkD  r| j                   nt        j                  d¬«      }dt        j                  vrt        |«      t        j                  d<   ddlm} ddlm	}  | || j                  «      «      }d }| j                  dk(  rNt        || j                  | j                  | j                  | j                   | j"                  | j$                  «      }nº| j                  dk(  r8t'        || j                  | j                  | j(                  | j                  «      }ns| j                  d	k(  r8t+        || j                  | j                  | j,                  | j                  «      }n,t/        || j                  | j                  | j                  «      }t1        | j                  | j2                  | j4                  | j6                  | j                   |«      }|S )
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Ñ>NÐW\Ô>]€Kð ¤§
¡
Ñ*Ü(+¨KÓ(8Œ�
‰
Ð$Ñ%åÝ$á™4 §
¡
Ó+Ó,€Jà€JØ×Ñ˜FÒ"Ü'ØØ�O‰OØ× Ñ Ø�L‰LØ×ÑØ×!Ñ!Ø× Ñ ó
‰
ð 
×	Ñ	˜fÒ	$Ü'ØØ�O‰OØ× Ñ Ø×%Ñ%Ø�L‰Ló
‰
ð 
×	Ñ	˜lÒ	*Ü-ØØ�O‰OØ× Ñ Ø×ÑØ�L‰Ló
‰
ô )¨°T·_±_Àd×FZÑFZÐ\`×\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á˜l¨IÓ6€Gàò ˆÙˆd�ñð# r#   