
    ^h3                     v   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    ry 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           dS dS )    N)TensorProtoc                 .   t          j                    }|                    dddt          d           |                    dddt          d           |                    d	d
dt          dd           |                    dddt          dd           |                    ddt          dd           |                    ddt          dd           |                    ddt          dd           |                    ddt
          dd           |                    ddt          dd           |                    ddt          d d            |                    d!dt          d d"           |                    d#dt          d d$           |                    d%dd&g d'd()           |                    d*d+dd,d-.           |                    d/           |                    d0dt          d1d2           |                    d3dd,d4.           |                    d5           |                    d6dd,d7.           |                    d8           |                    d9d:dd,;           |                    d<           |                    |           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{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     a/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/onnxruntime/transformers/profiler.pyparse_argumentsr"      s   $&&F
A     X     "     '      ,     5     k     u     '     1     3     6     999T     kE,U^___
&&&
(     n	     5111
=	     ///
kE,OOO
&&&T"""    c                     ddl m}  || ||| |d          }|D ]}|                    d |          }	|                                }
|
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  & &KKf%%((**Lr#   c                     t          |                     d                    t          k    r#t          | |                     d                    nd S )Nvalue)r   
WhichOneofr   getattr)dims    r!   get_dim_from_type_protor:      sC    489P9P4Q4QUX4X4X73w//000^bbr#   c                 8    d | j         j        j        D             S )Nc                 ,    g | ]}t          |          S  )r:   ).0ds     r!   
<listcomp>z-get_shape_from_type_proto.<locals>.<listcomp>   s!    QQQ1#A&&QQQr#   )tensor_typeshaper9   )
type_protos    r!   get_shape_from_type_protorD      s    QQ
0F0L0PQQQQr#   c                    i |                                  D ]F}t          |j                  }g }t          |          D ]/\  }}t	          |t
                    r|                    |           0t          |          dk    r dS t          |          dk    r|||d         <   t          |          dk    r|||d         <   |j        j        j	        }	|	t          j        t          j        t          j        fv sJ |	t          j        k    rt          j        n'|	t          j        k    rt          j        nt          j        }
t          j        ||
          }||j        <   Hfdt)          |          D             }|S )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   dtypec                     g | ]}S r=   r=   r>   r2   dummy_inputss     r!   r@   z'create_dummy_inputs.<locals>.<listcomp>       7771,777r#   )'get_graph_inputs_excluding_initializersrD   r   	enumerate
isinstancer   appendlenrA   	elem_typer   FLOATINT32INT64numpyfloat32int64int32onesnamerange)
onnx_model
batch_sizesequence_lengthsamplesgraph_inputrB   symbol_dimsir9   rR   	data_typedatar/   rK   s                @r!   create_dummy_inputsrf      s    L!IIKK . .)+*:;;&& 	& 	&FAs#s## &""1%%% {a44{a$.E+a.!{a$3E+a.!$0:	[.0A;CTUUUUU K--- MM!*k.?!?!?%++U[ 	
 z%y111)-[%&&7777g777Jr#   c                 b    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_datarh   ri   )r]   r^   r_   r`   input_ids_namesegment_ids_nameinput_mask_namerh   ri   rm   rn   ro   r/   s                r!   create_bert_inputsru      sv    . DCCCCCCC)9)9*nVfhw)x)x&I{J## 
 
 
J r#   c                 z   |||||z   d}i |                                  D ]}t          |j                  }t          |          D ];\  }}	t	          |	t
                    r!|	|vrt          d|	           ||	         ||<   <|j        j        j        }
|
t          j
        t          j        t          j        fv sJ |
t          j
        k    rt          j        n'|
t          j        k    rt          j        nt          j        }t          j        ||          }||j        <   fdt'          |          D             }|S )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
    )r^   seq_lenpast_seq_lentotal_seq_lensymbol is not supported: rG   c                     g | ]}S r=   r=   rJ   s     r!   r@   z&create_gpt2_inputs.<locals>.<listcomp>7  rL   r#   )rM   rD   r   rN   rO   r   RuntimeErrorrA   rR   r   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   )r]   r^   r_   past_sequence_lengthr`   symbolsra   rB   rc   r9   rR   rd   re   r/   rK   s                 @r!   create_gpt2_inputsr     sb   $ !",(+??	 G L!IIKK . .)+*:;;&& 	, 	,FAs#s## ,g%%&'H3'H'HIII&s|E!H$0:	[.0A;CTUUUUU K--- MM!*k.?!?!?%++U[ 	
 z%y111)-[%&&7777g777Jr#   c                    ||d}i |                                  D ])}t          |j                  }t          |          D ];\  }}	t	          |	t
                    r!|	|vrt          d|	           ||	         ||<   <|j        j        j        }
|
t          j
        t          j        t          j        fv sJ |
t          j
        k    rt          j        n'|
t          j        k    rt          j        nt          j        }d|j        v r"t          j        ||          }d|ddd|f<   nt          j        ||          }||j        <   +fdt)          |          D             }|S )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
    )r^   r_   rz   globalrG   r   Nc                     g | ]}S r=   r=   rJ   s     r!   r@   z,create_longformer_inputs.<locals>.<listcomp>f  rL   r#   )rM   rD   r   rN   rO   r   r|   rA   rR   r   rS   rT   rU   rV   rW   rX   rY   r[   zerosrZ   r\   )r]   r^   r_   global_lengthr`   r~   ra   rB   rc   r9   rR   rd   re   r/   rK   s                 @r!   create_longformer_inputsr   ;  s     (OLLGL!IIKK . .)+*:;;&& 	, 	,FAs#s## ,g%%&'H3'H'HIII&s|E!H$0:	[.0A;CTUUUUU K--- MM!*k.?!?!?%++U[ 	 {''';uI666D&'DN]N"##:e9555D)-[%&&7777g777Jr#   c           	         | j         dk    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    r4t          || j        | j        | j        | j        | j        | j                  }n| j        dk    r(t'          || j        | j        | j        | j                  }nT| j        d	k    r(t+          || j        | j        | j        | j                  }n!t/          || j        | j        | j                  }t1          | j
        | j        | j        | j        | j         |          }|S )
Nr   F)logicalOMP_NUM_THREADS)load)	OnnxModelr   r   r   )r.   psutil	cpu_countosenvironr   onnxr   r]   r   modelrK   ru   r^   r_   r`   rr   rs   rt   r   r}   r   r   rf   r4   r   r-   r   )argsr'   r   r   r]   r/   r3   s          r!   r*   r*   j  s   %)_q%8%8$//f>NW\>]>]>]K 
**(+K(8(8
$%$$$$$$44
++,,JJF""'O L! 
 


 
	f	$	$'O %L
 


 
	l	*	*-O L
 


 )T_dFZ\`\hii

 L r#   __main__	Arguments)setup_loggerzMrequires either --model to run profiling or --input to read profiling results)process_results)N)NNN)r   r   rV   r   r   r   r"   r4   r:   rD   rf   ru   r   r   r*   __name__	argumentsprintr)   r   r   inputr   r3   profile_result_processorr   resultsliner=   r#   r!   <module>r      s    				        I# I# I# I#X  &c c cR R R' ' '^ & & & &R- - -`, , ,^3 3 3l z!!I	E+y!!!------L"###? 'oo ooos9~~ 888888olI66G  d% " r#   