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 NZopenai)super__init__r   devicer   encoderr   )selfr   r   r   	__class__ q/home/kim/smarthome/.venv/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   Zlast_hidden_state)r   r   Z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   )NZ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.
           Z
batch_sizeZuse_fp16T)parentsexist_okzencoder.onnxr      )	argsfZexport_paramsr   r   r   Zopset_versionZdo_constant_foldingr#   )Zload_external_data)Zsave_as_external_dataZall_tensors_to_one_fileN)r   r   r   r   r   r   r   parentmkdirtempfileTemporaryDirectoryospathjointorchonnxZexportZ
load_modelr    r   saveverify_onnx)r   r!   r"   r#   r$   r   inputsr   r   r   Ztmp_dir_nameZtemp_onnx_model_pathZ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   r7   Z
pt_outputssessZort_outputsdiffr   r   r   r6      s   $
zWhisperEncoder.verify_onnx)TFF)__name__
__module____qualname____doc__r   r3   nnModulestrr   ZTensorr   r   r   r   r   boolr    r8   r6   __classcell__r   r   r   r   r
      s:    
@r
   )loggingr0   r.   pathlibr   r<   r>   r4   r3   Zfloat16r   r   Z
onnx_modelr   Ztransformersr   Zwhisper_inputsr   r   Zonnxruntimer	   	getLoggerrE   r@   rI   rJ   r
   r   r   r   r   <module>   s   
