
    g/                        d dl Z d dlZd dlZd dlZ	 d dlmZmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ  ej<                  e       ej<                  d      k  r ede d      g dZde fdZ!	 dde dee    de"fdZ#deee ef      de fdZ$deee ef      de de fdZ%d Z&ddZ'e(dk(  r e&        yy# e$ r d dlmZmZ Y w xY w)    N)PackageNotFoundErrorversion)Path)AnyDictListOptional)load_dataset)	evaluator)ORTModelForQuestionAnswering)__version__)r   )AutoTokenizerpipelinez1.13.1z1Please install optimum>=1.13.1. Current version: .)z5bert-large-uncased-whole-word-masking-finetuned-squadzdeepset/roberta-base-squad2z%distilbert-base-cased-distilled-squadpackage_namec                 8    	 t        |       S # t        $ r Y y w xY wN)r   r   )r   s    d/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/models/bert/eval_squad.pyget_package_versionr   7   s$    |$$ s   
 	model_id	onnx_pathuse_io_bindingc                    |zt        j                  | d||      }t        j                  j	                  d|       }|j                  |       t        j                  j	                  |d      }t        d|       ||fS t        j                  t        j                  j                  |      t        |      j                  ||      }||fS )a  Load onnx model given pretrained model name and optional ONNX model path. If onnx_path is None,
    the default onnx model from optimum will be used.

    Args:
        model_id (str): pretrained model name or checkpoint path
        onnx_path (Optional[str], optional): path of onnx model to evaluate. Defaults to None.

    Returns:
        model: ORTModel for the onnx model
        onnx_path: the path of onnx model
    T)exportproviderr   r   z
model.onnxzModel is exported to onnx file:)	file_namer   r   )
r   from_pretrainedospathjoinsave_pretrainedprintdirnamer   name)r   r   r   r   modelsave_onnx_dirs         r   load_onnx_modelr'   >   s     ,<<TH^
 S(3m,GGLL=	/; ) -<<GGOOI&9o**)	
 )    resultscsv_filenamec                    t        |ddd      5 }g d}t        j                  ||      }|j                          | D ]  }|j	                  |        |j                          ddd       t        d|        y# 1 sw Y   xY w)	zOutput a CSV file with detail of each test results.

    Args:
        results (List[Dict[str, Any]]): list of JSON results.
        csv_filename (str): path of output CSV file
    a asciimodenewlineencoding)pretrained_model_namer   r   disable_fused_attention
batch_sizesequence_lengthr   exactf1totalHasAns_exact	HasAns_f1HasAns_total
best_exactbest_exact_threshbest_f1best_f1_threshtotal_time_in_secondssamples_per_secondlatency_in_seconds
fieldnamesNz&Detail results are saved to csv file: )opencsv
DictWriterwriteheaderwriterowflushr"   )r)   r*   csv_filecolumn_names
csv_writerresults         r   output_detailsrP   b   s     
lb7	Cx
. ^^HF
 F'  	; 
D> 
2<.
AB? 
D	Cs   AA;;Bmetric_namec           	      
   t        |ddd      5 }g d}t        | D ch c]  }|d   	 c}      }|j                          t        | D ch c]  }|d   	 c}      }|j                          t        | D ch c]  }|d   	 c}      }|j                          g }	|D ]   }
|D ]  }|	j                  d	| d
|
         " t	        j
                  |||	z         }|j                          |D ]  }i }i }|j                  |	D ci c]  }|d c}       | D ]k  }|d   |k(  s||   s|j                         D ci c]  \  }}||v s|| }}}|s|j                  |       |d   }|d   }
d	| d
|
 }||	v sd||   ||<   m |s|	D ]  }|j                  |d      ||<    |j                  |        |j                          ddd       t        d| d|        yc c}w c c}w c c}w c c}w c c}}w # 1 sw Y   5xY w)a  Output a CSV file with summary of a metric on combinations of batch_size and sequence_length.

    Args:
        results (List[Dict[str, Any]]): list of JSON results.
        csv_filename (str): path of output CSV file
        metric_name (str): the metric to summarize
    r,   r-   r.   r/   )r3   r   r   r4   r   r   r5   r6   b_srD   NzSummary results for z are saved to csv file: )rF   listsortappendrG   rH   rI   updateitemsgetrJ   rK   r"   )r)   r*   rQ   rL   header_namesrO   
model_listbatch_sizessequence_lengths	key_namesr6   r5   rN   r%   rowvalueskvheaderskeys                       r   output_summaryrf      sC    
lb7	Cx
 WEW66+.WEF
wGwVF<0wGH Qv(9!: QR	/O)
  1ZL?2C!DE *  0 ^^H	9QR
 EC FMM)4)Q1b5)45!+&%/F;4G06T1!|BSq!tGT

