Ë
    cQêjž  ã                   ó&  — 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	Z	d dl
Z
d dl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 d d	lmZ d d
lmZmZmZ 	 d dlmZ  e j@                  e!«      Z"g d¢Z#ejH                  dejJ                  dejL                  diZ' G d„ de«      Z(e� G d„ de«      Z)ndZ) G d„ de«      Z* G d„ de«      Z+ G d„ de«      Z,e+ddfe,ddfe*ddfdœZ- G d„ d «      Z. G d!„ d"«      Z/y# e$ r dZY Œ¥w xY w)#é    N)ÚPath)Ú	Precision)Úfloat_to_float16_max_diff)ÚFusionOptions)ÚIOBindingHelper)Ú	OnnxModel)Úoptimize_model)Útorch_onnx_export)Ú
GPT2ConfigÚGPT2LMHeadModelÚ	GPT2Model)ÚTFGPT2Model)Ú
distilgpt2Úgpt2zgpt2-mediumz
gpt2-largezgpt2-xlçü©ñÒMb@?gš™™™™™É?g      @c                   ó,   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ xZS )ÚGPT2ModelNoPastStateú2Here we wrap a class to disable past state output.c                 ó$   •— t         ‰| �  |«       y ©N©ÚsuperÚ__init__©ÚselfÚconfigÚ	__class__s     €úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/gpt2/gpt2_helper.pyr   zGPT2ModelNoPastState.__init__/   ó   ø€ Ü‰Ñ˜Õ ó    c                 ó(   •— t         ‰| �  |dd¬«      S )NF)Ú	use_cacheÚreturn_dict)r   Úforward©r   Ú	input_idsr   s     €r   r$   zGPT2ModelNoPastState.forward2   s   ø€ Ü‰w‰˜y°EÀuˆÓMÐMr    ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r$   Ú__classcell__©r   s   @r   r   r   ,   s   ø„ Ù<ô!÷Nð Nr    r   c                   ó,   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ xZS )ÚTFGPT2ModelNoPastStater   c                 ó2   •— d|_         t        ‰| �	  |«       y )NF)r"   r   r   r   s     €r   r   zTFGPT2ModelNoPastState.__init__;   s   ø€ Ø$ˆFÔÜ‰GÑ˜VÕ$r    c                 ó&   •— t         ‰| �  |d¬«      S )NF)r"   )r   Úcallr%   s     €r   r$   zTFGPT2ModelNoPastState.forward?   s   ø€ Ü‘7‘< 	°U�<Ó;Ð;r    r'   r-   s   @r   r/   r/   8   s   ø„ Ù@ô	%÷	<ð 	<r    r/   c                   ó<   ‡ — e Zd ZdZˆ fd„Zed„ «       Zˆ fd„Zˆ xZS )ÚMyGPT2ModelzMHere we wrap a class for Onnx model conversion for GPT2Model with past state.c                 ó$   •— t         ‰| �  |«       y r   r   r   s     €r   r   zMyGPT2Model.__init__I   r   r    c           	      ó€  — t        | d   d   t        t        f«      r¡t        | d   «      |k(  rt        | d   d   «      dk(  sJ ‚g }t	        |«      D ]Z  }|j                  t        j                  | d   |   d   j                  d«      | d   |   d   j                  d«      fd¬«      «       Œ\ | d   t        |«      fS | S )Né   r   é   )Údim)	Ú
isinstanceÚtupleÚlistÚlenÚrangeÚappendÚtorchÚcatÚ	unsqueeze)ÚresultÚ	num_layerÚpresentÚis       r   Úpost_processzMyGPT2Model.post_processL   sÉ   € ä�f˜Q‘i ‘l¤U¬D MÔ2Ü�v˜a‘y“> YÒ.´3°v¸a±yÀ±|Ó3DÈÒ3IÐIÐIàˆGÜ˜9Ó%ò �ð —‘Ü—I‘IØ ™ 1™ a™×2Ñ2°1Ó5°v¸a±yÀ±|ÀA±×7PÑ7PÐQRÓ7SÐTØôõðð ˜1‘Iœu W›~Ð.Ð.àˆr    c                 ó€   •— t         ‰| �  ||||d¬«      }t        j                  || j                  j
                  «      S ©NF)Úposition_idsÚattention_maskÚpast_key_valuesr#   ©r   r$   r4   rG   r   Ún_layer©r   r&   rJ   rK   ÚpastrC   r   s         €r   r$   zMyGPT2Model.forward_   sD   ø€ Ü‘‘ØØ%Ø)Ø Øð !ó 
ˆô ×'Ñ'¨°·±×0CÑ0CÓDÐDr    )	r(   r)   r*   r+   r   ÚstaticmethodrG   r$   r,   r-   s   @r   r4   r4   F   s+   ø„ ÙWô!ð ñó ð÷$Eð Er    r4   c                   ó,   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ xZS )ÚMyGPT2LMHeadModelzSHere we wrap a class for Onnx model conversion for GPT2LMHeadModel with past state.c                 ó$   •— t         ‰| �  |«       y r   r   r   s     €r   r   zMyGPT2LMHeadModel.__init__m   r   r    c                 ó€   •— t         ‰| �  ||||d¬«      }t        j                  || j                  j
                  «      S rI   rM   rO   s         €r   r$   zMyGPT2LMHeadModel.forwardp   sD   ø€ Ü‘‘ØØ%Ø)Ø Øð !ó 
ˆô ×'Ñ'¨°·±×0CÑ0CÓDÐDr    r'   r-   s   @r   rS   rS   j   s   ø„ Ù]ô!÷	Eð 	Er    rS   c                   ó,   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ xZS )ÚMyGPT2LMHeadModel_NoPaddinga  Here we wrap a class for Onnx model conversion for GPT2LMHeadModel with past state and no padding.
    When you always use batch_size=1 in inference, there is no padding in inputs. In such case, position_ids
    and attention_mask need no be in inputs.
    c                 ó$   •— t         ‰| �  |«       y r   r   r   s     €r   r   z$MyGPT2LMHeadModel_NoPadding.__init__‚   r   r    c                 ó|   •— t         ‰| �  ||d¬«      }t        j                  || j                  j
                  «      S )NF)rL   r#   rM   )r   r&   rP   rC   r   s       €r   r$   z#MyGPT2LMHeadModel_NoPadding.forward…   s4   ø€ Ü‘‘ ¸DÈe�ÓTˆä×'Ñ'¨°·±×0CÑ0CÓDÐDr    r'   r-   s   @r   rW   rW   |   s   ø„ ñô
