Ë
    cQêj±Ì  ã                   óž   — 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mZmZ d dlmZ  ee«      Z G d„ d	«      Z G d
„ de«      Zy)é    )Ú	getLoggerN)ÚFusion)ÚAttentionMaskFormat)ÚFusionUtilsÚNumpyHelper)Ú	NodeProtoÚTensorProtoÚhelperÚnumpy_helper)Ú	OnnxModelc                   óJ   — e Zd ZdZdefd„Zdefd„Zd„ Zd„ Z	de
d	e
d
z  fd„Zy
)ÚAttentionMaskú:
    Fuse Attention subgraph into one Attention node.
    Úmodelc                 ó¢   — || _         i | _        i | _        t        |«      | _        t
        j                  | _        |j                  «       | _	        y ©N)
r   Úmask_indiceÚmask_castedr   Úutilsr   ÚMaskIndexEndÚmask_formatÚget_opset_versionÚopset_version)Úselfr   s     ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_attention.pyÚ__init__zAttentionMask.__init__   sD   € ØˆŒ
àˆÔàˆÔÜ  Ó'ˆŒ
Ü.×;Ñ;ˆÔØ"×4Ñ4Ó6ˆÕó    r   c                 ó   — || _         y r   )r   )r   r   s     r   Úset_mask_formatzAttentionMask.set_mask_format    s
   € Ø&ˆÕr   c                 óf   — || j                   v r|| j                   |   k(  sJ ‚|| j                   |<   y r   )r   )r   ÚmaskÚ
mask_indexs      r   Úset_mask_indicezAttentionMask.set_mask_indice#   s9   € Ø�4×#Ñ#Ñ#Ø ×!1Ñ!1°$Ñ!7Ò7Ð7Ð7Ø!+ˆ×Ñ˜Òr   c                 ór   — t        | j                  «      dkD  sJ ‚t        t        | j                  «      «      S ©Nr   )Úlenr   ÚnextÚiter)r   s    r   Úget_first_maskzAttentionMask.get_first_mask(   s1   € Ü�4×#Ñ#Ó$ qÒ(Ð(Ð(Ü”D˜×)Ñ)Ó*Ó+Ð+r   Úmask_2dÚreturnNc           	      óÚ  — | j                   t        j                  k(  ry || j                  v r| j                  |   S | j                  j                  |«      r| j                  j                  |«      \  }}n | j                  j                  |«      \  }}d}|r|| j                  |<   | j                   t        j                  k(  r|| j                  |<   |S | j                  j                  d«      }| j                  dk  r|t        j                  d|g|g| j                  j                  dd«      ¬«      }|j                  j!                  t        j"                  ddg«      t        j"                  d	d
«      g«       nÆd}| j                  j%                  |«      €C| j                  j'                  t        j(                  |t*        j,                  dgdgd¬«      «       t        j                  d||g|g| j                  j                  dd«      ¬«      }|j                  j!                  t        j"                  d	d
«      g«       | j                  j/                  |«       || j                  |<   |S )NTr"   é   Ú	ReduceSumÚMaskReduceSum©ÚinputsÚoutputsÚnameÚaxesé   Úkeepdimsr   Úort_const_1_reduce_sum_axesF©r3   Ú	data_typeÚdimsÚvalsÚraw)r   r   ÚNoMaskr   r   Úfind_graph_inputr   Úcast_graph_input_to_int32Úcast_input_to_int32r   r   Úcreate_node_namer   r
   Ú	make_nodeÚ	attributeÚextendÚmake_attributeÚget_initializerÚadd_initializerÚmake_tensorr	   ÚINT64Úadd_node)r   r*   ÚcastedÚ
