
    \j-                     b    d dl Z d dlmZmZ d dlmZ  e j                  e      Z G d de      Z	y)    N)AttentionMaskFusionAttention)	OnnxModelc                   :     e Zd ZdZdedededef fdZd Z xZ	S )FusionConformerAttentionzM
    Fuse Conformer Attention subgraph into one MultiHeadAttention node.
    modelhidden_size	num_headsattention_maskc                 *    t         |   ||||       y )N)super__init__)selfr   r	   r
   r   	__class__s        f/root/.hermes/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr   z!FusionConformerAttention.__init__   s     	YG    c                    | j                   j                  |g dg d      }|9| j                   j                  |g dg d      }|t        j                  d       y |d   |d   |d   }}}d	\  }}	| j                   j                  |g d
g d      }
|
\| j                   j                  |g dg d      }
|
y| j                   j                  |g dg d      }
|
Vt        j                  d       y |
d   }| j                   j	                  |dd       }|j
                  d   }	|j
                  d   }t        |
      dk\  r|
d   j                  dk(  r|
d   nd }|
d   }d}| j                   j                  |g dg d      }d }|g| j                   j                  |g dg d      }|?| j                   j                  |g dg d      }|t        j                  d       y |d   }n|d   }|5| j                   j                  |g dg d      }||d   j
                  d   }|d   |d   }}| j                   j                  |g dg d      }|| j                   j                  |g dg d      }|\| j                   j                  |g d g d!      }|9| j                   j                  |g d g d"      }|t        j                  d#       y t        d$ |D        d       }t        d% |D        d       }t        d& t        |      D        d       }|||t        j                  d'       y | j                   j                  |g d(g d)      }|2|d   j                  d*v r!|d   |d   k7  rt        j                  d+       y |%| j                   j                  |g d,g d-      }||}d	\  }}| j                   j                  |g d.g d/      }|| j                   j                  |g d0g d1      }|| j                   j                  |g dg d      }|y| j                   j                  |g dg d      }|Vt        j                  d2       y |d3   }| j                   j	                  |dd       }|j
                  d   }|j
                  d   }t        |      dk\  r|d   j                  dk(  r|d   nd }|d   } | j                  |      \  }!}"|!dk  s|"dk  s|"|!z  dk7  rt        j                  d4       y |j                  d3   }#| j                   j                  |#      }$|$Dt        |$j                        d5k7  r,t        j                  d6|#t        |$j                               d}#d }%|j                  d   | j                  d   k(  xr7 | j                  d   |j                  d   k(  xr |d u xr |d uxr
 |d uxr |d u}&|&r<| j                  ||| |||||!|"|j                  d   |j
                  d   |#||||	7      }%n-| j!                  || |||||!|"|j
                  d   ||#||||	8      }%|%t        j                  d9       y | j"                  j%                  |%       | j&                  | j(                  |%j*                  <   | j,                  j/                  |||g       | j,                  j/                  |       |&sf|d   j                  d:k(  r|j1                          |d   j                  d:k(  r|j1                          |
