o
    ٷi
                      @   sB   d dl Z d dlmZmZ d dlmZ e eZG dd deZ	dS )    N)AttentionMaskFusionAttention)	OnnxModelc                       s:   e Zd ZdZdedededef fddZdd	 Z  Z	S )
FusionConformerAttentionzM
    Fuse Conformer Attention subgraph into one MultiHeadAttention node.
    modelhidden_size	num_headsattention_maskc                    s   t  |||| d S )N)super__init__)selfr   r   r   r	   	__class__ g/home/ubuntu/.local/lib/python3.10/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr      s   z!FusionConformerAttention.__init__c           $      C   s  | j |g dg d}|d u rtd d S |d |d |d }}}d\}}	| j |g dg d	}
|
d u rQ| j |g d
g d}
|
d u rPtd d S n|
d }| j |dd }|jd }	|jd }|
d |
d }}d}| j |g dg d}|d u r| j |g dg d}|d u rtd d S |d }| j |g dg d}|d ur|d jd }|d |d }}| j |g dg d}|d u r| j |g dg d}|d u rtd d S |d |d |d }}}| j |g dg d}|d ur|d |d krtd d S d\}}| j |g dg d}|d u rR| j |g d g d!}|d u rQ| j |g d
g d}|d u rQtd" d S n|d# }| j |dd }|jd }|jd }|d |d }}| |\} }!| dks|!dks|!|  dkrtd$ d S d }"|jd |jd ko|jd |jd ko|d u }#|#r| jd9i d%|d&|d'|d(|d)|d*|d+|d,| d-|!d.|jd d/|jd d0|jd# d1|d2|d3|d4|	}"n| j	||||||| |!|jd ||jd# ||||	d5}"|"d u rtd6 d S | j
|" | j| j|"j< | j|||g | j| |#sX|d jd7kr@|  |d jd7krL|  |
d jd7krX|
  |d u rc| j| | j| | j|
 d8| _d S ):N)AddMatMulReshape	Transposer   )   Nr   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   z0fuse_conformer_attention: failed to match v pathr   r   )Softmaxr   r   )r   r   r   )Wherer   r   r   r   )r      r   r   r   z1fuse_conformer_attention: failed to match qk pathr   )Equal	UnsqueezeCast)Divr   r   r   r   )r   r   r   r   r   )Mulr   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   z6fuse_conformer_attention: failed to match extra q path)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
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)r$   r%   r&   r'   r(   r)   r   r   r+   key_padding_maskadd_qkr-   r.   r/   r0   zAfuse_conformer_attention: MultiHeadAttention node creation failedr   Tr   )r   match_parent_pathloggerdebug
get_parentr+   get_num_heads_and_hidden_sizeinputcreate_attention_nodecreate_multihead_attention_node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_qkvr.   r0   v_nodesconcat_vconcat_parentadd_vmatmul_v	attn_maskqk_nodeswhere_qk
mask_nodesr2   	matmul_qkq_nodes	reshape_qadd_qmatmul_qextra_q_nodesr-   r/   k_nodesconcat_kadd_kmatmul_kr   r   new_nodeuse_packed_attention_opr   r   r   fuse   sj  












"
2
	







zFusionConformerAttention.fuse)
__name__
__module____qualname____doc__r   intr   r   ra   __classcell__r   r   r   r   r      s    	r   )
loggingfusion_attentionr   r   
onnx_modelr   	getLoggerrb   r4   r   r   r   r   r   <module>   s
   