input_nameÚ
_cast_nodeÚoutput_nameÚmask_index_nodeÚ	axes_names           r   Úprocess_maskzAttentionMask.process_mask,   s-  € Ø×ÑÔ2×9Ñ9Ò9Øà�d×&Ñ&Ñ&Ø×#Ñ# GÑ,Ð,ð �:‰:×&Ñ& wÔ/Ø!%§¡×!EÑ!EÀgÓ!NÑˆF‘Jà%)§Z¡Z×%CÑ%CÀGÓ%LÑ"ˆJ˜
ØˆFáØ(2ˆD×Ñ˜WÑ%ð ×ÑÔ2×@Ñ@Ò@Ø(2ˆD×Ñ˜WÑ%ØÐð —j‘j×1Ñ1°,Ó?ˆØ×Ñ Ò"Ü$×.Ñ.ØØ"�|Ø$˜Ø—Z‘Z×0Ñ0°¸oÓNô	ˆOð ×%Ñ%×,Ñ,¬f×.CÑ.CÀFÈQÈCÓ.PÔRX×RgÑRgÐhrÐtuÓRvÐ-wÕxð 6ˆIØ�z‰z×)Ñ)¨)Ó4Ð<Ø—
‘
×*Ñ*Ü×&Ñ&Ø&Ü"-×"3Ñ"3Ø˜SØ˜SØ!ôôô %×.Ñ.ØØ" IÐ.Ø$˜Ø—Z‘Z×0Ñ0°¸oÓNô	ˆOð ×%Ñ%×,Ñ,¬f×.CÑ.CÀJÐPQÓ.RÐ-SÔTà�
‰
×Ñ˜OÔ,à$/ˆ×Ñ˜Ñ!ØÐr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r#   r)   ÚstrrQ   © r   r   r   r      sA   „ ñð7˜ió 7ð'Ð+>ó 'ò,ò
,ð8 Cð 8¨C°$©Jô 8r   r   c            (       ó@  ‡ — e Zd ZdZdddddgfdededed	edz  d
ededee	   fˆ fd„Z
dedeeef   fd„Zdedeeef   fd„Zdefd„Zde	fd„Zde	de	de	fd„Zde	de	de	fd„Zdededz  dedz  d e	dedz  f
d!„Zd"ed#ed$edededz  dedz  deeeef   fd%„Z	 	 	 	 	 	 	 	 d4d"ed#ee	z  dz  d$ee	z  dz  dededz  dedz  deded&e	d'e	de	d(ede	de	d)e	d*e	d+ededz  f$d,„Z	 	 	 	 	 	 	 d5d-e	dz  d"ed#ed$edededededed.e	d&e	d/e	d0ede	de	d)e	d*e	d1edz  dedz  f&d2„Zd3„ Zˆ xZS )6ÚFusionAttentionr   NFÚSkipLayerNormalizationÚLayerNormalizationr   Úhidden_sizeÚ	num_headsÚattention_maskÚuse_multi_head_attentionÚ!disable_multi_head_attention_biasÚsearch_op_typesc                 óÚ   •— |rdnd}t         ‰	| �  |||«       || _        || _        |r|n
t	        |«      | _        || _        || _        d | _        d| _	        d| _
        d | _        d| _        y )NÚMultiHeadAttentionÚ	AttentionT)Úsuperr   r\   r]   r   r^   r_   r`   Úmask_filter_valueÚnum_heads_warningÚhidden_size_warningÚshape_inferÚshape_infer_done)
r   r   r\   r]   r^   r_   r`   ra   Úattention_op_nameÚ	__class__s
            €r   r   zFusionAttention.__init__l   s   ø€ ñ 5MÑ0ÐR]ÐÜ‰Ñ˜Ð 1°?ÔCØ&ˆÔØ"ˆŒÙ0>™nÄMÐRWÓDXˆÔØ(@ˆÔ%Ø1RˆÔ.Ø!%ˆÔð "&ˆÔØ#'ˆÔ àˆÔØ $ˆÕr   Úconcatr+   c                 ód  — t        |j                  «      dk(  �r | j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      }t	        |t
        j                  «      r–|j                  dk(  r‡t	        |t
        j                  «      rm|j                  dk(  r^|d   dk(  rF| j                  dkD  r7| j                  | j                  |d   z  k(  r| j                  | j                  fS |d   |d   |d   z  fS | j                  | j                  fS )aU  
        Detect num_heads and hidden_size from Concat node in the following subgraph:

        SkipLayerNormalization or EmbedLayerNormalization
                        /        |
                     MatMul    Shape
                        |        |
                       Add     Gather(indices=0)
                        |        |
                        |      Unsqueeze
                        |        |
                        |     Concat (*, -1, 12, 64)
                        |     /
                       Reshape
                          |
                       Transpose
        é   é   é   r5   r   éÿÿÿÿ)
r&   Úinputr   Úget_constant_valueÚ
isinstanceÚnpÚndarrayÚsizer]   r\   )r   rm   r]   Ú	head_sizes       r   Ú)get_num_heads_and_hidden_size_from_concatz9FusionAttention.get_num_heads_and_hidden_size_from_concat†   sþ   € ô$ ˆv�|‰|Ó Ó!ØŸ
™
×5Ñ5°f·l±lÀ1±oÓFˆIØŸ
™
×5Ñ5°f·l±lÀ1±oÓFˆIä˜9¤b§j¡jÔ1Ø—N‘N aÒ'Ü˜y¬"¯*©*Ô5Ø—N‘N aÒ'à˜Q‘< 2Ò%¨$¯.©.¸1Ò*<À×AQÑAQÐUY×UcÑUcÐfoÐpqÑfrÑUrÒArØŸ>™>¨4×+;Ñ+;Ð;Ð;Ø  ‘| Y¨q¡\°I¸a±LÑ%@Ð@Ð@à�~‰~˜t×/Ñ/Ð/Ð/r   Ú	reshape_qc                 ó‚  — | j                   j                  |j                  d   «      }|€y| j                   j                  |d«      }|� |j                  dk(  r| j                  |«      S t        j                  d|j                  d   «       | j                  | j                  fS t        |t        j                  «      rt        |«      dk7  s|d   dk  s|d   dk  r.t        j                  d|«       | j                  | j                  fS |d   }|d   }||z  }| j                  dkD  rC|| j                  k7  r4| j                  r(t        j                  d	| j                  |«       d
| _        | j                  dkD  rC|| j                  k7  r4| j                   r(t        j                  d| j                  |«       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
        r5   ÚConcatz%s is not initializer.ro   rp   r   rq   zGq_shape_value=%s. Expected value are like [0, 0, num_heads, head_size].z>--num_heads is %d. Detected value is %d. Using detected value.Fz@--hidden_size is %d. Detected value is %d. Using detected value.)r   rt   rs   Ú
get_parentÚop_typerz   ÚloggerÚdebugr]   r\   ru   rv   rw   r&   rg   Úwarningrh   )r   r{   Úq_shape_valuerm   r]   ry   r\   s          r   Úget_num_heads_and_hidden_sizez-FusionAttention.get_num_heads_and_hidden_size§   sž  € ð Ÿ
™
×5Ñ5°i·o±oÀaÑ6HÓIˆØÐ Ø—Z‘Z×*Ñ*¨9°aÓ8ˆFØÐ! f§n¡n¸Ò&@Ø×EÑEÀfÓMÐMÜ�L‰LÐ1°9·?±?À1Ñ3EÔFØ—>‘> 4×#3Ñ#3Ð3Ð3ô ˜M¬2¯:©:Ô6Ü�=Ó! QÒ&Ø˜aÑ  AÒ%¨°qÑ)9¸QÒ)>ä�L‰LÐbÐdqÔrØ—>‘> 4×#3Ñ#3Ð3Ð3à! !Ñ$ˆ	Ø! !Ñ$ˆ	Ø )Ñ+ˆà�>‰>˜AÒ )¨t¯~©~Ò"=Ø×%Ò%Ü—‘ØTÐVZ×VdÑVdÐfoôð */�Ô&à×Ñ˜aÒ K°4×3CÑ3CÒ$CØ×'Ò'Ü—‘ØVÐX\×XhÑXhÐjuôð ,1�Ô(à˜+Ð%Ð%r   Úadd_qkc                 ó°  — | j                   s(| j                  j                  d¬«      | _        d| _         | j                  €y | j                  j	                  |j
                  d   «      }| j                  j	                  |j
                  d   «      }|�|€t        j                  d|«       y ||k7  rt        j                  d|«       y |j
                  d   S )NT)Úupdater   r5   zone of the inputs of %s is Nonez)the shape of two inputs of %s is not same)rj   r   Úinfer_runtime_shaperi   Úget_edge_shapers   r€   r�   )r   r…   Úinput_0_shapeÚinput_1_shapes       r   Úget_add_qk_strzFusionAttention.get_add_qk_strÕ   s½   € Ø×$Ò$Ø#Ÿz™z×=Ñ=ÀTÐ=ÓJˆDÔØ$(ˆDÔ!à×ÑÐ#Øà×(Ñ(×7Ñ7¸¿¹ÀQ¹ÓHˆØ×(Ñ(×7Ñ7¸¿¹ÀQ¹ÓHˆàÐ  MÐ$9Ü�L‰LÐ:¸FÔCØà˜MÒ)Ü�L‰LÐDÀfÔMØà�|‰|˜A‰Ðr   c                 ó¶  ‡— |dz   Št        t        ˆfd„| j                  «      «      }t        |«      dk(  r‰S t        |«      dk(  sJ ‚| j                  j                  d«      }t        j                  dt        | j                  «      D �cg c]  }|‘Œ c}‰g|d¬«      }| j                  j                  |«       | j                  | j                  |<   ‰S c c}w )NÚ_maskc                 ó(   •— | j                   d   ‰k(  S r%   )Úoutput)ÚnodeÚmask_output_names    €r   ú<lambda>z0FusionAttention.reshape_add_qk.<locals>.<lambda>ð   s   ø€ ¨t¯{©{¸1©~ÐAQÑ/Q€ r   r5   r   r}   ©r1   r2   r3   Úaxis)ÚlistÚfilterÚnodes_to_addr&   r   rA   r
   rB   Úranger]   ÚappendÚthis_graph_nameÚnode_name_to_graph_name)r   r…   Úconcat_nodeÚconcat_node_nameÚ_Úconcat_add_qk_fp32r’   s         @r   Úreshape_add_qkzFusionAttention.reshape_add_qkê   sÖ   ø€ ð " GÑ+Ðô œ6Ó"QÐSW×SdÑSdÓeÓfˆÜˆ{Ó˜qÒ Ø#Ð#ä�;Ó 1Ò$Ð$Ð$ØŸ:™:×6Ñ6°xÓ@ÐÜ#×-Ñ-ØÜ$)¨$¯.©.Ó$9Ö:˜q’FÒ:Ø%Ð&Ø!Øô
Ðð 	×Ñ× Ñ Ð!3Ô4Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6àÐùò ;s   Â	C
Úpast_kÚpast_vc                 óF  — | j                   j                  d«      }| j                   j                  d«      }|dz   j                  dd«      }|dz   j                  dd«      }t        j                  d|g|g|dg¬«      }t        j                  d|g|g|dg¬«      }| j
                  j                  |«       | j
                  j                  |«       | j                  | j                  |<   | j                  | j                  |<   | j                   j                  d«      }	|j                  dd	«      j                  dd«      j                  d
d«      }
t        j                  d||g|
g|	d¬«      }| j
                  j                  |«       | j                  | j                  |	<   |
