o
    ;ήcpE                     @   s,  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Zd dlmZ d dl	m	Z	 d dl
mZ d dlZd dlZd dlZd dlmZmZ eG dd dZeG dd	 d	Zd&ddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Z d#d$ Z!e"d%krdZ#e!  dS dS )'    N)	dataclass)datetime)Path)generate_test_dataget_bert_inputsc                   @   sf   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< eed
< eed< dS )TestSetting
batch_sizesequence_length
test_cases
test_timesuse_gpuuse_io_bindingproviderintra_op_num_threadsseedverboselog_severityN)__name__
__module____qualname__int__annotations__boolstr r   r   N/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/bert_perf_test.pyr       s   
 r   c                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )ModelSetting
model_pathinput_ids_namesegment_ids_nameinput_mask_name	opt_levelN)r   r   r   r   r   r   r   r   r   r   r   /   s   
 r      c           
      C   s  dd l }|| |rd| vrtd |rI|dkr ddg}n,|dkr)ddg}n#|d	kr2g d
}n|dkr;ddg}n|dkrDg d}nddg}ndg}| }||_|jj|_|d u rb|j	j
|_n+|dkrl|j	j|_n!|dkrv|j	j|_n|dkr|j	j|_n|dkr|j	j
|_n||_|d ur||_|j| ||d}	|r|dkrd|	 v sJ |	S |dkrd|	 v sJ |	S |d	krd|	 v sJ d|	 v sJ |	S |dkrd|	 v sJ |	S |dkrd|	 v sJ d|	 v sJ |	S d|	 v sJ |	S d|	 v sJ |	S )Nr   CUDAExecutionProviderzWarning: Please install onnxruntime-gpu package instead of onnxruntime, and use a machine with GPU for testing gpu performance.dmlDmlExecutionProviderCPUExecutionProviderrocmROCMExecutionProvidermigraphx)MIGraphXExecutionProviderr(   r&   cudatensorrt)TensorrtExecutionProviderr#   r&      r"   c   )	providersr*   r-   )onnxruntimeset_default_logger_severityget_available_providersprintSessionOptionslog_severity_levelExecutionModeORT_SEQUENTIALexecution_modeGraphOptimizationLevelORT_ENABLE_ALLgraph_optimization_levelORT_DISABLE_ALLORT_ENABLE_BASICORT_ENABLE_EXTENDEDr   InferenceSessionget_providers)
r   r   r   r   r<   r   r1   execution_providerssess_optionssessionr   r   r   create_session8   st   







	rE   c                 C   s,   t jtjt jtjt jtjt jtji}||  S )N)torchfloat32npfloat16int32int64longlong)
torch_typetype_mapr   r   r   
numpy_type   s   rO   c                    s4    fdd|   D } fdd|  D }||fS )Nc                    "   i | ]\}}|t | qS r   rF   
from_numpyto.0namearraydevicer   r   
<dictcomp>      " z/create_input_output_tensors.<locals>.<dictcomp>c                    rP   r   rQ   rT   rX   r   r   rZ      r[   )items)inputsoutputsrY   input_tensorsoutput_tensorsr   rX   r   create_input_output_tensors   s   ra   c              
   C   sx   |   }| D ]\}}|||jjdt|j|j|  q| D ]\}}|	||jjdt|j|j|  q#|S Nr   )

io_bindingr\   
bind_inputrY   typerO   dtypeshapedata_ptrbind_output)sessr_   r`   rc   rV   tensorr   r   r   create_io_binding   s(   rl   c                 C   s   g }g }|j r	dnd}t|D ]I\}}| ||}	||	 i }
tt|D ]
}|	| |
|| < q&t||
|\}}t| ||}| | t	
 }| | t	
 | }|| q||fS )Nr+   cpu)r   	enumeraterunappendrangelenra   rl   run_with_iobindingtimeitdefault_timer)rD   
all_inputsoutput_namestest_settingresultslatency_listrY   test_case_idr]   resultr^   ir_   r`   rc   
start_timelatencyr   r   r   %onnxruntime_inference_with_io_binding   s"   


r   c           
      C   st   t |dkr| |t| g }g }t|D ]\}}t }| ||}t | }	|| ||	 q||fS rb   )rr   ro   randomchoicern   rt   ru   rp   )
rD   rv   rw   ry   rz   r{   r]   r~   r|   r   r   r   r   onnxruntime_inference   s   
r   c                 C   sj   |  }dtj| }|d|j|jdd7 }|d|j d|j	 d|j
 d|j d	|j 
7 }|S )
Nz	model={},z4graph_optimization_level={},intra_op_num_threads={},zGraphOptimizationLevel.ORT_ zbatch_size=z,sequence_length=z,test_cases=z,test_times=z	,use_gpu=)get_session_optionsformatospathbasenamer<   r   replacer   r	   r
   r   r   )r   rD   rx   rC   optionr   r   r   	to_string   s   0r   c                 C   sX  t | j|j|j|| j|jd}dd | D }t| j||}||v r*td| d S td| g }|j	rKt
|jD ]}	t||||\}
}|| q9nt
|jD ]}	t|||\}
}|| qPt|d }t|}t|d}t|d}t|d	}t|d
}t|d}|jd|  }|||||||f||< tdt|dt|d d S )N)r   c                 S   s   g | ]}|j qS r   )rV   )rU   outputr   r   r   
<listcomp>   s    z run_one_test.<locals>.<listcomp>zskip duplicated test:zRunning test:  2   K   Z   _   r/   g     @@z,Average latency = {} ms, Throughput = {} QPS.2f)rE   r   r   r   r!   r   get_outputsr   r4   r   rq   r   r   extendr   rH   rW   
statisticsmean
percentiler   r   )model_settingrx   perf_resultsrv   r   rD   rw   keyall_latency_listr}   ry   rz   
latency_msaverage_latency
latency_50
latency_75
latency_90
latency_95
latency_99
throughputr   r   r   run_one_test   sX   



