Ë
    cQêj@  ã                   óî   — 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       €ú|/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr   zWhisperEncoder.__init__   sI   ø€ Ü‰ÑÔØˆŒØ—l‘lˆŒØ$ˆŒà(2°hÒ(>�u—}‘}ˆ�ÀEÇKÁK×DWÑDWˆ�ó    Ú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Ò5ˆwÐT¸7×;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   € Ü-¨d¯k©k¸;ÈÓ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ˆEØˆ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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   é   F)
ÚargsÚfÚexport_paramsr"   r%   r'   Úopset_versionÚdo_constant_foldingÚdynamor-   )Ú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Ø�K‰KØØ$ô	
ˆð ×&Ñ&Ó(ˆØ×(Ñ(Ó*ˆØ×(Ñ(¨°lÓCˆäˆ_Ó×$Ñ$×*Ñ*°4À$Ð*ÔGÜ×(Ñ(Ó*ð 	¨lÜ#%§7¡7§<¡<°¸nÓ#MÐ ÜÐ%Ó&×-Ñ-×3Ñ3¸DÈ4Ð3ÔPÙ/GÑ+È_ˆHä�J‰J×ÑØØÐ-Ñ.ØØ"Ø'Ø)Ø)Ø Ø$(ØØð ô ô —O‘O HÐAYÔZˆEØ×.Ñ.¨u°oÓFˆEÜ�N‰NØØØ&>Ø(,õ	÷+	ð8 	×Ñ˜¨(°OÕD÷9	ð 	ús   ÂB<E(Å(E1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(   rM   Ú
pt_outputsÚsessÚort_outputsÚdiffs	            r   rL   zWhisperEncoder.verify_onnx‚   sÝ   € ô$ +Ø�K‰KØ�K‰KØØ$ô	
ˆð —\‘\ &Ð)9Ñ":Ó;×BÑBÓD×HÑHÓJ×PÑPÓRˆ
ô   ¸H¸:ÔFˆØ—h‘h˜tÐ&6¸Ð?OÑ8P×8WÑ8WÓ8Y×8]Ñ8]Ó8_×8eÑ8eÓ8gÐ%hÓiÐjkÑlˆô �v‰v�j ;Ñ.Ó/ˆÜ�‰Ð;Ô<Ü�‰˜¤B§F¡F¨4£L >Ð2Õ3r   )TFF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rG   ÚnnÚModuleÚstrr   ÚTensorr   r"   r%   r'   r   Úboolr*   rQ   rL   Ú__classcell__)r   s   @r   r   r      sÉ   ø„ Ù#ðX˜}ð X°U·X±X·_±_ð XÐRUõ XðU e§l¡ló Uòòòð
¨:ð 
Èó 
ð  Ø).Ø %ñ?Eàð?Eð ð?Eð ð	?Eð
 #'ð?Eð ó?EðB#4àð#4ð ð#4ð ÷	#4r   r   )ÚloggingrD   rB   Úpathlibr   rV   rX   rH   rG   Úfloat16r   r   Ú
onnx_modelr   Útransformersr   Úwhisper_inputsr   r	   Úonnxruntimer
   Ú	getLoggerra   rZ   re   rf   r   r!   r   r   ú<module>rs      sV   ðó Û 	Û Ý ã Û Û Ý ,Ý Ý  Ý &ß Lå (à	ˆ×	Ñ	˜8Ó	$€ôK4�U—X‘X—_‘_õ K4r   