S )zýConcatenate past_k and past_v inputs to create past_kv input.

        Args:
            past_k (str): name of past K value
            past_v (str): name of past V value

        Returns:
            kv_output_name (str): name of past KV value
        Ú	UnsqueezeÚ_5dú.rŸ   r   )r1   r2   r3   r4   r}   z.valuez.kvÚ_valueÚ_kvr”   )	r   rA   Úreplacer
   rB   r˜   rš   r›   rœ   )r   r¢   r£   Úunsqueeze_k_nameÚunsqueeze_v_nameÚ	k_5d_nameÚ	v_5d_nameÚk_5dÚv_5drž   Úkv_output_nameÚ	concat_kvs               r   r²   zFusionAttention.concat_kv  s›  € ð  Ÿ:™:×6Ñ6°{ÓCÐØŸ:™:×6Ñ6°{ÓCÐØ˜e‘^×,Ñ,¨S°#Ó6ˆ	Ø˜e‘^×,Ñ,¨S°#Ó6ˆ	ä×ÑØØ�8Ø�KØ!Ø�ô
ˆô ×ÑØØ�8Ø�KØ!Ø�ô
ˆð 	×Ñ× Ñ  Ô&Ø×Ñ× Ñ  Ô&Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6ð  Ÿ:™:×6Ñ6°xÓ@ÐØŸ™¨°%Ó8×@Ñ@ÀÀcÓJ×RÑRÐS[Ð]bÓcˆÜ×$Ñ$ØØ˜yÐ)Ø#Ð$Ø!Øô
ˆ	ð 	×Ñ× Ñ  Ô+Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6àÐr   Úpresent_k_nameÚpresent_v_nameÚkv_nodec                 óz  — d\  }}| j                   j                  |«      }| j                   j                  |«      }|€Rt        j                  t	        j
                  dd¬«      |¬«      }| j                   j                  || j                  «       |€Rt        j                  t	        j
                  dd¬«      |¬«      }| j                   j                  || j                  «       | j                   j                  d«      }| j                   j                  d«      }	t        j                  d||g|g|d¬	«      }
t        j                  d||g|g|	d¬	«      }| j                  j                  |
«       | j                  j                  |«       | j                  | j                  |<   | j                  | j                  |	<   y)
a?  Split kv_node containing present KV values into separate present K and present V values.

        Args:
            present_k_name (str): name of output to store present K value in
            present_v_name (str): name of output to store present V value in
            kv_node (str): name of present KV values
        )Úindex_0Úindex_1Nr   Úint64)Údtype)r3   r5   ÚGatherr”   )r   rF   r   Ú
from_arrayrv   ÚarrayrG   r›   rA   r
   rB   r˜   rš   rœ   )r   r³   r´   rµ   Úk_indexÚv_indexÚk_dimÚv_dimÚgather_k_nameÚgather_v_nameÚ	present_kÚ	present_vs               r   Úsplit_kvzFusionAttention.split_kv:  s~  € ð 0Ñˆ�Ø—
‘
×*Ñ*¨7Ó3ˆØ—
‘
×*Ñ*¨7Ó3ˆØˆ=Ü ×+Ñ+¬B¯H©H°Q¸gÔ,FÈWÔUˆEØ�J‰J×&Ñ& u¨d×.BÑ.BÔCØˆ=Ü ×+Ñ+¬B¯H©H°Q¸gÔ,FÈWÔUˆEØ�J‰J×&Ñ& u¨d×.BÑ.BÔCð Ÿ
™
×3Ñ3°HÓ=ˆØŸ
™
×3Ñ3°HÓ=ˆÜ×$Ñ$ØØ˜WÐ%Ø#Ð$ØØô
ˆ	ô ×$Ñ$ØØ˜WÐ%Ø#Ð$ØØô
ˆ	ð 	×Ñ× Ñ  Ô+Ø×Ñ× Ñ  Ô+Ø6:×6JÑ6Jˆ×$Ñ$ ]Ñ3Ø6:×6JÑ6Jˆ×$Ñ$ ]Ò3r   Úq_addÚk_addÚv_addÚname_prefixc                 óŽ  — | j                   j                  |j                  d   «      xs( | j                   j                  |j                  d   «      }t        j                  |«      }t        j                  |«      }t        j                  |«      }|�g| j                   j                  |j                  d   «      xs( | j                   j                  |j                  d   «      }	t        j                  |	«      }|�g| j                   j                  |j                  d   «      xs( | j                   j                  |j                  d   «      }
t        j                  |
«      }t        j                  |||fd¬«      }dt        j                  |j                  «      z  }|dz   }| j                  ||j                  |g|¬«       |S )Nr5   r   ©r•   rq   Ú	_qkv_bias©r3   r9   r:   r;   )r   rF   rs   r   Úto_arrayrv   Ú
zeros_likeÚstackÚprodÚshaperG   r9   )r   rÇ   rÈ   rÉ   rÊ   Úq_biasÚqbÚkbÚvbÚk_biasÚv_biasÚqkv_biasÚqkv_bias_dimÚ	bias_names                 r   Úcreate_combined_qkv_biasz(FusionAttention.create_combined_qkv_biasg  sy  € ð —‘×+Ñ+¨E¯K©K¸©NÓ;Òi¸t¿z¹z×?YÑ?YÐZ_×ZeÑZeÐfgÑZhÓ?iˆÜ×!Ñ! &Ó)ˆÜ�]‰]˜2ÓˆÜ�]‰]˜2ÓˆØÐØ—Z‘Z×/Ñ/°·±¸A±Ó?ÒmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÑ^lÓCmˆFÜ×%Ñ% fÓ-ˆBØÐØ—Z‘Z×/Ñ/°·±¸A±Ó?ÒmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÑ^lÓCmˆFÜ×%Ñ% fÓ-ˆBä—8‘8˜R  R˜L¨qÔ1ˆØœ2Ÿ7™7 2§8¡8Ó,Ñ,ˆà +Ñ-ˆ	Ø×ÑØØ×&Ñ&Ø�Øð	 	ô 	
ð Ðr   Úq_matmulÚk_matmulÚv_matmulc                 ó6  — | j                   j                  d«      }|j                  d   |j                  d   k(  r|j                  d   |j                  d   k(  sJ ‚| j                   j                  |j                  d   «      }| j                   j                  |j                  d   «      }	| j                   j                  |j                  d   «      }
t	        j
                  |«      }t	        j
                  |	«      }t	        j
                  |
