Ë
    cQêj�A  ã                   ó`  — 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mZ d d	lmZ  e j.                  e«      Z G d
„ dej4                  j6                  «      Z G d„ dej4                  j6                  «      Z G d„ d«      Z G d„ d«      Zy)é    N)ÚPath)Ú
TypeHelper)Ú	OnnxModel)ÚPastKeyValuesHelper)ÚT5EncoderInputs)Útorch_onnx_export)Ú	MT5ConfigÚT5Config)ÚInferenceSessionc            
       óä   ‡ — e Zd ZdZ	 ddej
                  j                  dej
                  j                  deez  de	dz  fˆ fd„Z
dej                  d	ej                  d
ej                  fd„Zˆ xZS )ÚT5DecoderInitz~A T5 decoder with LM head to create initial past key values.
    This model is only called once during starting decoding.
    NÚdecoderÚlm_headÚconfigÚdecoder_start_token_idc                 óü   •— t         ‰| �  «        || _        || _        || _        |�|n| j                  j
                  | _        t        | j                  d«      r| j                  j                  | _        y d| _        y ©NÚtie_word_embeddingsT)ÚsuperÚ__init__r   r   r   r   Úhasattrr   )Úselfr   r   r   r   Ú	__class__s        €úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/t5/t5_decoder.pyr   zT5DecoderInit.__init__    sr   ø€ ô 	‰ÑÔØˆŒØˆŒØˆŒà&<Ð&HÑ"ÈdÏkÉk×NpÑNpð 	Ô#ô 07°t·{±{ÐDYÔ/ZˆD�K‰K×+Ñ+ð 	Õ Ø`dð 	Õ ó    Údecoder_input_idsÚencoder_attention_maskÚencoder_hidden_statesc                 óª  — |€N|j                   d   }t        j                  |dft        j                  |j                  ¬«      | j
                  z  }| j                  |||dd¬«      }|j                  }|j                  }| j                  r|| j                  j                  dz  z  }| j                  |«      }t        j                  |«      \  }	}
||	|
fS )Nr   é   ©ÚdtypeÚdeviceT)Ú	input_idsr   r   Ú	use_cacheÚreturn_dictç      à¿)ÚshapeÚtorchÚonesÚlongr#   r   r   Úlast_hidden_stateÚpast_key_valuesr   r   Úd_modelr   r   Úgroup_by_self_or_cross)r   r   r   r   Ú
batch_sizeÚdecoder_outputsÚsequence_outputÚpresent_key_valuesÚ	lm_logitsÚ	past_selfÚ
past_crosss              r   ÚforwardzT5DecoderInit.forward2   sâ   € ð Ð$Ø/×5Ñ5°aÑ8ˆJä—
‘
Ø �OÜŸ*™*Ø1×8Ñ8ôð
 ×-Ñ-ñ.ð ð Ÿ,™,Ø'Ø"7Ø#9ØØð 'ó 
ˆð *×;Ñ;ˆØ,×<Ñ<Ðà×#Ò#Ø-°·±×1DÑ1DÀdÑ1JÑKˆOà—L‘L Ó1ˆ	Ü 3× JÑ JÐK]Ó ^Ñˆ	�:Ø˜) ZÐ/Ð/r   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   ÚnnÚModuler
   r	   Úintr   ÚTensorÚFloatTensorr7   Ú__classcell__©r   s   @r   r   r      s€   ø„ ñð .2ñ
à—‘—‘ð
ð —‘—‘ð
ð ˜9Ñ$ð	
ð
 !$ d¡
