
    fPi"                         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mZ d dlmZ  e j        e          Z G d	 d
ej        j                  ZdS )    N)Path)convert_float_to_float16)
ModelProto)	OnnxModel)WhisperConfig)get_model_dynamic_axesget_sample_encoder_inputs)InferenceSessionc                        e Zd ZdZdedej        j        def fdZ	dej
        fdZd Zd	 Zd
 ZdedefdZ	 	 	 ddededededef
dZdededefdZ xZS )WhisperEncoderzWhisper encoder componentconfigmodel
model_implc                     t                                                       || _        |j        | _        || _        |dk    r|j        n|j        j        | _        d S Nopenai)super__init__r   devicer   encoderr   )selfr   r   r   	__class__s       /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr   zWhisperEncoder.__init__   sP    l$(2h(>(>u}}EKDW    audio_featuresc                 T    |                      |          }| j        dk    r|n|j        S r   )r   r   last_hidden_state)r   r   outputss      r   forwardzWhisperEncoder.forward%   s,    ,,~../X55ww7;TTr   c                     dg}|S )Nr    )r   input_namess     r   r"   zWhisperEncoder.input_names)   s    '(r   c                     dg}|S )Nencoder_hidden_statesr!   )r   output_namess     r   r%   zWhisperEncoder.output_names-   s    /0r   c                 2    t          | j        ||          }|S )N)r   r   )r   r"   r%   dynamic_axess       r   r'   zWhisperEncoder.dynamic_axes1   s    -dk;UUr   use_fp16_inputsc                 >    | j         dk    r|rt          |          }|S r   )r   r   )r   r   r(   s      r   fix_layernorm_weightsz$WhisperEncoder.fix_layernorm_weights5   s(    ?h&&?& -U33Er   TFonnx_model_pathproviderverboseuse_external_data_formatc                    t          | j        | j        d|          }|                                 }|                                 }|                     ||          }	t          |          j                            dd           t          j
                    5 }
t          j                            |
d          }t          |          j                            dd           |r|n|}t          j                            | |d         |d|||	dd|
  
         t          j        ||	          }|                     ||          }t'          j        |||d
           ddd           n# 1 swxY w Y   |                     |||           dS )a  Export encoder to ONNX

        Args:
            onnx_model_path (str): path to save ONNX model
            provider (str): provider to use for verifying parity on ONNX model
            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_fp16_inputs (bool, optional): use float16 inputs for the audio_features. Defaults to False.
           
batch_sizeuse_fp16T)parentsexist_okzencoder.onnxr      )	argsfexport_paramsr"   r%   r'   opset_versiondo_constant_foldingr-   )load_external_data)save_as_external_dataall_tensors_to_one_fileN)r	   r   r   r"   r%   r'   r   parentmkdirtempfileTemporaryDirectoryospathjointorchonnxexport
load_modelr*   r   saveverify_onnx)r   r+   r,   r-   r.   r(   inputsr"   r%   r'   tmp_dir_nametemp_onnx_model_pathout_pathr   s                 r   export_onnxzWhisperEncoder.export_onnxA   s   . +KK$	
 
 
 &&((((**((lCC_$**4$*GGG(** 	l#%7<<n#M#M %&&-33D43PPP/G\++_HJ-."')) $(     OHAYZZZE..uoFFEN&>(,	   )	 	 	 	 	 	 	 	 	 	 	 	 	 	 	6 	(ODDDDDs   CE''E+.E+c                 z   t          | j        | j        d|          }|                     |d                                                                                                                   }t          ||g          }|                    dd|d                                                                                                         i          d         }t          j
        ||z
            }t                              d           t                              dt          j        |                      dS )	a"  Verify ONNX model outputs and PyTorch model outputs match

        Args:
            onnx_model_path (str): path to save ONNX model
            provider (str): execution provider for ONNX model
            use_fp16_inputs (bool, optional): use float16 inputs for the audio_features
        r0   r1   r   )	providersNr   z"Comparing encoder_hidden_states...z
Max diff: )r	   r   r   r   detachcpunumpyr
   runnpabsloggerwarningmax)	r   r+   r,   r(   rL   
pt_outputssessort_outputsdiffs	            r   rK   zWhisperEncoder.verify_onnx   s   $ +KK$	
 
 
 \\&)9":;;BBDDHHJJPPRR
  H:FFFhht&6?O8P8W8W8Y8Y8]8]8_8_8e8e8g8g%hiijkl vj;.//;<<<2BF4LL2233333r   )TFF)__name__
__module____qualname____doc__r   rF   nnModulestrr   Tensorr   r"   r%   r'   r   boolr*   rP   rK   __classcell__)r   s   @r   r   r      sf       ##X} XUX_ XRU X X X X X XUel U U U U      
: 
 
 
 
 
  ). %>E >E>E >E 	>E
 #'>E >E >E >E >E@#4#4 #4 	#4 #4 #4 #4 #4 #4 #4 #4r   r   )loggingrC   rA   pathlibr   rU   rW   rG   rF   float16r   r   
onnx_modelr   transformersr   whisper_inputsr   r	   onnxruntimer
   	getLoggerr`   rY   rd   re   r   r!   r   r   <module>rr      s    				              , , , , , ,                   & & & & & & L L L L L L L L ( ( ( ( ( (		8	$	$J4 J4 J4 J4 J4UX_ J4 J4 J4 J4 J4r   