«      }|j                  |j                  k(  r|j                  |j                  k(  sJ ‚|j                  d   }t        j                  |||fd¬«      j                  |d|z  f«      }|dz   }| j                  ||j                  |j                  d   |j                  d   g|¬«       |dz   }t        j                  d|j                  d   |g|g|¬	«      }| j                  | j                  |<   |g}|d
z   }| j                  |t         j"                  dgdgd¬«       |dz   }| j                  |t         j"                  dg|gd¬«       |dz   }| j                  |t         j"                  dgd|z  gd¬«       |dz   }| j                  |t         j"                  dgd|z  gd¬«       |dz   }| j                  |t         j"                  dgdgd¬«       |dz   }t        j                  d||||g|g| j                   j                  d«      ¬	«      }| j                  | j                  |j$                  <   |dz   }t        j                  d||||g|g| j                   j                  d«      ¬	«      }| j                  | j                  |j$                  <   |dz   }t        j                  d||||g|g| j                   j                  d«      ¬	«      }| j                  | j                  |j$                  <   |}|} |}!|j'                  |||g«       | j(                  �rL|�Â| j                   j                  |j                  d   «      rdnd}"t        j*                  t	        j
                  | j                   j                  |j                  |"   «      «      «      rH||j                  d|"z
  <   |}|j-                  |«       | j                  | j                  |j$                  <   |�Â| j                   j                  |j                  d   «      rdnd}"t        j*                  t	        j
                  | j                   j                  |j                  |"   «      «      «      rH||j                  d|"z
  <   |} |j-                  |«       | j                  | j                  |j$                  <   |�Â| j                   j                  |j                  d   «      rdnd}"t        j*                  t	        j
                  | j                   j                  |j                  |"   «      «      «      rH||j                  d|"z
  <   |}!|j-                  |«       | j                  | j                  |j$                  <   | j.                  j'                  |«       || |!fS )a©  Create packed QKV MatMul node before MultiHeadAttention node.
           This is for the scenario where an Attention node should be created but cannot be created
           because past_key and past_value are separate inputs and not one concatenated input.

        Args:
            q_matmul (NodeProto): name of MatMul from Q path - (batch_size, sequence_length, hidden_size)
            k_matmul (NodeProto): name of MatMul from K path - (batch_size, sequence_length, hidden_size)
            v_matmul (NodeProto): name of MatMul from V path - (batch_size, sequence_length, hidden_size)
            q_add (NodeProto): name of Add from Q path
            k_add (NodeProto): name of Add from K path
            v_add (NodeProto): name of Add from V path

        Returns:
             q_output (NodeProto): Slice node for Q
             k_output (NodeProto): Slice node for K
             v_output (NodeProto): Slice node for V
        ÚMatMulr   r5   rÌ   rq   Ú_qkv_weightrÎ   Ú_qkv_outr0   Ú_q_start_indexFr8   Ú_k_start_indexÚ_v_start_indexrp   Ú_end_of_qkv_indexÚ_qkv_last_axisrr   Ú_q_outÚSliceÚ_k_outÚ_v_out)r   rA   rs   rF   r   rÏ   rÓ   rv   rÑ   ÚreshaperG   r9   r
   rB   r›   rœ   r	   rI   r3   rD   r`   Úanyrš   r˜   )#r   rÞ   rß   rà   rÇ   rÈ   rÉ   Úmatmul_node_nameÚq_weightÚk_weightÚv_weightÚqwÚkwÚvwÚdÚ
qkv_weightÚqkv_weight_nameÚqkv_matmul_outputÚ
qkv_matmulÚ	qkv_nodesÚq_slice_nameÚk_slice_nameÚv_slice_nameÚend_of_qkv_nameÚqkv_last_axis_nameÚq_slice_outputÚq_sliceÚk_slice_outputÚk_sliceÚv_slice_outputÚv_sliceÚq_outputÚk_outputÚv_outputÚinitializer_inputs#                                      r   Úcreate_packed_qkv_matmul_nodez-FusionAttention.create_packed_qkv_matmul_node…  s$  € ð4  Ÿ:™:×6Ñ6°xÓ@Ðð �~‰~˜aÑ  H§N¡N°1Ñ$5Ò5¸(¿.¹.ÈÑ:KÈxÏ~É~Ð^_ÑO`Ò:`Ð`Ð`ð —:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆä×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆà�x‰x˜2Ÿ8™8Ò#¨¯©°B·H±HÒ(<Ð<Ð<Ø�H‰H�Q‰Kˆä—X‘X˜r 2 r˜l°Ô3×;Ñ;¸QÀÀAÁ¸JÓGˆ
Ø*¨]Ñ:ˆà×ÑØ Ø×(Ñ(Ø×"Ñ" 1Ñ% z×'7Ñ'7¸Ñ':Ð;Øð	 	ô 	
ð" -¨zÑ9ÐÜ×%Ñ%ØØ—N‘N 1Ñ% Ð7Ø&Ð'Ø!ô	
ˆ
ð :>×9MÑ9Mˆ×$Ñ$Ð%5Ñ6à�Lˆ	ð (Ð*:Ñ:ˆØ×Ñ ,¼+×:KÑ:KÐSTÐRUÐ]^Ð\_ÐejÐÔkØ'Ð*:Ñ:ˆØ×Ñ ,¼+×:KÑ:KÐSTÐRUÐ]^Ð\_ÐejÐÔkØ'Ð*:Ñ:ˆØ×Ñ ,¼+×:KÑ:KÐSTÐRUÐ]^ÐabÑ]bÐ\cÐinÐÔoØ*Ð-@Ñ@ˆØ×Ñ /¼[×=NÑ=NÐVWÐUXÐ`aÐdeÑ`eÐ_fÐlqÐÔrØ-Ð0@Ñ@ÐØ×ÑÐ"4Ä×@QÑ@QÐYZÐX[ÐceÐbfÐlqÐÔrà)¨HÑ4ˆÜ×"Ñ"ØØ% |°\ÐCUÐVØ#Ð$Ø—‘×,Ñ,¨WÓ5ô	
ˆð 6:×5IÑ5Iˆ×$Ñ$ W§\¡\Ñ2Ø)¨HÑ4ˆÜ×"Ñ"ØØ% |°\ÐCUÐVØ#Ð$Ø—‘×,Ñ,¨WÓ5ô	
ˆð 6:×5IÑ5Iˆ×$Ñ$ W§\¡\Ñ2Ø)¨HÑ4ˆÜ×"Ñ"ØØ% |°_ÐFXÐYØ#Ð$Ø—‘×,Ñ,¨WÓ5ô	
ˆð 6:×5IÑ5Iˆ×$Ñ$ W§\¡\Ñ2àˆØˆØˆØ×Ñ˜' 7¨GÐ4Ô5à×1Ó1ØÐ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÁNÔ)S¡AÐYZÐ!Ü—6‘6œ+×.Ñ.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÑJhÓ/iÓjÔkØ9G�E—K‘K Ð$5Ñ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ØÐ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÁNÔ)S¡AÐYZÐ!Ü—6‘6œ+×.Ñ.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÑJhÓ/iÓjÔkØ9G�E—K‘K Ð$5Ñ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ØÐ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÁNÔ)S¡AÐYZÐ!Ü—6‘6œ+×.Ñ.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÑJhÓ/iÓjÔkØ9G�E—K‘K Ð$5Ñ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ð 	×Ñ× Ñ  Ô+Ø˜ 8Ð+Ð+r   r�   Úkey_padding_maskÚunidirectionalrÄ   rÅ   Ú
packed_qkvc                 óT  — |dkD  sJ ‚|dkD  r ||z  dk7  rt         j                  d||«       y| j                  j                  «       j                  D �ch c]  }|j
                  ’Œ }}| j                  j                  d«      }g }|rW| j                  ||||||«      \  }}}|j                  |j                  d   |j                  d   |j                  d   g«       �nt        |t        «      r”t        |t        «      r„| j                  r<|j                  |j                  d   |j                  d   |j                  d   g«       nµ|j                  |j                  d   |j                  d   |j                  d   g«       nyt        |t        «      rht        |t        «      rX||v rT||v rP| j                  r"|j                  |j                  d   ||g«       n#|j                  |j                  d   ||g«       ny| j                  s&| j                  ||||«      }|j                  |«       n|j                  d«       |r|r|j                  |
|||g«       n|
s|r|j                  |
|g«       |	g}|r|r|j                  ||g«       t!        j"                  d|||¬«      }d|_        |j&                  j                  t!        j(                  d	|«      «       |r8|j&                  j                  t!        j(                  d
t+        |«      «      «       | j-                  d«       |S c c}w )aº  Create a MultiHeadAttention node.

        Args:
            q_matmul (NodeProto): name of MatMul from Q path - (batch_size, sequence_length, hidden_size)
            k_matmul (NodeProto): name of MatMul from K path - (batch_size, sequence_length, hidden_size) or (batch_size, num_heads, past_sequence_length, head_size)
            v_matmul (NodeProto): name of MatMul from V path - (batch_size, sequence_length, hidden_size) or (batch_size, num_heads, past_sequence_length, head_size)
            q_add (NodeProto): name of Add from Q path
            k_add (NodeProto): name of Add from K path
            v_add (NodeProto): name of Add from V path
            num_heads (int): number of attention heads. If a model is pruned, it is the number of heads after pruning.
            hidden_size (int): hidden dimension. If a model is pruned, it is the hidden dimension after pruning.
            output (str): output name of MHA
            key_padding_mask (str): name of key padding mask
            add_qk (str): name of add after Q x K'
            unidirectional (bool): whether to apply causal attention mask automatically or not
            past_k (str): name of past K value - (batch_size, num_heads, past_sequence_length, head_size)
            past_v (str): name of past V value - (batch_size, num_heads, past_sequence_length, head_size)
            present_k (str): name of present K value - (batch_size, num_heads, sequence_length, head_size)
            present_v (str): name of present V value - (batch_size, num_heads, sequence_length, head_size)
            packed_qkv (bool): whether to combine MatMuls from Q, K, V paths
                               Note: This is for the scenario where an Attention node should be created but cannot be created
                               because past_key and past_value are separate inputs and not one concatenated input.

        Returns:
            Union[NodeProto, None]: the node created or None if failed.
        r   ú9input hidden size %d is not a multiple of num of heads %dNrd   Ú rc   r0   úcom.microsoftr]   r  )r€   r�   r   Úgraphrs   r3   rA   r  rD   r�   ru   r   r`   rV   rÝ   rš   r
   rB   ÚdomainrC   rE   ÚintÚincrease_counter)r   rÞ   rß   rà   rÇ   rÈ   rÉ   r]   r\   r�   r  r…   r  r¢   r£   rÄ   rÅ   r  r‘   Úgraph_input_namesÚmha_node_nameÚ
