Ë
    cQêjMA  ã                   ó‚   — 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y)
é    )Ú	getLoggerN)ÚAttentionMask)ÚFusion)ÚFusionUtilsÚNumpyHelper)Ú	NodeProtoÚhelper)Ú	OnnxModelc                   óP   ‡ — 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                 óR   •— || _         || _        || _        t        ‰| �  |dd«       y )NÚQOrderedAttentionÚQOrderedLayerNormalization)r   r   r   ÚsuperÚ__init__)Úselfr   r   r   r   Ú	__class__s        €úw/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_qordered_attention.pyr   z FusionQOrderedAttention.__init__   s/   ø€ ð 'ˆÔØ"ˆŒØ,ˆÔä‰Ñ˜Ð 3Ð5QÕRó    Ú	reshape_qÚreturnc                 óø  — | j                   j                  |j                  d   «      }|€¬t        j	                  |j                  d   › d�«       | j                   j                  |dgdg«      }|€| j                  | j                  fS |d   }t        |j                  «      dk7  r| j                  | j                  fS |j                  d   j                  }t        j                  |«      }t        |«      dk7  s|d   dk  s|d   dk  r1t        j	                  d|› d	�«       | j                  | j                  fS |d   }|d   }||z  }| j                  dkD  rH|| j                  k7  r9| j                  r-t        j                  d
| j                  › d|› d�«       d| _        | j                  dkD  rH|| j                  k7  r9| j                  r-t        j                  d| j                  › d|› d�«       d| _        ||fS )zÊDetect 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
        é   z 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Ñ-?Ó@ˆØˆ?Ü�L‰L˜IŸO™O¨AÑ.Ð/Ð/CÐDÔEð !ŸJ™J×8Ñ8¸ÀZÀLÐSTÐRUÓVˆMàÐ$Ø—~‘~ t×'7Ñ'7Ð7Ð7à -¨aÑ 0�ä�}×.Ñ.Ó/°1Ò4ØŸ>™>¨4×+;Ñ+;Ð;Ð;ð (×1Ñ1°!Ñ4×6Ñ6�ä#×,Ñ,¨WÓ5ˆÜˆ}Ó Ò" }°QÑ'7¸1Ò'<ÀÈaÑ@PÐTUÒ@UÜ�L‰L˜>¨-¨Ð8oÐpÔqØ—>‘> 4×#3Ñ#3Ð3Ð3à! !Ñ$ˆ	Ø! !Ñ$ˆ	Ø )Ñ+ˆà�>‰>˜AÒ )¨t¯~©~Ò"=Ø×%Ò%Ü—‘ °·±Ð0@Ð@TÐU^ÐT_Ð_vÐwÔxØ).�Ô&à×Ñ˜aÒ K°4×3CÑ3CÒ$CØ×'Ò'Ü—‘Ø'¨×(8Ñ(8Ð'9Ð9MÈkÈ]ÐZqÐrôð ,1�Ô(à˜+Ð%Ð%r   c                 ó~  — | j                   j                  |ddgddg«      }|�|d   }ny | j                   j                  |dgd g«      }|€t        j                  d«       y |d   }| j                   j                  |g d¢g d¢«      }|€t        j                  d	«       y |\  }}	}
}}}}t	        j
                  || j                   «      sy t	        j
                  || j                   «      sy g }t        |j                  «      D ]1  \  }}||vrŒ||d   j                  d   k(  rŒ!|j                  |«       Œ3 t        |«      d
k7  ry |d   }| j                   j                  |g d¢g d¢«      }|€t        j                  d«       y |\  }}}}}}t	        j
                  || j                   «      sy t	        j
                  || j                   «      sy | j                   j                  |dgd
