
    fPiMA                         d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZ  ee          Z G d d	e          ZdS )
    )	getLoggerN)AttentionMask)Fusion)FusionUtilsNumpyHelper)	NodeProtohelper)	OnnxModelc                   V     e Zd Zde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 )
FusionQOrderedAttentionmodelhidden_size	num_headsattention_maskc                 x    || _         || _        || _        t                                          |dd           d S )NQOrderedAttentionQOrderedLayerNormalization)r   r   r   super__init__)selfr   r   r   r   	__class__s        /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_qordered_attention.pyr   z FusionQOrderedAttention.__init__   s@     '", 35QRRRRR    	reshape_qreturnc                    | j                             |j        d                   }|t                              |j        d          d           | j                             |dgdg          }|| j        | j        fS |d         }t          |j	                  dk    r| j        | j        fS |j	        d         j
        }t          j        |          }t          |          dk    s|d         dk    s|d         dk    r,t                              d	| d
           | j        | j        fS |d         }|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 from a reshape node.
        Args:
            reshape_q (NodeProto): reshape node for Q
        Returns:
            Tuple[int, int]: num_heads and hidden_size
           Nz is not initializer.Constantr            zq_shape_value=z7. Expected value are like [0, 0, num_heads, head_size].z--num_heads is z. Detected value is z. Using detected value.Fz--hidden_size is )r   get_initializerinputloggerdebugmatch_parent_pathr   r   len	attributetr   to_arraynum_heads_warningwarninghidden_size_warning)r   r   q_shapeconstant_nodeq_shape_valuer   	head_sizer   s           r   get_num_heads_and_hidden_sizez5FusionQOrderedAttention.get_num_heads_and_hidden_size    s    *,,Y_Q-?@@?LLIOA.DDDEEE !J88ZLSTRUVVM$~t'777 -a 0}.//144>4+;;; (1!46#,W55}""}Q'71'<'<a@PTU@U@ULLp-pppqqq>4#333!!$	!!$	)+>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                 4   | j                             |ddgddg          }|	|d         }nd S | j                             |dgd g          }|t                              d           d S |d         }| j                             |g dg d          }|t                              d	           d S |\  }}	}
}}}}t	          j        || j                   sd S t	          j        || j                   sd S g }t          |j                  D ]7\  }}||vr
||d         j        d         k    r"|	                    |           8t          |          d
k    rd S |d         }| j                             |g dg d          }|t                              d           d S |\  }}}}}}t	          j        || j                   sd S t	          j        || j                   sd S | j                             |dgd
g          }|t                              d           d S |d         }| j                             |j        d                   d S t	          j        || j         d          sd S | j                             |g dg d          }|t                              d           d S |\  }}}}}}} }!t	          j        || j                   sd S t	          j        || j                   sd S t	          j        | | j                   sd S t	          j        || j                   sd S | j                             |!g dg d          }"|"t                              d           d S |"\  }}#}$}%}&}'t	          j        |%| j                   sd S t	          j        |$| j                   sd S | j                             |'dgd
g          }(|(t                              d           d S |(d         }(| j                             |(j        d                   d S t	          j        |(| j         d          sd S | j                             |!g dg d          })|)t                              d           d S |)\  }}}*}+},}-t	          j        |+| j                   sd S t	          j        |*| j                   sd S | j                             |-dgd
g          }.|.t                              d           d S |.d         }.| j                             |.j        d                   d S t	          j        |.| j         d          sd S | j                             |g dg d          }/|/t                              d           d S | j                             |(j        d                   }0| j                             |.j        d                   }1| j                             |j        d                   }2t          j        |0          }3t          j        |1          }4t          j        |2          }5t          j        |3j        d
d                    }6t          j        |4j        d
d                    }7t          j        |5j        d
d                    }8|j        d         |k    r|'j        d         |k    r{|-j        d         |k    rk| j                            |/d         j        d                   }9|                     |#          \  }:};|j        d         g}<|<	                    |j        d
                    |<	                    |$j        d
                    |<	                    |*j        d
                    |<	                    |j        d
                    |<	                    |(j        d                    |<	                    |.j        d                    |<	                    |j        d                    |<	                    |(j        d
                    |<	                    |.j        d
                    |<	                    |j        d
                    | j                             |&j        d                   r!|<	                    |&j        d                    n |<	                    |&j        d
                    | j                             |,j        d                   r!|<	                    |,j        d                    n |<	                    |,j        d
                    | j                             |j        d                   r!|<	                    |j        d                    n |<	                    |j        d
                    |<	                    | j        d
                    |<	                    |j        d
                    |<	                    |j        d
                    |9|<	                    |9           n|<	                    d           | j                             |(j        d                   }=t	          j        |=           | j                             |.j        d                   }>t	          j        |>           | j                             |j        d                   }?t	          j        |?           | j                             d          }@t/          j        d|<|
j        d         g|@          }A| j                             ||j        d         |Aj        d                    | j                             |	|	j        d         |j        d                    |Aj                            t/          j        d|:          g           |Aj                            t/          j        dd
          g           |Aj                            t/          j        dd          g           |Aj                            t/          j        dd
          g           |Aj                            t/          j        d|6|7|8g          g           d |A_        | j        	                    |A           | j        | j         |Aj!        <   | j"                            |
