
     Ng(                         d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ  ee          Z G d de          Zd	S )
    )	getLogger)Tuple)AttentionMaskFusionAttention)AttentionMaskFormat)	NodeProto)	OnnxModelc                   V     e Zd ZdZdededef fdZdedeeef         fdZ	d	 Z
 xZS )
FusionAttentionClipzB
    Fuse Attention subgraph of Clip into one Attention node.
    modelhidden_size	num_headsc                     t          |          }t          j        |_        t	                                          ||||ddg           d S )NFSkipLayerNormalization)use_multi_head_attentionsearch_op_types)r   r   NoMaskmask_formatsuper__init__)selfr   r   r   attention_mask	__class__s        j/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_attention_clip.pyr   zFusionAttentionClip.__init__   s]     'u--%8%?"%*56 	 	
 	
 	
 	
 	
    	reshape_qreturnc                 l   | j                             |dd          }|t          |j                  dk    r| j        | j        fS | j                             |j        d                   }|| j        | j        fS t          |          dk    s|d         dk    r| j        | j        fS |d         }| j                             |j        d                   }|| j        | j        fS t          |          dk    s|d         dk    r| j        | j        fS |d         }||z  }| j        dk    r?|| j        k    r4| j        r-t          	                    d| j         d	| d
           d| _        | j        dk    r?|| j        k    r4| j
        r-t          	                    d| j         d	| d
           d| _
        ||fS )zDetect num_heads and hidden_size for ONNX model from MiDaS
        Args:
            reshape_q (NodeProto): reshape node for q
        Returns:
            Tuple[int, int]: num_heads and hidden_size
        Concat   N      r      z--num_heads is z. Detected value is z. Using detected value.Fz--hidden_size is )r   match_parentleninputr   r   get_constant_valuenum_heads_warningloggerwarninghidden_size_warning)r   r   concatnum_head_valuer   head_size_value	head_sizer   s           r   get_num_heads_and_hidden_sizez1FusionAttentionClip.get_num_heads_and_hidden_size'   s    ((Ha@@>S..!33>4#333 66v|AGG!>4#333~!##~a'8A'='=>4#333"1%	*77QHH">4#3331$$(:a(?(?>4#333#A&	)+>A)t~"="=% /wwwU^wwwxxx).&aK43C$C$C' 1r(8rrkrrr   ,1(+%%r   c                    d }d }dD ]$}| j                             |d|          }||}|}%d }||j        d         }n~dD ]w}d }| j                             |d|          }	| j                             |d|          }
|	|	}n|
|
}|H| j                             |d|d          }|h|j        d         }|} |d S | j                             |g dd	|z
  d d dddg          }|d S |\  }}}}}}| j                             |g d
g d          }|t
                              d           d S |\  }}}}}d }g }d }| j                             |g dg d|          }| j                             |ddgddg          }|+|}t          |          d	k    sJ d	|d         z
  }|\  }}}}}n&||}|\  }}nt
                              d           d S | j                             |g dg d          }|t
                              d           d S |\  }}}} }!}"| j                             |g dg d          }#|#t
                              d           d S |#\  }$}%}}}&}'|"j        d         |k    s"|'j        d         |k    s|j        d         |k    rt
                              d           d S | 	                    |          \  }(})|(dk    s|)dk    rt
                              d           d S |}*|g| j                             |g d|dddddg          }+|+A| j                             |g d|ddddg          }+|+t
                              d           d S | 
                    d |"|'||!|&||(|)||*j        d         d d |d u          },|,d S | j                            |,           | j        | j        |,j        <   | j                            |*|g           d| _        d S ) N)r    r   r   r   )r   r    AddLayerNormalizationF)r2   MatMulReshape	Transposer5   r4   r    )r5   r6   r5   r2   r4   )r    r   r   r   Nz&fuse_attention: failed to match v path)Softmaxr5   r2   r5   r4   )r   r   r   Nr   )return_indicer7   r4   z'fuse_attention: failed to match qk path)r5   r6   r5   Mulr2   r4   )r   r   r   r   NNz&fuse_attention: failed to match q path)r6   r5   r6   r5   r2   r4   )r    r   r   r   r   Nz&fuse_attention: failed to match k pathz>fuse_attention: expect to have same input to q, k and v matmulz9fuse_attention: failed to detect num_heads or hidden_size)r   Expand	Unsqueezer;   WhereLess)r:   r;   r;   r<   r=   z4fuse_attention: failed to match causal mask subgraph)
mask_indexq_matmulk_matmulv_matmulq_addk_addv_addr   r   r&   output
add_qk_strscalecausalT)r   r$   rE   find_first_child_by_typematch_parent_pathr)   debugr%   r&   r0   create_attention_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namenamenodes_to_removeextendprune_graph)-r   normalize_nodeinput_name_to_nodesoutput_name_to_nodeskip_input_indexnode_before_layer_normiparent
root_inputnode_before_layer_norm_1node_before_layer_norm_2child	qkv_nodes_reshape_qkvtranspose_qkv
matmul_qkvv_nodes	reshape_vadd_vmatmul_vadd_maskadd_mask_indicesqk_nodes
qk_nodes_1
qk_nodes_2causal_mask_input_index_softmax_qk	matmul_qkq_nodes_transpose_qr   mul_qadd_qmatmul_qk_nodes_transpose_k
_reshape_kadd_kmatmul_kr   r   attention_last_nodecausal_mask_nodesnew_nodes-                                                r   fusezFusionAttentionClip.fuseU   sb   !% 	0 	0AZ,,^=UWXYYF!#$ )/&
!-/6q9JJ  % %)-&+/:+B+B>SXZ[+\+\(+/:+B+B>Sgij+k+k(+7 .F**-9 .F*)1
;;*,@BUW\  ="\!_
#$ 'J00JJJ!!4q!Q7
 
	
 F<E9A{M1j*..LLLN`N`N`
 
 ?LLABBBF-4*Ay%Z11>>>*	 2 
 

 Z11!F
 


 !!H'((A----&'*:1*=&=#7?4[!Xq))#!H'/$[))LLBCCCF*..RRRTlTlTl
 
 ?LLABBBF?F<L)UE8*..XXXZoZoZo
 
 ?LLABBBF<C9z1a>!
**hnQ.?:.M.MQYQ_`aQbfpQpQpLLYZZZF!%!C!CI!N!N	;>>[A--LLTUUUF) !%
 < <OOO(!Q1a8! !
 !($(J$@$@III,aAq9% %!
 %,LL!WXXXF--#&-a0D( . 
 
  F  ***6:6J$X]3##%8-$HIII  r   )__name__
__module____qualname____doc__r	   intr   r   r   r0   r~   __classcell__)r   s   @r   r   r      s         

 
 	
 
 
 
 
 
$,&y ,&U3PS8_ ,& ,& ,& ,&\l  l  l  l  l  l  l r   r   N)loggingr   typingr   fusion_attentionr   r   fusion_optionsr   onnxr   
onnx_modelr	   r   r)   r    r   r   <module>r      s   
             ; ; ; ; ; ; ; ; . . . . . .                  	8		q  q  q  q  q / q  q  q  q  q r   