
    g                        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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  e j$                  e      Z G d d	e	j*                  j,                        Z G d
 d      Z G d d      Zy)    N)Path)List)	OnnxModel)torch_onnx_export)WhisperConfig)InferenceSessionc                   4     e Zd ZdZddedef fdZd Z xZS )WhisperEncoderz2Whisper encoder outputs only the last hidden stateconfig
model_implc                 L    t         |           || _        || _        || _        y N)super__init__encoderr   r   )selfr   r   r   	__class__s       l/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr   zWhisperEncoder.__init__   s#    $    c                     | j                   dk(  r| j                  |      S | j                  j                  j                  |      d   S )Nopenair   )r   r   modelr   input_featuress     r   forwardzWhisperEncoder.forward"   s=    ??h&<<//||!!)).9!<<r   )hf)	__name__
__module____qualname____doc__r   strr   r   __classcell__)r   s   @r   r
   r
      s    <% %3 %=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
)WhisperEncoderInputsc                     || _         y r   	input_idsr   s     r   r   zWhisperEncoderInputs.__init__)   s	    +9r   
batch_sizesequence_lengthfeature_sizedeviceuse_int32_inputsc                 L    t        j                  | ||f|      }t        |      S )ah  Create dummy inputs for Whisper encoder.

        Args:
            batch_size (int): batch size
            sequence_length (int): sequence length
            feature_size (int): feature size for spectrogram input
            device (torch.device): device of output tensors

        Returns:
            WhisperEncoderInputs: dummy inputs for encoder
        )sizer+   )torchrandnr$   )r(   r)   r*   r+   r,   r   s         r   create_dummyz!WhisperEncoderInputs.create_dummy,   s,    ( lO<
 $N33r   returnc                 8    | j                   g S | j                   gS r   r&   )r   s    r   to_listzWhisperEncoderInputs.to_listF   s    >>!Ir   NF)r   r   r   r   staticmethodintr/   r+   boolr1   r   r4    r   r   r$   r$   (   s^    :  "'444 4 	4
 4 42   r   r$   c                       e Zd Ze	 	 	 d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)WhisperEncoderHelperr+   onnx_model_pathverboseuse_external_data_formatr,   c                 l   | 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gdg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 (WhisperEncoder): 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.
           i  )r(   r)   r*   r+   r,   T)parentsexist_okzencoder.onnxr   hidden_statesr(   r*   r)   )r      r@   )r   rD   )r'   rC      )
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_fileN)r   r$   r1   num_mel_binsr   parentmkdirtempfileTemporaryDirectoryospathjoinr   tupler4   onnx
load_modelr   save)r   r+   r<   r=   r>   r,   r   encoder_inputstmp_dir_nametemp_onnx_model_pathr   s              r   export_onnxz WhisperEncoderHelper.export_onnxM   s.   $ -:: ,,- ; 
 	_$$**4$*G((*l#%77<<n#M %&--33D43P>1134*B&"-.-.%1nIZ![)5:K%L !$()A" ((<QUV#*.,0	- +**s   +B6D**D3inputsc                     dt        j                  |j                  j                         j                               i}| j	                  d|      S )zRun inference of ONNX model.r'   N)numpyascontiguousarrayr'   cpurun)ort_sessionra   
ort_inputss      r   onnxruntime_inferencez*WhisperEncoderHelper.onnxruntime_inference   sF     001A1A1E1E1G1M1M1OP

 tZ00r   r   rg   c                 R   t         j                  dd||      }|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.      )r(   r)   r+   r,   r   z	max_diff=)r$   r1   r4   r;   ri   rc   amaxabsre   loggerinfo)	r   rg   r+   r,   ra   
input_listtorch_outputsort_outputsmax_diffs	            r   verify_onnxz WhisperEncoderHelper.verify_onnx   s    
 &22-	 3 
 ^^%
z**@@fU::eii(9(9(;(A(A(CkRSn(TUViz*+r   N)TFFr5   )r   r   r   r6   r/   r+   r!   r8   r`   r$   ri   r
   r   ru   r9   r   r   r;   r;   L   s    
 ).!&77 7 	7
 #'7 7 7r 13G 1 1 mr,<FKllfj r   r;   )loggingrV   rT   pathlibr   typingr   rc   rZ   r/   
onnx_modelr   torch_onnx_export_helperr   transformersr   onnxruntimer   	getLoggerr   ro   nnModuler
   r$   r;   r9   r   r   <module>r      sh     	         6 & (			8	$=UXX__ =!  ! HX Xr   