õ
ð$!0à Ÿ<™<ð!0ð !&§¡ð!0ð  %×0Ñ0÷	!0r   r   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )Ú	T5Decoderz-A T5 decoder with LM head and past key valuesc                 ó¾   •— t         ‰| �  «        || _        || _        || _        t        | j                  d«      r| j                  j                  | _        y d| _        y r   )r   r   r   r   r   r   r   )r   r   r   r   r   s       €r   r   zT5Decoder.__init__Y   sQ   ø€ Ü‰ÑÔØˆŒØˆŒØˆŒä/6°t·{±{ÐDYÔ/ZˆD�K‰K×+Ñ+ð 	Õ Ø`dð 	Õ r   c                 óÞ  — | j                   j                  }t        j                  ||«      }|j	                  d«      j                  | j                  j                  j                  «      }| j                  ||||dd¬«      }|j                  }|j                  }	| j                  r|| j                   j                  dz  z  }| j                  |«      }
t        j                  |	«      \  }}|
|fS )Né   T)r$   r-   r   r   r%   r&   r'   )r   Únum_decoder_layersr   Úgroup_by_layerÚ	unsqueezeÚtor   Úweightr"   r   r,   r-   r   r.   r/   )r   r   r   ÚpastrI   r-   Údummy_encoder_hidden_statesr1   r2   r3   r4   Úpresent_selfÚ_s                r   r7   zT5Decoder.forwardb   sã   € Ø!Ÿ[™[×;Ñ;ÐÜ-×<Ñ<¸TÐCUÓVˆð '=×&FÑ&FÀqÓ&I×&LÑ&LÈTÏ\É\×M`ÑM`×MfÑMfÓ&gÐ#ØŸ,™,Ø'Ø+Ø"=Ø#9ØØð 'ó 
ˆð *×;Ñ;ˆØ,×<Ñ<Ðà×#Ò#Ø-°·±×1DÑ1DÀdÑ1JÑKˆOà—L‘L Ó1ˆ	Ü-×DÑDÐEWÓX‰ˆ�að ˜,Ð&Ð&r   )r9   r:   r;   r<   r   r7   rB   rC   s   @r   rE   rE   V   s   ø„ Ù7ô
ö'r   rE   c                   óv   — e Zd Z	 dd„Ze	 	 ddeez  dedededej                  de
d	e
fd
„«       Zdefd„Zd„ Zy)ÚT5DecoderInputsNc                 ó.   — || _         || _        || _        y r8   )r   r   r-   )r   r   r   r-   s       r   r   zT5DecoderInputs.__init__   s   € ð 4EˆÔØ8NˆÔ#ØXgˆÕr   r   r0   Úencode_sequence_lengthÚpast_decode_sequence_lengthr#   Úfloat16Úuse_int32_inputsc                 óž  — | j                   }| j                  }| j                  }	| j                  }
d}t	        j
                  d|	dz
  ||f|rt        j                  nt        j                  |¬«      }t        j                  |||	||¬«      }|rt        j                  nt        j                  }|dkD  rƒ||||
g}||||
g}g }t        d|z  «      D ])  }|j                  t	        j                  |||¬«      «       Œ+ t        d|z  «      D ])  }|j                  t	        j                  |||¬«      «       Œ+ nd}t        ||j                   |«      S )aZ  Create dummy inputs for T5Decoder.

        Args:
            decoder: decoder
            batch_size (int): batch size
            encode_sequence_length (int): sequence length of input_ids for encoder
            past_decode_sequence_length (int): past sequence length of input_ids for decoder
            device (torch.device): device of output tensors
            float16 (bool): whether the model uses float32 or float16 in input
            use_int32_inputs(bool): whether use int32 instead of int64 for some inputs

        Returns:
            T5DecoderInputs: dummy inputs for decoder
        r    r   )ÚlowÚhighÚsizer"   r#   )rX   rH   r!   N)Ú	num_headsrI   Ú
vocab_sizeÚd_kvr)   ÚrandintÚint32Úint64r   Úcreate_dummyrW   Úfloat32ÚrangeÚappendÚrandrS   Úattention_mask)r   r0   rU   rV   r#   rW   rX   Únum_attention_headsÚ
num_layersr^   Ú	head_sizeÚsequence_lengthr   Úencoder_inputsÚ
float_typeÚself_attention_past_shapeÚcross_attention_past_shaperN   rQ   s                      r   rc   zT5DecoderInputs.create_dummy‰   s`  € ð0 $*×#3Ñ#3ÐØ ×3Ñ3ˆ
Ø ×+Ñ+ˆ
ð  Ÿ™ˆ	à ˆÜ!ŸM™MØØ˜a‘Ø˜oÐ.Ù"2”5—;’;¼¿¹Øô
Ðô )×5Ñ5ØØ"ØØØ-ô
ˆñ '.”U—]’]´5·=±=ˆ
à&¨Ò*àØ#Ø+Øð	)Ð%ð Ø#Ø&Øð	*Ð&ð ˆDÜ˜1˜z™>Ó*ò d�Ø—‘œEŸJ™JÐ'@È
Ð[aÔbÕcðdô ˜1˜z™>Ó*ò e�Ø—‘œEŸJ™JÐ'AÈÐ\bÔcÕdñeð ˆDäÐ0°.×2OÑ2OÐQUÓVÐVr   Úreturnc                 ó„   — | j                   | j                  g}| j                  r|j                  | j                  «       |S r8   )r   r   r-   Úextend)r   Ú
input_lists     r   Úto_listzT5DecoderInputs.to_listÕ   s@   € à×"Ñ"Ø×'Ñ'ð
ˆ
ð ×ÒØ×Ñ˜d×2Ñ2Ô3ØÐr   c                 ó  — | j                   r8| j                   D �cg c]"  }|j                  t        j                  ¬«      ‘Œ$ c}nd }t	        | j
                  j                  «       | j                  j                  «       |«      S c c}w )N)r"   )r-   rL   r)   rd   rS   r   Úcloner   )r   ÚprN   s      r   Úto_fp32zT5DecoderInputs.to_fp32Þ   sl   € ØLP×L`ÒL`°4×3GÑ3GÖH¨a�—‘œ5Ÿ=™=�Õ)ÓHÐfjˆÜØ×"Ñ"×(Ñ(Ó*Ø×'Ñ'×-Ñ-Ó/Øó
