U
    h                     @   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 Zdd Zdd Zedkre  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| ||r2dnd||}dd | D }t|||\}	}
|	|
|fS )Nr   F)logicalZcudacpuc                 S   s   g | ]
}|j qS  )name).0outputr
   r
   Q/tmp/pip-unpacked-wheel-socb9apf/onnxruntime/transformers/compare_bert_results.py
<listcomp>   s     zrun_model.<locals>.<listcomp>)onnxruntimeZGraphOptimizationLevelZORT_DISABLE_ALLpsutil	cpu_countr   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   sL  d}d}t | D ]\}}d}	tt|D ]}
|| |
 }tt|||
  }|r~||kr~td| td| td||
  t||}tj||
 	 |	 ||ds(|	r(d}	|d7 }|r(td	| d
|
  td||
 	  d|  td|  q(q|dkrtd
t| || ntd
|t| || td|  ||	fS )Nr   Tabs_diffZ	treatmentZbaseline)rtolatolF   zcase z output z	baseline=z
treatment=z	abs_diff=zE100% passed for {} random inputs given thresholds (rtol={}, atol={}).zKWARNING: {} out of {} results NOT passed for thresholds (rtol={}, atol={}).zmaximum absolute difference=)	enumeraterangelennpZamaxabsprintmaxZallclosetolistformat)baseline_resultstreatment_resultsverboser   r   Z
diff_countZmax_abs_diffZtest_case_idr   Zcase_passediZtreatment_outputr   r
   r
   r   compare$   sL    



     r.   c                 C   s   t ||||\}}}|dkr(t|d n|}t|||||||||d|}t| ||dd\}}}|rztdt|d  |d k	rt|D ]\}}t	||| qt|||dd\}}}|rtdt|d  d t
||||	|
S )	N   T)r   z<baseline average latency (all optimizations disabled): {} msi  Fztreatment average latency: z ms)r   intr   r   r&   r)   
statisticsZmeanr!   r   r.   )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_type	input_idssegment_ids
input_maskZaverage_sequence_lengthr   r*   Zbaseline_latencyr   r-   inputsr+   Ztreatment_latencyZtreatment_output_namesr
   r
   r   run_testN   sX       
      r=   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.)r>   r?   defaultr@   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	--samplesd   z$number of test cases to be generatedz--seed   zrandom seedz	--use_gpu
store_truezuse GPU)r>   actionr@   )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_typer/   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strr0   floatset_defaults
parse_args)parserargsr
   r
   r   parse_arguments   s    rO   c                  C   sn   t  } | jd k	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)rO   r4   r   mkdirr=   r2   r3   r5   r6   r   Zsamplesr7   r,   r   r   r9   r:   r;   r8   )rN   pathr
   r
   r   main   s*    

rT   __main__)r   r   )rF   r1   pathlibr   Znumpyr$   r   Zbert_perf_testr   r   Zbert_test_datar   r   r   r   r.   r=   rO   rT   __name__r
   r
   r
   r   <module>   s   
*>X