o
    ٷi"                     @   s   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 eZG d	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                       s   e Zd ZdZdedejjdef fddZ	dej
fdd	Zd
d Zdd Zdd ZdedefddZ			ddededededef
ddZdededefddZ  ZS )WhisperEncoderzWhisper encoder componentconfigmodel
model_implc                    s@   t    || _|j| _|| _|dkr|j| _d S |jj| _d S Nopenai)super__init__r   devicer   encoderr   )selfr   r   r   	__class__ k/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr      s
   
"zWhisperEncoder.__init__audio_featuresc                 C   s   |  |}| jdkr|S |jS r   )r   r   last_hidden_state)r   r   outputsr   r   r   forward%   s   
zWhisperEncoder.forwardc                 C   
   dg}|S )Nr   r   )r   input_namesr   r   r   r   )      zWhisperEncoder.input_namesc                 C   r   )Nencoder_hidden_statesr   )r   output_namesr   r   r   r!   -   r   zWhisperEncoder.output_namesc                 C   s   t | j||}|S )N)r   r   )r   r   r!   dynamic_axesr   r   r   r"   1   s   zWhisperEncoder.dynamic_axesuse_fp16_inputsc                 C   s   | j dkr|rt|}|S r   )r   r   )r   r   r#   r   r   r   fix_layernorm_weights5   s   z$WhisperEncoder.fix_layernorm_weightsTFonnx_model_pathproviderverboseuse_external_data_formatc                 C   s   t | j| jd|d}|  }|  }| ||}	t|jjddd t	
 G}
tj|
d}t|jjddd |r<|n|}tjj| |d |d|||	dd|d
 tj||d	}| ||}tj|||dd
 W d   n1 spw   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   r   r   r   export_onnxA   sH   
zWhisperEncoder.export_onnxc           	      C   s   t | j| jd|d}| |d    }t||gd}|dd|d    id }t	
|| }td tdt	|  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
        r)   r*   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#   rE   
pt_outputssessort_outputsdiffr   r   r   rD      s   $
zWhisperEncoder.verify_onnx)TFF)__name__
__module____qualname____doc__r   r?   nnModulestrr   Tensorr   r   r!   r"   r   boolr$   rI   rD   __classcell__r   r   r   r   r
      s:    
@r
   )loggingr<   r:   pathlibr   rM   rO   r@   r?   float16r   r   
onnx_modelr   transformersr   whisper_inputsr   r   onnxruntimer	   	getLoggerrX   rQ   r\   r]   r
   r   r   r   r   <module>   s   
