
    hM                     v    S SK r S SKrS SKJrJr  S SKJr  S SKJ	r	  \ R                  " \5      r " S S\5      rg)    N)AttentionMaskFusionAttention)helper)	OnnxModelc                   F   ^  \ rS rSrSrS\S\S\S\4U 4S jjrS r	S	r
U =r$ )
FusionBartAttention   z7
Fuse Bart Attention subgraph into one Attention node.
modelhidden_size	num_headsattention_maskc                 &   > [         TU ]  XX45        g )N)super__init__)selfr
   r   r   r   	__class__s        h/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/fusion_bart_attention.pyr   FusionBartAttention.__init__   s     	YG    c                    U R                   R                  U/ SQ/ SQ5      nUb	  Uu  nnnnn	O[        R                  S5        g / n
UR                   H2  nX;  a  M
  XS   R
                  S   :X  a  M!  U
R                  U5        M4     [        U
5      S:w  a  g U
S   n X<   nUR                  S;   a  U R                   R                  U5      S   nUR
                   HE  nU(       d  M  X.   nU Vs/ s H  nUR                  PM     nnUR                  S5      S:  d  MC  Un  O   U R                   R                  5       R                   Vs1 s H  nUR                  iM     nnU R                   R                  5       R
                   Vs1 s H  nUR                  iM     nnU R                   R                  U	/ SQ/ S	Q5      nU R                   R                  U	/ S
Q/ SQ5      nU R                   R                  U	/ SQ/ SQ5      nSu  nn/ S S nnnUb  UnUu  nnnnUUR
                  S      nU H]  n U R                  S:X  d  M  U R                   R                  U SS/SS/5      n!U!b  U!S   R                  S   nUU R
                  S      n  O   U HJ  n UU R
                  S      n"U" H'  n#U#R
                  S   U;   d  M  U#R
                  S   n  O   US:w  d  MJ    O   O}Ub)  UnUu  n$nnnnU$R                  S   nU$R
                  S   nOQU	R                  S   U;   a  U	R                  S   nO.Ub  UnUS   R                  S   nO[        R                  S5        g UU;   a  UOSnUU;   a  UOSnU R                   R                  U	SS/SS/5      n%U R                   R                  U	/ SQ/ SQ5      n&/ S n(n'U%b  U%u  n)n*U%n'O"U&b	  U&u  n)n(n*U&n'O[        R                  S5        g U R                   R                  U*/ SQ/ SQ5      n+U R                   R                  U*/ SQ/ SQ5      n,/ n-U+b  U+n-U-u  n.n/n0n1n2O$U,b  U,n-U-u  n0n.n/n1n2O[        R                  S5        g U R                   R                  U*/ SQ/ SQ5      n3U R                   R                  U*/ SQ/ S Q5      n4U R                   R                  U*/ S!Q/ SQ5      n5U R                   R                  U*/ S"Q/ S#Q5      n6Su  n7n8/ S S n;n:n9U3bJ  U3n9U9u  n<n=n;UU=R
                  S      n>U> H(  n?U?R
                  S   U;   d  M  U?R
                  S   n8  GO{   GOwU4b*  U4n9U9u  n)n@n<n=n;U@R                  S   n7U@R
                  S   n8GOJUU*R                  S      R                  S   U;   a'  UU*R                  S      /n9U9S   R                  S   n7GO U5b  U5n9U9u  n)n<n=n;UU;R
                  S      nU H]  n U R                  S:X  d  M  U R                   R                  U SS/SS/5      nAUAb  WAS   R                  S   n7UU R
                  S      n  O   U HJ  n UU R
                  S      n"U" H'  n#U#R
                  S   U;   d  M  U#R
                  S   n8  O   U8S:w  d  MJ    O1   O.U6b  U6n9U9S   R                  S   n7O[        R                  S$5        g U7U;   a  U7OSn7U8U;   a  U8OSn8U;b  U:c  U R                   R                  UR                  S   5      nBUBR                  S   nCUBR                  nDS%nEU R                   R                  UE5      nFUFc>  U R!                  WEWDWC/["        R$                  " S&/UC-  [&        R(                  " UD5      S'9S(9  U R                   R+                  S)5      nG[&        R,                  " S)WEU;R
                  S   /W=R                  /UG5      n:[/        U75      =(       a!    [/        U5      =(       a    U;S L =(       a    US L nHUH(       + =(       aD    U2R                  S   U:H  =(       a+    U;R                  S   U:H  =(       a    UR                  S   U:H  nIWH(       + =(       a^    U2R                  S   U:H  =(       aE    U;R                  S   UR                  S   :H  =(       a    U;R                  S   U2R                  S   :g  nJWI=(       a    U'U%:H  nKWI=(       a    U'U&:H  nLWJ=(       a    U'U%:H  nMWL=(       a    [/        U75      =(       a    [/        U5      nNWH=(       a    U'U%:H  nOU'U&:H  nP/ nQUP(       a  U R                   R                  U(S*/S/5      nRU R                   R                  U(/ S+Q/ S,Q5      nSU R                   R                  U(/ S-Q/ S.Q5      nTU R                   R                  U(S/S//SS/5      nUUSb  WSnQO(WTb  WTnQO"WUb  WUnQOWRb  WRnQO[        R                  S05        g [        WQ5      S:  d   eWK(       d  WL(       d  WM(       d  WN(       d  WO(       Gag  UnVU R1                  U/5      u  nWnXUWS::  d  WXS::  d	  WXWW-  S:w  a  [        R                  S15        g S nYWN(       d  WM(       d  WO(       a  U R2                  (       a{  U R5                  U2WM(       d  WN(       a  U;OU7WM(       d  WN(       a  UOUU1WM(       d  WN(       a  U:OS WM(       d  WN(       a  UOS WWWXWVR
                  S   WPWN(       a  U7OSWN(       a  UOSU8US29OS nYOEU R2                  nZS3U l        U R7                  S U2U;UU1U:UWWWXUWVR
                  S   WPU7UU8US49nYUZU l        WYc  [        R                  S55        g U R8                  R                  WY5        U R:                  U R<                  UYR                  '   U R>                  RA                  WVX/5        U R>                  RA                  U'5        WN(       d  WM(       d  WO(       Ga=  [        U-5      S:  a#  U-S   R                  S:X  a  U-RC                  5         [        U95      S:  a#  U9S   R                  S:X  a  U9RC                  5         [        U5      S:  a#  US   R                  S:X  a  URC                  5         U RD                  (       a  [        U-5      S:  a#  U-S   R                  S):X  a  U-RC                  5         [        U95      S:  a#  U9S   R                  S):X  a  U9RC                  5         [        U5      S:  a#  US   R                  S):X  a  URC                  5         U R>                  RA                  U-5        U R>                  RA                  U95        U R>                  RA                  U5        S6U l#        g g s  snf s  snf s  snf )7N)AddMatMulReshape	Transposer   )   r   r   r   r   z(fuse_attention: failed to match qkv pathr   r   >   r   Clipr   )r   r   r   r   )r   r   r   N)Concatr   r   r   r   )r   r   r   r   N)r   r   r   r   )r   r   r   r   ) r   r   r   r   r   z&fuse_attention: failed to match v pathSoftmax)r    r   r   )r   r   r   z'fuse_attention: failed to match qk path)r   r   Mulr   r   )r   r   r   r   r   )r!   r   r   r   r   z&fuse_attention: failed to match q path)r   r   r   )r   r   r   )r   r   r   r   r   )r   r   r   r   r   )r!   r   r   r   )r!   r   r   r   r   )r   r   r   r   r   z&fuse_attention: failed to match k path
empty_biasg        )dtype)dimsvalsr   Where)SliceExpandr&   )r   r   r   )r'   	UnsqueezeGatherShaper   )r      r   r   r   r'   z*fuse_attention: failed to match mask nodesz9fuse_attention: failed to detect num_heads or hidden_size)q_matmulk_matmulv_matmulq_addk_addv_addr   r   outputunidirectionalpast_kpast_v	present_k	present_vF)
mask_indexr-   r.   r/   r0   r1   r2   r   r   first_inputr3   causalr5   r6   r7   r8   z+fuse_attention: failed to create fused nodeT)$r
   match_parent_pathloggerdebuginputr3   appendlenop_typeget_childrencountgraphnameget_initializerr$   	data_typeadd_initializernparrayr   tensor_dtype_to_np_dtypecreate_node_name	make_nodeboolget_num_heads_and_hidden_sizeuse_multi_head_attentioncreate_multihead_attention_nodecreate_attention_nodenodes_to_addthis_graph_namenode_name_to_graph_namenodes_to_removeextendpop!disable_multi_head_attention_biasprune_graph)[r   normalize_nodeinput_name_to_nodesoutput_name_to_node	qkv_nodesadd_out
matmul_outreshape_qkvtranspose_qkv
matmul_qkvother_inputsinput_
root_inputskip_layernormr3   childrenchildchildren_typesnodegraph_input_namesgraph_output_namesv_nodes_past_or_presentv_nodes_with_pastv_nodes_past_only_oair6   r8   v_nodesadd_vmatmul_vtranspose_v	reshape_vstart_child_nodesstart_child_nodeconcat_v_nodesstart_grandchild_nodesstart_grandchild_nodeconcat_vqk_nodes_no_maskqk_nodes_with_maskqk_nodesadd_qk_	matmul_qk
q_nodes_hfq_nodes_oaiq_nodestranspose_q	reshape_qmul_qadd_qmatmul_qk_nodes_no_past_hfk_nodes_with_past_hfk_nodes_past_or_present_oaik_nodes_past_only_oair5   r7   k_nodesadd_kmatmul_ktranspose_k	reshape_ktranspose_k_nodestranspose_k_nodeconcat_kconcat_k_nodesadd_v_tensorbias_dimr#   empty_bias_nameempty_tensoradd_namethree_root_inputsone_root_inputtwo_root_inputsencoder_attentiondecoder_self_attentiondecoder_cross_attention decoder_self_attention_with_past!decoder_cross_attention_with_pastcausal_mask
mask_nodesmask_nodes_bartmask_nodes_whisper_hfmask_nodes_whisper_oai mask_nodes_whisper_oai_unit_testattention_last_noder   r   new_node%use_multi_head_attention_ground_truths[                                                                                              r   fuseFusionBartAttention.fuse   s   JJ00?
	
    LLCD$**F01,,Q//' + |!!!_
	 -8 !!_4!ZZ44^DQGN$++F*2H9ABemmNB##H-2#
 , 48::3C3C3E3K3KL3K4TYY3KL48JJ4D4D4F4M4MN4MDdii4MN"&**">">5#

 !JJ88?

 !%

 < <<!

 #	#%tT".-G8?5[)UH !4ELLO D$5 #++x7%)ZZ%A%A("K0A&N
 &1!/!3!9!9!!<(;<L<S<STU<V(W% %6 %6 )<=M=T=TUV=W)X&-C),33A6:LL$9$@$@$C	 .D ? %6 *'GBI?X{Iuh^^A&F *Ia $55%%a(F".+GR[&&q)FLLAB!%66B!*.@!@Ib	::77
YPXDY\]_`[ab!ZZ99*Fbdmnt&'+LAy'H+#5 Avy)HLLBCZZ11<


 jj22<

 ! G?F<[)UE8$!G?F<UKE8LLAB!ZZ99.

  $zz;;E 

 '+jj&B&B5'
#
 !%

 < <C!

 #	#%tT)(G18.[)X !4I4D4DQ4G H$5 #**1-1CC 0 7 7 :I %6 "-*G>E;Q+y(^^A&F *I !34::1=ARR*9??1+=>?GQZ%%a(F(41G4;1QY !4HOOA4F G$5 #++x7%)ZZ%A%A("K0A&N
 &1!/!3!9!9!!<(;<L<S<STU<V(W% %6 %6 )<=M=T=TUV=W)X&-C),33A6:LL$9$@$@$C	 .D ? %6 #.+GR[&&q)FLLAB!%66B!*.@!@Ib	EM::55ekk!nEL#((+H **E*O::55oFL#$$#"3%("2&:Y:YZ_:`a	 %  zz2259H$$U_hooa>P,QT]TbTbScemnE LcT&\ch$>NcS[_cSc!! 0q!Z/0q!Z/0 q!Z/	 	 "! 7q!Z/7q!X^^A%667 q!X^^A%66	 	 +Kx;K/K!/!RH@R4R"1"RhBR6R+A+cd6l+cW[\bWc(,=,^(N^B^) "44
"jj::	O
 %)JJ$@$@,%!
 &*ZZ%A%A@&"
 04zz/K/K'"A0,
 %02
'33
1==
 ,,
IJz?Q&&& %&/0"-%)%G%G	%R"I{A~!1kI6MRS5SXYH/3JNo* 44! 88!)-DHhnt-DHhnt#'>Bbehl'>Bbehl"+$/299!<'2)Ivr)Ivr"+"+ 9 " % , 9=8U8U505-55#%%%' + *.55a8&!!''! 6 $ 1V-JK$$X.:>:N:ND((7  '')<m(XY  ''1 03JNow<!#(;(;x(GKKMw<!#(;(;x(GKKMw<!#(;(;x(GKKM997|a'GBK,?,?5,H7|a'GBK,?,?5,H7|a'GBK,?,?5,H  ''0  ''0  ''0  $Dq 1Y C
 MNs   0u!u&	u+)r[   rQ   )__name__
__module____qualname____firstlineno____doc__r   intr   r   r   __static_attributes____classcell__)r   s   @r   r   r      sD    HH H 	H
 &HV$ V$r   r   )loggingnumpyrJ   fusion_attentionr   r   onnxr   
onnx_modelr   	getLoggerr   r=   r    r   r   <module>r      s4   
   ;   			8	$d$/ d$r   