o
    ;ήcD-                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ e eZG dd deZG d	d
 d
eZG dd deZdS )    N)AttentionMaskFusionAttention)FusionReshape)numpy_helper)	OnnxModel)BertOnnxModelc                       sB   e Zd ZdZdedededef fddZdd	 Zd
d Z	  Z
S )FusionBartEncoderAttentionz?
    Fuse Bart Attention subgraph into one Attention node.
    modelhidden_size	num_headsattention_maskc                    s   t  |||| d S Nsuper__init__)selfr	   r
   r   r   	__class__ O/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/onnx_model_bart.pyr      s   z#FusionBartEncoderAttention.__init__c                 C   s  | j |dgdg}|d u rdS |d }| j |g dg d}	| j |g dg d}
| j |g dg d}|	d u sD|
d u sD|d u rFdS |	\}}}|
\}}}|\}}}|jd |ksj|jd |ksj|jd |krldS | j |g d	g d}| j |g d	g d
}|d u s|d u rdS |d j|jks|d j|jkrdS | j |g dg d}| j |g dg d}| j |g dg d}|d u s|d u s|d u rdS |d }|d }|d }|jd }|jd |ks|jd |ks|jd |krdS dS )NConcat   Fr   	UnsqueezeGatherShaper   r   r   r   r   r   )   r   r   )r   r   r   )r   r   r   )r   r   MulT)r	   match_parent_pathinputnameoutput)r   reshape_qkv_2reshape_qkv_1reshape_q_2reshape_k_2reshape_v_2
root_inputconcat_qkv_2_pathconcat_qkv_2reshape_qkv_2_path_1reshape_qkv_2_path_2reshape_qkv_2_path_3_gather_1shape_1gather_2shape_2shape_3reshape_qkv_1_path_1reshape_qkv_1_path_2reshape_q_2_pathreshape_k_2_pathreshape_v_2_pathmul_qmul_kmul_vgather_1_outr   r   r   check_runtime_shape_path   s@   	


* 
*z3FusionBartEncoderAttention.check_runtime_shape_pathc           *      C   s  | j |g dg d}|d ur|\}}}}}	}
nd S g }t|jD ]\}}||vr+q"||d jd kr5q"|| q"t|dkrCd S |d }|| }dd |D }|ddkr[d S | j |
g d	g d
}|d u rrt	d d S |\}}}}}| j |
ddgddg}|d ur|\}}nd S | j |g dg d}|d ur|\}}}}}}nd S | j |g dg d}|d ur|\}} }}!}"}#nd S | 
||	|| ||sd S |jd |krb|jd |krd|jd |krfg }$d }%|}&| |\}'}(|'dks|(dks|(|' dkrt	d d S | |%||#|||"||'|(||&jd d })|)d u r)d S | j|) | j| j|)j< | j|&||
g | j| | j| | j| | j| | j|$ d| _d S d S d S d S )N)AddMatMulReshape	TransposerB   rA   )Nr   r   r   r   r   r   r   c                 S   s   g | ]}|j qS r   )op_type).0childr   r   r   
<listcomp>o   s    z3FusionBartEncoderAttention.fuse.<locals>.<listcomp>rA      )rB   rC   rB   r@   rA   )r   r   r   r   Nz&fuse_attention: failed to match v pathSoftmax)rB   rC   rB   r    r@   rA   )r   r   r   r   r   r   )rC   rB   rC   rB   r@   rA   )r   r   r   r   r   r   z9fuse_attention: failed to detect num_heads or hidden_sizeT)r	   r!   	enumerater"   r$   appendlencountloggerdebugr?   get_num_heads_and_hidden_sizecreate_attention_nodenodes_to_addthis_graph_namenode_name_to_graph_namer#   nodes_to_removeextendprune_graph)*r   normalize_nodeinput_name_to_nodesoutput_name_to_node	qkv_nodesadd_out
matmul_outr%   transpose_qkvr&   
matmul_qkvother_inputsir"   r*   childrenchildren_typesv_nodesr)   transpose_vreshape_v_1add_vmatmul_vqk_nodesr0   	matmul_qkq_nodesr'   reshape_q_1add_qmatmul_qk_nodesr(   reshape_k_1add_kmatmul_k
mask_nodes
mask_indexattention_last_noder   r
   new_noder   r   r   fuseP   s   

0"


zFusionBartEncoderAttention.fuse)__name__
__module____qualname____doc__r   intr   r   r?   rw   __classcell__r   r   r   r   r      s    	2r   c                       s*   e Zd Zdef fddZdd Z  ZS )FusionBartReshaper	   c                    s   t  | d S r   r   )r   r	   r   r   r   r      s   zFusionBartReshape.__init__c                 C   s4  |j d |vr	d S ||j d  }|jdkst|j dkrd S | j|g dg d|}|d u r1d S |\}}}g }	| j|j d }
|
dkrJ|	d | j|g dg d|}|d u r| j|j d }| j|j d }| j|j d	 }|d u s|d u s|d u rd S t	|}t	|}t	|}t|dkst|dkst|dkrd S |d d
kr|d dkr|d dksd S |	
| |	
| |	
| | j|ddgddg|}|d u rd S |d
 }|j d }|j d |krd S | |	|| d S |\}}}| j|j d }
|
dkr|	d | j|j d }| j|j d	 }|d u s,|d u r.d S t	|}t	|}t|dksFt|dkrHd S |d dkrV|d dksXd S |	
| |	
| | j|g dg d|}|d u rvd S |d
 }|j d }|j d |ks|j d |krd S | |	|| d S )Nr   r      r   r   r   r   r   rH   r   r@   rA   )r    r@   rA   )r   r   r   )r"   rD   rL   r	   r!   get_constant_valuerK   get_initializerr   to_arrayrV   replace_reshape_node)r   reshape_noderY   rZ   concat_nodepath0r0   gather_0shape_0shapegather_valuepath1input_1_protoinput_2_protoinput_3_protoinput_1input_2input_3	gemm_path
top_matmulr*   r1   r2   r   r   r   rw      s   




$$












 zFusionBartReshape.fuse)rx   ry   rz   r   r   rw   r}   r   r   r   r   r~      s    r~   c                       s,   e Zd Z fddZdd Zdd Z  ZS )BartOnnxModelc                    s>   t  ||| t| | _t| | j| j| j| _t| | _	d S r   )
r   r   r   r   r   r
   r   attention_fusionr~   bart_reshape_fusion_preprocess)r   r	   r   r
   r   r   r   r   0  s   
zBartOnnxModel.__init__c                 C   s   | j   d S r   )r   applyr   r   r   r   fuse_attention6  s   zBartOnnxModel.fuse_attentionc                 C   s   |    | j  d S r   )adjust_reshape_and_expandr   r   r   r   r   r   
preprocess9  s   zBartOnnxModel.preprocess)rx   ry   rz   r   r   r   r}   r   r   r   r   r   /  s    r   )loggingfusion_attentionr   r   fusion_reshaper   onnxr   
onnx_modelr   onnx_model_bertr   	getLoggerrx   rN   r   r~   r   r   r   r   r   <module>   s   
 =c