o
    i                       @   s   d dl Z d dlZd dlmZ d dlZd dlZd dlmZm	Z	 d dl
mZmZmZ dd Zdd	d
Z	ddefddZdd Zdd ZedkrKe  dS dS )    N)Path)create_sessiononnxruntime_inference)generate_test_dataget_bert_inputsoutput_test_datac                 C   sh   dd l }d }|r|jj}tjdd}t| ||rdnd||}dd | D }t|||\}	}
|	|
|fS )Nr   F)Zlogicalcudacpuc                 S   s   g | ]}|j qS  )name).0outputr
   r
   g/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/compare_bert_results.py
<listcomp>   s    zrun_model.<locals>.<listcomp>)onnxruntimeZGraphOptimizationLevelZORT_DISABLE_ALLpsutil	cpu_countr   Zget_outputsr   )Z
model_path
all_inputsuse_gpudisable_optimizationr   Zgraph_optimization_levelZintra_op_num_threadssessionoutput_namesresultsZlatency_listr
   r
   r   	run_model   s   
r   皙?MbP?c              
   C   s  d}d}d}d}t | D ]\}	}
tt|
D ]}||	 | }t||
|  }t|}|rC||krCtd| td| td|
|  t||k}|j}|| d }t	||}t	||}tj
|
|  | ||ds|rd}|d	7 }|rtd
|	 d|  td|
|   d|  td|  qq|dkrtdt|  d| d| d ntd| dt|  d| d| d	 td|  td| d|dd ||fS )Nr   Tabs_diffZ	treatmentZbaselined   )rtolatolF   zcase z output z	baseline=z
treatment=z	abs_diff=z100% passed for z& random inputs given thresholds (rtol=z, atol=z).z	WARNING: z out of z) results NOT passed for thresholds (rtol=zmaximum absolute difference=z1maximum percentage of elements that exceeds atol=z is z.3f%)	enumeraterangelennpabsZamaxprintsumsizemaxZallclosetolist)baseline_resultstreatment_resultsverboser   r   Z
diff_countZmax_abs_diffZmax_diff_percentageZcase_passedZtest_case_idr   iZtreatment_outputZabs_diff_tensorr   Zcount_exceedingZtotal_elementsZpercentage_exceedingr
   r
   r   compare$   sH   




" r0      dictionary_sizec                 C   s   t ||||\}}}|dkrt|d n|}t|||||||||d||d}t| ||dd\}}}|r@tdt|d  d |d urSt|D ]
\}}t||| qHt|||dd\}}}|rmtd	t|d  d t	||||	|
S )
N   T)r2   )r   z7baseline average latency (all optimizations disabled): i  z msFztreatment average latency: )
r   intr   r   r'   
statisticsmeanr"   r   r0   )baseline_modeloptimized_model
output_dir
batch_sizesequence_lengthr   Z
test_casesseedr.   r   r   Zinput_ids_nameZsegment_ids_nameZinput_mask_name	mask_typer2   	input_idssegment_ids
input_maskZaverage_sequence_lengthr   r,   Zbaseline_latencyr   r/   Zinputsr-   Ztreatment_latencyZtreatment_output_namesr
   r
   r   run_testP   s@   
rA   c                  C   sN  t  } | jddtdd | jddtd dd | jdd	td d
d | jddtdd | jddtdd | jdd	tddd | jdd	tddd | jdd	tddd | jdd	t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d%d	td d&d | jd'd	td d(d | jd)d	td*d+d |  }|S ),Nz--baseline_modelTzbaseline onnx model path.)requiredtypehelpz--optimized_modelzMpath of the optimized model. It shall have same inputs as the baseline model.)rB   rC   defaultrD   z--output_dirFzEoutput test data path. If not specified, test data will not be saved.z--batch_sizezbatch size of inputz--sequence_lengthz maximum sequence length of inputz--rtolr   zrelative tolerancez--atolg-C6?zabsolute tolerancez	--samplesr   z$number of test cases to be generatedz--seed   zrandom seedz	--use_gpu
store_truezuse GPU)rB   actionrD   )r   z	--verbosezprint verbose information)r.   z--input_idszinput name for input idsz--segment_idszinput name for segment idsz--input_maskzinput name for attention maskz--mask_typer3   zmmask type: (1: mask index or sequence length, 2: raw 2D mask, 3: key len, cumulated lengths of query and key))argparseArgumentParseradd_argumentstrr4   floatset_defaults
parse_args)parserargsr
   r
   r   parse_arguments   s   rR   c                  C   sn   t  } | jd urt| j}|jddd t| j| j| j| j| j| j	| j
| j| j| j| j| j| j| j| j d S )NT)parentsexist_ok)rR   r9   r   mkdirrA   r7   r8   r:   r;   r   Zsamplesr<   r.   r   r   r>   r?   r@   r=   )rQ   pathr
   r
   r   main   s*   

rW   __main__)r   r   )r1   )rI   r5   pathlibr   numpyr%   r   Zbert_perf_testr   r   Zbert_test_datar   r   r   r   r0   r4   rA   rR   rW   __name__r
   r
   r
   r   <module>   s$   
<
<X
