Ë
    cQêjrL  ã                   ó¤   — 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
mZ  e j                  e«      Z G d„ d«      Z G d„ d«      Zy)é    N)Ú	Precision)Ú
Gpt2HelperÚ
Gpt2Inputsc                   óN   — e Zd Zdd„Zd„ Zdefd„Zdefd„Zdd„Z	dd„Z
d	„ Zd
„ Zy)Ú
Gpt2Metricc                 óÎ   — |dkD  r|dk  sJ ‚|| _         || _        |› d|› �| _        || _        d| _        d| _        d| _        d| _        d| _        d | _	        d | _
        i | _        y )Né   éd   z vs r   )ÚbaselineÚ	treatmentÚnameÚtop_kÚtop_1_errorÚtop_k_errorÚtotal_samplesÚmax_logits_diffÚmax_logits_diff_no_pastÚbatch_top1_errorÚbatch_topk_errorÚseq_len_latency)ÚselfÚtreatment_nameÚbaseline_namer   s       úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/gpt2/gpt2_tester.pyÚ__init__zGpt2Metric.__init__   s}   € Ø�qŠy˜U cš\Ð)Ð)Ø%ˆŒØ'ˆŒØ*Ð+¨4°¨Ð?ˆŒ	ØˆŒ
Ø !ˆÔØ !ˆÔØ"#ˆÔØ&'ˆÔØ./ˆÔ$Ø37ˆÔØ37ˆÔØ!ˆÕó    c                 óD  — | j                   | j                  k7  rþt        d«       t        d| j                  › d| j                   › d�«       | j                  dkD  r€d| j                  z  | j                  z  }d| j
                  z  | j                  z  }t        d| j                  › d| j                  › d	|d
›d| j                  › d| j
                  › d	|d
›d�«       t        d«       t        d| j                  d›�«       t        d| j                  d›�«       nt        d| j                  › d�«       | j                  rät        d«       d}d}t        | j                  j                  «       «      D ]›  }t        j                  | j                  |   «      dz  }|dk(  rt        d|› d|d
›d�«       n"t        dd|z  › dd|dz   z  dz
  › d|d
›d�«       ||t        | j                  |   «      z  z  }|t        | j                  |   «      z  }Œ� t        d||z  d
›d�«       y y )Nz---zMetrics for z (baseline=z):r   g      Y@zTotal=z Top1Error=z (z.2fz%) TopzError=z%)zMax logits diffs:z	with past  = z.6fz	empty past = z (baseline):z/Past sequence length range and average latency:ç     @�@ú	z:         	z msz	[é   z, r	   z]:	zAverage Latency: )r   r   Úprintr   r   r   r   r   r   r   ÚsortedÚkeysÚ
statisticsÚmeanÚlen)r   Útop_1_error_rateÚtop_k_error_rateÚtotalÚcountÚkeyÚaverages          r   r!   zGpt2Metric.print%   s\  € Ø�=‰=˜DŸN™NÒ*Ü�%ŒLÜ�L §¡Ð 0°¸D¿M¹M¸?È"ÐMÔNØ×!Ñ! AÒ%Ø#(¨4×+;Ñ+;Ñ#;¸d×>PÑ>PÑ#PÐ Ø#(¨4×+;Ñ+;Ñ#;¸d×>PÑ>PÑ#PÐ ÜØ˜T×/Ñ/Ð0°¸D×<LÑ<LÐ;MÈRÐP`ÐadÐOeÐekÐlp×lvÑlvÐkwÐw}ð  C÷  Oñ  Oð  ~Pð  PRð  Scð  dgð  Rhð  hjð  kôô Ð%Ô&Ü�O D×$8Ñ$8¸Ð#=Ð>Ô?Ü�O D×$@Ñ$@ÀÐ#EÐFÕGä�L §¡Ð 0°Ð=Ô>à×ÒÜÐCÔDØˆEØˆEÜ˜d×2Ñ2×7Ñ7Ó9Ó:ò 8�Ü$Ÿ/™/¨$×*>Ñ*>¸sÑ*CÓDÀvÑM�Ø˜!’8Ü˜B˜s˜e <°¸¨}¸CÐ@ÕAä˜C  3¡˜x r¨!°°a±©.¸1Ñ*<Ð)=¸TÀ'È#ÀÈcÐRÔSØ˜¤3 t×';Ñ';¸CÑ'@Ó#AÑAÑA�Øœ˜T×1Ñ1°#Ñ6Ó7Ñ7‘ð8ô Ð% e¨e¡m°CÐ%8¸Ð<Õ=ð  r   Úis_empty_pastc                 ó¼   — ||z
  j                  «       j                  «       }|rt        | j                  |«      | _        |S t        | j                  |«      | _        |S ©N)ÚabsÚmaxr   r   )r   Úbaseline_logitsÚtreatment_logitsr-   Údiffs        r   Údiff_logitszGpt2Metric.diff_logitsC   sZ   € ØÐ"2Ñ2×7Ñ7Ó9×=Ñ=Ó?ˆÙÜ+.¨t×/KÑ/KÈTÓ+RˆDÔ(ð ˆô $' t×';Ñ';¸TÓ#BˆDÔ àˆr   Ú