!÷Eð Er    rW   ÚlogitsTFÚ
last_state)r   ÚGPT2LMHeadModel_NoPaddingr   c                   ó0   — e Zd Zd„ Zdefd„Zdefd„Zd„ Zy)Ú
Gpt2Inputsc                 ó<   — || _         || _        || _        || _        y r   )r&   rJ   rK   rP   )r   r&   rJ   rK   rP   s        r   r   zGpt2Inputs.__init__”   s    € Ø+4ˆŒØ.:ˆÔØWeˆÔØFJˆ�	r    Úreturnc                 óÄ   — | j                   | j                  | j                  fD �cg c]  }|€Œ|‘Œ	 }}| j                  r|j	                  | j                  «       |S c c}w r   )r&   rJ   rK   rP   Úextend)r   ÚvÚ
input_lists      r   Úto_listzGpt2Inputs.to_listš   sW   € Ø"&§.¡.°$×2CÑ2CÀT×EXÑEXÐ!YÖk˜AÐ]^Ñ]j’aÐkˆ
ÐkØ�9Š9Ø×Ñ˜dŸi™iÔ(àÐùò	 ls
   ¦A®Ac                 ó~   — t        d„ | j                  | j                  | j                  | j                  fD «       «      S )Nc              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr   © )Ú.0rc   s     r   ú	<genexpr>z&Gpt2Inputs.to_tuple.<locals>.<genexpr>¢   s   è ø€ Òu˜1ÐghÑgt”QÑuùs   ‚Š)r;   r&   rJ   rK   rP   )r   s    r   Úto_tuplezGpt2Inputs.to_tuple¡   s3   € ÜÑu §¡°×1BÑ1BÀD×DWÑDWÐY]×YbÑYbÐ cÔuÓuÐur    c                 ó”  — d }| j                   �]| j                   j                  t        j                  k(  r*| j                   j	                  t        j
                  ¬«      n| j                   }| j                  D �cg c]"  }|j	                  t        j
                  ¬«      ‘Œ$ }}t        | j                  | j                  ||«      S c c}w )N)Údtype)
rK   rm   r@   Úfloat16ÚtoÚfloat32rP   r^   r&   rJ   )r   rK   ÚprP   s       r   Úto_fp32zGpt2Inputs.to_fp32¤   s    € àˆØ×ÑÐ*ð ×'Ñ'×-Ñ-´·±Ò>ð ×#Ñ#×&Ñ&¬U¯]©]Ð&Ô;à×(Ñ(ð ð 48·9±9Ö=¨a�—‘œ5Ÿ=™=�Õ)Ð=ˆÐ=Ü˜$Ÿ.™.¨$×*;Ñ*;¸^ÈTÓRÐRùò >s   Á:'CN)	r(   r)   r*   r   r<   re   r;   rk   rr   rh   r    r   r^   r^   “   s(   „ òKð˜ó ðv˜%ó vóSr    r^   c            "       óp  — e Zd ZdZedddej                  ej                  ej                  dfdededededed	ed
edej                  de	de	de	dej                  dej                  dej                  de	def d„«       Ze	 dAdedededededeeee   f   fd„«       Zed„ «       ZedBd„«       ZedBd„«       ZedCd„«       ZedDd„«       Zeddddej                  ej                  ej                  fdede	d e	de	de	dej                  dej                  dej                  fd!„«       Ze	 	 	 dEd#„«       Zeg d$¢fd%ed&ee   fd'„«       ZedFd(ed)efd*„«       ZedFd(ed)efd+„«       Zed,„ «       ZedGd-„«       Ze	 	 	 dHd(ed.eeej>                  f   d/eeee   f   d)ed0e	d1e	fd2„«       Z ed3„ «       Z!ed4„ «       Z"edd5d5d6d7ddddej                  ej                  ej                  d"ddfd8„«       Z#edd9ddddej                  ej                  ej                  d:d7d;fd<„«       Z$edId=„«       Z%edddg d>¢fdefd?„«       Z&y@)JÚ
Gpt2HelperzEA helper class for Gpt2 model conversion, inference and verification.FTÚ
batch_sizeÚpast_sequence_lengthÚsequence_lengthÚnum_attention_headsÚhidden_sizerD   Ú
vocab_sizeÚdevicern   Úhas_position_idsÚhas_attention_maskÚinput_ids_dtypeÚposition_ids_dtypeÚattention_mask_dtypeÚleft_side_paddingr`   c                 ó´  — |rt         j                  nt         j                  }d| ||t        ||z  «      g}t	        |«      D �cg c]   }t        j
                  |||¬«      dz  dz
  ‘Œ" }}t        j                  d|dz
  | |f||¬«      }d}|
re||z   }t        j                  | |g||¬«      }|dk\  rAt	        | «      D ]3  }t        j                  d|dz
  «      }|r
d||d|…f<   Œ(d||||z
  d…f<   Œ5 d}|	rQ|j                  «       j                  d	«      dz
  }|j                  |dk  d«       |dd…|d…f   j                  |«      }t        ||||«      S c c}w )
z˜Create random inputs for GPT2 model.
        Returns torch tensors of input_ids, position_ids, attention_mask and a list of past state tensors.
        r8   ©rm   r{   g       @ç      ð?r   r7   )ÚlowÚhighÚsizerm   r{   Néÿÿÿÿ)r@   rn   rp   Úintr>   ÚrandÚrandintÚonesÚrandomÚlongÚcumsumÚmasked_fill_ro   r^   )ru   rv   rw   rx   ry   rD   rz   r{   rn   r|   r}   r~   r   r€   r�   Ú
float_typeÚ
past_shapeÚ_rP   r&   rK   Útotal_sequence_lengthrF   Úpadding_lengthrJ   s                            r   Úget_dummy_inputszGpt2Helper.get_dummy_inputsµ   sœ  € ñ* '.”U—]’]´5·=±=ˆ
àØØØ Ü�Ð1Ñ1Ó2ð
ˆ
ô `eÐenÓ_oÖpÐZ[”—‘˜J¨jÀÔHÈ3ÑNÐQTÓTÐpˆÐpÜ—M‘MØØ˜a‘Ø˜oÐ.Ø!Øô
ˆ	ð ˆÙØ$8¸?Ñ$JÐ!Ü"ŸZ™ZØÐ2Ð3Ø*ØôˆNð %¨Ò)Ü˜zÓ*ò X�AÜ%+§^¡^°AÐ7LÈqÑ7PÓ%Q�NÙ(Ø=>˜ q¨/¨>¨/Ð'9Ò:àVW˜ qÐ*?À.Ñ*PÑ*RÐ'RÒSðXð ˆÙØ)×.Ñ.Ó0×7Ñ7¸Ó;¸aÑ?ˆLØ×%Ñ% l°QÑ&6¸Ô:Ø'ªÐ+?Ñ+@Ð(@ÑA×DÑDÐEWÓXˆLä˜) \°>À4ÓHÐHùòC qs   Á%Er   r   Úmodel_classc                 ó  — |j                   }|j                  }|j                  }|j                  }t        |   d   }	| ||	dk(  r|n|g}
d| |||z   t        ||z  «      g}|	|
i}t        |«      D ]  }||dt        |«      z   <   Œ |S )zAReturns a dictionary with output name as key, and shape as value.r7   rZ   r8   Úpresent_)rx   ry   Únum_hidden_layersrz   ÚMODEL_CLASSESr‰   r>   Ústr)ru   rv   rw   r   r—   rx   ry   rD   rz   Úoutput_nameÚlast_state_shapeÚpresent_state_shapeÚoutput_shapesrF   s                 r   Úget_output_shapeszGpt2Helper.get_output_shapesö   sÃ   € ð %×8Ñ8ÐØ×(Ñ(ˆØ×,Ñ,ˆ	Ø×&Ñ&ˆ
ä# KÑ0°Ñ3ˆð ØØ%¨Ò1‰J°{ð
Ðð ØØØ  ?Ñ2Ü�Ð1Ñ1Ó2ð
Ðð %Ð&6Ð7ˆÜ�yÓ!ò 	EˆAØ1DˆM˜*¤s¨1£vÑ-Ò.ð	Eð Ðr    c                 ó  — |D ]|  }|| v sJ ‚| |   }t        j                  ||   «      |j                  «       kD  sŒ8t        j                  t        j                  ||   «      |j
                  |j                  ¬«      | |<   Œ~ y )Nrƒ   )ÚnumpyÚprodÚnelementr@   Úemptyrm   r{   )Úoutput_buffersr    ÚkeyÚbuffers       r   Úauto_increase_buffer_sizez$Gpt2Helper.auto_increase_buffer_size  sx   € à ò 	ˆCØ˜.Ñ(Ð(Ð(Ø# CÑ(ˆFÜ�z‰z˜-¨Ñ,Ó-°·±Ó0AÓAÜ&+§k¡kÜ—J‘J˜}¨SÑ1Ó2Ø Ÿ,™,Ø!Ÿ=™=ô'�˜sÒ#ñ		r    c                 óÚ   — |rt         j                  nt         j                  }i }| j                  «       D ]3  \  }}t        j                  t        j                  |«      ||¬«      ||<   Œ5 |S )zpReturns a dictionary of output name as key, and 1D tensor as value. The tensor has enough space for given shape.rƒ   )r@   rn   rp   Úitemsr¦   r£   r¤   )r    r{   Ú
is_float16Ú	data_typer§   ÚnameÚshapes          r   Úget_output_bufferszGpt2Helper.get_output_buffers%  s_   € ñ &0”E—M’M´U·]±]ˆ	àˆØ(×.Ñ.Ó0ò 	b‰KˆD�%Ü#(§;¡;¬u¯z©z¸%Ó/@È	ÐZ`Ô#aˆN˜4Ò ð	bàÐr    c                 ó  — | d   j                  «       j                  «       }t        j                  ||d   z
  «      }|r.t        j                  |t        j                  |«      dz   z  «      S t        j                  |«      S )zGReturns the maximum difference between PyTorch and OnnxRuntime outputs.r   ç�íµ ÷Æ°>)Úcpur£   ÚabsÚamax)Útorch_outputsÚort_outputsÚrelativeÚexpected_outputsÚdiffs        r   Údiff_outputszGpt2Helper.diff_outputs/  sn   € ð )¨Ñ+×/Ñ/Ó1×7Ñ7Ó9ÐÜ�y‰yÐ)¨K¸©NÑ:Ó;ˆÙÜ—:‘:˜d¤e§i¡iÐ0@Ó&AÀDÑ&HÑIÓJÐJä—:‘:˜dÓ#Ð#r    c           	      ó  — t        j                  |d   | d   j                  «       j                  «       ||¬«      }t        j	                  d|› �«       |}t        |«      dz
  }t        |«      D ]g  }t        j                  |d|z      | d   |   j                  «       j                  «       ||¬«      }t        j	                  d|› d|› d|› �«       |xr |}Œi |s/t        j                  | |«      }	t        j                  d|	d	›�«       |S )