ð 	
ùò Is   ›'Br8   )FF)r9   r:   r;   r   Ústaticmethodr
   r	   r?   r)   r#   Úboolrc   Úlistru   ry   © r   r   rS   rS   ~   s˜   „ ð
 ó	hð ð Ø!&ñIWØ˜9Ñ$ðIWàðIWð !$ðIWð &)ð	IWð
 —‘ðIWð ðIWð òIWó ðIWðV˜ó ó
r   rS   c                   ó²   — e Zd Ze	 	 	 ddeez  dej                  dede	de	de	fd„«       Z
edefd	„«       Ze	 dd
eez  dedej                  de	def
d„«       Zy)ÚT5DecoderHelperr   r#   Úonnx_model_pathÚverboseÚuse_external_data_formatrX   c                 ó†  — t        | t        t        f«      sJ ‚t        j	                  | j
                  ddt        | t        «      rdnd||¬«      }|j                  «       }| j
                  j                  }t        j                  |d¬«      }	t        j                  |d¬«      }
|
d	d|z   }t        | t        «      r|	ng }t        | t        «      r|n|
}d
g|¢}dg}|j                  d«       |j                  |«       ddidddœdddœddidœ}|D ]  }dd|v rdnddœ||<   Œ |D ]/  }d|v r	dddœ||<   Œt        | t        «      r	dddœ||<   Œ)ddi||<   Œ1 t        |«      j                  j                  dd¬«       t        j                   «       5 }t"        j$                  j'                  |d«      }t        |«      j                  j                  dd¬«       t)        | t+        |«      |r|n|d|||dd||¬«       |r0t-        j.                  |d¬«      }t1        j2                  ||dd¬«       d	d	d	«       y	# 1 sw Y   y	xY w)aâ  Export decoder to ONNX

        Args:
            decoder (Union[T5Decoder, T5DecoderNoPastState]): decoder object
            device (torch.device): device of decoder object
            onnx_model_path (str): onnx path
            verbose (bool, optional): print verbose information. Defaults to True.
            use_external_data_format (bool, optional): use external data format or not. Defaults to False.
            use_int32_inputs (bool, optional): use int32 inputs
        rH   é   é   r   )r0   rU   rV   r#   rX   F)ÚpresentTNÚlogitsr$   r   r0   rU   )r   r    )r$   r   r   r‡   r   rV   )r   rH   Úcrosszpast_decode_sequence_length + 1)ÚparentsÚexist_okzdecoder.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)Ú
