
    g                     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        h/var/www/openai/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      }|	|\  }}}}}nt        j                  d       y | j                   j                  |g dg d      }	d }
|	D|	\  }}}}
}| j                   j	                  |dd       }|j
                  d   }|j
                  d   }nt        j                  d       y | j                   j                  |g dg d	      }||\  }}}nt        j                  d
       y | j                   j                  |g dg d      }|	|\  }}}}}nt        j                  d       y | j                   j                  |g dg d      }d }|E|\  }}}}}}| j                   j	                  |dd       }|j
                  d   }|j
                  d   }nt        j                  d       y |}| j                  |      \  }}|dk  s|dk  s||z  dk7  rt        j                  d       y | j                  ||||||
|||j
                  d   |j                  d   ||||      } | t        j                  d       y | j                  j                  |        | j                  | j                  | j                  <   | j                  j                  |||g       | j                  j                  |       |d   j                   dk(  r|j#                          |d   j                   dk(  r|j#                          |	d   j                   dk(  r|	j#                          | j                  j                  |       | j                  j                  |	       d| _        y )N)AddMatMulReshape	Transposer   )   r   r   r   r   z2fuse_conformer_attention: failed to match qkv path)Concatr   r   r   r   )r   r   r   r   r   r   z0fuse_conformer_attention: failed to match v path)Softmaxr   r   )r   r   r   z1fuse_conformer_attention: failed to match qk path)Divr   r   r   r   )r   r   r   r   r   z0fuse_conformer_attention: failed to match q path)r   r   r   r   r   r   )r   r   r   r   r   r   z0fuse_conformer_attention: failed to match k pathzCfuse_conformer_attention: failed to detect num_heads or hidden_sizer   )add_qkpast_kpast_v	present_k	present_vzAfuse_conformer_attention: MultiHeadAttention node creation failedr   T)r   match_parent_pathloggerdebug
get_parentoutputget_num_heads_and_hidden_sizecreate_multihead_attention_nodeinputnodes_to_addappendthis_graph_namenode_name_to_graph_namenamenodes_to_removeextendop_typepopprune_graph)!r   normalize_nodeinput_name_to_nodesoutput_name_to_node	qkv_nodes_reshape_qkvtranspose_qkv
matmul_qkvv_nodesadd_vconcat_vmatmul_vconcat_parentr    r   qk_nodesr   	matmul_qkq_nodes	reshape_qadd_qmatmul_qk_nodesmatmul_kconcat_kadd_kr   r   attention_last_noder
   r	   new_nodes!                                    r   fusezFusionConformerAttention.fuse   sg   JJ00?
	
    LLMN**..?
 07-Xq!UH JJ11(AtDM *I"))!,FLLKL:://
<XZcd#+ AvyLLLM**..<

 /6,Aq)UHLLKL**..L
 18.AxAuh JJ11(AtDM"))!,F *ILLKL)!%!C!CI!N	;>[A-+	2Ia1OLL^_77&&q)<<? 8 
" LL\]  *6:6J6J$$X]]3##%8-$TU##H- 2;(*KKM2;(*KKM2;(*KKM##G,##G,  r   )
__name__
__module____qualname____doc__r   intr   r   rM   __classcell__)r   s   @r   r   r      s>    HH H 	H
 &Ht r   r   )
loggingfusion_attentionr   r   
onnx_modelr   	getLoggerrN   r#   r    r   r   <module>rY      s0   
  ;  			8	$B  B r   