zËReturns True if torch and ORT outputs are close for given thresholds, and False otherwise.
        Note: need kwargs since Gpt2BeamSearchHelper.compare_outputs has an extra parameter model_class
        r   )ÚrtolÚatolz9PyTorch and OnnxRuntime output 0 (last_state) are close: r7   zPyTorch and OnnxRuntime layer z state (present_z) are close:z@PyTorch and OnnxRuntime results are not all close: max_abs_diff=ú.5f)
r£   Úallcloser´   ÚloggerÚdebugr=   r>   rt   r¼   Úinfo)
r·   r¸   r¾   r¿   ÚkwargsÚis_closeÚis_all_closeÚ
num_layersÚlayerÚmax_abs_diffs
             r   Úcompare_outputszGpt2Helper.compare_outputs9  s  € ô
 —>‘> +¨a¡.°-ÀÑ2B×2FÑ2FÓ2H×2NÑ2NÓ2PÐW[ÐbfÔgˆÜ�‰ÐPÐQYÐPZÐ[Ô\àˆÜ˜Ó%¨Ñ)ˆ
ä˜:Ó&ò 	5ˆEÜ—~‘~Ø˜A ™IÑ&Ø˜aÑ  Ñ'×+Ñ+Ó-×3Ñ3Ó5ØØô	ˆHô �L‰LÐ9¸%¸Ð@PÐQVÐPWÐWcÐdlÐcmÐnÔoØ'Ò4¨H‰Lð	5ñ Ü%×2Ñ2°=À+ÓNˆLÜ�K‰KÐZÐ[gÐhkÐZlÐmÔnàÐr    c                 ó˜  — d}d}g }g }t        t        |«      «      D �]�  }||   }|dk(  r| d   n
| d   |dz
     j                  «       j                  «       }	t        j                  ||	|d¬«      }
|j                  t        j                  t        j                  |	|z
  «      «      «       |xr |
}t        j                  |	«      j                  «       rt        j                  d|› d�«       t        j                  |	«      j                  «       rt        j                  d|› d�«       t        j                  |«      j                  «       rt        j                  d	|› d�«       t        j                  |«      j                  «       rt        j                  d	|› d�«       t        j                  ||	z
  «      }t        j                  |j                  «       |j                   «      }|j                  d
||   d›d|› d||   d›dt#        |	|   «      d›�«       |dk(  s�Œt        j                  t        j                  |d¬«      |j                   «      }t        j                  t        j                  |	d¬«      |	j                   «      }t        j$                  ||«      }�Œ„ |j'                  t)        |«      «      }|t)        |«      |||fS )aë  Compare outputs from PyTorch and OnnxRuntime

        Args:
            torch_outputs (Tuple[Torch.Tensor]): PyTorch model output
            ort_outputs (List[numpy.ndarray]): OnnxRuntime output
            atol (float, optional): Absolute tollerance. Defaults to 1e-06.

        Returns:
            is_all_close(bool): whether all elements are close.
            max_abs_diff(float): maximum absolute difference.
            messages(str): a list of debug message for each output
        TFr   r7   )r¿   r¾   zPyTorch output z has nanz has infzORT output zdiff=z.9fz index=z ort=z torch=N)Úaxis)r>   r=   r´   r£   rÁ   r?   r¶   rµ   ÚisnanÚanyrÂ   rÃ   ÚisinfÚfabsÚunravel_indexÚargmaxr°   ÚfloatÚarray_equalÚindexÚmax)r·   r¸   r¿   rÇ   Úis_top1_matchedÚ	max_diffsÚmessagesrF   Ú