mha_inputsr  r  r  rÜ   Úmha_outputsÚmha_nodes                               r   Úcreate_multihead_attention_nodez/FusionAttention.create_multihead_attention_node  sê  € ð^ ˜1Š}Ðˆ}à˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐTÐVaÐclÔmØà37·:±:×3CÑ3CÓ3E×3KÑ3KÖL¨4˜TŸY›YÐLÐÐLØŸ
™
×3Ñ3°KÓ@ˆð ˆ
ÙØ(,×(JÑ(JØØØØØØó)Ñ%ˆG�W˜gð ×Ñ˜wŸ~™~¨aÑ0°'·.±.ÀÑ2CÀWÇ^Á^ÐTUÑEVÐWÖXÜ˜¤)Ô,´¸HÄiÔ1PØ×5Ò5Ø×!Ñ! 5§<¡<°¡?°H·O±OÀAÑ4FÈÏÉÐUVÉÐ"XÕYà×!Ñ! 8§?¡?°1Ñ#5°x·±ÀqÑ7IÈ8Ï?É?Ð[\ÑK]Ð"^Õ_ä�x¤Ô%Ü˜8¤SÔ)ØÐ-Ñ-ØÐ-Ñ-à×5Ò5Ø×!Ñ! 5§<¡<°¡?°H¸hÐ"GÕHà×!Ñ! 8§?¡?°1Ñ#5°xÀÐ"JÕKàð ×5Ò5Ø×5Ñ5°e¸UÀEÈ=ÓYˆIØ×Ñ˜iÕ(à×Ñ˜bÔ!ñ ‘fØ×ÑÐ/°¸ÀÐHÕIÙ¡Ø×ÑÐ/°Ð8Ô9ð �hˆÙ™Ø×Ñ 	¨9Ð5Ô6ä×#Ñ#Ø ØØØô	
ˆð *ˆŒØ×Ñ×!Ñ!¤&×"7Ñ"7¸ÀYÓ"OÔPÙØ×Ñ×%Ñ%¤f×&;Ñ&;Ð<LÌcÐR`ÓNaÓ&bÔcà×ÑÐ2Ô3ØˆùòE Ms   ÁL%r"   Úfirst_inputÚ
add_qk_strÚcausalÚscalec                 ó*  — |dkD  sJ ‚|	dkD  r |	|z  dk7  rt         j                  d|	|«       yd}|€|€|€d}| j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      }d\  }}}|rÿ| j                  j                  |j                  d   «      xs( | j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      xs( | j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      xs( | j                  j                  |j                  d   «      }|r|r|r|sy|€t        |j                  d   › d�«       yt        j                  |«      }t        j                  |«      }t        j                  |«      }|j                  |j                  k(  sJ ‚|j                  d   }|j                  d   }|j                  d   }||cxk(  r|k(  sJ ‚ J ‚|	dkD  r|	|k7  rt         j                  d	|	|«       d} |j                  |j                  k7  rd} t        j                  |j                  dd «      }!t        j                  |j                  dd «      }"t        j                  |j                  dd «      }#d}$| r#t        j                  |||fd¬
«      }%|!|"z   |#z   }$nt        j                  |||fd¬
«      }%d|!z  }$d}&d}'|r÷t        j                  |«      }(t        j                  |«      })t        j                  |«      }*t        j                  |(j                  «      }+t        j                  |)j                  «      },t        j                  |*j                  «      }-|+|,cxk(  r|!k(  sJ ‚ J ‚|-|#k(  sJ ‚| r#t        j                  |(|)|*fd¬
«      }'|+|,z   |-z   }&nt        j                  |(|)|*fd¬
«      }'d|+z  }&| j                  j                  d«      }.| j                  s-| j!                  |.dz   |j"                  |t%        |$«      g|%¬«       |r,| j!                  |.dz   |j"                  t%        |&«      g|'¬«       | j                  rˆ|rt         j                  d«       y|j&                  d   |j&                  d   |j&                  d   |.dz   g}/|�|/j)                  |«       t+        j,                  d|/|g|.¬«      }0| j/                  d«       �n|
|.dz   |r|.dz   ndg}/|�|/j)                  |«       n|/j)                  d«       |xr |}1|1r#| j1                  ||«      }2|/j)                  |2«       |r$|1s|/j)                  d«       |/j)                  |«       |g}3|rX|rV|j3                  dd«      j3                  dd«      j3                  dd«      }4|3j)                  |4«       | j5                  |||4«       t+        j,                  d|/|3|.¬«      }0| j/                  d«       d|0_        |0j8                  j;                  t+        j<                  d|«      g«       |r0|0j8                  j;                  t+        j<                  dd«      g«       |�0|0j8                  j;                  t+        j<                  d|«      g«       | r3|0j8                  j;                  t+        j<                  d|!|"|#g«      g«       | j>                  �C|0j8                  j;                  t+        j<                  dtA        | j>                  «      «      g«       |0S )a>  Create an Attention node.

        Args:
            mask_index (str | None): mask input
            q_matmul (NodeProto): MatMul node in fully connection for Q
            k_matmul (NodeProto): MatMul node in fully connection for K
            v_matmul (NodeProto): MatMul node in fully connection for V
            q_add (NodeProto): Add bias node in fully connection for Q
            k_add (NodeProto): Add bias node in fully connection for K
            v_add (NodeProto): Add bias node in fully connection for V
            num_heads (int): number of attention heads. If a model is pruned, it is the number of heads after pruning.
            hidden_size (int): hidden dimension. If a model is pruned, it is the hidden dimension after pruning.
            first_input (str): first input name
            output (str): output name
            add_qk_str (str): name of Add node after Q x K'
            causal: whether it is uni-directional mask.
            past_k (str): name of input for past K value
            past_v (str): name of input for past V value
            present_k (str): name of output to store present K value
            present_v (str): name of output to store present V value
            scale: scale before softmax

        Returns:
            Union[NodeProto, None]: the node created or None if failed.
        r   r  NTFr5   )NNNzl is not an initializer. Please set do_constant_folding=True in torch.onnx.export to unblock attention fusionz„Input hidden size (%d) is not same as weight matrix dimension of q,k,v (%d). Please provide a correct input hidden size or pass in 0rÌ   rq   rd   rã   rÎ   rÍ   zVMultiHeadAttention does not support relative_position_bias: cannot fuse the attention.rc   r0   r  z.keyÚ_keyr§   rŸ   r  r]   r  r!  Úqkv_hidden_sizesrf   )!r€   r�   r   rF   rs   Úprintr   rÏ   rÓ   r‚   rv   rÒ   ÚconcatenaterÑ   rA   r_   rG   r9   r  r�   rš   r
   rB   r  r²   rª   rÆ   r  rC   rD   rE   rf   Úfloat)5r   r"   rÞ   rß   rà   rÇ   rÈ   rÉ   r]   r\   r  r�   r  r   r¢   r£   rÄ   rÅ   r!  Úhas_biasrñ   rò   ró   rÔ   rØ   rÙ   rô   rõ   rö   Ú