batch_sizec                 óÞ   — | xj                   |z  c_         t        j                  |dft        j                  ¬«      | _        t        j                  |dft        j                  ¬«      | _        y )Nr	   ©Údtype)r   ÚtorchÚzerosÚboolr   r   )r   r6   s     r   Ústart_batchzGpt2Metric.start_batchL   sI   € Ø×Ò˜jÑ(ÕÜ %§¡¨Z¸¨OÄ5Ç:Á:Ô NˆÔÜ %§¡¨Z¸¨OÄ5Ç:Á:Ô NˆÕr   c                 óH  — | j                  |j                  |j                  d|«       | j                  |j                  |j                  | j                  |«       | j	                  |j
                  |j
                  |dk(  «      }|rt        d| j                  › d|› �«       y y )Nr	   r   zMax logits diffs of z: )Ú
_eval_topkÚtop_1_tokensÚtop_k_tokensr   r5   Úlogitsr!   r   )r   r   r   Úpast_seq_lenÚverboseÚmax_diffs         r   Ú
eval_batchzGpt2Metric.eval_batchQ   s‰   € Ø�‰˜×-Ñ-¨y×/EÑ/EÀqÈ'ÔRØ�‰˜×-Ñ-¨y×/EÑ/EÀtÇzÁzÐSZÔ[à×#Ñ# H§O¡O°Y×5EÑ5EÀ|ÐWXÑGXÓYˆÙÜÐ(¨¯©¨°2°h°ZÐ@ÕAð r   c                 óô  — t        j                  t        j                  ||«      «      sÏ|dk(  rR|rt        d| j                  › �«       | xj
                  t        j                  ||«      j                  «       z  c_        y |rt        d|› d| j                  › d�«       | xj                  t        j                  ||«      j                  «       j                  d«      j                  d¬«      dkD  z  c_        y y )Nr	   z!Generated tokens not matched for zTop z tokens not matched for z-. This will lead to wrong beam search results)Údimr   )