ort_outputÚtorch_outputrÆ   r»   ÚidxÚort_max_indexÚtorch_max_indexÚmax_diff_output_indexs                   r   Úcompare_outputs_v2zGpt2Helper.compare_outputs_v2T  sg  € ð ˆØˆØˆ	ØˆÜ”s˜;Ó'Ó(ó 	TˆAØ$ Q™ˆJØ01°Q²˜M¨!Ò,¸MÈ!Ñ<LÈQÐQRÉUÑ<S×XÑXÓZ×`Ñ`ÓbˆLÜ—~‘~ j°,ÀTÐPQÔRˆHØ×ÑœUŸZ™Z¬¯	©	°,ÀÑ2KÓ(LÓMÔNØ'Ò4¨HˆLä�{‰{˜<Ó(×,Ñ,Ô.Ü—‘˜¨q¨c°Ð:Ô;Ü�{‰{˜<Ó(×,Ñ,Ô.Ü—‘˜¨q¨c°Ð:Ô;Ü�{‰{˜:Ó&×*Ñ*Ô,Ü—‘˜{¨1¨#¨XÐ6Ô7Ü�{‰{˜:Ó&×*Ñ*Ô,Ü—‘˜{¨1¨#¨XÐ6Ô7ä—:‘:˜j¨<Ñ7Ó8ˆDÜ×%Ñ% d§k¡k£m°T·Z±ZÓ@ˆCØ�O‰OØ˜˜S™	 #� g¨c¨U°%¸
À3¹ÈÐ7LÈGÔTYÐZfÐgjÑZkÓTlÐmpÐSqÐrôð �AŒvÜ %× 3Ñ 3´E·L±LÀÐRVÔ4WÐYc×YiÑYiÓ j�Ü"'×"5Ñ"5´e·l±lÀ<ÐVZÔ6[Ð]i×]oÑ]oÓ"p�Ü"'×"3Ñ"3°MÀ?Ó"S’ð3	Tð6 !*§¡´°I³Ó ?ÐàÜ�	‹NØ!ØØð
ð 	
r    Úonnx_model_pathÚverboseÚuse_external_data_formatc
                 óŽ  — | j                   }
|
j                  }t        j                  ddd|
j                  |
j
                  ||
j                  |d|||||	¬«      }|j                  «       }t        j                  «       5   | |Ž }ddd«       t        |«      D �cg c]  }d|› �‘Œ	 }}t        |«      D �cg c]  }d|› �‘Œ	 }}d   j                  d   |
j                  k(  s!|d   j                  d   |
j
                  k(  sJ ‚|d   j                  d   |
j                  k(  rd	nd
g|¢}ddddœ|d   dddœi}|D ]
  }dddœ||<   Œ |D ]
  }dddœ||<   Œ dg}|rdddœ|d<   |j                  d«       |rdddœ|d<   |j                  d«       |j                  |«       t        |«      dk(  rt        |d   «      |k(  sJ ‚t        j!                  d|j"                  j                  › d|j$                  d   j                  › d|d   j                  › d|d   d   j                  › �«       t'        |«      j(                  j+                  dd¬«       |r³t-        j.                  «       5 }t0        j2                  j5                  |d«      }t'        |«      j(                  j+                  dd¬«       t7        | t9        |«      |d|||ddd|¬«       t;        j<                  |d¬«      } t?        j@                  | |dd¬«       ddd«       yt7        | t9        |«      |d|||ddd|¬«       y# 1 sw Y   �Œ¢xY wc c}w c c}w # 1 sw Y   yxY w) z1Export GPT-2 model with past state to ONNX model.r7   F)ru   rv   rw   rx   ry   rD   rz   r{   rn   r|   r}   r~   r   r€   NÚpast_r™   r   r8   rZ   r[   r&   ru   Úseq_len)r   r7   Úpast_seq_len)r7   é   Útotal_seq_lenrJ   rK   zShapes: input_ids=z past=z output=z	 present=T)ÚparentsÚexist_okz	gpt2.onnxé   )
ÚargsÚfÚexport_paramsÚinput_namesÚoutput_namesÚdynamic_axesÚopset_versionÚdo_constant_foldingrä   rã   )Úload_external_data)Úsave_as_external_dataÚall_tensors_to_one_fileé   )!r   rN   rt   r–   rx   ry   rz   re   r@   Úno_gradr>   r°   r?   rb   r=   rÂ   rÄ   r&   rP   r   ÚparentÚmkdirÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinr
   r;   ÚonnxÚ
load_modelr   Úsave)Úmodelr{   râ   rã   rä   r|   r}   r~   r   r€   r   rD   Údummy_inputsrd   ÚoutputsrF   Ú
past_namesÚpresent_namesrò   ró   r¯   rñ   Útmp_dir_nameÚtemp_onnx_model_paths                           r   Úexport_onnxzGpt2Helper.export_onnxŠ  sÎ  € ð #Ÿ\™\ˆØ—N‘Nˆ	Ü!×2Ñ2ØØ!"ØØ &× :Ñ :Ø×*Ñ*ØØ×(Ñ(ØØØ-Ø1Ø+Ø1Ø!5ð 3ó 
ˆð  "×)Ñ)Ó+ˆ
ä�]‰]‹_ñ 	)Ù˜ZÐ(ˆG÷	)ô ,1°Ó+;Ö< a˜˜a˜S’kÐ<ˆ
Ð<Ü16°yÓ1AÖB¨A˜8 A 3šÐBˆÐBð �q‰z×Ñ Ñ" f×&7Ñ&7Ò7¸7À1¹:×;KÑ;KÈAÑ;NÐRX×RdÑRdÒ;dÐdÐdØ$+¨A¡J×$4Ñ$4°QÑ$7¸6×;LÑ;LÒ$L™ÐR^ÐoÐanÐoˆð ˜\¨iÑ8Ø˜‰O °)Ñ<ð
ˆð ò 	FˆDØ%1°nÑ!EˆL˜Òð	Fà!ò 	GˆDØ%1°oÑ!FˆL˜Òð	Gð #�mˆÙØ/;À	Ñ+JˆL˜Ñ(Ø×Ñ˜~Ô.ÙØ1=À/Ñ-RˆLÐ)Ñ*Ø×ÑÐ/Ô0Ø×Ñ˜:Ô&ä�7‹|˜qÒ ¤S¨°©£_¸	Ò%AÐAÐAä�‰Ø  ×!7Ñ!7×!=Ñ!=Ð >¸fÀ\×EVÑEVÐWXÑEY×E_ÑE_ÐD`Ð`hÐipÐqrÑis×iyÑiyÐhzð  {Dð  ELð  MNñ  EOð  PQñ  ER÷  EXñ  EXð  DYð  Zô	
ô 	ˆ_Ó×$Ñ$×*Ñ*°4À$Ð*ÔGá#ä×,Ñ,Ó.ð °,Ü')§w¡w§|¡|°LÀ+Ó'NÐ$ÜÐ)Ó*×1Ñ1×7Ñ7ÀÈtÐ7ÔTä!ØÜ˜zÓ*Ø*Ø"&Ø +Ø!-Ø!-Ø"$Ø(,Ø-1Ø#õô Ÿ™Ð(<ÐQUÔV�Ü—‘ØØ#Ø*.Ø,0õ	÷'ð ô4 ØÜ˜:Ó&Ø!Ø"Ø'Ø)Ø)Ø Ø$(Ø).Øö÷Q	)ñ 	)üò =ùÚB÷Tð ús%   Á>L$ÂL1Â4L6É%BL;Ì$L.Ì;Mr   c           	      óÒ   — t        d«      }	t        | d||d|	d¬«      }
|r5|rt        j                  |
«       nd|vrd|d<    |
j                  dddi|¤Ž |
j                  ||«       |
S )	zHOptimize ONNX model with an option to convert it to use mixed precision.r   r   F)Ú
model_typeÚ	num_headsry   Ú	opt_levelÚoptimization_optionsÚuse_gpuÚkeep_io_typesÚuse_symbolic_shape_inferTrh   )r   r	   rt   Úauto_mixed_precisionÚconvert_float_to_float16Úsave_model_to_file)râ   Úoptimized_model_pathr­   rx   ry   rä   r  ÚstagerÅ   r  Úms              r   Úoptimize_onnxzGpt2Helper.optimize_onnx  s…   € ô  -¨VÓ4ÐäØØØ)Ø#ØØ!5Øô
ˆñ Ù#Ü×/Ñ/°Õ2à"¨&Ñ0Ø.3�F˜?Ñ+Ø*�×*Ñ*ÑSÀDÐSÈFÒSà	×ÑÐ1Ð3KÔLØˆr    )ÚAddÚLayerNormalizationÚSkipLayerNormalizationÚFastGeluÚEmbedLayerNormalizationÚ
onnx_modelÚop_block_listc                 ón  — | j                  «       D �ch c]  }|j                  ’Œ }}t        |«      }|j                  |«      }t        j                  d|› d|› �«       | j                  «       j                  d   j                  }d}| j                  «       }||v sJ ‚||   }d}	|j                  dk(  r‚|}	t        j                  d|j                  › �«       d}
|j                  D ]  }| j                  |«      }
|
€Œ n t        |
«      }t        j                  d|j                  › d	|› �«       |d
k  }n/t        j                  d|j                  › d|j                  › �«       g }g }|s|	�|g}|	j                  g}||||dœ}t        j                  d|› �«        | j                  dddi|¤Ž |S c c}w )a?  Convert GPT-2 model to mixed precision.
           It detects whether original model has fp16 weights, and set parameters for float16 conversion automatically.
        Args:
            onnx_model (OnnxModel): optimized ONNX model
            op_block_list (List[str], optional): operators to compute in fp32. Defaults to ["Add", "LayerNormalization",
                                                 "SkipLayerNormalization", "FastGelu", "EmbedLayerNormalization"]
        Returns:
            parameters(dict): a dictionary of parameters used in float16 conversion
        z	fp32 op: z
 fp16 op: r   FNÚMatMulz#Found last MatMul node for logits: z3max diff of converting weights in last MatMul node ú: r³   z-Failed to find MatMul node for logits. Found z	 of node )r  r"  Únode_block_listÚforce_fp16_initializersz!auto_mixed_precision parameters: r  Trh   )ÚnodesÚop_typeÚsetÚ
