
    g                        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 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mZ d dlmZ  e j*                  e      Z G d d	ej0                  j2                        Z G d
 d      Z G d d      Zy)    N)Path)ListUnion)	OnnxModel)torch_onnx_export)	MT5ConfigT5Config)InferenceSessionc                   8     e Zd ZdZdeeef   f fdZd Z xZ	S )	T5Encoderz-T5 encoder outputs only the last hidden stateconfigc                 >    t         |           || _        || _        y N)super__init__encoderr   )selfr   r   	__class__s      b/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/models/t5/t5_encoder.pyr   zT5Encoder.__init__   s        c                 ,    | j                  ||      d   S )Nr   )r   r   	input_idsattention_masks      r   forwardzT5Encoder.forward"   s    ||I~6q99r   )
__name__
__module____qualname____doc__r   r	   r   r   r   __classcell__)r   s   @r   r   r      s!    7h	.A(B 
:r   r   c                   \    e Zd Zd Ze	 ddedededej                  def
d       Z	de
fd	Zy
)T5EncoderInputsc                      || _         || _        y r   r   r   r   s      r   r   zT5EncoderInputs.__init__'   s    +40>r   
batch_sizesequence_length
vocab_sizedeviceuse_int32_inputsc                 >   |rt         j                  nt         j                  }t        j                  d|dz
  | |f||      }t        j                  | |g||      }|dk\  r2t        |       D ]$  }t        j                  d|dz
        }	d||d|	f<   & t        ||      S )aI  Create dummy inputs for T5 encoder.

        Args:
            batch_size (int): batch size
            sequence_length (int): sequence length
            vocab_size (int): vocabulary size
            device (torch.device): device of output tensors

        Returns:
            T5EncoderInputs: dummy inputs for encoder
        r      )lowhighsizedtyper(   )r/   r(      N)torchint32int64randintonesrangerandomr"   )
r%   r&   r'   r(   r)   r/   r   r   ipadding_positions
             r   create_dummyzT5EncoderInputs.create_dummy+   s      0U[[MMao.
	 Z$AW]^a:&#)>>!_q5H#I 78q"3#3"334 ' y.99r   returnc                 `    | j                   | j                  fD cg c]  }||	 }}|S c c}w r   r$   )r   v
input_lists      r   to_listzT5EncoderInputs.to_listK   s7    "&..$2E2E!FX!FA!-a!F
X Ys   ++NF)r   r   r   r   staticmethodintr1   r(   boolr:   r   r?    r   r   r"   r"   &   sV    ? ot::*-:;>:HM:hl: :> r   r"   c                       e Zd Ze	 	 	 ddedej                  dedededefd       Z	ede
fd	       Ze	 dd
ededej                  defd       Zy)T5EncoderHelperr   r(   onnx_model_pathverboseuse_external_data_formatr)   c                 t   | j                   }t        j                  dd|j                  ||      }t	        |      j
                  j                  dd       t        j                         5 }t        j                  j                  |d      }	t	        |	      j
                  j                  dd       t        | t        |j                               |r|	n|dddgd	gd
ddd
ddd
ddddd||       |r0t        j                   |	d      }
t#        j$                  |
|dd       ddd       y# 1 sw Y   yxY w)a  Export encoder to ONNX

        Args:
            encoder (T5Encoder): encoder object
            device (torch.device): device of encoder 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.
        r0      r%   r&   r'   r(   r)   T)parentsexist_okzencoder.onnxr   r   hidden_statesr%   r&   )r   r+   )r   r   rO      )
argsfexport_paramsinput_namesoutput_namesdynamic_axesopset_versiondo_constant_foldingrI   rH   )load_external_data)save_as_external_dataall_tensors_to_one_fileN)r   r"   r:   r'   r   parentmkdirtempfileTemporaryDirectoryospathjoinr   tupler?   onnx
load_modelr   save)r   r(   rG   rH   rI   r)   r   encoder_inputstmp_dir_nametemp_onnx_model_pathmodels              r   export_onnxzT5EncoderHelper.export_onnxQ   s8   $ (55((- 6 
 	_$$**4$*G((*l#%77<<n#M %&--33D43P>1134*B&"(*:;-.%16G!H*6;L&M)5:K%L
 !$()A$ ((<QUV#*.,0	/ +**s   +B:D..D7inputsc                    t        j                  |j                  j                         j                               t        j                  |j                  j                         j                               d}| j                  d|      S )zRun inference of ONNX model.r$   N)numpyascontiguousarrayr   cpur   run)ort_sessionrl   
ort_inputss      r   onnxruntime_inferencez%T5EncoderHelper.onnxruntime_inference   sj     001A1A1E1E1G1M1M1OP#55f6K6K6O6O6Q6W6W6YZ


 tZ00r   rj   rr   c                 |   t         j                  dd| j                  j                  ||      }|j	                         } | | }t
        j                  ||      }t        j                  t        j                  |j                         j                         |d   z
              }t        j                  d|        |S )zQCompare the result from PyTorch and OnnxRuntime to verify the ONNX model is good.rK      rL   r   z	max_diff=)r"   r:   r   r'   r?   rF   rt   rn   amaxabsrp   loggerinfo)	rj   rr   r(   r)   rl   r>   torch_outputsort_outputsmax_diffs	            r   verify_onnxzT5EncoderHelper.verify_onnx   s    
 !--||..- . 
 ^^%
z*%;;KP::eii(9(9(;(A(A(CkRSn(TUViz*+r   N)TFFr@   )r   r   r   rA   r   r1   r(   strrC   rk   r"   rt   r
   r~   rD   r   r   rF   rF   P   s    
 ).!&888 8 	8
 #'8 8 8t 1? 1 1 hm'7AFae r   rF   )loggingr`   r7   r^   pathlibr   typingr   r   rn   rd   r1   
onnx_modelr   torch_onnx_export_helperr   transformersr   r	   onnxruntimer
   	getLoggerr   ry   nnModuler   r"   rF   rD   r   r   <module>r      sk     	          6 , (			8	$	: 	:' 'T[ [r   