|||g           | j"                            |           | j"                            |"           | j"                            |)           | j"                            |           | j"                            |(|.|g           d!| _#        d S d S d S d S )"NQuantizeLinearAddr   DequantizeLinearz=fuse_qordered_attention: failed to match input qdq nodes path)r5   MatMulReshape	Transposer7   r4   r8   )NNr   r   r   r   r   z1fuse_qordered_attention: failed to match qkv pathr   )r:   r9   r7   r4   r5   r8   )r   r   r   r   r   Nz/fuse_qordered_attention: failed to match v pathF)r7   r4   Softmaxr5   Divr7   r4   r8   )r   r   r   r   Nr   r   r   z0fuse_qordered_attention: failed to match qk path)r   r   r   r   r   Nz/fuse_qordered_attention: failed to match q pathz/fuse_qordered_attention: failed to match k path)MulSubCast	Unsqueezer@   )Nr   r   r   r   z8fuse_qordered_attention: failed to match mask_nodes path r   )inputsoutputsnamer   order_inputorder_weightorder_outputqkv_hidden_sizeszcom.microsoftT)$r   r&   r$   r%   r   check_qdq_node_for_fusion	enumerater#   outputappendr'   get_constant_valuer"   r   r*   npprodshaper   process_maskr2   transpose_2d_int8_tensorcreate_node_namer	   	make_nodereplace_node_inputr(   extendmake_attributedomainnodes_to_addthis_graph_namenode_name_to_graph_namerD   nodes_to_removeprune_graph)Br   normalize_nodeinput_name_to_nodesoutput_name_to_nodeadd_before_layernorm
start_nodedequantize_input	qkv_nodes_projection_matmulreshape_qkvtranspose_qkvdequantize_qkvquantize_qkv
matmul_qkvother_inputs_ir#   
root_inputv_nodesdequantize_v
quantize_vadd_vmatmul_vdequantize_v_matmul_weightqk_nodesdequantize_qk_softmaxquantize_qk_softmax
softmax_qkadd_qkdiv_qkdequantize_qkquantize_qk	matmul_qkq_nodesr   dequantize_q
quantize_qadd_qmatmul_qdequantize_q_matmul_weightk_nodesdequantize_k
quantize_kadd_kmatmul_kdequantize_k_matmul_weight
mask_nodesq_weightk_weightv_weightqwkwvwqw_out_sizekw_out_sizevw_out_size
mask_indexr   r   attention_inputsq_weight_tensork_weight_tensorv_weight_tensorattention_node_nameattention_nodesB                                                                     r   fusezFusionQOrderedAttention.fuseS   s   #z;;u%F 
  
  +-b1JJF  :77 F
 
 #LLXYYYF+B/ J00eee'''
 
	 LLLMMMFgpd{M><Yc 4\4:NN 	F4^TZPP 	F ":#344 	' 	'IB///	!+A...&&&&|!!F!!_
 *..[[[!!!
 
 ?LLJKKKF<C9A|Z 4ZLL 	F4\4:NN 	F &*Z%A%A(M_L`cdbe%f%f"%-LLJKKKF%?%B":(()C)I!)LMMUF 45OQUQ[]bcc 	F ://	 	 	 (''
 
 LLKLLLF 		
! 45H$*UU 	F45JDJWW 	F4[$*MM 	F4]DJOO 	F *..[[[!!!
 
 ?LLJKKKFDKAI|Z 4ZLL 	F4\4:NN 	F &*Z%A%A(M_L`cdbe%f%f"%-LLJKKKF%?%B":(()C)I!)LMMUF 45OQUQ[]bcc 	F *..[[[!!!
 
 ?LLJKKKF<C9A|Z 4ZLL 	F4\4:NN 	F &*Z%A%A(M_L`cdbe%f%f"%-LLJKKKF%?%B":(()C)I!)LMMUF 45OQUQ[]bcc 	F Z11DDDFXFXFX
 

 LLSTTTF :--.H.Nq.QRR:--.H.Nq.QRR:--.H.Nq.QRR!(++!(++!(++gbhqrrl++gbhqrrl++gbhqrrl++ >!
**x~a/@J/N/NS[SabcSdhrSrSr,99*R.:Nq:QRRJ &*%G%G	%R%R"I{ !1 6q 9:##$4$:1$=>>>##L$6q$9:::##L$6q$9:::##L$6q$9:::##$>$DQ$GHHH##$>$DQ$GHHH##$>$DQ$GHHH##$>$DQ$GHHH##$>$DQ$GHHH##$>$DQ$GHHHz))%+a.99 8 ''A7777 ''A777z))%+a.99 8 ''A7777 ''A777z))%+a.99 8 ''A7777 ''A777##K$5a$8999##$7$=a$@AAA##N$8$;<<< % ''
3333 ''+++ #j889S9YZ[9\]]O0AAA"j889S9YZ[9\]]O0AAA"j889S9YZ[9\]]O0AAA #'*"="=>Q"R"R#-#'$+A./(	  N J))..:Nq:QSaShijSklllJ))*;=N=TUV=WYgYnopYqrrr$++V-B;PY-Z-Z,[\\\$++V-B=RS-T-T,UVVV$++V-B>ST-U-U,VWWW$++V-B>ST-U-U,VWWW$++&'9KVa;bccd   %4N!$$^444@D@TD()<= ''m\S](^___ ''111 ''000 ''000 ''000 ''+-GIcd    $DE +*/N/NSrSrr   )__name__
__module____qualname__r
   intr   r   r   tupler2   r   __classcell__)r   s   @r   r   r      s        SS S 	S
 &S S S S S S1&y 1&U3PS8_ 1& 1& 1& 1&fQ$ Q$ Q$ Q$ Q$ Q$ Q$r   r   )loggingr   numpyrN   fusion_attentionr   fusion_baser   fusion_utilsr   r   onnxr   r	   
onnx_modelr
   r   r$   r    r   r   <module>r      s              * * * * * *       1 1 1 1 1 1 1 1 " " " " " " " "            	8		R$ R$ R$ R$ R$f R$ R$ R$ R$ R$r   