g«      }|€t        j                  d«       y |d   }| j                   j                  |j                  d   «      €y t	        j
                  || j                   d«      sy | j                   j                  |g d¢g d¢«      }|€t        j                  d«       y |\  }}}}}}} }!t	        j
                  || j                   «      sy t	        j
                  || j                   «      sy t	        j
                  | | j                   «      sy t	        j
                  || j                   «      sy | j                   j                  |!g d¢g d¢«      }"|"€t        j                  d«       y |"\  }}#}$}%}&}'t	        j
                  |%| j                   «      sy t	        j
                  |$| j                   «      sy | j                   j                  |'dgd
g«      }(|(€t        j                  d«       y |(d   }(| j                   j                  |(j                  d   «      €y t	        j
                  |(| j                   d«      sy | j                   j                  |!g d¢g d¢«      })|)€t        j                  d«       y |)\  }}}*}+},}-t	        j
                  |+| j                   «      sy t	        j
                  |*| j                   «      sy | j                   j                  |-dgd
g«      }.|.€t        j                  d«       y |.d   }.| j                   j                  |.j                  d   «      €y t	        j
                  |.| j                   d«      sy | j                   j                  |g d¢g d¢«      }/|/€t        j                  d«       y | j                   j                  |(j                  d   «      }0| j                   j                  |.j                  d   «      }1| j                   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(  �ry| j$                  j'                  |/d   j                  d   «      }9| j)                  |#«      \  }:};|j                  d   g}<|<j                  |j                  d
   «       |<j                  |$j                  d
   «       |<j                  |*j                  d
   «       |<j                  |j                  d
   «       |<j                  |(j                  d   «       |<j                  |.j                  d   «       |<j                  |j                  d   «       |<j                  |(j                  d
   «       |<j                  |.j                  d
   «       |<j                  |j                  d
   «       | j                   j                  |&j                  d   «      r|<j                  |&j                  d   «       n|<j                  |&j                  d
   «       | j                   j                  |,j                  d   «      r|<j                  |,j                  d   «       n|<j                  |,j                  d
   «       | j                   j                  |j                  d   «      r|<j                  |j                  d   «       n|<j                  |j                  d
   «       |<j                  | j                  d
   «       |<j                  |j                  d
   «       |<j                  |j                  d
   «       |9�|<j                  |9«       n|<j                  d«       | j                   j                  |(j                  d   «      }=t	        j*                  |=«       | j                   j                  |.j                  d   «      }>t	        j*                  |>«       | j                   j                  |j                  d   «      }?t	        j*                  |?«       | j                   j-                  d«      }@t/        j0                  d|<|
