U
    T?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)Zlogicalcudacpuc                 S   s   g | ]
}|j qS  )name).0outputr
   r
   _/var/www/html/venv/lib/python3.8/site-packages/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   sd  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|  d| d| d n&td| dt|  d| d| d	 td|  ||	fS )Nr   Tabs_diffZ	treatmentZbaseline)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=)
	enumeraterangelennpZamaxabsprintmaxZallclosetolist)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$   s6    



" r-   c                 C   s   t ||||\}}}|dkr(t|d n|}t|||||||||d|}t| ||dd\}}}|r|tdt|d  d |d k	rt|D ]\}}t||| qt|||dd\}}}|rtdt|d  d t	||||	|
S )	N   T)r   z7baseline average latency (all optimizations disabled): i  z msFztreatment average latency: )
r   intr   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_testH   sP       
      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strr/   floatset_defaults
parse_args)parserargsr
   r
   r   parse_arguments   s    rN   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)rN   r3   r   mkdirr<   r1   r2   r4   r5   r   Zsamplesr6   r+   r   r   r8   r9   r:   r7   )rM   pathr
   r
   r   main   s*    

rS   __main__)r   r   )rE   r0   pathlibr   numpyr$   r   Zbert_perf_testr   r   Zbert_test_datar   r   r   r   r-   r<   rN   rS   __name__r
   r
   r
   r   <module>   s   
$:X