r   c                 C   s,   t jt| ||||fd}|  |  d S )N)targetargs)multiprocessingProcessr   startjoin)r   rx   r   rv   r   processr   r   r   launch_test  s   
r   c           	      C   s   |j d urt| ||||j  d S tjdd}tjdd}tt||g}tdtd|D ]}||vr7|| q,|j	dd |D ]
}t| |||| q@d S )NF)logicalTr.      )reverse)
r   r   psutil	cpu_countlistsetrq   minrp   sort)	r   rx   r   rv   r   logical_corescandidate_threadsr}   r   r   r   r   run_perf_tests&  s(   

r   c                 C   sr   t | j| j| j| j\}}}td|j d|j d|j  t	|j|j|j|j
|j|||dd	}t| ||| d S )NzGenerating z samples for batch_size=z sequence_length=F)random_mask_length)r   r   r   r   r    r4   r
   r   r	   r   r   r   r   )r   rx   r   	input_idssegment_ids
input_maskrv   r   r   r   run_performance>  s*   
r   c                  C   s  t  } | jddtdd | jdddtddd	 | jd
ddtdd | jddtddd | jdddtddd | jddtg dddd | jddtddd | jdddd d! | jdd" | jd#dtd$g d%d&d' | jd(ddd)d! | jdd* | jd+ddd,d! | jdd- | jd.dtd d/d | jd0d1dtd d2d | jd3dtd d4d | jd5dtd d6d | jd7dtd d8d |  }|S )9Nz--modelTzbert onnx model path)requiredre   helpz-bz--batch_size+zKbatch size of input. Allow one or multiple values in the range of [1, 128].)r   re   nargsr   z-sz--sequence_lengthz maximum sequence length of inputz	--samplesF
   z!number of samples to be generated)r   re   defaultr   z-tz--test_timesr   zJnumber of times to run per sample. By default, the value is 1000 / samplesz--opt_level)r   r.   r"   r/   r/   zZonnxruntime optimization level: 0 - disable all, 1 - basic, 2 - extended, 99 - enable all.)r   re   choicesr   r   z--seed   zPrandom seed. Use the same seed to make sure test data is same in multiple tests.z	--verbose
store_truezprint verbose information)r   actionr   )r   z--log_severityr"   )r   r.   r"   r      z.0:Verbose, 1:Info, 2:Warning, 3:Error, 4:Fatal)r   re   r   r   r   z	--use_gpuzuse GPU)r   z--use_io_bindingzuse io_binding)r   z
--providerzExecution provider to usez-nz--intra_op_num_threadsz>=0, set intra_op_num_threadsz--input_ids_namezinput name for input idsz--segment_ids_namezinput name for segment idsz--input_mask_namezinput name for attention mask)argparseArgumentParseradd_argumentr   r   set_defaults
parse_args)parserr   r   r   r   parse_argumentsY  s   					r   c                  C   s  t  } | jdkrtdtd| j | _t }| }t| j	}t
|dks0t|dkr0tdt| j| j| j| j| j}|D ]%}t|| j| j| j| j| j| j| j| j| j| j}td| t||| q?t| ddd	 d
}tj !t"| jj#d$| jrdndd!dd tt%|D | jt&' (d}t)|dddK}	t*j+|	ddd}
d }|D ]6\}}|,d}|d u rg d}|-dd |D  |
.| dd |D }|-dd |D  |
.| qW d    n1 sw   Y  td| d S )Nr   r.   r      z batch_size not in range [1, 128]ztest settingFc                 S   s   | d S )Nr.   r   )xr   r   r   <lambda>  s    zmain.<locals>.<lambda>)r   r   zperf_results_{}_B{}_S{}_{}.txtGPUCPU-c                 S   s   g | ]}t |qS r   )r   rU   r   r   r   r   r      s    zmain.<locals>.<listcomp>z%Y%m%d-%H%M%Szw+r   )newline	
)	delimiterlineterminator,)zLatency(ms)Latency_P50Latency_P75Latency_P90Latency_P95Latency_P99zThroughput(QPS)c                 S      g | ]	}| d d qS )=r   splitr   r   r   r   r         c                 S   s   g | ]}t |d qS )r   )r   r   r   r   r   r     s    c                 S   r   )r   r.   r   r   r   r   r   r     r   zTest summary is saved to)/r   r   maxr   samplesr   Managerdictr   r   r   	Exceptionr   modelr   r   r    r!   r   r	   r   r   r   r   r   r   r   r4   r   sortedr\   r   r   r   r   parentr   r   r   nowstrftimeopencsvwriterr   r   writerow)r   managerr   batch_size_setr   r   rx   sorted_resultssummary_filetsv_file
tsv_writerheadersr   perf_resultparamsvaluesr   r   r   main  sp   



	
	
r  __main__)Nr"   )$r   r   r   r   r   r   rt   dataclassesr   r   pathlibr   numpyrH   r   rF   bert_test_datar   r   r   r   rE   rO   ra   rl   r   r   r   r   r   r   r   r   r  r   __spec__r   r   r   r   <module>   sF   
M

8yL