r:   ÚallÚeqr!   r   r   Úlogical_notr   ÚsumÚ	unsqueeze)r   Úbaseline_topkÚtreatment_topkr   rD   s        r   r?   zGpt2Metric._eval_topkY   sÏ   € Ü�y‰yœŸ™ -°Ó@ÔAØ˜ŠzÙÜÐ=¸d¿i¹i¸[ÐIÔJØ×%Ò%¬¯©°-ÀÓ)P×)\Ñ)\Ó)^Ñ^Ö%áÜØ˜u˜gÐ%=¸d¿i¹i¸[ÐHuÐvôð ×%Ò%Ü—H‘H˜]¨NÓ;×GÑGÓI×MÑMÈaÓP×ZÑZÐ_`ÐZÓaÐdeÑeñÖ%ð Br   c                 ó¸   — | xj                   | j                  j                  «       z  c_         | xj                  | j                  j                  «       z  c_        y r/   )r   r   rL   r   r   ©r   s    r   Ú	end_batchzGpt2Metric.end_batchh   sB   € Ø×Ò˜D×1Ñ1×5Ñ5Ó7Ñ7ÕØ×Ò˜D×1Ñ1×5Ñ5Ó7Ñ7Ör   c                 óÊ   — |dkD  r!t        t        j                  |«      «      dz   nd}|| j                  vrg | j                  |<   | j                  |   j	                  |«       y )Nr   r	   )ÚintÚmathÚlog2r   Úappend)r   rC   Úlatencyr+   s       r   Úadd_latencyzGpt2Metric.add_latencyl   sZ   € Ø2>ÀÒ2BŒc”$—)‘)˜LÓ)Ó*¨QÒ.ÈˆØ�d×*Ñ*Ñ*Ø(*ˆD× Ñ  Ñ%Ø×Ñ˜SÑ!×(Ñ(¨Õ1r   N)ÚTorché   )T)Ú__name__Ú
__module__Ú__qualname__r   r!   r<   r5   rT   r=   rF   r?   rR   rY   © r   r   r   r      s;   „ ó"ò>ð<ÈDó ðO có Oó
Bóò8ó2r   r   c            
       ó¢   — e Zd Z	 	 	 dd„Zdefd„Zd„ Zd„ Zd„ Ze	dd	„«       Z
e	d
„ «       Ze	d„ «       Ze	ej                  ddddddddf	d„«       Zy)Ú
Gpt2TesterFr[   c                 ó(  — |j                   d   | _        |j                   d   | _        || _        || _        || _        || _        |d u| _        |d u| _        g | _	        d| j                  |d||z  g}t        |«      D ]p  }t        j                  |«      j                  |rt        j                  nt        j                  «      }| j                  j!                  |j#                  |«      «       Œr d | _        d | _        d | _        |	| _        |
| _        y )Nr   r	   r    )Úshaper6   Úinput_lengthÚn_layerÚ	input_idsÚposition_idsÚattention_maskÚhas_position_idsÚhas_attention_maskÚpastÚranger:   ÚemptyÚtypeÚfloat16Úfloat32rW   ÚtorB   r@   rA   r   Útop_k_required_order)r   rf   rg   rh   Únum_attention_headsÚhidden_sizeÚ	num_layerÚdeviceÚis_fp16r   rr   Ú
past_shapeÚ_iÚ
empty_pasts                 r   r   zGpt2Tester.__init__t   s  € ð $Ÿ/™/¨!Ñ,ˆŒØ%ŸO™O¨AÑ.ˆÔØ ˆŒà"ˆŒØ(ˆÔØ,ˆÔà ,°DÐ 8ˆÔØ"0¸Ð"<ˆÔð ˆŒ	àØ�O‰OØØØÐ.Ñ.ð
ˆ
ô ˜	Ó"ò 	4ˆBÜŸ™ ZÓ0×5Ñ5Áw´e·m²mÔTY×TaÑTaÓbˆJØ�I‰I×Ñ˜ZŸ]™]¨6Ó2Õ3ð	4ð ˆŒØ ˆÔØ ˆÔØˆŒ
Ø$8ˆÕ!r   Úreturnc                 ón   — t        | j                  | j                  | j                  | j                  «      S r/   )r   rf   rg   rh   rk   rQ   s    r   Ú
get_inputszGpt2Tester.get_inputsŸ   s*   € Ü˜$Ÿ.™.¨$×*;Ñ*;¸T×=PÑ=PÐRV×R[ÑR[Ó\Ð\r   c           	      ó0  ‡— ddl mŠ t        j                  j	                  |dt        |«      z   «      }t        j                  j                  |«      rt        d|› d�«       y t        j                  |d¬«       ˆfd„}g } ||| j                  d	«       | j                  r ||| j                  d
«       | j                  r ||| j                  d«       t        | j                  «      D ]%  } ||| j                   |   dt        |«      z   «       Œ' t#        |«      D ][  \  }}	t%        t        j                  j	                  |d|› d�«      d«      5 }
|
j'                  |	j)                  «       «       d d d «       Œ] |j+                  «       D �cg c]  }|j,                  ‘Œ }}t#        |«      D ]»  \  }}‰j/                  t1        |   t2        j4                  «      r||   n.||   j7                  «       j9                  «       j3                  «       «      }	t%        t        j                  j	                  |d|› d�«      d«      5 }
|
j'                  |	j)                  «       «       d d d «       Œ½ t        d|› �«       y # 1 sw Y   �ŒgxY wc c}w # 1 sw Y   ŒèxY w)Nr   )Únumpy_helperÚtest_data_set_z
Directory z existed. Skip saving test dataT)Úexist_okc                 óœ   •— | j                  ‰j                  |j                  «       j                  «       j	                  «       |«      «       y r/   )rW   Ú
from_arrayÚcloneÚcpuÚnumpy)Úinput_tensorsÚtorch_tensorr   r   s      €r   Ú
add_tensorz-Gpt2Tester.save_test_data.<locals>.add_tensor¬   s:   ø€ Ø× Ñ  ×!8Ñ!8¸×9KÑ9KÓ9M×9QÑ9QÓ9S×9YÑ9YÓ9[Ð]aÓ!bÕcr   rf   rg   rh   Úpast_Úinput_z.pbÚwbÚoutput_zTest data saved to directory )Úonnxr   ÚosÚpathÚjoinÚstrÚexistsr!   Úmakedirsrf   ri   rg   rj   rh   rl   re   rk   Ú	enumerateÚopenÚwriteÚSerializeToStringÚget_outputsr   rƒ   Ú
isinstancer†   Úndarrayr„   r…   )r   ÚsessionÚoutputÚsave_test_data_dirÚtest_case_idr�   r‰   r‡   ÚiÚtensorÚfÚoutput_namesÚ_namer   s                @r   Úsave_test_datazGpt2Tester.save_test_data¢   s=  ø€ Ý%ä�w‰w�|‰|Ð.Ð0@Ä3À|ÓCTÑ0TÓUˆÜ�7‰7�>‰>˜$ÔÜ�J˜t˜fÐ$CÐDÔEØä
�‰�D 4Õ(ô	dð ˆÙ�= $§.¡.°+Ô>à× Ò Ù�} d×&7Ñ&7¸ÔHà×"Ò"Ù�} d×&9Ñ&9Ð;KÔLä�t—|‘|Ó$ò 	FˆAÙ�} d§i¡i°¡l°G¼cÀ!»fÑ4DÕEð	Fô # =Ó1ò 	4‰IˆAˆvÜ”b—g‘g—l‘l 4¨6°!°°C¨Ó9¸4Ó@ð 4ÀAØ—‘˜×0Ñ0Ó2Ô3÷4ð 4ð	4ð 3:×2EÑ2EÓ2GÖH¨˜Ÿ›ÐHˆÐHÜ! ,Ó/ò 	4‰HˆAˆuØ!×,Ñ,Ü'¨¨q©	´5·=±=ÔA��q’	ÀvÈaÁyÇÁÓGX×G\ÑG\ÓG^×GdÑGdÓGfóˆFô ”b—g‘g—l‘l 4¨7°1°#°SÐ)9Ó:¸DÓAð 4ÀQØ—‘˜×0Ñ0Ó2Ô3÷4ð 4ð		4ô 	Ð-¨d¨VÐ4Õ5÷4ñ 4üò I÷
4ð 4ús   Å I:ÆJÉ JÉ:J	ÊJ	c                 ó´  — t        |d   t        j                  «      rt        j                  |d   «      n.|d   j                  «       j                  «       j                  «       | _        t        j                  | j                  «      | _        t        j                  | j                  | j                  | j                  «      | _        | j                  j                  «       j                  «       j                  | j                   dg«      j#                  |«      | _        | j&                  rct        j(                  | j*                  |z   dz
  g«      j-                  d«      j/                  | j                   d«      j#                  |«      | _        | j2                  rnt        j4                  | j6                  t        j8                  | j                   dg«      j;                  | j6                  «      gd«      j#                  |«      | _        g | _        t        |d   t>        «      rtA        |d   «      | _        ytC        | jD                  «      D ]‹  }t        ||dz      t        j                  «      rt        j                  ||dz      «      n#||dz      j                  «       j                  «       }| j<                  jG                  |j#                  |«      «       Œ� y)z7
        Update the inputs for next inference.
        r   r	   N)$rš   r†   r›   r:   Ú
from_numpyr„   Údetachr…   rB   ra   Úpredict_next_tokenr@   r   rr   rA   Úreshaper6   rq   rf   ri   r¡   rd   rM   Úrepeatrg   rj   Úcatrh   ÚonesÚtype_asrk   ÚtupleÚlistrl   re   rW   )r   r�   Ústeprv   r    Úpast_is         r   ÚupdatezGpt2Tester.updateÉ   s=  € ô
 ,6°f¸Q±iÄÇÁÔ+OŒE×Ñ˜V A™YÔ'ÐU[Ð\]ÑU^×UdÑUdÓUf×UmÑUmÓUo×UsÑUsÓUuð 	Œô '×9Ñ9¸$¿+¹+ÓFˆÔÜ&×9Ñ9¸$¿+¹+ÀtÇzÁzÐSW×SlÑSlÓmˆÔà×*Ñ*×0Ñ0Ó2×9Ñ9Ó;×CÑCÀTÇ_Á_ÐVWÐDXÓY×\Ñ\Ð]cÓdˆŒà× Ò ä—‘˜d×/Ñ/°$Ñ6¸Ñ:Ð;Ó<×FÑFÀqÓI×PÑPÐQU×Q`ÑQ`ÐbcÓd×gÑgÐhnÓoð Ôð ×"Ò"Ü"'§)¡)à×'Ñ'Ü—J‘J §¡°Ð3Ó4×<Ñ<¸T×=PÑ=PÓQðð ó#÷ ‰b�‹jð Ôð ˆŒ	ä�f˜Q‘i¤Ô'Ü˜V A™Y›ˆD�Iä˜4Ÿ<™<Ó(ò 4�ô " &¨¨Q©¡-´·±Ô?ô ×$Ñ$ V¨A°©E¡]Ô3à  A¡™×,Ñ,Ó.×5Ñ5Ó7ð ð
 —	‘	× Ñ  §¡¨6Ó!2Õ3ñ4r   c                 óV  — t        d«       | j                  �H| j                  |j                  z
  j                  «       j                  «       }|dkD  rt        d|› �«       t	        j
                  | j                  |j                  k(  «      s!t        d| j                  |j                  «       | j                  rMt	        j
                  | j                  |j                  k(  «      s!t        d| j                  |j                  «       | j                  rMt	        j
                  | j                  |j                  k(  «      s!t        d| j                  |j                  «       t        | j                  «      t        |j                  «      k(  sJ ‚t        | j                  «      D ]†  \  }}|j                  |j                  |   j                  k(  sJ ‚|j                  «       dkD  sŒB||j                  |   z
  j                  «       j                  «       }|dkD  sŒvt        d	|› d
|› �«       Œˆ y)z3
        Compare inputs and logits output.
        zstart diff...Ng-Cëâ6?z$Max logits difference is too large: zInput_ids is differentzposition_ids is differentzattention_mask is differentr   zmax_past_diff[z]=)r!   rB   r0   r1   r:   rI   rf   ri   rg   rj   rh   r&   rk   r•   rc   Únelement)r   r   Úmax_io_diffr    r²   Úmax_past_diffs         r   r4   zGpt2Tester.diffñ   s½  € ô
 	ˆoÔØ�;‰;Ð"ØŸ;™;¨¯©Ñ8×=Ñ=Ó?×CÑCÓEˆKØ˜TÒ!ÜÐ<¸[¸MÐJÔKä�y‰y˜Ÿ™¨8×+=Ñ+=Ñ=Ô>ÜÐ*¨D¯N©N¸H×<NÑ<NÔOà× Ò Ü—9‘9˜T×.Ñ.°(×2GÑ2GÑGÔHÜØ/Ø×%Ñ%Ø×)Ñ)ôð ×"Ò"Ü—9‘9˜T×0Ñ0°H×4KÑ4KÑKÔLÜØ1Ø×'Ñ'Ø×+Ñ+ôô �4—9‘9‹~¤ X§]¡]Ó!3Ò3Ð3Ð3ä" 4§9¡9Ó-ò 	A‰IˆAˆvØ—<‘< 8§=¡=°Ñ#3×#9Ñ#9Ò9Ð9Ð9Ø�‰Ó  1Ó$Ø!'¨(¯-©-¸Ñ*:Ñ!:× ?Ñ ?Ó A× EÑ EÓ G�Ø  4Ó'Ü˜N¨1¨#¨R°¨Ð?Õ@ñ	Ar   c                 óÄ   — | dd…df   }|dk(  rt        j                  |dd«      }|S t        j                  |dd¬«      dd…d|…f   }|s|j                  «       \  }}|S |S )z4
        Get top k topkens based on logits.
        Néÿÿÿÿr	   T)Ú
descending)r:   ÚargmaxÚargsortÚsort)rB   r   Úrequired_orderÚlastTokenLogitsÚgeneratedTokensÚtopkÚsorted_topkÚ_s           r   r©   zGpt2Tester.predict_next_token  sl   € ð !¢ B ™-ˆØ�AŠ:Ü#Ÿl™l¨?¸A¸tÓDˆOØ"Ð"ä—=‘= °"ÀÔFÂqÈ&È5È&ÀyÑQˆDÙ!Ø!%§¡£‘�˜QØ"Ð"ØˆKr   c                 ó´  — g }t        |«      D ]º  }t        | |dz      t        j                  «      rt	        j
                  | |dz      «      n| |dz      }t        ||dz      t        j                  «      rt	        j
                  ||dz      «      n||dz      }||z
  j                  «       j                  «       }|j                  |«       Œ¼ t        d|› �«       y)zO
        Compare the present outputs of two outputs from ONNX Runtime.
        r	   zpresent_diff_max=N)
rl   rš   r†   r›   r:   r§   r0   r1   rW   r!   )Úonnx_outputÚonnx_io_outputre   Úpresent_diff_maxr    Úonnx_present_iÚonnx_io_present_irE   s           r   Údiff_presentzGpt2Tester.diff_present+  sä   € ð
 ÐÜ�w“ò 	.ˆAô ˜k¨!¨a©%Ñ0´%·-±-Ô@ô × Ñ  ¨Q°©UÑ!3Ô4à   Q¡Ñ'ð ô ˜n¨Q°©UÑ3´U·]±]ÔCô × Ñ  °°A±Ñ!6Ô7à# A¨¡EÑ*ð ð
 'Ð):Ñ:×?Ñ?ÓA×EÑEÓGˆHØ×#Ñ# HÕ-ð	.ô 	Ð!Ð"2Ð!3Ð4Õ5r   c                 óH   — ddl m}  || «      }ddlm} |j                  |k(  S )z>
        Returns True if the ONNX model is quantized.
        r   )Úload)Ú__producer__)rŽ   rÌ   Ú!onnxruntime.quantization.quantizerÍ   Úproducer_name)Úonnx_model_pathrÌ   ÚmodelÚquantize_producers       r   Úis_quantized_onnx_modelz"Gpt2Tester.is_quantized_onnx_model@  s&   € õ
 	á�_Ó%ˆÝWà×"Ñ"Ð&7Ñ7Ð7r   ÚGpt2LMHeadModelTé   r   ú.c                 óÎ
  — t        d|› d|› d|› dt        |«      › d|	› d�«       |j                  j                  }|j                  j                  }|j                  j
                  }|j                  j                  }d}|t        j                  k(  }|r!d| j                  «       d   j                  v sJ ‚|j                  «       j                  |«       t        j                  d	d
d|j                  |¬«      }t        j                  |||¬«      }d}|t        j                   k(  rdnd}t#        |||«      }t#        |||«      }t#        |dz   ||«      }t%        |«      D �]È  \  }}|	dkD  r||	k(  r �n¸|dz  dk(  rt        |› «       |d   }|j'                  dd«      }|j'                  dd«      }t)        |||||||||| «
      }t)        |||||||||| «
      } t)        |||||||d|| «
      }!|!j*                  }"|j-                  |"«       |j-                  |"«       t/        j0                  «       5  t/        j2                  |"t.        j4                  ¬«      }#t7        |«      D �]š  }$t9        |j:                  j=                  «       «      d   }%t9        |j>                  d   j=                  «       «      d   }&tA        jB                  «       }'t        jD                  ||!jG                  «       «      }(|jI                  |&tA        jB                  «       |'z
  «       |!jK                  |(|$|«       t        jL                  | |jG                  «       d¬«      \  })}*|jI                  |&|*dz  «       |jK                  |)|$|«       t        j                  |"|&|%|j                  |¬«      }+t        jN                  ||+«       t        jP                  | | jG                  «       ||+ddd¬«      \  },}*|jI                  |&|*dz  «       ||k  r| jS                  | |,||«       |dz  }| jK                  |,|$|«       |
ru|jU                  | «       t(        jW                  |)|,|«       t        d «       t        d!|!jX                  «       t        d"|jX                  «       t        d#| jX                  «       |j[                  |!||&|
¬$«       |j[                  |!| |&|
¬$«       |#|!jX                  |k(  j]                  «       z  }#t/        j^                  |#«      s�Œ› n ddd«       |ja                  «        |ja                  «        �ŒË |j                  «        |j                  «        |j                  «        y# 1 sw Y   Œ]xY w)%z·
        Test Generation using greedy beam search (without sampling) to compare PyTorch and ONNX model.
        It will print top 1 and top k errors on the given test inputs.
        zstart test generation: (top_k=z top_k_no_order=z max_steps=z test_inputs=z max_inputs=ú)r   ro   é   é€   é    )r6   Úpast_sequence_lengthÚsequence_lengthÚconfigÚmodel_class)Ú
is_float16rZ   zQuantized OnnxÚOnnxz with IO Bindingé
   rf   rg   Nrh   Fr8   r	   é   )Ú
total_runsr   )rß   T)rä   Úreturn_numpyÚinclude_copy_output_latencyzTop 1 tokens:z	Torchz	ONNXz	ONNX with IO binding)rD   )1r!   r&   rÞ   re   Ún_headÚn_embdÚeos_token_idr   ÚFLOAT16r™   rn   Úevalrq   r   Úget_output_shapesÚget_output_buffersÚINT8r   r•   Úgetra   r6   r=   r:   Úno_gradr;   r<   rl   r°   rf   Úsizerk   ÚtimeitÚdefault_timerÚpytorch_inferencer}   rY   r³   Úonnxruntime_inferenceÚauto_increase_buffer_sizeÚ$onnxruntime_inference_with_binded_ior¥   r4   rÊ   r@   rF   ÚanyrI   rR   )-rœ   rÑ   rv   Útest_inputsÚ	precisionrß   r   Útop_k_no_orderÚ	max_stepsÚ
max_inputsrD   r¥   rž   re   rç   rè   ré   Útest_data_savedrà   Úinit_output_shapesÚoutput_buffersr   r   Útorch_metricÚonnx_metricÚonnx_io_metricr    Úinputsrf   rg   rh   Úonnx_runnerÚonnx_io_runnerÚtorch_runnerr6   Údoner±   Úseq_lenrC   Ú
start_timeÚpytorch_outputrÅ   Úavg_latency_msÚoutput_shapesrÆ   s-                                                r   Útest_generationzGpt2Tester.test_generationL  sv  € ô( 	Ø,¨U¨GÐ3CÀNÐCSÐS^Ð_hÐ^iÐivÔwzð  |Gó  xHð  wIð  IUð  V`ð  Uað  abð  cô	
ð —,‘,×&Ñ&ˆØ—‘×$Ñ$ˆØ—‘×$Ñ$ˆØ—|‘|×0Ñ0ˆØˆà¤)×"3Ñ"3Ñ3ˆ
ÙØ × 3Ñ 3Ó 5°aÑ 8× =Ñ =Ñ=Ð=Ð=ð 	�
‰
‹�‰˜Ôô (×9Ñ9ØØ!$ØØ—<‘<Ø#ô
Ðô $×6Ñ6Ð7IÈ6Ð^hÔiˆàˆØ-6¼)¿.¹.Ò-HÑ)ÈfˆÜ! -°ÀÓFˆÜ  °ÀÓFˆÜ# NÐ5GÑ$GÈÐX]Ó^ˆä" ;Ó/ó q	'‰IˆAˆvØ˜AŠ~ ! z¢/ÚØ�2‰v˜Š{Ü˜˜”Ø˜{Ñ+ˆIØ!Ÿ:™: n°dÓ;ˆLØ#ŸZ™ZÐ(8¸$Ó?ˆNä$ØØØØØØØØØØ"Ð"óˆKô (ØØØØØØØØØØ"Ð"óˆNô &ØØØØØØØØØØ"Ð"óˆLð &×0Ñ0ˆJØ×#Ñ# JÔ/Ø×&Ñ& zÔ2ä—‘“ñ <Ü—{‘{ :´U·Z±ZÔ@�Ü! )Ó,ó :�DÜ" ;×#8Ñ#8×#=Ñ#=Ó#?Ó@ÀÑC�GÜ#'¨×(8Ñ(8¸Ñ(;×(@Ñ(@Ó(BÓ#CÀAÑ#F�Lä!'×!5Ñ!5Ó!7�JÜ%/×%AÑ%AÀ%È×I`ÑI`ÓIbÓ%c�NØ ×,Ñ,¨\¼6×;OÑ;OÓ;QÐT^Ñ;^Ô_Ø ×'Ñ'¨¸¸fÔEä2<×2RÑ2RØ ×!7Ñ!7Ó!9Àaô3Ñ/�K ð  ×+Ñ+¨L¸.È6Ñ:QÔRØ×&Ñ& {°D¸&ÔAä$.×$@Ñ$@Ø"Ø$ØØŸ™Ø$/ô%�Mô ×8Ñ8¸ÈÔWô
 #×GÑGØØ&×1Ñ1Ó3Ø&Ø%Ø#$Ø%*Ø48ôñØ&Ø&ð #×.Ñ.¨|¸^ÈfÑ=TÔUà&¨Ò7Ø&×5Ñ5°g¸~ÐOaÐcrÔsØ'¨1Ñ,˜à"×)Ñ)¨.¸$ÀÔGáØ#×(Ñ(¨Ô8Ü"×/Ñ/°¸^ÈWÔUä˜oÔ.Ü˜i¨×)BÑ)BÔCÜ˜h¨×(@Ñ(@ÔAÜÐ6¸×8SÑ8SÔTà×*Ñ*¨<¸ÀlÐ\cÐ*ÔdØ"×-Ñ-¨l¸NÈLÐbiÐ-Ôjà <×#<Ñ#<ÀÑ#L×"QÑ"QÓ"SÑS�DÜ—y‘y –Ùðu:÷<ð| ×!Ñ!Ô#Ø×$Ñ$Ö&ðcq	'ðf 	×ÑÔØ×ÑÔØ×ÑÕ÷G<ð <ús   È0K
UÓ<UÕU$	N)Fr[   F)r	   F)r\   r]   r^   r   r   r}   r¥   r³   r4   Ústaticmethodr©   rÊ   rÓ   r   ÚFLOAT32r  r_   r   r   ra   ra   s   s©   „ ð ØØ"ó)9ðV]˜Jó ]ò%6òN&4òP%AðN òó ðð$ ñ6ó ð6ð( ñ	8ó ð	8ð ð ×#Ñ#Ø%ØØØØØØØòhó ñhr   ra   )ÚloggingrU   r�   r$   rò   r†   r:   Úbenchmark_helperr   Úgpt2_helperr   r   Ú	getLoggerr\   Úloggerr   ra   r_   r   r   ú<module>r     sM   ðó Û Û 	Û Û ã Û Ý &ß .à	ˆ×	Ñ	˜8Ó	$€÷[2ñ [2÷|Bò Br   