Ë
    cQêj¹-  ã                   ób   — d dl Z d dlmZmZ d dlmZ  e j                  e«      Z G d„ de«      Z	y)é    N)ÚAttentionMaskÚFusionAttention)Ú	OnnxModelc                   ó:   ‡ — e Zd ZdZdedededefˆ fd„Zd„ Zˆ xZ	S )ÚFusionConformerAttentionzM
    Fuse Conformer Attention subgraph into one MultiHeadAttention node.
    ÚmodelÚhidden_sizeÚ	num_headsÚattention_maskc                 ó*   •— t         ‰| �  ||||«       y )N)ÚsuperÚ__init__)Úselfr   r	   r
   r   Ú	__class__s        €úx/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_conformer_attention.pyr   z!FusionConformerAttention.__init__   s   ø€ ô 	‰Ñ˜ ¨Y¸ÕGó    c                 óú  — | j                   j                  |g d¢g d¢«      }|€9| j                   j                  |g d¢g d¢«      }|€t        j                  d«       y |d   |d   |d   }}}d	\  }}	| j                   j                  |g d
¢g d¢«      }
|
€\| j                   j                  |g d¢g d¢«      }
|
€y| j                   j                  |g d¢g d¢«      }
|
€Vt        j                  d«       y |
d   }| j                   j	                  |dd «      }|j
                  d   }	|j
                  d   }t        |
«      dk\  r|
d   j                  dk(  r|
d   nd }|
d   }d}| j                   j                  |g d¢g d¢«      }d }|€g| j                   j                  |g d¢g d¢«      }|€?| j                   j                  |g d¢g d¢«      }|€t        j                  d«       y |d   }n|d   }|�5| j                   j                  |g d¢g d¢«      }|�|d   j
                  d   }|d   |d   }}| j                   j                  |g d¢g d¢«      }|€| j                   j                  |g d¢g d¢«      }|€\| j                   j                  |g d ¢g d!¢«      }|€9| j                   j                  |g d ¢g d"¢«      }|€t        j                  d#«       y t        d$„ |D «       d «      }t        d%„ |D «       d «      }t        d&„ t        |«      D «       d «      }|�|�|€t        j                  d'«       y | j                   j                  |g d(¢g d)¢«      }|�2|d   j                  d*v r!|d   |d   k7  rt        j                  d+«       y |€%| j                   j                  |g d,¢g d-¢«      }|�|}d	\  }}| j                   j                  |g d.¢g d/¢«      }|€| j                   j                  |g d0¢g d1¢«      }|€œ| j                   j                  |g d¢g d¢«      }|€y| j                   j                  |g d¢g d¢«      }|€Vt        j                  d2«       y |d3   }| j                   j	                  |dd «      }|j
                  d   }|j
                  d   }t        |«      dk\  r|d   j                  dk(  r|d   nd }|d   } | j                  |«      \  }!}"|!dk  s|"dk  s|"|!z  dk7  rt        j                  d4«       y |j                  d3   }#| j                   j                  |#«      }$|$�Dt        |$j                  «      d5k7  r,t        j                  d6|#t        |$j                  «      «       d}#d }%|j                  d   | j                  d   k(  xr7 | j                  d   |j                  d   k(  xr |d u xr |d uxr
 |d uxr |d u}&|&r<| j                  ||| |||||!|"|j                  d   |j
                  d   |#||||	¬7«      }%n-| j!                  || |||||!|"|j
                  d   ||#||||	¬8«      }%|%€t        j                  d9«       y | j"                  j%                  |%«       | j&                  | j(                  |%j*                  <   | j,                  j/                  |||g«       | j,                  j/                  |«       |&sf|d   j                  d:k(  r|j1                  «        |d   j                  d:k(  r|j1                  «        |