isinstancerE   r   rS   rc   r   ru   rI   r   Úget_past_namesrf   rs   r   ÚparentÚmkdirÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinr   ÚtupleÚonnxÚ
load_modelr   Úsave)r   r#   r€   r�   r‚   rX   Úinputsrt   rI   Ú
past_namesÚpresent_namesÚpresent_self_namesÚinput_past_namesÚoutput_present_namesr�   r�   r‘   ÚnameÚtmp_dir_nameÚtemp_onnx_model_pathÚmodels                        r   Úexport_onnxzT5DecoderHelper.export_onnxè   s‘  € ô& ˜'¤I¬}Ð#=Ô>Ð>Ð>ä ×-Ñ-Ø�N‰NØØ#$Ü-7¸ÄÔ-K©ÐQRØØ-ð .ó 
ˆð —^‘^Ó%ˆ
à$Ÿ^™^×>Ñ>Ðä(×7Ñ7Ð8JÐTYÔZˆ
Ü+×:Ñ:Ð;MÐW[Ô\ˆØ*Ð+C¨QÐ1CÑ-CÐDÐä)3°G¼YÔ)G™:ÈRÐÜ5?ÀÌÔ5SÑ1ÐYfÐØ Ð8Ð#7Ð8ˆð #�mˆØ×ÑÐ3Ô4Ø×ÑÐ+Ô,ð �<ðð +7Ð;SÑ&TØ)5Ð:RÑ%Sà�<ðñ
ˆð %ò 	ˆDàØ4:¸d±NÑ0ÐH`ñ"ˆL˜Òð	ð )ò 	ˆDØ˜$‰Ø)5Ð:RÑ%S�˜TÒ"ä˜g¤yÔ1à'Ø<ñ*�L Ò&ð ˜<ð*�L Ò&ð	ô 	ˆ_Ó×$Ñ$×*Ñ*°4À$Ð*ÔGä×(Ñ(Ó*ð 	¨lÜ#%§7¡7§<¡<°¸nÓ#MÐ ÜÐ%Ó&×-Ñ-×3Ñ3¸DÈ4Ð3ÔPÜØÜ˜:Ó&Ù*BÑ&ÈØ"Ø'Ø)Ø)Ø Ø$(Ø)AØõñ (ÜŸ™Ð(<ÐQUÔV�Ü—‘ØØ#Ø*.Ø,0õ	÷'	÷ 	ñ 	ús   ÆBH7È7I r¤   c                 ó¨  — t         j                  d«       t        j                  |j                  j                  «       j                  «       «      t        j                  |j                  j                  «       j                  «       «      dœ}|j                  r§t        |j                  «      dz  dk(  sJ ‚t        t        |j                  «      dz  «      }t        j                  |«      }t        |j                  «      D ]<  \  }}t        j                  |j                  «       j                  «       «      |||   <   Œ> | j                  d|«      }|S )zRun inference of ONNX model.zstart onnxruntime_inference)r$   r   é   r   N)ÚloggerÚdebugÚnumpyÚascontiguousarrayr   Úcpur   r-   Úlenr?   r   r˜   Ú	enumerateÚrun)Úort_sessionr¤   Ú
ort_inputsrj   r¥   ÚiÚpast_tensorÚort_outputss           r   Úonnxruntime_inferencez%T5DecoderHelper.onnxruntime_inference^  s  € ô 	�‰Ð2Ô3ô ×0Ñ0°×1IÑ1I×1MÑ1MÓ1O×1UÑ1UÓ1WÓXÜ&+×&=Ñ&=¸f×>[Ñ>[×>_Ñ>_Ó>a×>gÑ>gÓ>iÓ&jñ
ˆ
ð
 ×!Ò!Ü�v×-Ñ-Ó.°Ñ2°aÒ7Ð7Ð7ÜœS ×!7Ñ!7Ó8¸1Ñ<Ó=ˆJÜ,×;Ñ;¸JÓGˆJÜ"+¨F×,BÑ,BÓ"Cò _‘��;Ü,1×,CÑ,CÀKÇOÁOÓDU×D[ÑD[ÓD]Ó,^�
˜: a™=Ò)ð_ð "—o‘o d¨JÓ7ˆØÐr   r­   r¹   Ú	max_casesc                 óH  — t        j                  |d«      dk(  }g d¢}g }|d| D �]l  \  }}	}
t        | t        «      rd}
t        j                  | j                  ||	|
|||¬«      }|j                  «       j                  «       }t        j                  «       5   | |Ž }ddd«       t        j                  ||«      }| j                  j                  }t        j                  t        j                   d   j#                  «       j                  «       |d   z
  «      «      }|}t$        j'                  d|› �«       t)        d|z  «      D ]|  }t        j                  t        j                   |d	   |   j#                  «       j                  «       |d	|z      z
  «      «      }t$        j'                  d
|› d|› �«       t+        ||«      }Œ~ t        | t        «      r“t)        d|z  «      D ]‚  }t        j                  t        j                   |d   |   j#                  «       j                  «       |d	d|z  z   |z      z
  «      «      }t$        j'                  d|› d|› �«       t+        ||«      }Œ„ |j-                  |«       t$        j/                  d||	|
|«       �Œo S # 1 sw Y   �ŒüxY w)zQCompare the result from PyTorch and OnnxRuntime to verify the ONNX model is good.Úpast_key_self_0ztensor(float16)))r°   é   r„   )r    rH   r…   )r„   r    r    )é   r…   rH   Nr   )r#   rW   rX   zlogits max_diff=rH   r    zself attention past state z
 max_diff=zcross attention past state zUbatch_size=%s, encode_sequence_length=%s, past_decode_sequence_length=%s, max_diff=%s)r   Úget_input_typer—   r   rS   rc   r   ry   ru   r)   Úno_gradr   r¾   rI   r³   ÚamaxÚabsrµ   r±   r²   re   Úmaxrf   Úinfo)r­   r¹   r#   rX   r¿   rW   Ú
test_casesÚtest_cases_max_diffr0   rU   rV   r¤   rt   Útorch_outputsr½   rI   Úmax_diffÚmax_diff_allr»   s                      r   Úverify_onnxzT5DecoderHelper.verify_onnxr  sœ  € ô #×1Ñ1°+Ð?PÓQÐUfÑfˆâBˆ
Ø Ðð
 ˜
˜Ð#ó	4	ñ 
ØØ"Ø'ä˜%¤Ô/Ø./Ð+ä$×1Ñ1Ø—‘ØØ&Ø+ØØØ!1ð 2ó ˆFð  Ÿ™Ó)×1Ñ1Ó3ˆJô —‘“ñ 3Ù % zÐ 2�÷3ô *×?Ñ?ÀÈVÓTˆKØ!&§¡×!@Ñ!@Ðä—z‘z¤%§)¡)¨M¸!Ñ,<×,@Ñ,@Ó,B×,HÑ,HÓ,JÈ[ÐYZÉ^Ñ,[Ó"\Ó]ˆHØ#ˆLÜ�L‰LÐ+¨H¨:Ð6Ô7ä˜1Ð1Ñ1Ó2ò ;�Ü Ÿ:™:¤e§i¡i°¸aÑ0@ÀÑ0C×0GÑ0GÓ0I×0OÑ0OÓ0QÐT_Ð`aÐdeÑ`eÑTfÑ0fÓ&gÓh�Ü—‘Ð9¸!¸¸JÀxÀjÐQÔRÜ" <°Ó:‘ð;ô
 ˜%¤Ô/Ü˜qÐ#5Ñ5Ó6ò ?�AÜ$Ÿz™zÜŸ	™	 -°Ñ"2°1Ñ"5×"9Ñ"9Ó";×"AÑ"AÓ"CÀkÐRSÐVWÐZlÑVlÑRlÐopÑRpÑFqÑ"qÓró �Hô —L‘LÐ#>¸q¸cÀÈHÈ:Ð!VÔWÜ#& |°XÓ#>‘Lð?ð  ×&Ñ& |Ô4Ü�K‰KØgØØ&Ø+Øöð]4	ðl Ð÷A3ñ 3ús   ÂJÊJ!	N)TFF)r°   )r9   r:   r;   rz   rE   r   r)   r#   Ústrr{   r®   rS   r¾   r   r?   rÏ   r}   r   r   r   r   ç   sÛ   „ Øð
 Ø).Ø!&ñsØ˜]Ñ*ðsà—‘ðsð ðsð ð	sð
 #'ðsð òsó ðsðj ð°?ò ó ðð& ð ñBØ˜=Ñ(ðBà%ðBð —‘ðBð ð	Bð
 òBó ñBr   r   ) Úloggingr�   r›   Úpathlibr   r³   r¡   r)   Úio_binding_helperr   Ú
onnx_modelr   Úpast_helperr   Ú
t5_encoderr   Útorch_onnx_export_helperr   Útransformersr	   r
   Úonnxruntimer   Ú	getLoggerr9   r±   r=   r>   r   rE   rS   r   r}   r   r   ú<module>rÛ      s†   ðó Û 	Û Ý ã Û Û Ý (Ý  Ý +Ý &Ý 6ß ,å (à	ˆ×	Ñ	˜8Ó	$€ô80�E—H‘H—O‘Oô 80ôv%'�—‘—‘ô %'÷Pf
ñ f
÷RNò Nr   