
    hS                        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rS SK	r	S SK
r
S SKJr  S SKJr  S SK	JrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJrJr  S SKJr  \ R<                  " \5      r  " S S\
RB                  RD                  5      r#g)    N)chain)Path)convert_float_to_float16)RepeatedCompositeFieldContainer)
ModelProtoValueInfoProto)	OnnxModel)PastKeyValuesHelper)WhisperConfig)convert_inputs_for_ortget_model_dynamic_axesget_sample_decoder_inputsgroup_past_key_values)InferenceSessionc                     ^  \ rS rSrSrS'S\S\R                  R                  S\	S\
4U 4S jjjr  S(S	\R                  S
\R                  S-  S\\\R                        S-  4S jjr  S(S	\R                  S
\R                  S-  S\\\R                        S-  4S jjr  S(S	\R                  S
\R                  S-  S\\\R                        S-  4S jjrS rS rS rS'S\
S\
S\
4S jjrS)S\S\
S\
4S jjrS'S\S\
4S jjrS\4S jrS\S\
4S jr      S*S\	S\	S \
S!\
S\
S\
S"\
S#\
4S$ jjrS\	S\	S\
S\
4S% jrS&rU =r $ )+WhisperDecoder"   z/A Whisper decoder with optional past key valuesconfigmodel
model_implno_beam_search_opc                   > [         TU ]  5         Xl        UR                  U l        X0l        X@l        US:X  a  S OUR                  R                  U l        US:X  a  S OUR                  U l        US:X  a  UOS U l        U R                  R                  U l	        U R                  R                  U l        U R                  R                  U R                  -  U l        g Nopenai)super__init__r   devicer   r   r   decoderproj_outmax_source_positionsdecoder_attention_heads	num_headsd_model	head_size)selfr   r   r   r   	__class__s        q/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/models/whisper/whisper_decoder.pyr   WhisperDecoder.__init__%   s    ll$!2)X5t5;;;N;N *h 6ENN(H4U$
$(KK$D$D!<<,,>    Ndecoder_input_idsencoder_hidden_statespast_key_valuesc                     U R                  UUUSS9nU R                  UR                  5      nUR                  nUc  XV4$ [        R
                  " U5      u  pxXW4$ )NT)r+   	input_idsr,   	use_cache)r   r   last_hidden_stater,   r
   group_by_self_and_cross)	r%   r*   r+   r,   outputslogitspresent_key_valuespresent_selfpresent_crosss	            r'   
hf_forwardWhisperDecoder.hf_forward4   su     ,,"7'+	  
 w889$44"-- ':&Q&QRd&e# ##r)   c           	         0 nUGbc  [        U5      u  pVU Vs/ s H  owR                  SS5      PM     nnU Vs/ s H%  owR                  / UR                  S S QSP75      PM'     nnU Vs/ s H  owR                  SS5      PM     nnU Vs/ s H%  owR                  / UR                  S S QSP75      PM'     nn[	        U R
                  R                  R                  5       H  u  pUSU-     XIR                  R                  '   USU-  S-      XIR                  R                  '   USU-     XIR                  R                  '   USU-  S-      XIR                  R                  '   M     U R
                  R                  5       u  pU R
                  R                  XUS9nUb  U R
                  R                  R                   H  n	[        R                  " XIR                  R                     XR                  R                     /SS9R                  5       XR                  R                  '   [        R                  " XIR                  R                     XR                  R                     /SS9R                  5       XR                  R                  '   M     / / pU R
                  R                  R                   H  n	UR!                  XR                  R                     5        UR!                  XR                  R                     5        Ub  MV  UR!                  XR                  R                     5        UR!                  XR                  R                     5        M     U Vs/ s HB  nUR                  / UR                  S S QSPU R"                  P75      R                  SS5      PMD     nnU Vs/ s HB  nUR                  / UR                  S S QSPU R"                  P75      R                  SS5      PMD     nnU H  nUR%                  5         M     Uc)  [&        R(                  " X-   [+        U5      S-  5      nUU4$ X4$ s  snf s  snf s  snf s  snf s  snf s  snf )N      )xxakv_cache)dim)r   	transposereshapeshape	enumerater   r   blocksattnkeyvalue
cross_attninstall_kv_cache_hookstorchcatdetachappendr$   remover
   group_by_layerlen)r%   r*   r+   r,   past_kv_cacheself_attn_kv_cachescross_attn_kv_cachespast_kvidxblockr?   hooksr3   r5   r6   
present_kvhookr4   s                     r'   oai_forwardWhisperDecoder.oai_forwardP   s    &8Mo8^5J]"^J]w#4#4Q#:J]"^\o"p\oQX??3KW]]2A5F3K3K#L\o"pK_#`K_$5$5a$;K_ #`]q#r]qRYOO4LgmmBQ6G4L4L$M]q #r'

(:(:(A(AB
0CAG0Ljjnn-2Ea#gPQk2Rjj../6J1s76S..2238LQQTWWX[8Y..445	 C **;;= ##&7\i#j &++22+099"::>>2HZZ^^4LMST,&( ( .3YY"::#3#34hzz?O?O6PQWX.&( ))*	 3 ')"mZZ''..E 89)9)9 :;&$$X.>.>.B.B%CD$$X.>.>.D.D%EF / +
*
 J!1!1"1!5JrJ4>>JKUUVWYZ[* 	 
 ,
+
 J!1!1"1!5JrJ4>>JKUUVWYZ[+ 	 
 DKKM  "!4!C!C,c,.?1.D" --- ##] #_"p#`#rl

s$   Q	,Q+Q,Q'A	Q6A	Q"c                 j    U R                   S:X  a  U R                  XU5      $ U R                  XU5      $ r   )r   r[   r7   )r%   r*   r+   r,   s       r'   forwardWhisperDecoder.forward   s6     ??h&##$5o^^0YYr)   c           	          U R                   (       a  SS/nU$ SS/[        [        R                  " S [	        U R
                  R                  5       5       5      5      QnU$ )Nr.   r+   c              3   F   #    U  H  nS U 3SU 3SU 3SU 34v   M     g7f)past_key_self_past_value_self_past_key_cross_past_value_cross_N .0is     r'   	<genexpr>-WhisperDecoder.input_names.<locals>.<genexpr>   sB      (!BA *!-1A!/EYZX[G\`qrsqt^uv!B   !
first_passlistr   from_iterableranger   decoder_layers)r%   input_namess     r'   rs   WhisperDecoder.input_names   sl    ??&(?@K  '	 '' (!&t{{'A'A!B( 	K r)   c           	      D   U R                   (       aH  S/[        [        R                  " S [	        U R
                  R                  5       5       5      5      QnU$ S/[        [        R                  " S [	        U R
                  R                  5       5       5      5      QnU$ )Nr3   c              3   F   #    U  H  nS U 3SU 3SU 3SU 34v   M     g7f)present_key_self_present_value_self_present_key_cross_present_value_cross_Nrf   rg   s     r'   rj   .WhisperDecoder.output_names.<locals>.<genexpr>   sG      ( "CA 0s31!50421#6	 "Crl   c              3   6   #    U  H  nS U 3SU 34v   M     g7f)rw   rx   Nrf   rg   s     r'   rj   r{      s*      (VwQR,QC04Gs2KLVws   rm   )r%   output_namess     r'   r}   WhisperDecoder.output_names   s    ??'' ( "'t{{'A'A!B( 
L.  '' (V[\`\g\g\v\vVw( L r)   c                 l    [        U R                  X5      nSU;   a  U R                  (       d  US   S	 U$ )Nr.   r:   )r   r   r   )r%   rs   r}   dynamic_axess       r'   r   WhisperDecoder.dynamic_axes   s5    -dkk;U,&t/E/E[)!,r)   use_fp16_inputsuse_int32_inputsreturn_dictc           
          [        U R                  U R                  SU R                  (       a  SOSU R                  (       a  SOSUUS9nU(       a  U R                  (       a  US	 U$ U R                  (       a
  US   US   4$ US   US   US   4$ )	Nr;   r      r:   )
batch_sizepast_sequence_lengthsequence_lengthuse_fp16	use_int32r,   r*   r+   )r   r   r   rn   )r%   r   r   r   inputss        r'   r   WhisperDecoder.inputs   s    *KKKK'+!A"&//Qq$&
 ,-M??*+./ 
 &'*+$%
 	
r)   iois_cross	is_outputc                 j   UR                   R                  R                  R                  S   nSUR                  ;   a!  UR                  5         U R                  Ul        UR                   R                  R                  R                  S   nSUR                  ;   a9  UR                  5         U(       a  U R                  Ul        OU(       a  SOSUl        UR                   R                  R                  R                  S   nSUR                  ;   a!  UR                  5         U R                  Ul        U$ )Nr:   _dim_r;   total_sequence_lengthr      )
typetensor_typerC   r@   	dim_paramClearr"   	dim_valuer    r$   )r%   r   r   r   r"   r   r$   s          r'   fix_key_value_cache_dims'WhisperDecoder.fix_key_value_cache_dims   s     GG''--11!4	i)))OO"&..I''--3377:o///!!#,0,E,E)GP,CVl)GG''--11!4	i)))OO"&..I	r)   io_listc                    / n/ n/ nU H  nSUR                   ;  a#  SUR                   ;  a  UR                  U5        M6  SUR                   ;   aH  U R                  USUS9nU R                  (       a  UR                  U5        M{  UR                  U5        M  U R                  USUS9nU R                  (       a  UR                  U5        M  UR                  U5        M     U R                  (       d  X4U-   -  nU$ )Npastpresentr%   F)r   r   T)namerN   r   r   )r%   r   r   reordered_iorS   rT   r   new_ios           r'   fix_ioWhisperDecoder.fix_io  s     !BRWW$"'')A##B'277"66rEU^6_)) ''/'..v6 66rDT]6^)) ''/(//7! $ %%2FFFLr)   c                    U R                  UR                  R                  SS9n[        UR                  R                  5      S:  aI  UR                  R                  R	                  5         [        UR                  R                  5      S:  a  MI  UR                  R                  R                  U5        U R                  UR                  R                  SS9n[        UR                  R                  5      S:  aI  UR                  R                  R	                  5         [        UR                  R                  5      S:  a  MI  UR                  R                  R                  U5        U$ )NF)r   r   T)r   graphinputrQ   popextendoutput)r%   r   reordered_inputsreordered_outputss       r'   fix_inputs_and_outputs%WhisperDecoder.fix_inputs_and_outputs0  s     ;;u{{'8'8E;J%++##$q(KK!!# %++##$q(  !12 KK(:(:dKK%++$$%)KK""$ %++$$%)!!"34r)   c                 J    U R                   S:X  a  U(       a  [        U5      nU$ r   )r   r   )r%   r   r   s      r'   fix_layernorm_weights$WhisperDecoder.fix_layernorm_weights>  s!    ??h&? -U3Er)   onnx_model_pathproviderverboseuse_external_data_formatuse_encoder_hidden_statesuse_kv_cache_inputsc	                 v   U=(       a    U(       + U l         U(       + =(       a    UU l        U R                   (       d  U R                  (       d   S5       eU R                  XVS9n	U R                  5       n
U R	                  5       nU R                  X5      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	USU
UUSSUS9
  [        R"                  " XS9nU R%                  U5      nU R'                  UU5      n[(        R*                  " UUUSS	9  S
S
S
5        U R-                  XXV5        g
! , (       d  f       N!= f)a  Export decoder 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 KV caches. Defaults to False.
    use_int32_inputs (bool, optional): use int32 inputs for the decoder_input_ids. Defaults to True.
    use_encoder_hidden_states (bool, optional): use encoder_hidden_states as model input for decoder-init/decoder-without-past models. Defaults to False.
    use_kv_cache_inputs (bool, optional): use KV caches as model inputs for decoder-with-past models. Defaults to True.
zVOnly one of `use_encoder_hidden_states` and `use_kv_cache_inputs` can be true at once.)r   r   T)parentsexist_okzdecoder.onnx   )	argsfexport_paramsrs   r}   r   opset_versiondo_constant_foldingr   )load_external_data)save_as_external_dataall_tensors_to_one_fileN)rn   
later_passr   rs   r}   r   r   parentmkdirtempfileTemporaryDirectoryospathjoinrK   onnxexport
load_modelr   r   r	   saveverify_onnx)r%   r   r   r   r   r   r   r   r   r   rs   r}   r   tmp_dir_nametemp_onnx_model_pathout_pathr   s                    r'   export_onnxWhisperDecoder.export_onnxJ  s   H 4O<O8O 87O<O$// 	
d	
1 _`&&(((*((C_$$**4$*G((*l#%77<<n#M %&--33D43P/G+_HJJ"')) $(   OOHZE//6E..uoFENN&>(,	+ +8 	OV9 +*s   CF**
F8c                    U R                  X4SS9n/ nU R                  (       a  U R                  " S
0 UD6nUR                  US   R	                  5       R                  5       R                  5       5        US    HG  nU H>  n	UR                  U	R	                  5       R                  5       R                  5       5        M@     MI     OU R                  " S
0 UD6nUR                  US   R	                  5       R                  5       R                  5       5        US    H>  n
UR                  U
R	                  5       R                  5       R                  5       5        M@     [        X/S9nUR                  S[        X[5      5      n [        U R                  5       5       Hg  u  p[        R                  " Xm   X   -
  5      n[        R                  SU S35        [        R                  S	[        R                   " U5       35        Mi     g!    g= f)aG  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 KV caches
    use_int32_inputs (bool, optional): use int32 inputs for the decoder_input_ids
T)r   r   r   r   r:   )	providersNz
Comparing z...z
Max diff: rf   )r   rn   r^   rN   rM   cpunumpyr   runr   rD   r}   npabsloggerwarningmax)r%   r   r   r   r   r   
pt_outputsoutpresent_key_value_layerpresent_key_valuepresent_self_key_valuesessort_outputsri   output_namediffs                   r'   r   WhisperDecoder.verify_onnx  s   8 _mqr
??,,((Cc!fmmo11399;<+.q6')@%%%&7&>&>&@&D&D&F&L&L&NO *A ,2 ,,((Cc!fmmo11399;<*-a&&!!"8"?"?"A"E"E"G"M"M"OP +1  :Fhht%;F%IJ	"+D,=,=,?"@vvjmkn<=K=<=BFF4L>:; #A	s   BH H)r   r   r   rn   r$   r   r    r   r   r   r"   r   )F)NN)FF)TFFTFT)!__name__
__module____qualname____firstlineno____doc__r   rK   nnModulestrboolr   Tensorro   tupler7   r[   r^   rs   r}   r   r   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r&   s   @r'   r   r   "   s<   9?} ?UXX__ ?RU ?jn ? ?$ 6:<@	$ <<$  %||d2$ eELL12T9	$> 6:<@	X$ <<X$  %||d2X$ eELL12T9	X$z 6:<@	Z <<Z  %||d2Z eELL12T9	Z 6
d 
d 
QU 
4> T ^b (= $ 8J 
: 
 
  ). %!%*/$(OWOW OW 	OW
 #'OW OW OW $(OW "OWb55 5 	5
 5 5r)   r   )$loggingr   r   	itertoolsr   pathlibr   r   r   r   rK   float16r   #google.protobuf.internal.containersr   r   r   
onnx_modelr	   past_helperr
   transformersr   whisper_inputsr   r   r   r   onnxruntimer   	getLoggerr   r   r   r   r   rf   r)   r'   <module>r     sf     	       , O +   + &  )			8	$nUXX__ nr)   