j                  d   g|@¬«      }A| j                   j3                  ||j                  d   |Aj                  d   «       | j                   j3                  |	|	j                  d   |j                  d   «       |Aj4                  j7                  t/        j8                  d|:«      g«       |Aj4                  j7                  t/        j8                  dd
«      g«       |Aj4                  j7                  t/        j8                  dd«      g«       |Aj4                  j7                  t/        j8                  dd
«      g«       |Aj4                  j7                  t/        j8                  d|6|7|8g«      g«       d |A_        | j<                  j                  |A«       | j>                  | j@                  |AjB                  <   | jD                  j7                  |
|||g«       | jD                  j7                  |«       | jD                  j7                  |"«       | jD                  j7                  |)«       | jD                  j7                  |«       | jD                  j7                  |(|.|g«       d!| _#        y y y y )"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™z×;Ñ;ØØ˜uÐ%Ø�ˆFó 
Ðð  Ð+Ø-¨bÑ1‰Jàð  Ÿ:™:×7Ñ7ØØÐ ØˆFó
Ðð Ð#Ü�L‰LÐXÔYØà+¨BÑ/Ðð —J‘J×0Ñ0ØÚeÚ'ó
ˆ	ð ÐÜ�L‰LÐLÔMØàgpÑdˆÐ˜{¨M¸>È<ÐYcô ×4Ñ4°\À4Ç:Á:ÔNØä×4Ñ4°^ÀTÇZÁZÔPØð ˆÜ" :×#3Ñ#3Ó4ò 	'‰IˆB�ØÐ/Ñ/Øà˜	 !™×+Ñ+¨AÑ.Ò.Øà×Ñ Õ&ð	'ô ˆ|Ó Ò!Øà! !‘_ˆ
ð —*‘*×.Ñ.ØÚ[Ú!ó
ˆð ˆ?Ü�L‰LÐJÔKØà<CÑ9ˆˆAˆ|˜Z¨°ô ×4Ñ4°ZÀÇÁÔLØä×4Ñ4°\À4Ç:Á:ÔNØð &*§Z¡Z×%AÑ%AÀ(ÐM_ÐL`ÐcdÐbeÓ%fÐ"à%Ð-Ü�L‰LÐJÔKØà%?ÀÑ%BÐ"à�:‰:×(Ñ(Ð)C×)IÑ)IÈ!Ñ)LÓMÐUØô ×4Ñ4Ð5OÐQU×Q[ÑQ[Ð]bÔcØð —:‘:×/Ñ/Øò	ò (ó
ˆð ÐÜ�L‰LÐKÔLØð ñ		
Ø!ØØØØØØØô ×4Ñ4Ð5HÈ$Ï*É*ÔUØä×4Ñ4Ð5JÈDÏJÉJÔWØä×4Ñ4°[À$Ç*Á*ÔMØä×4Ñ4°]ÀDÇJÁJÔOØð —*‘*×.Ñ.ØÚ[Ú!ó
ˆð ˆ?Ü�L‰LÐJÔKØàDKÑAˆˆI�| Z°¸ô ×4Ñ4°ZÀÇÁÔLØä×4Ñ4°\À4Ç:Á:ÔNØð &*§Z¡Z×%AÑ%AÀ(ÐM_ÐL`ÐcdÐbeÓ%fÐ"à%Ð-Ü�L‰LÐJÔKØà%?ÀÑ%BÐ"à�:‰:×(Ñ(Ð)C×)IÑ)IÈ!Ñ)LÓMÐUØô ×4Ñ4Ð5OÐQU×Q[ÑQ[Ð]bÔcØð —*‘*×.Ñ.ØÚ[Ú!ó
ˆð ˆ?Ü�L‰LÐJÔKØà<CÑ9ˆˆAˆ|˜Z¨°ô ×4Ñ4°ZÀÇÁÔLØä×4Ñ4°\À4Ç:Á:ÔNØð &*§Z¡Z×%AÑ%AÀ(ÐM_ÐL`ÐcdÐbeÓ%fÐ"à%Ð-Ü�L‰LÐJÔKØà%?ÀÑ%BÐ"à�:‰:×(Ñ(Ð)C×)IÑ)IÈ!Ñ)LÓMÐUØô ×4Ñ4Ð5OÐQU×Q[ÑQ[Ð]bÔcØð —Z‘Z×1Ñ1ØÒDÒFXó
ˆ
ð ÐÜ�L‰LÐSÔTØð —:‘:×-Ñ-Ð.H×.NÑ.NÈqÑ.QÓRˆØ—:‘:×-Ñ-Ð.H×.NÑ.NÈqÑ.QÓRˆØ—:‘:×-Ñ-Ð.H×.NÑ.NÈqÑ.QÓRˆä×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆä—g‘g˜bŸh™h q r˜lÓ+ˆÜ—g‘g˜bŸh™h q r˜lÓ+ˆÜ—g‘g˜bŸh™h q r˜lÓ+ˆð �>‰>˜!Ñ 
Ó*¨x¯~©~¸aÑ/@ÀJÓ/NÐS[×SaÑSaÐbcÑSdÐhrÓSrØ×,Ñ,×9Ñ9¸*ÀR¹.×:NÑ:NÈqÑ:QÓRˆJð &*×%GÑ%GÈ	Ó%RÑ"ˆI�{ð !1× 6Ñ 6°qÑ 9Ð:ÐØ×#Ñ#Ð$4×$:Ñ$:¸1Ñ$=Ô>à×#Ñ# L×$6Ñ$6°qÑ$9Ô:Ø×#Ñ# L×$6Ñ$6°qÑ$9Ô:Ø×#Ñ# L×$6Ñ$6°qÑ$9Ô:à×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHØ×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHØ×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHà×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHØ×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHØ×#Ñ#Ð$>×$DÑ$DÀQÑ$GÔHà�z‰z×)Ñ)¨%¯+©+°a©.Ô9Ø ×'Ñ'¨¯©°A©Õ7à ×'Ñ'¨¯©°A©Ô7à�z‰z×)Ñ)¨%¯+©+°a©.Ô9Ø ×'Ñ'¨¯©°A©Õ7à ×'Ñ'¨¯©°A©Ô7à�z‰z×)Ñ)¨%¯+©+°a©.Ô9Ø ×'Ñ'¨¯©°A©Õ7à ×'Ñ'¨¯©°A©Ô7à×#Ñ# K×$5Ñ$5°aÑ$8Ô9Ø×#Ñ#Ð$7×$=Ñ$=¸aÑ$@ÔAØ×#Ñ# N×$8Ñ$8¸Ñ$;Ô<ð Ð%Ø ×'Ñ'¨
Õ3à ×'Ñ'¨Ô+ð #Ÿj™j×8Ñ8Ð9S×9YÑ9YÐZ[Ñ9\Ó]ˆOÜ×0Ñ0°ÔAà"Ÿj™j×8Ñ8Ð9S×9YÑ9YÐZ[Ñ9\Ó]ˆOÜ×0Ñ0°ÔAà"Ÿj™j×8Ñ8Ð9S×9YÑ9YÐZ[Ñ9\Ó]ˆOÜ×0Ñ0°ÔAð #'§*¡*×"=Ñ"=Ð>QÓ"RÐä#×-Ñ-Ø#Ø'Ø$×+Ñ+¨AÑ.Ð/Ø(ô	ˆNð �J‰J×)Ñ)¨.¸.×:NÑ:NÈqÑ:QÐSa×ShÑShÐijÑSkÔlØ�J‰J×)Ñ)Ð*;Ð=N×=TÑ=TÐUVÑ=WÐYg×YnÑYnÐopÑYqÔrà×$Ñ$×+Ñ+¬V×-BÑ-BÀ;ÐPYÓ-ZÐ,[Ô\Ø×$Ñ$×+Ñ+¬V×-BÑ-BÀ=ÐRSÓ-TÐ,UÔVØ×$Ñ$×+Ñ+¬V×-BÑ-BÀ>ÐSTÓ-UÐ,VÔWØ×$Ñ$×+Ñ+¬V×-BÑ-BÀ>ÐSTÓ-UÐ,VÔWØ×$Ñ$×+Ñ+Ü×&Ñ&Ð'9¸KÈÐVaÐ;bÓcÐdôð %4ˆNÔ!à×Ñ×$Ñ$ ^Ô4Ø@D×@TÑ@TˆD×(Ñ(¨×)<Ñ)<Ñ=à× Ñ ×'Ñ'¨°mÀ\ÐS]Ð(^Ô_Ø× Ñ ×'Ñ'¨Ô1Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'¨Ô0Ø× Ñ ×'Ñ'Ø+Ð-GÐIcÐdôð  $ˆDÕðE TsÐ/NÐ*r   )Ú__name__Ú
__module__Ú__qualname__r
   Úintr   r   r   Útupler2   r›   Ú__classcell__)r   s   @r   r   r      sV   ø„ ðSàðSð ðSð ð	Sð
 &õSð1&°yð 1&ÀUÈ3ÐPSÈ8Á_ó 1&öfQ$r   r   )Úloggingr   ÚnumpyrN   Úfusion_attentionr   Úfusion_baser   Úfusion_utilsr   r   Úonnxr   r	   Ú
onnx_modelr
   rœ   r$   r   © r   r   ú<module>rª      s4   ðõ ã Ý *Ý ß 1ß "Ý  á	�8Ó	€ôR$˜fõ R$r   