differencerÂ   rÄ   ÚgraphÚoutputr¯   Úoutput_name_to_nodeÚinputÚget_initializerr   rÃ   Úwarningr  )r!  r"  ÚnodeÚop_full_setÚfp32_op_setÚfp16_op_setÚlogits_output_nameÚis_weight_fp16_precisionr.  Úlast_matmul_nodeÚinitializerr/  Úmax_diffr  r&  Ú
parameterss                   r   r  zGpt2Helper.auto_mixed_precision&  sâ  € ð( 1;×0@Ñ0@Ó0BÖC¨�t—|“|ÐCˆÐCÜ˜-Ó(ˆØ!×,Ñ,¨[Ó9ˆÜ�‰�i ˜}¨J°{°mÐDÔEð (×-Ñ-Ó/×6Ñ6°qÑ9×>Ñ>Ðð $)Ð Ø(×<Ñ<Ó>ÐØ!Ð%8Ñ8Ð8Ð8Ø"Ð#5Ñ6ˆØÐØ�<‰<˜8Ò#Ø#ÐÜ�K‰KÐ=¸d¿i¹i¸[ÐIÔJØˆKØŸ™ò �Ø(×8Ñ8¸Ó?�ØÑ*Ùðô 1°Ó=ˆHÜ�L‰LÐNÈtÏyÉyÈkÐY[Ð\dÐ[eÐfÔgØ'/°$¡Ñ$ä�N‰NÐJÈ4Ï<É<È.ÐXaÐbf×bkÑbkÐalÐmÔnàˆØˆÙ(Ð/?Ð/Kà/Ð0ˆMØ/×4Ñ4Ð5ˆOð +Ø*Ø.Ø'?ñ	
ˆ
ô 	�‰Ð7¸
°|ÐDÔEØ+ˆ
×+Ñ+ÑXÀTÐXÈZÒXàÐùòa Ds   “F2ÚinputsÚ
total_runsc                 ó`  — t         j                  d«       |j                  «       j                  «       }t	        j
                  «       5   | |Ž }ddd«       |dk(  rS g }t	        j
                  «       5  t        |«      D ]A  }t        j                  «       } | |Ž }|j                  t        j                  «       |z
  «       ŒC 	 ddd«       t        |«      dz  t        |«      z  }t         j                  dj                  t        |d«      «      «       |fS # 1 sw Y   ŒËxY w# 1 sw Y   ŒaxY w)zfRun inference of PyTorch model, and returns average latency in ms when total_runs > 0 besides outputs.zstart pytorch_inferenceNr   éè  zPyTorch inference time = {} msú.2f)rÂ   rÃ   rr   re   r@   rú   r>   Útimer?   Úsumr=   Úformat)	r  r<  r=  rd   r  Úlatencyr“   ÚstartÚaverage_latencys	            r   Úpytorch_inferencezGpt2Helper.pytorch_inferencel  s  € ô 	�‰Ð.Ô/ð —^‘^Ó%×-Ñ-Ó/ˆ
ä�]‰]‹_ñ 	)Ù˜ZÐ(ˆG÷	)ð ˜Š?ØˆNàˆÜ�]‰]‹_ñ 	4Ü˜:Ó&ò 4�ÜŸ	™	›�Ù Ð,�Ø—‘œtŸy™y›{¨UÑ2Õ3ñ4÷	4ô ˜g›,¨Ñ-´°G³Ñ<ˆÜ�‰Ð5×<Ñ<¼VÀOÐUZÓ=[Ó\Ô]à˜Ð'Ð'÷!	)ð 	)ú÷	4ð 	4ús   ÁDÁ3AD$ÄD!Ä$D-c                 ó  — t         j                  d«       dt        j                  |j                  j                  «       j                  «       «      i}|j                  �Tt        |j                  «      D ]<  \  }}t        j                  |j                  «       j                  «       «      |d|› �<   Œ> |j                  �>t        j                  |j                  j                  «       j                  «       «      |d<   |j                  �>t        j                  |j                  j                  «       j                  «       «      |d<   | j                  d|«      }|dk(  r|S g }t        |«      D ]N  }t        j                  «       }	| j                  d|«      }|j                  t        j                  «       |	z
  «       ŒP t        |«      dz  t        |«      z  }
t         j                  d	j!                  t!        |
d
«      «      «       ||
fS )zcRun inference of ONNX model, and returns average latency in ms when total_runs > 0 besides outputs.zstart onnxruntime_inferencer&   Nræ   rK   rJ   r   r?  z"OnnxRuntime Inference time = {} msr@  )rÂ   rÃ   r£   Úascontiguousarrayr&   r´   rP   Ú	enumeraterK   rJ   Úrunr>   rA  r?   rB  r=   rC  )Úort_sessionr<  r=  Ú
ort_inputsrF   Úpast_ir¸   rD  r“   rE  rF  s              r   Úonnxruntime_inferencez Gpt2Helper.onnxruntime_inference†  s±  € ô 	�‰Ð2Ô3à!¤5×#:Ñ#:¸6×;KÑ;K×;OÑ;OÓ;Q×;WÑ;WÓ;YÓ#ZÐ[ˆ
à�;‰;Ð"Ü& v§{¡{Ó3ò X‘	��6Ü*/×*AÑ*AÀ&Ç*Á*Ã,×BTÑBTÓBVÓ*W�
˜U 1 #˜;Ò'ðXð × Ñ Ð,Ü+0×+BÑ+BÀ6×CXÑCX×C\ÑC\ÓC^×CdÑCdÓCfÓ+gˆJÐ'Ñ(à×ÑÐ*Ü).×)@Ñ)@À×ATÑAT×AXÑAXÓAZ×A`ÑA`ÓAbÓ)cˆJ�~Ñ&à!—o‘o d¨JÓ7ˆØ˜Š?ØÐàˆÜ�zÓ"ò 	0ˆAÜ—I‘I“KˆEØ%Ÿ/™/¨$°
Ó;ˆKØ�N‰Nœ4Ÿ9™9›;¨Ñ.Õ/ð	0ô
 ˜g›,¨Ñ-´°G³Ñ<ˆÜ�‰Ð9×@Ñ@ÄÈÐY^ÓA_Ó`Ôaà˜OÐ+Ð+r    c           	      ó8   — t        j                  | ||||||«      S )z)Returnas IO binding object for a session.)r   Úprepare_io_binding)rL  r&   rJ   rK   rP   r§   r    s          r   rQ  zGpt2Helper.prepare_io_binding¦  s,   € ô ×1Ñ1ØØØØØØØó