d   j                  d:k(  r|
j1                  «        |€| j,                  j/                  |«       | j,                  j/                  |«       | j,                  j/                  |
«       d;| _        y )<N)ÚAddÚMatMulÚReshapeÚ	Transposer   )é   Nr   r   r   )r   r   r   r   )r   r   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   r   r   z0fuse_conformer_attention: failed to match v pathr   é   r   r   )ÚSoftmaxr   r   )r   r   r   )ÚWherer   r    r   r   )r   r   r   r   r   )r    r   r    ÚDivr   r   )r   r   r   r   r   r   z1fuse_conformer_attention: failed to match qk path)ÚEqualÚ	UnsqueezeÚCast)r!   r   r   r   r   )r   r   r   r   r   )ÚMulr   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 q pathc              3   ó@   K  — | ]  }|j                   d k(  sŒ|–— Œ y­w)r   N©Úop_type©Ú.0Únodes     r   ú	<genexpr>z0FusionConformerAttention.fuse.<locals>.<genexpr>Œ   s   è ø€ ÒP 4°d·l±lÀiÓ6Oœ$ÑPùó   ‚—c              3   ó@   K  — | ]  }|j                   d k(  sŒ|–— Œ y­w)r   Nr'   r)   s     r   r,   z0FusionConformerAttention.fuse.<locals>.<genexpr>�   s   è ø€ ÒH˜t°$·,±,À%Ó2G”dÑHùr-   c              3   ó@   K  — | ]  }|j                   d k(  sŒ|–— Œ y­w)r   Nr'   r)   s     r   r,   z0FusionConformerAttention.fuse.<locals>.<genexpr>Ž   s   è ø€ ÒX $¸t¿|¹|ÈxÓ?WœÑXùr-   zGfuse_conformer_attention: failed to identify q reshape/add/matmul nodes)r   r   r   r   r   r!   )r   r   r   r   r   r   )r!   r%   z6fuse_conformer_attention: failed to match extra q path)ÚSlicer   r0   r   ÚPadr   r   r   )r   r   r   r   r   r   r   r   )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é   zPfuse_conformer_attention: skipping attention_bias %s with dims %s (expected 4-D))Ú
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)r4   r5   r6   r7   r8   r9   r
   r	   r;   Úkey_padding_maskÚadd_qkr=   r>   r?   r@   zAfuse_conformer_attention: MultiHeadAttention node creation failedr   T)r   Úmatch_parent_pathÚloggerÚdebugÚ
get_parentr;   Úlenr(   ÚnextÚreversedÚget_num_heads_and_hidden_sizeÚinputÚget_initializerÚdimsÚlistÚcreate_attention_nodeÚcreate_multihead_attention_nodeÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_nameÚnameÚnodes_to_removeÚextendÚpopÚprune_graph)'r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚ	qkv_nodesÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvr>   r@   Úv_nodesÚconcat_vÚconcat_parentÚadd_vÚmatmul_vÚ	attn_maskÚqk_nodesÚwhere_qkÚ
mask_nodesrB   Ú	matmul_qkÚq_nodesÚ	reshape_qÚadd_qÚmatmul_qÚextra_q_nodesÚnemotron_extra_q_nodesr=   r?   Úk_nodesÚconcat_kÚadd_kÚmatmul_kr
   r	   Úattention_biasÚ	bias_initÚnew_nodeÚuse_packed_attention_ops'                                          r   ÚfusezFusionConformerAttention.fuse   sÙ  € à—J‘J×0Ñ0ØÚ?Úó
ˆ	ð
 ÐØŸ
