
    piM                     v    d dl Z d dlZd dlmZmZ d dlmZ d dlm	Z	  e j                  e      Z G d de      Zy)    N)AttentionMaskFusionAttention)helper)	OnnxModelc                   :     e Zd ZdZdedededef fdZd Z xZ	S )FusionBartAttentionz?
    Fuse Bart Attention subgraph into one Attention node.
    modelhidden_size	num_headsattention_maskc                 *    t         |   ||||       y )N)super__init__)selfr	   r
   r   r   	__class__s        p/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_bart_attention.pyr   zFusionBartAttention.__init__   s     	YG    c                    | j                   j                  |g dg d      }|	|\  }}}}}	nt        j                  d       y g }
|j                  D ].  }||vr||d   j
                  d   k(  r|
j                  |       0 t        |
      dk7  ry |
d   }	 ||   }|j                  dv r| j                   j                  |      d   }|j
                  D ];  }|s||   }|D cg c]  }|j                   }}|j                  d      dk\  s9|} n | j                   j                         j                  D ch c]  }|j                   }}| j                   j                         j
                  D ch c]  }|j                   }}| j                   j                  |	g dg d	      }| j                   j                  |	g d
g d      }| j                   j                  |	g dg d      }d\  }}g d d }}}||}|\  }}}}||j
                  d      }|D ]Z  } | j                  dk(  s| j                   j                  | ddgddg      }!|!|!d   j                  d   }|| j
                  d      } n |D ]D  } || j
                  d      }"|"D ]$  }#|#j
                  d   |v s|#j
                  d   } n |dk7  sD n{ ny|)|}|\  }$}}}}|$j                  d   }|$j
                  d   }nN|	j                  d   |v r|	j                  d   }n-||}|d   j                  d   }nt        j                  d       y ||v r|nd}||v r|nd}| j                   j                  |	ddgddg      }%| j                   j                  |	g dg d      }&g d }(}'|%|%\  })}*|%}'n!|&	|&\  })}(}*|&}'nt        j                  d       y | j                   j                  |*g dg d      }+| j                   j                  |*g dg d      },g }-|+|+}-|-\  }.}/}0}1}2n#|,|,}-|-\  }0}.}/}1}2nt        j                  d       y | j                   j                  |*g dg d      }3| j                   j                  |*g dg d       }4| j                   j                  |*g d!g d      }5| j                   j                  |*g d"g d#      }6d\  }7}8g d d };}:}9|3F|3}9|9\  }<}=};||=j
                  d      }>|>D ]%  }?|?j
                  d   |v s|?j
                  d   }8 ni nf|4*|4}9|9\  })}@}<}=};|@j                  d   }7|@j
                  d   }8n:||*j                  d      j                  d   |v r&||*j                  d      g}9|9d   j                  d   }7n|5|5}9|9\  })}<}=};||;j
                  d      }|D ]Z  } | j                  dk(  s| j                   j                  | ddgddg      }A|AAd   j                  d   }7|| j
                  d      } n |D ]D  } || j
                  d      }"|"D ]$  }#|#j
                  d   |v s|#j
                  d   }8 n |8dk7  sD n/ n-|6|6}9|9d   j                  d   }7nt        j                  d$       y |7|v r|7nd}7|8|v r|8nd}8|;|:| j                   j                  |j                  d         }B|Bj                  d   }C|Bj                  }Dd%}E| j                   j                  |E      }F|FB| j!                  EDCgt#        j$                  d&g|Cz  t'        j(                  |D      '      (       | j                   j+                  d)      }Gt'        j,                  d)E|;j
                  d   g=j                  g|G      }:t/        |7      xr t/        |      xr
 |;d u xr |d u }H|H xr: |2j                  d   |k(  xr& |;j                  d   |k(  xr |j                  d   |k(  }IH xrT |2j                  d   |k(  xr@ |;j                  d   |j                  d   k(  xr |;j                  d   |2j                  d   k7  }JIxr |'|%k(  }KIxr |'|&k(  }LJxr |'|%k(  }MLxr t/        |7      xr t/        |      }NHxr |'|%k(  }O|'|&k(  }Pg }Q|Pr| j                   j                  |(d*gdg      }R| j                   j                  |(g d+g d,      }S| j                   j                  |(g d-g d.      }T| j                   j                  |(d/d/gddg      }U|SS}Qn%TT}Qn UU}QnRR}Qnt        j                  d0       y t        Q      dkD  sJ Ks	LsMsNsOr|}V| j1                  |/      \  }W}X|Wdk  sXdk  sXWz  dk7  rt        j                  d1       y d }YNsMsOr[| j2                  rL| j5                  |2MsNr|;n|7MsNr|n||1MsNr|:nd MsNr|nd WXVj
                  d   PNr|7ndNr|nd|8|2      nd }YnH| j2                  }Zd3| _        | j7                  d |2|;||1|:|WX|Vj
                  d   P|7||8|4      }Y|Z| _        Yt        j                  d5       y | j8                  j                  Y       | j:                  | j<                  |Yj                  <   | j>                  jA                  V||	g       | j>                  jA                  |'       NsMsOr,t        |-      dkD  r"|-d   j                  dk(  r|-jC                          t        |9      dkD  r"|9d   j                  dk(  r|9jC                          t        |      dkD  r"|d   j                  dk(  r|jC                          | jD                  rt        |-      dkD  r"|-d   j                  d)k(  r|-jC                          t        |9      dkD  r"|9d   j                  d)k(  r|9jC                          t        |      dkD  r"|d   j                  d)k(  r|jC                          | j>                  jA                  |-       | j>                  jA                  |9       | j>                  jA                  |       d6| _#        y y c c}w c c}w c c}w )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-   r.   r/   r0   r   r
   first_inputr1   causalr3   r4   r5   r6   z+fuse_attention: failed to create fused nodeT)$r	   match_parent_pathloggerdebuginputr1   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_layernormr1   childrenchildchildren_typesnodegraph_input_namesgraph_output_namesv_nodes_past_or_presentv_nodes_with_pastv_nodes_past_only_oair4   r6   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_oair3   r5   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   fusezFusionBartAttention.fuse   s   JJ00?
	
    LLCD$** 	(F001,,Q//'	( |!!!_
	 -Z8 !!_4!ZZ44^DQGN$++ 	F*62H9ABemmBNB##H-2#
	 48::3C3C3E3K3KL4TYYLL48JJ4D4D4F4M4MNDdiiN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  )<=M=T=TUV=W)X&-C ),33A6:LL$9$@$@$C	 ? *'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 "-*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  )<=M=T=TUV=W)X&-C ),33A6:LL$9$@$@$C	 ? #.+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  '')<mZ(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   #p=8q3q)
__name__
__module____qualname____doc__r   intr   r   r   __classcell__)r   s   @r   r   r      s>    HH H 	H
 &HV$r   r   )loggingnumpyrH   fusion_attentionr   r   onnxr   
onnx_modelr   	getLoggerr   r;   r    r   r   <module>r      s6   
   ;   			8	$d$/ d$r   