ð 	
r    c                 ó2   — t        j                  | |||«      S )z3Copy results to cpu. Returns a list of numpy array.)r   Ú"get_outputs_from_io_binding_buffer)rL  r§   r    Úreturn_numpys       r   rS  z-Gpt2Helper.get_outputs_from_io_binding_buffer»  s    € ô ×AÑAØ˜¨¸ó
ð 	
r    r§   r    rT  Úinclude_copy_output_latencyc           	      óh  — t         j                  d«       t        j                  | |j                  |j
                  |j                  |j                  ||«      }| j                  |«       t        j                  | |||«      }|dk(  r|S g }	t        |«      D ]g  }
t        j                  «       }| j                  |«       |rt        j                  | |||«      }
|	j                  t        j                  «       |z
  «       Œi t        |	«      dz  t        |	«      z  }t         j                  d|«       ||fS )zUInference with IO binding. Returns outputs, and optional latency when total_runs > 0.z*start onnxruntime_inference_with_binded_ior   r?  z4OnnxRuntime with IO binding inference time = %.2f ms)rÂ   rÃ   rt   rQ  r&   rJ   rK   rP   Úrun_with_iobindingrS  r>   rA  r?   rB  r=   )rL  r<  r§   r    r=  rT  rU  Ú
io_bindingr¸   rD  r“   rE  rF  s                r   Ú$onnxruntime_inference_with_binded_ioz/Gpt2Helper.onnxruntime_inference_with_binded_ioÂ  s"  € ô 	�‰ÐAÔBô  ×2Ñ2ØØ×ÑØ×ÑØ×!Ñ!Ø�K‰KØØó
ˆ
ð 	×&Ñ& zÔ2ô !×CÑCØ˜¨¸ó
ˆð ˜Š?ØÐàˆÜ�zÓ"ò 	0ˆAÜ—I‘I“KˆEà×*Ñ*¨:Ô6Ù*Ü×AÑAØ °Àó�ð �N‰Nœ4Ÿ9™9›;¨Ñ.Õ/ð	0ô ˜g›,¨Ñ-´°G³Ñ<ˆÜ�‰ÐKÈ_Ô]à˜OÐ+Ð+r    c                 óT  — t        d| › d�d«      5 }t        j                  ||«       d d d «       t        j	                  d| › d�«       t        d| › d�d«      5 }t        j                  ||«       d d d «       t        j	                  d| › d�«       y # 1 sw Y   ŒkxY w# 1 sw Y   Œ/xY w)NÚort_outputs_ú.pickleÚwbz$ORT output are saved to ort_outputs_Útorch_outputs_z(Torch output are saved to torch_outputs_©ÚopenÚpickleÚdumprÂ   rÄ   )rF   r¸   r·   rï   s       r   Úsave_outputszGpt2Helper.save_outputsõ  sž   € ä�L   7Ð+¨TÓ2ð 	(°aÜ�K‰K˜ QÔ'÷	(ä�‰Ð:¸1¸#¸WÐEÔFä�N 1 # WÐ-¨tÓ4ð 	*¸Ü�K‰K˜ qÔ)÷	*ä�‰Ð>¸q¸cÀÐIÕJ÷	(ð 	(ú÷	*ð 	*ús   ‘BÁBÂBÂB'c                 ó¬   — t        d| › d�d«      5 }t        j                  ||«       d d d «       t        j	                  d| › d�«       y # 1 sw Y   Œ#xY w)NÚdummy_inputs_r\  r]  z!inputs are saved to dummy_inputs_r_  )rF   r  r¸   r·   rï   s        r   Úsave_inputszGpt2Helper.save_inputsÿ  sP   € ä�M !  GÐ,¨dÓ3ð 	)°qÜ�K‰K˜ aÔ(÷	)ä�‰Ð7¸°s¸'ÐBÕC÷	)ð 	)ús   ‘A
Á
Ar   i'  r7   c                 ó�  — |j                   }t        j                  d|› d|› d|› d|› d|	› d|› d�«       d}d	}d
}d}|r0t        j	                  |||||	«      }t        j                  |||«      }d}d}g }dg|z  }||z  }t        |«      D �]E  }t        ||z  «      }t        j                  d|«      }|dk(  rdnt        j                  d|«      } t        j                  d|«      }!t        j                  d|!› d| › d�«       t        j                  |!| ||j                  |j                  |j                  |j                  |||
||||d¬«      }"t        j!                  ||"«      }#|rt        j#                  | |"«      }$n1t        j	                  |!| |||	«      }%t        j%                  | |"||%«      }$t        j'                  |#|$|¬«      \  }&}'}(})}*t)        j*                  |'«      s|j-                  |'«       |&r|dz  }|*r|dz  }||xx   dz  cc<   |rr|&spt        j                  d|› d|!› d| › d|› d|'› �
«       t/        |)«      D ]>  \  }}+t        j                  d|› d| j1                  «       |   j2                  › d|+› �«       Œ@ |s�Œút)        j*                  |'«      s
|'d|z  kD  s�Œt        j5                  ||"«       t        j7                  ||$|#«       �ŒH |r*dD �,ci c]  },d|,› �t)        j8                  ||,«      d›“Œ  }-},ndD �,ci c]  },d|,› �d“Œ
 }-},|d z  |z  |-d!<   |D �.cg c]
  }.|.d z  |z  ‘Œ c}.|-d"<   |d z  |z  |-d#<   |t;        |«      z
  d z  |z  |-d$<   t        j                  d%|› d&|› d'|t;        |«      z
  › d(|› �«       |d)|z  kD  r)t        j                  d*t        |dz  |z  «      d+›d,�«       |-S c c},w c c},w c c}.w )-zKGenerate random inputs and compare the results of PyTorch and Onnx Runtime.zRunning parity test (atol=z, test_cases=z, runs=z, use_io_binding=z, model_class=z, is_float16=z) ...é   é   r8   Nr   r7   z#Running parity test for batch_size=z past_sequence_length=z...T)r~   r   r€   r�   )r¿   z
