Ë
    �…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     új/root/aria/tools/markitdown-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                 óÆ  — t        |j                  «      dk(  r²| j                  j                  |j                  d   «      }| j                  j                  |j                  d   «      }t	        |t
        j                  «      rH|j                  dk(  r9t	        |t
        j                  «      r|j                  dk(  r|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Ò'à  ‘| 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   rs   rr   Ú
get_parentÚop_typery   ÚloggerÚdebugr]   r\   rt   ru   rv   r&   rg   Úwarningrh   )r   rz   Úq_shape_valuerm   r]   rx   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_shaperr   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_arrayru   Ú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_kv8  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   rr   r   Úto_arrayru   Ú
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_biase  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_axiséÿÿÿÿÚ_q_outÚSliceÚ_k_outÚ_v_out)r   rA   rr   rF   r   rÎ   rÒ   ru   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   Úgraphrr   r3   rA   r  rD   r�   rt   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   rr   Úprintr   rÎ   rÒ   r�   ru   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 }0d3}1|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| j                  |#«      }1|1€Wt        j                  d9|#«       y |rn=| j                  j                  |#g d:¢g d;¢fg d<¢g d=¢fg d>¢g d?¢fg d@¢g dA¢fg|«      \  }	}0}	|s|0€t        j                  dB«       y |s–t        |0«      dkD  rˆ| j                  j!                  |0d   «      \  }	}2|2�<t#        |2t$        j&                  «      r"|2j(                  dk(  r|2j+                  «       dk\  ry |2j+                  «       dCk7  r|2j+                  «       | _        |j                  d   |k(  �rw|*j                  d   |k(  �rc|/j                  d   |k(  �rO|s+| j.                  j1                  |0d-   j                  d   «      nd }3|€
n|}4| j3                  |(«      \  }5}6|5dk  s|6dk  rt        j5                  dD«       y | j7                  |3|*|/||)|.||5|6||4j                  d   |1¬E«      }7|7€y | j8                  j                  |7«       | j:                  | j<                  |7j>                  <   |�´|j                  d   }8dF|8z   }9| jA                  dG|8z   tB        jD                  dgdd|5tG        |6|5z  «      gd¬H«      }:| j                  jI                  tK        jL                  dI|4j                  d   |:j>                  g|9gdJ|8z   «      | j:                  «       |9|j                  d<   | jN                  jQ                  |4||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 )KNr[   Ú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éýÿÿÿéþÿÿÿré   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   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>   rr   Úmatch_parent_pathÚ	enumerater�   r™   r&   Úcountr   r€   ÚitemsÚmatch_parent_pathsr‹   Úget_constant_inputrt   ru   rv   rw   Ú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_nodesrz   Úadd_qÚmatmul_qÚafter_kÚmul_k_nodesÚk_nodesÚadd_kÚmatmul_kÚ
mask_nodesr  Úmul_valr"   Úattention_last_nodeÚq_num_headsÚq_hidden_sizeÚnew_nodeÚunique_indexÚnew_edgeÚshape_tensors;                                                              r   ÚfusezFusionAttention.fusev  sÛ	  € ð ˆØ#ˆ
Ø×!Ñ!Ð%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×<Ñ<ØâEÒGYÐZÚ=ºÐOâQÒShÐiÚYÒ[sÐtðð $ó
 ÑˆAˆz˜1ñ $¨
Ð(:Ü�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ÙZn˜×,Ñ,×9Ñ9¸*ÀR¹.×:NÑ:NÈqÑ:QÔRÐtxˆJà1<Ð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ÕðI TsÐ/NÐ*ùòq ?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   Útuplery   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ð>,&°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x$r   rY   )Úloggingr   Únumpyru   Ú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G$�fõ G$r   