d   j                  d:k(  r|
j1                          || j,                  j/                  |       | j,                  j/                  |       | j,                  j/                  |
       d;| _        y )<N)AddMatMulReshape	Transposer   )   Nr   r   r   )r   r   r   r   )r   r   r   r   z2fuse_conformer_attention: failed to match qkv path) r   )Concatr   r   r   r   )r   r   r   r   r   )r   r   r   r   )r   r   r   )r   r   r   z0fuse_conformer_attention: failed to match v pathr      r   r   )Softmaxr   r   )r   r   r   )Wherer   r    r   r   )r   r   r   r   r   )r    r   r    Divr   r   )r   r   r   r   r   r   z1fuse_conformer_attention: failed to match qk path)Equal	UnsqueezeCast)r!   r   r   r   r   )r   r   r   r   r   )Mulr   r   r   r   )r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   z0fuse_conformer_attention: failed to match q pathc              3   @   K   | ]  }|j                   d k(  s|  yw)r   Nop_type.0nodes     r   	<genexpr>z0FusionConformerAttention.fuse.<locals>.<genexpr>   s     P4dlli6O$P   c              3   @   K   | ]  }|j                   d k(  s|  yw)r   Nr'   r)   s     r   r,   z0FusionConformerAttention.fuse.<locals>.<genexpr>   s     Ht$,,%2GdHr-   c              3   @   K   | ]  }|j                   d k(  s|  yw)r   Nr'   r)   s     r   r,   z0FusionConformerAttention.fuse.<locals>.<genexpr>   s     X$t||x?WXr-   zGfuse_conformer_attention: failed to identify q reshape/add/matmul nodes)r   r   r   r   r   r!   )r   r   r   r   r   r   )r!   r%   z6fuse_conformer_attention: failed to match extra q path)Slicer   r0   r   Padr   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   r   r   z0fuse_conformer_attention: failed to match k pathr   zCfuse_conformer_attention: failed to detect num_heads or hidden_size   zPfuse_conformer_attention: skipping attention_bias %s with dims %s (expected 4-D))
mask_indexq_matmulk_matmulv_matmulq_addk_addv_addr
   r	   first_inputoutput
add_qk_strpast_kpast_v	present_k	present_v)r4   r5   r6   r7   r8   r9   r
   r	   r;   key_padding_maskadd_qkr=   r>   r?   r@   zAfuse_conformer_attention: MultiHeadAttention node creation failedr   T)r   match_parent_pathloggerdebug
get_parentr;   lenr(   nextreversedget_num_heads_and_hidden_sizeinputget_initializerdimslistcreate_attention_nodecreate_multihead_attention_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namenamenodes_to_removeextendpopprune_graph)'r   normalize_nodeinput_name_to_nodesoutput_name_to_node	qkv_nodesreshape_qkvtranspose_qkv
matmul_qkvr>   r@   v_nodesconcat_vconcat_parentadd_vmatmul_v	attn_maskqk_nodeswhere_qk
mask_nodesrB   	matmul_qkq_nodes	reshape_qadd_qmatmul_qextra_q_nodesnemotron_extra_q_nodesr=   r?   k_nodesconcat_kadd_kmatmul_kr
   r	   attention_bias	bias_initnew_nodeuse_packed_attention_ops'                                          r   fusezFusionConformerAttention.fuse   s   JJ00?
	
 

44<I
  QR1:2	"yY[}J]"	**..?

 ?jj229G
 **666
 ?LL!STqzH JJ11(AtDM *I"))!,F"7|q0WR[5H5HE5QW[2;	:://(

 zz33>H
 ::77I&
 #LL!TU#A;#A;55.J
 %&rN11!4	$RL(2,	**..<

 ?jj22@G
 **66= 
 ?"jj::!A$G
 %WXP7PRVW	HwH$OX(7*;XZ^_1ALLbc

44M

 $););~)MRYZ[R\`mnp`qRqLLQR %)ZZ%A%A](&"
 &1 6"	**..L

 ?jj22FG
 **66= 
 ?"jj::!:!G
 %WXqzH JJ11(AtDM"))!,F *I"7|q0WR[5H5HE5QW[2;!%!C!CI!N	;>[A-+	2Ia1OLL^_  aJJ..~>	 S%8A%=LLbY^^$
  NNN1!22 "q!X^^A%66"%" T!" T!	"
 T! 	  #11$!!!#'$NN1-"))!,)##! 2 H& ;;!!!#'"))!,!*%## < H$ LL\]  *6:6J6J$$X]]3##[-$LM##H- 'r{""h.r{""h.r{""h.    ''0##G,##G,  r   )
__name__
__module____qualname____doc__r   intr   r   ry   __classcell__)r   s   @r   r   r      s>    HH H 	H
 &HN r   r   )
loggingfusion_attentionr   r   
onnx_modelr   	getLoggerrz   rD   r    r   r   <module>r      s0   
  ;  			8	$\  \ r   