qw_in_sizeÚ
kw_in_sizeÚ
vw_in_sizeÚis_qkv_diff_dimsÚqw_out_sizeÚkw_out_sizeÚvw_out_sizeÚqkv_weight_dimrø   rÛ   rÚ   rÕ   rÖ   r×   Úq_bias_shapeÚk_bias_shapeÚv_bias_shapeÚattention_node_nameÚattention_inputsÚattention_nodeÚpast_existsÚpast_kvÚattention_outputsÚ
present_kvs5                                                        r   Úcreate_attention_nodez%FusionAttention.create_attention_nodeŽ  s  € ð\ ˜1Š}Ðˆ}à˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐTÐVaÐclÔmØàˆØˆ=˜U˜]¨u¨}ØˆHà—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆà!1Ñˆ�˜ÙØ—Z‘Z×/Ñ/°·±¸A±Ó?ÒmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÑ^lÓCmˆFØ—Z‘Z×/Ñ/°·±¸A±Ó?ÒmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÑ^lÓCmˆFØ—Z‘Z×/Ñ/°·±¸A±Ó?ÒmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÑ^lÓCmˆFá¡©f¹ØàÐÜØ—>‘> !Ñ$Ð%ð &gð gôð ä×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆð �x‰x˜2Ÿ8™8Ò#Ð#Ð#à—X‘X˜a‘[ˆ
Ø—X‘X˜a‘[ˆ
Ø—X‘X˜a‘[ˆ
à˜ZÔ5¨:Ò5Ð5Ñ5Ð5Ð5à˜Š?˜{¨jÒ8Ü�N‰NðJàØô	ð !ÐØ�8‰8�r—x‘xÒØ#Ðô
 —g‘g˜bŸh™h q r˜lÓ+ˆÜ—g‘g˜bŸh™h q r˜lÓ+ˆÜ—g‘g˜bŸh™h q r˜lÓ+ˆàˆÙÜŸ™¨¨R°¨¸1Ô=ˆJØ(¨;Ñ6¸ÑD‰NäŸ™ 2 r¨2 ,°QÔ7ˆJØ ™_ˆNàˆØ&*ˆÙÜ×%Ñ% fÓ-ˆBÜ×%Ñ% fÓ-ˆBÜ×%Ñ% fÓ-ˆBäŸ7™7 2§8¡8Ó,ˆLÜŸ7™7 2§8¡8Ó,ˆLÜŸ7™7 2§8¡8Ó,ˆLà <Ô>°;Ò>Ð>Ñ>Ð>Ð>Ø ;Ò.Ð.Ð.áÜŸ>™>¨2¨r°2¨,¸QÔ?�Ø+¨lÑ:¸\ÑI‘äŸ8™8 R¨¨R L°qÔ9�Ø  <Ñ/�à"Ÿj™j×9Ñ9¸+ÓFÐà×,Ò,Ø× Ñ Ø(¨=Ñ8Ø"×,Ñ,Ø ¤# nÓ"5Ð6Øð	 !ô ñ Ø× Ñ Ø(¨;Ñ6Ø ×*Ñ*Ü˜,Ó'Ð(Øð	 !ô ð ×(Ò(ÙÜ—‘ÐuÔvØð —‘ Ñ"Ø—‘ Ñ"Ø—‘ Ñ"Ø# kÑ1ð	 Ðð Ð%Ø ×'Ñ'¨
Ô3ä#×-Ñ-Ø$Ø'Ø˜Ø(ô	ˆNð ×!Ñ!Ð"6Ö7ð Ø# mÑ3Ù5=Ð# kÒ1À2ð Ðð
 Ð%Ø ×'Ñ'¨
Õ3à ×'Ñ'¨Ô+à Ò+ VˆKÙØŸ.™.¨°Ó8�Ø ×'Ñ'¨Ô0áá"Ø$×+Ñ+¨BÔ/Ø ×'Ñ'¨
Ô3à!' ÐÙ™YØ&×.Ñ.¨v°rÓ:×BÑBÀ6È2ÓN×VÑVÐWZÐ\_Ó`�
Ø!×(Ñ(¨Ô4Ø—‘˜i¨°JÔ?ä#×-Ñ-ØØ'Ø)Ø(ô	ˆNð ×!Ñ! +Ô.à /ˆÔØ× Ñ ×'Ñ'¬×)>Ñ)>¸{ÈIÓ)VÐ(WÔXáØ×$Ñ$×+Ñ+¬V×-BÑ-BÐCSÐUVÓ-WÐ,XÔYàÐØ×$Ñ$×+Ñ+¬V×-BÑ-BÀ7ÈEÓ-RÐ,SÔTáØ×$Ñ$×+Ñ+Ü×&Ñ&Ð'9¸KÈÐVaÐ;bÓcÐdôð ×!Ñ!Ð-Ø×$Ñ$×+Ñ+¬V×-BÑ-BÐCVÔX]Ð^b×^tÑ^tÓXuÓ-vÐ,wÔxàÐr   c                 óÖ  — |}|}|j                   dk(  rN| j                  j                  |dd«      }|�|}n,| j                  j                  |j                  d   «      �|}ny | j                  j                  |g d¢g d¢«      }d }|�	|\  }	}	}
}}n,| j                  j                  |g d¢g d¢«      }|�|\  }	}}}ny g }t        |j                  «      D ]L  \  }}||vr| j                  j                  |«      €Œ&||d   j                  d   k(  rŒ<|j                  |«       ŒN t        |«      dk7  ry |d   }| j                  j                  |d	d«      }|�h||j                  d      }|�3t        |«      d
k(  r%|d   }|j                   dk(  r|j                  d   }n[y |�t        |«      dk(  r|j                  d   }n:y |j                   dv r+||   }|D ]!  }|j                   dk(  sŒ|j                  d   }Œ# ||v r;||   }|j                   dk(  r't        |j                  «      dk(  r|j                  d   }||   }|D �cg c]  }|j                   ‘Œ }}|j                  d«      dk7  ry | j                  j                  |g d¢g d¢«      }|€t        j                  d«       y |\  }	}	}}d}d}d}d}g d¢g d¢fg d¢g d¢fg d¢g d¢fg d¢g d¢fg d¢g d¢fg d¢g d¢fd œ}d } |j                  «       D ]K  \  }!}"| j                  j                  ||"d   |"d   «      } | €Œ,|!d!k(  rd"}n|!d#k(  rd"}n|!d$k(  rd"}n|!d%k(  rd"} n | €t        j                  d&«       y d }#d }$d }%d }&|r| \  }	}%}$}	n%|r| \  }	}#}%}$n|r| \  }	}	}$n|r	| \  }	}#}$}&}	n| \  }	}#}	}$|&xs |$}&| j                  j                  |&g d¢g d'¢«      }'|'€9| j                  j                  |&g d(¢g d)¢«      }'|'€t        j                  d*«       y |'d+   }(|'d,   })|'d-   }*|$}+|r>| j                  j                  |$d	d.gdd g«      },|,€t        j                  d/«       y |,\  }+}	| j                  j                  |+g d¢|rdndddd g«      }-|-€9| j                  j                  |$g d0¢g d1¢«      }-|-€t        j                  d2«       y |-d,   }.|-d-   }/d }0d}1d}2d3}3|r7| j                  j                  |%g d4¢g d¢fg d5¢g d¢fg d6¢g d7¢fg|«      \  }	}0}	nµ|r[| j                  j                  |%g d8¢g d7¢fg d5¢g d¢fg|«      \  }	}0}	|#�‚| j                  |#«      }3|3€ot        j                  d9|#«       y |rnU| j                  j                  |#g d:¢g d;¢fg d<¢g d=¢fg d>¢g d?¢fg d@¢g dA¢fg dB¢g dA¢fg dC¢g dD¢fg|«      \  }4}0}	|4dk(  }1|4dk(  }2|s|2s|0€t        j                  dE«       y |sš|2s˜t        |0«      dkD  rŠ|1sˆ| j                  j!                  |0d   «      \  }	}5|5�<t#        |5t$        j&                  «      r"|5j(                  dk(  r|5j+                  «       dk\  ry |5j+                  «       dFk7  r|5j+                  «       | _        |j                  d   |k(  �ry|*j                  d   |k(  �re|/j                  d   |k(  �rQ|s-|2s+| j.                  j1                  |0d-   j                  d   «      nd }6|€
n|}7| j3                  |(«      \  }8}9|8dk  s|9dk  rt        j5                  dG«       y | j7                  |6|*|/||)|.||8|9||7j                  d   |3¬H«      }:|:€y | j8                  j                  |:«       | j:                  | j<                  |:j>                  <   |�´|j                  d   };dI|;z   }<| jA                  dJ|;z   tB        jD                  dgdd|8tG        |9|8z  «      gd¬K«      }=| j                  jI                  tK        jL                  dL|7j                  d   |=j>                  g|<gdM|;z   «      | j:                  «       |<|j                  d<   | jN                  jQ                  |7||g«       | jN                  jQ                  | «       | jN                  jQ                  | jR                  s|'n|'d d- «       | jN                  jQ                  | jR                  s|-n|-d d- «       | jN                  jQ                  | jR                  s|n|d d- «       d"| _*        y y y y c c}w )NNr[   ÚAddr   )r=  râ   ÚReshapeÚ	Transposerâ   )NNr   r   r   )r=  ÚEinsumr?  râ   )r5   Nr   r   r5   ÚMulrp   é   )r[   rZ   rZ   ro   râ   rq   )r?  r>  r=  râ   )r5   r   r   Nz&fuse_attention: failed to match v pathF)ÚSoftmaxr=  ÚDivrâ   )r   r   Nr   )rC  r=  rA  râ   )rC  ÚWhererâ   rD  )r   r   rp   r   )rC  r=  rE  râ   )r   r   r   rp   )rC  rD  râ   )r   r   r   )rC  r=  râ   rA  ÚSqrt)r   r   Nr   r5   )Úpath1Úpath2Úpath3Úpath4Úpath5ÚsdparI  TrJ  rK  rL  z'fuse_attention: failed to match qk path)r   r   r   N)rD  r?  r>  r=  râ   )r   r   r   r   Nz&fuse_attention: failed to match q pathéýÿÿÿéþÿÿÿrr   rF  z/fuse_attention: failed to match mul sqrt q path)r?  r?  r>  r=  râ   )r5   r   r   r   Nz&fuse_attention: failed to match k pathr  )ÚExpandr>  ÚEqual)rP  r¥   r¥   )ÚCastrO  r>  rP  )r   r   r   r   )rQ  rP  r¥   r¥   z6fuse_attention: failed to verify shape inference of %s)rA  ÚSubrQ  r¥   r¥   )Nr   r5   r   r   )rA  rR  r¥   r¥   )Nr   r5   r   )rE  rQ  rR  rO  r¥   r¥   )Nr   r   r5   r   r   )rE  rQ  rR  rQ  rO  r¥   r¥   )Nr   r   r5   r   r   r   )rE  rO  ÚAndr>  r>  r»   ÚFlatten)	rE  rO  ÚGreaterOrEqualr¥   r¥   r¥   ÚRanger»   ÚShape)	Nr   r   r   r   r   r   r5   r   z)fuse_attention: failed to match mask pathiðØÿÿzmFailed to detect num_heads and hidden_size for Attention fusion. Please specify those parameters in argument.)r"   rÞ   rß   rà   rÇ   rÈ   rÉ   r]   r\   r  r�   r  Úedge_modified_Úshape_modified_tensorr8   r>  Úreshape_modified_)+r   r   Úmatch_parentr>   rs   Úmatch_parent_pathÚ	enumerater�   rš   r&   Úcountr€   r�   ÚitemsÚmatch_parent_pathsrŒ   Úget_constant_inputru   rv   rw   rx   Úitemrf   r^   rQ   r„   r‚   r;  r˜   r›   rœ   r3   rG   r	   rI   r  rJ   r
   rB   Únodes_to_removerD   r_   Úprune_graph)>r   r‘   Úinput_name_to_nodesÚoutput_name_to_nodeÚnormalize_nodeÚ