test_case=z batch_size=z sequence_length=z	 MaxDiff=ú	z: Name=z, éd   )é2   éZ   é_   éc   Úmax_diff_percentile_rÀ   Únanr„   Útop1_match_rateÚtop1_match_rate_per_runÚdiff_pass_rateÚnan_ratezParity Test Cases=z	; Passed=z; Nan=z; Top1_Matched=gffffffî?zParity is good: passed rate=z.0fú%)r   rÂ   rÄ   rt   r¡   r±   r>   r‰   r�   r‹   rÃ   r–   rx   ry   rN   rz   rG  rO  rY  rá   r£   rÎ   r?   rJ  Úget_outputsr¯   rf  rc  Ú
percentiler=   )/rL  r  r{   r­   r¾   r¿   Útest_cases_per_runr=  Úuse_io_bindingr—   r|   r}   r~   r   r€   r  rã   Úenable_pickle_outputr   Úmax_batch_sizeÚmax_past_seq_lenÚmax_seq_lenr§   Úmax_output_shapesÚpassed_test_casesÚtop1_matched_casesÚmax_abs_diff_listÚtop1_matched_cases_per_runÚtotal_test_casesrF   Úrun_idrw   rv   ru   r  r  r¸   r    rÇ   rÊ   rà   rÚ   rØ   Úmessagerq   rC   Úxs/                                                  r   Útest_parityzGpt2Helper.test_parity  sû  € ð. #Ÿ\™\ˆä�‰Ø(¨¨¨mÐ<NÐ;OÈwÐWaÐVbÐbsð  uCð  tDð  DRð  S^ð  R_ð  _lð  mwð  lxð  x}ð  ~ô	
ð ˆØÐØˆàˆÙÜ *× <Ñ <ØÐ 0°+¸vÀ{ó!Ðô (×:Ñ:Ð;LÈfÐV`ÓaˆNàÐØÐàÐØ&' S¨:Ñ%5Ð"Ø-°
Ñ:ÐÜÐ'Ó(ó C	AˆAÜ˜Ð/Ñ/Ó0ˆFÜ$Ÿn™n¨Q°Ó<ˆOØ).°!ª¡1¼&¿.¹.ÈÐL\Ó:]Ð ÜŸ™¨¨>Ó:ˆJä�L‰LØ5°j°\ÐAWÐXlÐWmÐmpÐqôô &×6Ñ6ØØ$ØØ×*Ñ*Ø×"Ñ"Ø—‘Ø×!Ñ!ØØØ Ø"Ø /Ø#5Ø%9Ø"&ð 7ó ˆLô" !×2Ñ2°5¸,ÓGˆGÙÜ(×>Ñ>¸{ÈLÓY‘ä *× <Ñ <ØØ(Ø#ØØó!�ô )×MÑMØ ¨~¸}ó�ô ×-Ñ-¨g°{ÈÐ-ÓNñØØØ%ØØä—;‘;˜|Ô,Ø!×(Ñ(¨Ô6ÙØ! QÑ&Ð!áØ" aÑ'Ð"Ø*¨6Ó2°aÑ7Ó2á™|Ü—‘Ø    <°
¨|Ð;QÐRfÐQgÐgxð  zIð  yJð  JSð  T`ð  Sað  bôô #,¨HÓ"5ò _‘J�A�wÜ—K‘K " Q C w¨{×/FÑ/FÓ/HÈÑ/K×/PÑ/PÐ.QÐQSÐT[ÐS\Ð ]Õ^ð_ó $¬¯©°\Ô)BÀlÐUXÐ[_ÑU_ÔF_Ü×&Ñ& q¨,Ô7Ü×'Ñ'¨¨;¸Ö@ðGC	AñJ àeuöØ`aÐ& q cÐ*¬u×/?Ñ/?Ð@QÐSTÓ/UÐVYÐ.ZÑ[ðˆFñ ð BRÖR¸AÐ,¨Q¨CÐ0°%Ñ7ÐRˆFÐRà$6¸Ñ$<Ð?OÑ$OˆÐ Ñ!ØSmÖ,nÈa¨Q°©WÐ7IÓ-IÒ,nˆÐ(Ñ)Ø#4°sÑ#:Ð=MÑ#MˆÐÑ Ø.´Ð5FÓ1GÑGÈ3ÑNÐQaÑaˆˆzÑä�‰Ø Ð!1Ð 2°)Ð<MÐ;NÈfÐUeÔhkÐl}Óh~ÑU~ÐTð  @Oð  Pbð  Ocð  dô	
ð ˜tÐ&6Ñ6Ò6Ü�K‰KÐ6´sÐ;LÈsÑ;RÐUeÑ;eÓ7fÐgjÐ6kÐklÐmÔnàˆùò%ùò Sùò -os   Ë#N9ÌN>Ì"Ork  rh  é    c                 ó�  — |j                   }d}|r0t        j                  |||||«      }t        j                  |||«      }t        j	                  ||||j
                  |j                  |j                  |j                  |||||	|
|¬«      }|rt        j                  | ||«      \  }}|S t        j                  | |||«      \  }}|S )zCGenerate random inputs and measure average latency of Onnx Runtime.N)r~   r   r€   )r   rt   r¡   r±   r–   rx   ry   rN   rz   rO  rY  )rL  r  r{   r­   r=  rz  r—   r|   r}   r~   r   r€   ru   rw   rv   r   r§   r    r  r“   rD  s                        r   Útest_performancezGpt2Helper.test_performance�  sê   € ð( #Ÿ\™\ˆàˆÙÜ&×8Ñ8ØÐ0°/À6È;óˆMô (×:Ñ:¸=È&ÐR\Ó]ˆNä!×2Ñ2ØØ ØØ×&Ñ&Ø×ÑØ�N‰NØ×ÑØØØØØ+Ø1Ø!5ð 3ó 
ˆñ" Ü#×9Ñ9¸+À|ÐU_Ó`‰JˆAˆwð ˆô	 $×HÑHØ˜\¨>¸=È*ó‰JˆAˆwð ˆr    c                 óî   — t         j                  ddd|j                  |j                  |j                  |j
                  |d||¬«      j                  «       }t        j                  j                  | |«      S )zJIT trace for TorchScript.r7   F)ru   rv   rw   rx   ry   rD   rz   r{   rn   r|   r}   )
rt   r–   rx   ry   rN   rz   re   r@   ÚjitÚtrace)r  r   r{   r|   r}   rd   s         r   ÚtorchscriptzGpt2Helper.torchscriptÄ  ss   € ô  ×0Ñ0ØØ!"ØØ &× :Ñ :Ø×*Ñ*Ø—n‘nØ×(Ñ(ØØØ-Ø1ð 1ó 
÷ ‰'‹)ð 	ô �y‰y�‰˜u jÓ1Ð1r    ©ÚrawÚfp32Úfp16Úint8c           
      ó¶  — |}t         j                  j                  |«      rt        |«      j                  d   }n|j                  d«      d    |dk7  r|d|z   z  }|r|dz  }|�r®dddd	d
