
    h"                         S SK r S SKrS SKrS SKJr  S SKrS SKrS SKrS SK	J
r
  S SKJr  S SKJr  S SKJr  S SKJrJr  S SKJr  \ R*                  " \5      r " S	 S
\R0                  R2                  5      rg)    N)Path)convert_float_to_float16)
ModelProto)	OnnxModel)WhisperConfig)get_model_dynamic_axesget_sample_encoder_inputs)InferenceSessionc                      ^  \ rS rSrSrS\S\R                  R                  S\	4U 4S jjr
S\R                  4S jrS	 rS
 rS rS\S\4S jr   SS\	S\	S\S\S\4
S jjrS\	S\	S\4S jrSrU =r$ )WhisperEncoder   zWhisper encoder componentconfigmodel
model_implc                    > [         TU ]  5         Xl        UR                  U l        X0l        US:X  a  UR
                  U l        g UR                  R
                  U l        g Nopenai)super__init__r   devicer   encoderr   )selfr   r   r   	__class__s       q/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/models/whisper/whisper_encoder.pyr   WhisperEncoder.__init__   sE    ll$(2h(>u}}EKKDWDW    audio_featuresc                 `    U R                  U5      nU R                  S:X  a  U$ UR                  $ r   )r   r   last_hidden_state)r   r   outputss      r   forwardWhisperEncoder.forward%   s,    ,,~.//X5wT7;T;TTr   c                     S/nU$ )Nr    )r   input_namess     r   r%   WhisperEncoder.input_names)   s    '(r   c                     S/nU$ )Nencoder_hidden_statesr$   )r   output_namess     r   r)   WhisperEncoder.output_names-   s    /0r   c                 2    [        U R                  X5      nU$ )N)r   r   )r   r%   r)   dynamic_axess       r   r,   WhisperEncoder.dynamic_axes1   s    -dkk;Ur   use_fp16_inputsc                 J    U R                   S:X  a  U(       a  [        U5      nU$ r   )r   r   )r   r   r.   s      r   fix_layernorm_weights$WhisperEncoder.fix_layernorm_weights5   s!    ??h&? -U3Er   onnx_model_pathproviderverboseuse_external_data_formatc                    [        U R                  U R                  SUS9nU R                  5       nU R	                  5       nU R                  Xx5      n	[        U5      R                  R                  SSS9  [        R                  " 5        n
[        R                  R                  U
S5      n[        U5      R                  R                  SSS9  U(       a  UOUn[        R                  R!                  U US   USUUU	SSUS9
  [        R"                  " XS	9nU R%                  X5      n[&        R(                  " UUUSS
9  SSS5        U R+                  XU5        g! , (       d  f       N!= f)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_foldingr4   )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_modelr0   r   saveverify_onnx)r   r2   r3   r4   r5   r.   inputsr%   r)   r,   tmp_dir_nametemp_onnx_model_pathout_pathr   s                 r   export_onnxWhisperEncoder.export_onnxA   sM   . +KKKK$	
 &&(((*((C_$$**4$*G((*l#%77<<n#M %&--33D43P/G+_HJJ-."')) $(   OOHZE..uFENN&>(,	) +6 	OD7 +*s   
B4E
E'c                    [        U R                  U R                  SUS9nU R                  US   5      R	                  5       R                  5       R                  5       n[        X/S9nUR                  SSUS   R	                  5       R                  5       R                  5       05      S   n[        R                  " XW-
  5      n[        R                  S5        [        R                  S[        R                  " U5       35        g)	zVerify 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
r7   r8   r   )	providersNr   z"Comparing encoder_hidden_states...z
Max diff: )r	   r   r   r!   detachcpunumpyr
   runnpabsloggerwarningmax)	r   r2   r3   r.   rS   
pt_outputssessort_outputsdiffs	            r   rR   WhisperEncoder.verify_onnx   s    $ +KKKK$	
 \\&)9":;BBDHHJPPR
  :Fhht&6?O8P8W8W8Y8]8]8_8e8e8g%hijkl vvj./;<BFF4L>23r   )r   r   r   r   )TFF)__name__
__module____qualname____firstlineno____doc__r   rM   nnModulestrr   Tensorr!   r%   r)   r,   r   boolr0   rW   rR   __static_attributes____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 	#4 #4r   r   )loggingrJ   rH   pathlibr   r]   r_   rN   rM   float16r   r   
onnx_modelr   transformersr   whisper_inputsr   r	   onnxruntimer
   	getLoggerri   ra   rn   ro   r   r$   r   r   <module>r}      sT     	      ,    & L (			8	$J4UXX__ J4r   