™
×4Ñ4ØÚ<ÚóˆIð
 Ð Ü—‘ÐQÔRØà1:¸2±À	È"ÁÈyÐY[É} J�]ˆà"Ñˆ�	Ø—*‘*×.Ñ.ØÚ?Úó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÚ9ÚóˆGð
 ˆØŸ*™*×6Ñ6ØÚ6Úó�ð
 �?Ü—L‘LÐ!SÔTØà˜q‘zˆHØ ŸJ™J×1Ñ1°(¸A¸tÓDˆMØ Ÿ™¨Ñ*ˆIØ"×)Ñ)¨!Ñ,ˆFä" 7›|¨qÒ0°W¸R±[×5HÑ5HÈEÒ5Q�˜’ÐW[ˆØ˜2‘;ˆàˆ	Ø—:‘:×/Ñ/ØÚ(Úó
ˆð
 ˆØÐØ—z‘z×3Ñ3ØÚ>ÚóˆHð
 ÐØŸ:™:×7Ñ7ØÚIÚ&ó�ð
 Ð#Ü—L‘LÐ!TÔUØØ# A™;‘à# A™;�àÐØŸ™×5Ñ5ØÚ.ÚóˆJð
 Ð%Ø& r™N×1Ñ1°!Ñ4�	à$ R™L¨(°2©,�	ˆà—*‘*×.Ñ.ØÚ<Úó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÚ@ÚóˆGð
 ˆØŸ*™*×6Ñ6ØÚ=Ú ó�ð
 �?Ø"Ÿj™j×:Ñ:Ø!ÚAÚ$ó�Gð
 �ÜŸ™Ð%WÔXØäÑP¨7ÔPÐRVÓWˆ	ÜÑH wÔHÈ$ÓOˆÜÑX¬(°7Ó*;ÔXÐZ^Ó_ˆØÐ  °Ð1AÜ�L‰LÐbÔcØàŸ
™
×4Ñ4ØÚMÚó
ˆð
 Ð$¨°©×);Ñ);¸~Ñ)MÐRYÐZ[ÑR\Ð`mÐnpÑ`qÒRqÜ�L‰LÐQÔRØàÐ Ø%)§Z¡Z×%AÑ%AØÚ]Ú(ó&Ð"ð
 &Ð1Ø 6�à"Ñˆ�	Ø—*‘*×.Ñ.ØÚLÚó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÚFÚóˆGð
 ˆØŸ*™*×6Ñ6ØÚ=Ú ó�ð
 �?Ø"Ÿj™j×:Ñ:Ø!Ú:Ú!ó�Gð
 �ÜŸ™Ð%WÔXØà˜q‘zˆHØ ŸJ™J×1Ñ1°(¸A¸tÓDˆMØ"×)Ñ)¨!Ñ,ˆFØ Ÿ™¨Ñ*ˆIä" 7›|¨qÒ0°W¸R±[×5HÑ5HÈEÒ5Q�˜’ÐW[ˆØ˜2‘;ˆà!%×!CÑ!CÀIÓ!NÑˆ	�;Ø˜Š>˜[¨AÒ-°+À	Ñ2IÈaÒ1OÜ�L‰LÐ^Ô_Øð  Ÿ™ a™ˆØ—J‘J×.Ñ.¨~Ó>ˆ	ØÐ ¤S¨¯©Ó%8¸AÒ%=Ü�L‰LØbØÜ�Y—^‘^Ó$ôð
  ˆNàˆà�N‰N˜1Ñ §¡°Ñ!2Ñ2ò "Ø—‘˜qÑ! X§^¡^°AÑ%6Ñ6ò"à Ð%ò"ð ˜TÐ!ò"ð ˜TÐ!ò	"ð
 ˜TÐ!ð 	 ñ #à×1Ñ1Ø$Ø!Ø!Ø!ØØØØ#Ø'Ø$ŸN™N¨1Ñ-Ø"×)Ñ)¨!Ñ,Ø)ØØØ#Ø#ð! 2ó ‰Hð& ×;Ñ;Ø!Ø!Ø!ØØØØ#Ø'Ø"×)Ñ)¨!Ñ,Ø!*Ø%ØØØ#Ø#ð <ó ˆHð$ ÐÜ�L‰LÐ\Ô]Øà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ñ3à×Ñ×#Ñ# [°-ÀÐ$LÔMØ×Ñ×#Ñ# HÔ-ñ 'Ø�r‰{×"Ñ" hÒ.Ø—‘”Ø�r‰{×"Ñ" hÒ.Ø—‘”Ø�r‰{×"Ñ" hÒ.Ø—‘”àÐ ð × Ñ ×'Ñ'¨Ô0à×Ñ×#Ñ# GÔ,Ø×Ñ×#Ñ# GÔ,ð  ˆÕr   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   ry   Ú__classcell__)r   s   @r   r   r      s>   ø„ ñðHàðHð ðHð ð	Hð
 &õHöN r   r   )
ÚloggingÚfusion_attentionr   r   Ú
onnx_modelr   Ú	getLoggerrz   rD   r   © r   r   ú<module>r…      s0   ðó
 ç ;Ý  à	ˆ×	Ñ	˜8Ó	$€ô\ ˜õ \ r   