
    Bvh"                         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j0                  j2                        Zy)    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
                  | _        y |j                  j
                  | _        y Nopenai)super__init__r   devicer   encoderr   )selfr   r   r   	__class__s       a/RAG/venv/lib/python3.12/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr   zWhisperEncoder.__init__   sI    ll$(2h(>u}}EKKDWDW    audio_featuresc                 ^    | j                  |      }| j                  dk(  r|S |j                  S r   )r   r   last_hidden_state)r   r   outputss      r   forwardzWhisperEncoder.forward%   s,    ,,~.//X5wT7;T;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                 4    t        | j                  ||      }|S )N)r   r   )r   r"   r%   dynamic_axess       r   r'   zWhisperEncoder.dynamic_axes1   s    -dkk;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3Er   onnx_model_pathproviderverboseuse_external_data_formatc                    t        | j                  | j                  d|      }| j                         }| j	                         }| j                  ||      }	t        |      j                  j                  dd       t        j                         5 }
t        j                  j                  |
d      }t        |      j                  j                  dd       |r|n|}t        j                  j!                  | |d   |d|||	dd|
       t        j"                  ||	      }| j%                  ||      }t'        j(                  |||d
       ddd       | j+                  |||       y# 1 sw Y   xY w)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   sV   . +KKKK$	
 &&(((*((lC_$$**4$*G((*l#%77<<n#M %&--33D43P/G+_HJJ-."')) $(   OOHAYZE..uoFENN&>(,	) +6 	(OD7 +*s   B;E''E0c                    t        | j                  | j                  d|      }| j                  |d         j	                         j                         j                         }t        ||g      }|j                  dd|d   j	                         j                         j                         i      d   }t        j                  ||z
        }t        j                  d       t        j                  dt        j                  |              y)	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    $ +KKKK$	
 \\&)9":;BBDHHJPPR
  H:Fhht&6?O8P8W8W8Y8]8]8_8e8e8g%hijkl vvj;./;<BFF4L>2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      s    #X} XUXX__ XRU XUell U
: 
 
  ). %>E>E >E 	>E
 #'>E >E@#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      sV     	      ,    & L (			8	$J4UXX__ J4r   