7+!'!5J&,->&?Oj\O+<=Ci'&,[&9s " $C%zz#r2CH %##C(1  4 	i 
Dl 
 -El^
TU[ F H !R" 5 UI 
D	Csj   G9G
 G9
G$
 G96G)
B G9
G.G9!G9'G9:G3G3,G99G9?G9G99Hc                  P   t               } t        |        dD ]  }t        |      }|st        | d|       ! | j                  }| j                  rAt
        j                  j                  | j                        st        d| j                         t
        j                  j                  dd      dk(  }g }t        j                  |      }| j                  D ]'  }||_        t        |dz  d      |_        | j                  t        d	       t#        j"                         }t%        || j                  | j&                  | j(                        \  }	}
t#        j"                         |z
  }t        d
|dd       t        |	j*                         ||	j*                  j,                  kD  rt        d      t/        d|	|d| j0                        }t3        d      }t        d       t#        j"                         }t5        d| j6                  dkD  rd| j6                   dnd      }t#        j"                         |z
  }t        d|dd       t        d       t#        j"                         }|j9                  ||dd      }t#        j"                         |z
  }t        d|dd       | j&                  |d<   ||d<   ||d<   |
|d <   | j0                  |d!<   ||d"<   | j(                  |d#<   t        |       |j;                  |       * t=        |d$       d%D ]  }t?        || d&|        y )'N)zonnxruntime-gpuonnxruntimeonnxtorchtransformersoptimumdatasetsevaluatez versionz Onnx model path does not exist: ORT_DISABLE_FUSED_ATTENTION01      z4Exporting onnx model. It might take a few minutes...z!Onnx model exported or loaded in z.1fz secondszTsequence length should not be larger than {ort_model.config.max_position_embeddings}zquestion-answeringT)r%   	tokenizerquestion_firstr5   zLoading dataset...squadr   zvalidation[:]
validation)splitzDataset loaded in z<Evaluating squad_v2 with ORT. It might take a few minutes...squad_v2)model_or_pipelinedatametricsquad_v2_formatzEvaluation done in r   r4   r3   r   r5   r6   r   z
detail.csv)r8   r7   rB   z.csv) parse_argumentsr"   r   
model_nameri   r   r   existsRuntimeErrorenvironrZ   r   r   r^   model_max_lengthmin
doc_stridetimer'   r   r   configmax_position_embeddingsr   r5   r   r
   r9   computerW   rP   rf   )argsr$   package_versionr3   r4   all_resultsrt   r6   
start_time	ort_modelr   latencyqa_pipelinetask_evaluatorsquad_datasetrO   rQ   s                    r   mainr      s   D	$Kv-d3TF(#_5 w
 !OOyy		2=dii[IJJ jjnn-JCPTWWK--.CDI00%4	""?a#7=	99HIYY[
./DdiiQUQ^Q^`d`s`st	9))+
*1'#hGHiY--EEEuvv 	YW[hlhwhw
 ##78"#YY[
$WTXT^T^abTbl4::,a4Phtu))+
*"73-x89LMYY[
'') 	 ( 
 ))+
*#GC=9:!]]z,C()*?&''{#|$3 !#'#6#6 f6"[ 1^ ;-<{{m4$8+F =r(   c           	         t        j                         }|j                  dddt        t        d   dt                |j                  ddd	t
        d
gd       |j                  ddt
        dd       |j                  ddt
        dd       |j                  ddt        d d       |j                  dddd       |j                  dddd       |j                  d       |j                  |       }|S ) Nz-mz--model_nameFr   z=Checkpoint directory or pre-trained model names in the list: )requiredtypedefaulthelpz-sz--sequence_lengths+i  zFSequence lengths for onnx model inputs. It could have multiple values.)nargsr   r   r   z-bz--batch_size   zbatch size for inference.)r   r   r   z-tz--totalz+Total samples to test. 0 means all samples.z--onnxzbOptional onnx model path. If not specified, optimum will be used to export onnx model for testing.z
--providerCUDAExecutionProviderzRSelect which Execution Provider to use for runs. Default is CUDAExecutionProvider.)r   r   r   z--use_io_binding
store_truezUse IO Binding for GPU.)r   actionr   )r   )argparseArgumentParseradd_argumentstrPRETRAINED_SQUAD_MODELSintset_defaults
parse_args)argvparserr   s      r   r   r     s0   $$&F
'*LMdLef   U   (   ic1Cpq
q   'a	   *U<Vop
u-T"DKr(   __main__)Nr   Fr   ))r   rG   r   r   importlib.metadatar   r   ImportErrorimportlib_metadatapathlibr   typingr   r   r   r	   rm   r
   rn   r   optimum.onnxruntimer   optimum.versionr   optimum_version	packagingversion_checkrk   r   r   parser   r   r   boolr'   rP   rf   r   r   __name__ r(   r   <module>r      s=  2  
 	 A@  , , !  < : . 0='*=-*=*=h*GG
I/IZZ[\
]] c  ns!!&sm!fj!H&CDc3h0 &C &CR>VDc3h0 >V >VRU >VBCGL3l zF Q	  A@@As   C C#"C#