start_nodeÚadd_before_layernormrü   Úeinsum_noderŸ   Úreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚother_inputsÚ_iÚ
node_inputÚ
root_inputÚmul_before_layernormÚmul_childrenÚlayernorm_nodeÚchildrenÚchildÚparent_nodeÚchildren_typesÚv_nodesÚadd_vÚmatmul_vÚ
is_distillÚis_distill_addÚis_no_mask_attentionÚis_sdpaÚqk_pathsÚqk_nodesÚkÚvr…   Ú	matmul_qkÚwhere_qkÚafter_qÚq_nodesr{   Úadd_qÚmatmul_qÚafter_kÚmul_k_nodesÚk_nodesÚadd_kÚmatmul_kÚ
mask_nodesÚis_transformers_5_maskÚis_transformers_5_no_maskr  Ú	mask_pathÚmul_valr"   Úattention_last_nodeÚq_num_headsÚq_hidden_sizeÚnew_nodeÚunique_indexÚnew_edgeÚshape_tensors>                                                                 r   ÚfusezFusionAttention.fusex  s1
  € ð ˆØ#ˆ
Ø×!Ñ!Ð%9Ò9Ø#'§:¡:×#:Ñ#:¸>È5ÐRSÓ#TÐ Ø#Ð/Ø1‘
Ø—‘×,Ñ,¨^×-AÑ-AÀ!Ñ-DÓEÐQð ,‘
àð —J‘J×0Ñ0ØÚ?Ú!ó
ˆ	ð
 ˆØÐ Ø=FÑ:ˆQ��; ©zð Ÿ
™
×4Ñ4ØÒDÂoóˆIð Ð$Ø>GÑ;��K ±
ààˆÜ'¨
×(8Ñ(8Ó9ò 	,‰NˆB�
ØÐ!4Ñ4Ø—:‘:×.Ñ.¨zÓ:ÐBØà˜Y q™\×0Ñ0°Ñ3Ò3ØØ×Ñ 
Õ+ð	,ô ˆ|Ó Ò!Øà! !‘_ˆ
ð  $Ÿz™z×6Ñ6°zÀ5È!ÓLÐØÐ+Ø.Ð/C×/JÑ/JÈ1Ñ/MÑNˆLØÐ'¬C°Ó,=ÀÒ,BØ!-¨a¡�Ø!×)Ñ)Ð-AÒAØ!/×!6Ñ!6°qÑ!9‘JàØÐ)¬c°,Ó.?À1Ò.DØ1×8Ñ8¸Ñ;‘
àØ×#Ñ#Ð'WÑWØ*¨:Ñ6ˆHØ!ò 1�Ø—=‘=Ð$8Ó8Ø!&§¡¨a¡‘Jð1ð Ð,Ñ,Ø-¨jÑ9ˆKØ×"Ñ"Ð&>Ò>Ä3À{×GYÑGYÓCZÐ^_ÒC_Ø(×/Ñ/°Ñ2�
à& zÑ2ˆØ5=Ö>¨E˜%Ÿ-›-Ð>ˆÐ>Ø×Ñ Ó)¨QÒ.Øà—*‘*×.Ñ.¨zÒ;dÒfuÓvˆØˆ?Ü�L‰LÐAÔBØØ")ÑˆˆAˆu�hàˆ
ØˆØ$ÐØˆâ9º?ÐKÚ9º?ÐKÚ;º\ÐJÚ;º\ÐJÚ2²IÐ>Ú@ÒBTÐUñ
ˆð ˆØ—N‘NÓ$ò 	‰DˆAˆqØ—z‘z×3Ñ3°JÀÀ!ÁÀaÈÁdÓKˆHØÐØØ�GŠ|Ø!‘
Ø�g’Ø!%‘Ø�g’Ø'+Ñ$Ø�f’Ø�Ùð	ð ÐÜ�L‰LÐBÔCØàˆØˆ	ØˆØˆÙØ*2Ñ'ˆQ�˜)¡QÙØ/7Ñ,ˆQ�˜¡)Ù!Ø (ÑˆQ�‘9ÙØ19Ñ.ˆQ�˜	 7©Aà(0Ñ%ˆQ�˜˜9àÒ&˜YˆØ—*‘*×.Ñ.¨wÒ8aÒcrÓsˆØˆ?Ø—j‘j×2Ñ2ØÚ@Ú"óˆGð
 ˆÜ—‘ÐEÔFØØ˜B‘Kˆ	Ø˜‘ˆØ˜2‘;ˆàˆÙØŸ*™*×6Ñ6°yÀ5È&À/ÐTUÐW[ÐS\Ó]ˆKØÐ"Ü—‘ÐNÔOØØ&‰LˆW�aà—*‘*×.Ñ.ØÒ>ÁgÁÐSTÐVWÐYZÐ\`Ð@aó
ˆð ˆ?Ø—j‘j×2Ñ2ØÚFÚ"óˆGð
 ˆÜ—‘ÐEÔFØØ˜‘ˆØ˜2‘;ˆð ˆ
Ø!&ÐØ$)Ð!Øˆ
ÙØ#Ÿz™z×<Ñ<Øâ3²YÐ?Ú8º)ÐDÚ;º\ÐJðð
 $ó ÑˆAˆz™1ñ Ø#Ÿz™z×<Ñ<Øâ@Â,ÐOÚ8º)ÐDðð $ó ÑˆAˆz˜1ð Ð!Ø!×0Ñ0°Ó8�
ØÐ%Ü—L‘LÐ!YÐ[aÔbØÙ!Øà'+§z¡z×'DÑ'DØâEÒGYÐZÚ=ºÐOâQÒShÐiÚYÒ[sÐtò ^Ú0ðò
ò 7ððð6 $ó;(Ñ$ˆI�z 1ð> &/°!¡^Ð"Ø(1°Q©Ð%Ù#Ñ,EÈ*ÐJ\Ü�L‰LÐDÔEØñ %Ù-Ü�J“ !Ò#Ù*àŸ™×6Ñ6°zÀ!±}ÓE‰JˆAˆwð �Ü" 7¬B¯J©JÔ7¸G¿L¹LÈAÒ<MØ—L‘L“N aÒ'àØ�|‰|‹~ Ò'Ø)0¯©«�Ô&à�>‰>˜!Ñ 
Ó*¨x¯~©~¸aÑ/@ÀJÓ/NÐS[×SaÑSaÐbcÑSdÐhrÓSrñ ,Ñ4Mð ×#Ñ#×0Ñ0°¸B±×1EÑ1EÀaÑ1HÔIàð ð 2=Ð1D¡+È-Ðà)-×)KÑ)KÈIÓ)VÑ&ˆK˜Ø˜aÒ =°AÒ#5Ü—‘ðCôð ð ×1Ñ1Ø%Ø!Ø!Ø!ØØØØ%Ø)Ø&Ø*×1Ñ1°!Ñ4Ø%ð 2ó ˆHð ÐØà×Ñ×$Ñ$ XÔ.Ø:>×:NÑ:NˆD×(Ñ(¨¯©Ñ7àÐ&Ø*×0Ñ0°Ñ3�Ø+¨lÑ:�à#×3Ñ3Ø0°<Ñ?Ü)×/Ñ/Ø˜Ø˜Q ¬S°ÀÑ1LÓ-MÐNØð  4ó  �ð —
‘
×#Ñ#Ü×$Ñ$Ø!Ø,×3Ñ3°AÑ6¸×8IÑ8IÐJØ!˜
Ø+¨lÑ:ó	ð ×(Ñ(ôð (0�×!Ñ! !Ñ$à× Ñ ×'Ñ'Ð)<¸mÈZÐ(XÔYØ× Ñ ×'Ñ'¨Ô1ð × Ñ ×'Ñ'°t×7TÒ7T©ÐZaÐbeÐceÐZfÔgØ× Ñ ×'Ñ'°t×7TÒ7T©ÐZaÐbeÐceÐZfÔgØ× Ñ ×'Ñ'°t×7TÒ7T©ÐZaÐbeÐceÐZfÔgð  $ˆDÕðQ TsÐ/NÐ*ùòk ?s   È>c&)r  r  Fr  r  r  r  F)r  Fr  r  r  r  N)rR   rS   rT   rU   r   r  r   Úboolr–   rV   r   r   Útuplerz   r„   rŒ   r¡   r²   rÆ   rÝ   r  r  r'  r;  r›  Ú__classcell__)rl   s   @r   rY   rY   g   s®  ø„ ñð 04Ø).Ø27Ø&>Ð@TÐ%Uñ%àð%ð ð%ð ð	%ð
 &¨Ñ,ð%ð #'ð%ð ,0ð%ð ˜c™õ%ð40À	ð 0ÈeÐTWÐY\ÐT\Éoó 0ðB,&°yð ,&ÀUÈ3ÐPSÈ8Á_ó ,&ð\ Yó ð*  Só  ð25 ð 5¨Sð 5°Só 5ðn+K sð +K¸Cð +KÈ#ó +KðZàðð ˜4Ñðð ˜4Ñð	ð
 ðð 
�TÑ	óð<M,àðM,ð ðM,ð ð	M,ð
 ðM,ð ˜4ÑðM,ð ˜4ÑðM,ð 
ˆy˜) YÐ.Ñ	/óM,ðv !#ØØ$ØØØØØ ñ%wàðwð ˜c‘/ DÑ(ðwð ˜c‘/ DÑ(ð	wð
 ðwð ˜4Ñðwð ˜4Ñðwð ðwð ðwð ðwð ðwð ðwð ðwð ðwð ðwð  ð!wð" ð#wð$ ð%wð& 
�TÑ	ó'wðL ØØØØØØ"ñ'hà˜$‘Jðhð ðhð ð	hð
 ðhð ðhð ðhð ðhð ðhð ðhð ðhð ðhð ðhð ðhð ðhð  ð!hð" ð#hð$ ð%hð& �t‰|ð'hð( 
�TÑ	ó)höTY$r   rY   )Úloggingr   Únumpyrv   Úfusion_baser   Úfusion_optionsr   Úfusion_utilsr   r   Úonnxr   r	   r
   r   Ú
onnx_modelr   rR   r€   r   rY   rW   r   r   ú<module>r¦     sD   ðõ
 ã Ý Ý .ß 1ß =Ó =Ý  á	�8Ó	€÷Sñ Sôlj$�fõ j$r   