œ}d
D ]–  }t         j                  j                  | |||   z   «      }	t         j                  j                  |	«      sŒI||v r/	 t        j                  |	«       t        j                  d|	› �«       Œ|t        j                  d|› d|	› �«       Œ˜ t         j                  j                  t         j                  j                  | |«      |dz   «      t         j                  j                  t         j                  j                  | |dz   «      |dz   «      t         j                  j                  t         j                  j                  | |dz   «      |dz   «      t         j                  j                  t         j                  j                  | |d	z   «      |dz   «      d
œS t         j                  j                  | |dz   «      t         j                  j                  | |dz   «      t         j                  j                  | |dz   «      t         j                  j                  | |dz   «      d
œS # t        $ r0}
t        j                  d|	› d|
j                  › �«       Y d}
~
�Œdd}
~
ww xY w)z=Build a  path name for given model based on given attributes.rˆ   ú/r   r“   Ú_pastÚ Ú_fp32Ú_fp16Ú_int8r�  zRemoved the existed directory: zFailed to remove the directory r%  NzDirectory for z
 existed: z.onnxz
_fp32.onnxz
_fp16.onnxz
_int8.onnx)rÿ   r   Úisdirr   ÚpartsÚsplitr  ÚexistsÚshutilÚrmtreerÂ   rÄ   ÚOSErrorÚstrerror)Ú
output_dirÚmodel_name_or_pathr—   Úhas_pastÚ
new_folderÚremove_existingÚ
model_nameÚsuffixr  Únew_dirÚes              r   Úget_onnx_pathszGpt2Helper.get_onnx_pathsÖ  sg  € ð (ˆ
Ü�7‰7�=‰=Ð+Ô,ÜÐ0Ó1×7Ñ7¸Ñ;‰Jà×Ñ˜SÓ! "Ò%àÐ+Ò+Ø˜# Ñ+Ñ+ˆJáØ˜'Ñ!ˆJâØ¨¸'È7ÑSˆFà=ò 
V�
ÜŸ'™'Ÿ,™, z°:ÀÀzÑ@RÑ3RÓS�Ü—7‘7—>‘> 'Õ*Ø! _Ñ4ðcÜ"ŸM™M¨'Ô2Ü"ŸK™KÐ*IÈ'ÈÐ(SÕTô Ÿ™ n°Z°LÀ
È7È)Ð$TÕUð
Vô —w‘w—|‘|¤B§G¡G§L¡L°¸ZÓ$HÈ*ÐW^ÑJ^Ó_ÜŸ™Ÿ™Ü—G‘G—L‘L ¨Z¸'Ñ-AÓBØ Ñ-óô Ÿ™Ÿ™Ü—G‘G—L‘L ¨Z¸'Ñ-AÓBØ Ñ-óô Ÿ™Ÿ™Ü—G‘G—L‘L ¨Z¸'Ñ-AÓBØ Ñ-óñð ô" —7‘7—<‘< 
¨J¸Ñ,@ÓAÜ—G‘G—L‘L ¨Z¸,Ñ-FÓGÜ—G‘G—L‘L ¨Z¸,Ñ-FÓGÜ—G‘G—L‘L ¨Z¸,Ñ-FÓGñ	
ð 	
øô-  'ò cÜ"ŸK™KÐ*IÈ'ÈÐRTÐUV×U_ÑU_ÐT`Ð(a×bÒbûðcús   Â=-JÊ	KÊ(%KËKN)r   )F)çü©ñÒMbP?r®  )r³   )FFr   )r   )T)r   TF)TT)'r(   r)   r*   r+   rQ   r@   Úint32r‰   r{   Úboolrm   r^   r–   r   rœ   Údictr<   r¡   rª   r±   r¼   rË   rá   r  r  r   r  rG  rO  rQ  rS  ÚTensorrY  rc  rf  rˆ  r‹  r�  r­  rh   r    r   rt   rt   ²   s“  „ ÙOàð Ø!%Ø#'Ø',§{¡{Ø*/¯+©+Ø,1¯K©KØ"&ñ>IØð>Ià!ð>Ið ð>Ið !ð	>Ið
 ð>Ið ð>Ið ð>Ið —‘ð>Ið ð>Ið ð>Ið !ð>Ið Ÿ™ð>Ið "ŸK™Kð>Ið $Ÿk™kð>Ið  ð>Ið  
ò!>Ió ð>Ið@ ð -ñ Øð à!ð ð ð ð ð	 ð
 ð ð 
ˆc�4˜‘9ˆnÑ	ò ó ð ðD ñ	ó ð	ð òó ðð ò$ó ð$ð òó ðð4 ò3
ó ð3
ðj ð
 Ø).Ø!%Ø#'Ø',§{¡{Ø*/¯+©+Ø,1¯K©Kñuð ðuð ð	uð
 #'ðuð ðuð !ðuð Ÿ™ðuð "ŸK™Kðuð $Ÿk™kòuó ðuðn ð "'Ø"Øò!ó ð!ðF ò$
ñCØðCà˜C‘yòCó ðCðJ ñ(¨ð (Àò (ó ð(ð2 ñ,°:ð ,È3ò ,ó ð,ð> ñ
ó ð
ð( ò
ó ð
ð ð Ø!Ø,1ñ0,àð0,ð ˜S %§,¡,Ð.Ñ/ð0,ð ˜C  c¡˜NÑ+ð	0,ð
 ð0,ð ð0,ð &*ò0,ó ð0,ðd ñKó ðKð ñDó ðDð
 ð
 ØØØ ØØØ%ØØØŸ™Ø Ÿ;™;Ø"Ÿ[™[ØØØ"ò%Eó ðEðN ð
 ØØØ%ØØØŸ™Ø Ÿ;™;Ø"Ÿ[™[ØØØò4ó ð4ðl ò2ó ð2ð" ð -ØØÚ7ñ:
ð ò:
ó ñ:
r    rt   )0Úloggingrÿ   ra  r�   r   rý   rA  Úpathlibr   r£   r  r@   Úbenchmark_helperr   rn   r   Úfusion_optionsr   Úio_binding_helperr   r!  r   Ú	optimizerr	   Útorch_onnx_export_helperr
   Útransformersr   r   r   r   ÚImportErrorÚ	getLoggerr(   rÂ   ÚPRETRAINED_GPT2_MODELSÚFLOAT32ÚFLOAT16ÚINT8ÚDEFAULT_TOLERANCEr   r/   r4   rS   rW   r›   r^   rt   rh   r    r   ú<module>rÂ     s9  ðó Û 	Û Û Û Û Û Ý ã Û Û Ý &Ý -Ý (Ý -Ý  Ý $Ý 6ß ?Ñ ?ðÝ(ð 
ˆ×	Ñ	˜8Ó	$€âWÐ ð ×Ñ�vØ×Ñ�sØ‡N�N�CðÐ ôN˜9ô Nð Ðô< õ <ð "Ðô!E�)ô !EôHE˜ô Eô$E /ô Eð" *¨8°TÐ:Ø"=¸xÈÐ!OØ˜|¨TÐ2ñ€÷Sñ S÷>_
ò _
øði ò Ø‚Kðús   Á$D ÄDÄD