+
    G-jïÆ  ã                   ó    € ^ RI Ht ^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
 ^ RIHtHtHtHt ^ RIHt ]! ]4      t ! R R	4      t ! R
 R]4      tR# )é    )Ú	getLoggerN)ÚFusion©ÚAttentionMaskFormat)ÚFusionUtilsÚNumpyHelper)Ú	NodeProtoÚTensorProtoÚhelperÚnumpy_helper©Ú	OnnxModelc                   óf   a € ] tR t^t o RtV 3R lR ltV 3R lR ltR tR tV 3R lR	 lt	R
t
V tR# )ÚAttentionMaskú2
Fuse Attention subgraph into one Attention node.
c                ó    <€ V ^8„  d   QhRS[ /# )é   Úmodelr   )ÚformatÚ__classdict__s   "€Úz/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/transformers/fusion_attention.pyÚ__annotate__ÚAttentionMask.__annotate__   s   ø€ ÷ 7ñ 7™iñ 7ó    c                ó¢   € Wn         / V n        / V n        \        V4      V n        \
        P                  V n        VP                  4       V n	        R # ©N)
r   Úmask_indiceÚmask_castedr   Úutilsr   ÚMaskIndexEndÚmask_formatÚget_opset_versionÚopset_version)Úselfr   s   &&r   Ú__init__ÚAttentionMask.__init__   sB   € ØŒ
àˆÔàˆÔÜ  Ó'ˆŒ
Ü.×;Ñ;ˆÔØ"×4Ñ4Ó6ˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# )r   r!   r   )r   r   s   "€r   r   r       s   ø€ ÷ 'ñ 'Ñ+>ñ 'r   c                ó   € Wn         R # r   )r!   )r$   r!   s   &&r   Úset_mask_formatÚAttentionMask.set_mask_format    s   € Ø&Ör   c                ót   € WP                   9   d   W P                   V,          8X  g   Q hW P                   V&   R # r   )r   )r$   ÚmaskÚ
mask_indexs   &&&r   Úset_mask_indiceÚAttentionMask.set_mask_indice#   s3   € Ø×#Ñ#Ô#Ø×!1Ñ!1°$Õ!7Ô7Ð7Ð7Ø!+×Ñ˜Ór   c                óv   € \        V P                  4      ^ 8”  g   Q h\        \        V P                  4      4      # ©r   )Úlenr   ÚnextÚiter)r$   s   &r   Úget_first_maskÚAttentionMask.get_first_mask(   s1   € Ü�4×#Ñ#Ó$ qÔ(Ð(Ð(Ü”D˜×)Ñ)Ó*Ó+Ð+r   c                ó4   <€ V ^8„  d   QhRS[ RS[ R,          /# )r   Úmask_2dÚreturnN©Ústr)r   r   s   "€r   r   r   ,   s   ø€ ÷ 8ñ 8¡Cð 8©C°$­Jñ 8r   c           
     ó  € V P                   \        P                  8X  d   R # WP                  9   d   V P                  V,          # V P                  P                  V4      '       d   V P                  P                  V4      w  r#MV P                  P                  V4      w  r4RpV'       d   W0P                  V&   V P                   \        P                  8X  d   W0P                  V&   V# V P                  P                  R4      pV P                  ^8  d€   \        P                  ! RV.V.V P                  P                  RR4      R7      pVP                  P!                  \        P"                  ! R^.4      \        P"                  ! R^ 4      .4       MÊRpV P                  P%                  V4      fE   V P                  P'                  \        P(                  ! V\*        P,                  ^.^.R	R
7      4       \        P                  ! RW7.V.V P                  P                  RR4      R7      pVP                  P!                  \        P"                  ! R^ 4      .4       V P                  P/                  V4       WPP                  V&   V# )NTr-   Ú	ReduceSumÚMaskReduceSum©ÚinputsÚoutputsÚnameÚaxesÚkeepdimsÚort_const_1_reduce_sum_axesF©rB   Ú	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$   r8   ÚcastedÚ
input_nameÚ
_cast_nodeÚoutput_nameÚmask_index_nodeÚ	axes_names   &&      r   Úprocess_maskÚAttentionMask.process_mask,   s$  € Ø×ÑÔ2×9Ñ9Ô9Ùà×&Ñ&Ô&Ø×#Ñ# GÕ,Ð,ð �:‰:×&Ñ& w×/Ò/Ø!%§¡×!EÑ!EÀgÓ!NÑˆF�Jà%)§Z¡Z×%CÑ%CÀGÓ%LÑ"ˆJØˆFçØ(2×Ñ˜WÑ%ð ×ÑÔ2×@Ñ@Ô@Ø(2×Ñ˜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Ø!ôôô %×.Ò.ØØ"Ð.Ø$˜Ø—Z‘Z×0Ñ0°¸oÓNô	ˆOð ×%Ñ%×,Ñ,¬f×.CÒ.CÀJÐPQÓ.RÐ-SÔTà�
‰
×Ñ˜OÔ,à$/×Ñ˜Ñ!ØÐr   )r   r!   r   r   r#   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r%   r)   r.   r5   r_   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      s2   ø‡ € ñ÷7ð 7÷'ð 'ò,ò
,÷8ö 8r   r   c                   ó  a a€ ] tR t^gt oRtRRRRR.3V3R lV 3R llltV3R lR	 ltV3R
 lR ltV3R lR ltV3R lR lt	V3R lR lt
V3R lR ltV3R lR ltV3R lR ltRV3R lR lltRV3R lR lltR tRtVtV ;t# ) ÚFusionAttentionr   NFÚSkipLayerNormalizationÚLayerNormalizationc                ób   <€ V ^8„  d   QhRS[ RS[RS[RS[R,          RS[RS[RS[S[,          /# )	r   r   Úhidden_sizeÚ	num_headsÚattention_maskNÚuse_multi_head_attentionÚ!disable_multi_head_attention_biasÚsearch_op_types)r   Úintr   ÚboolÚlistr;   )r   r   s   "€r   r   ÚFusionAttention.__annotate__l   sZ   ø€ ÷ %ñ %áð%ñ ð%ñ ð	%ñ
 &¨Õ,ð%ñ #'ð%ñ ,0ð%ñ ™c�ñ%r   c                óê   <€ V'       d   R MRp\         S	V `  WV4       W n        W0n        V'       d   TM
\	        V4      V n        WPn        W`n        RV n        RV n	        RV n
        RV n        RV n        R# )ÚMultiHeadAttentionÚ	AttentionNT)Úsuperr%   rm   rn   r   ro   rp   rq   Úmask_filter_valueÚnum_heads_warningÚhidden_size_warningÚshape_inferÚshape_infer_done)
r$   r   rm   rn   ro   rp   rq   rr   Úattention_op_nameÚ	__class__s
   &&&&&&&& €r   r%   ÚFusionAttention.__init__l   st   ø€ ÷ 5MÑ0ÐR]ÐÜ‰Ñ˜°?ÔCØ&ÔØ"Œß0>™nÄMÐRWÓDXˆÔØ(@Ô%Ø1RÔ.Ø!%ˆÔð "&ˆÔØ#'ˆÔ àˆÔØ $ˆÖr   c                ó<   <€ V ^8„  d   QhRS[ RS[S[S[3,          /# )r   Úconcatr9   ©r	   Útuplers   )r   r   s   "€r   r   rv   †   s&   ø€ ÷ 0ñ 0Á	ð 0ÉeÑTWÑY\ÐT\Íoñ 0r   c                ó  € \        VP                  4      ^8X  dÛ   V P                  P                  VP                  ^,          4      pV P                  P                  VP                  ^,          4      p\	        V\
        P                  4      '       dc   VP                  ^8X  dR   \	        V\
        P                  4      '       d2   VP                  ^8X  d!   V^ ,          V^ ,          V^ ,          ,          3# V P                  V P                  3# )aÝ  
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
)
r2   Úinputr   Úget_constant_valueÚ
isinstanceÚnpÚndarrayÚsizern   rm   )r$   r„   rn   Ú	head_sizes   &&  r   Ú)get_num_heads_and_hidden_size_from_concatÚ9FusionAttention.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Ò1Ø—N‘N aÔ'Ü˜y¬"¯*©*×5Ò5Ø—N‘N aÔ'à  •| Y¨q¥\°I¸aµLÕ%@Ð@Ð@à�~‰~˜t×/Ñ/Ð/Ð/r   c                ó<   <€ V ^8„  d   QhRS[ RS[S[S[3,          /# )r   Ú	reshape_qr9   r…   )r   r   s   "€r   r   rv   ¥   s$   ø€ ÷ ,&ñ ,&±yð ,&ÁUÉ3ÑPSÈ8Å_ñ ,&r   c                óþ  € V P                   P                  VP                  ^,          4      pVf‚   V P                   P                  V^4      pVe#   VP                  R8X  d   V P                  V4      # \        P                  RVP                  ^,          4       V P                  V P                  3# \        V\        P                  4      '       d-   \        V4      ^8w  g   V^,          ^ 8:  g   V^,          ^ 8:  d/   \        P                  RV4       V P                  V P                  3# V^,          pV^,          pWE,          pV P                  ^ 8”  dK   W@P                  8w  d;   V P                  '       d)   \        P                  RV P                  V4       RV n        V P                  ^ 8”  dK   W`P                  8w  d;   V P                   '       d)   \        P                  RV P                  V4       RV n        WF3# )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
ÚConcatz%s is not initializer.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   r‰   rˆ   Ú
get_parentÚop_typer�   ÚloggerÚdebugrn   rm   rŠ   r‹   rŒ   r2   r|   Úwarningr}   )r$   r’   Úq_shape_valuer„   rn   rŽ   rm   s   &&     r   Úget_num_heads_and_hidden_sizeÚ-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Ò6Ü�=Ó! QÔ&Ø˜aÕ  AÔ%¨°qÕ)9¸QÔ)>ä�L‰LÐbÐdqÔrØ—>‘> 4×#3Ñ#3Ð3Ð3à! !Õ$ˆ	Ø! !Õ$ˆ	ØÕ+ˆà�>‰>˜AÔ )¯~©~Ô"=Ø×%×%Ð%Ü—‘ØTÐVZ×VdÑVdÐfoôð */�Ô&à×Ñ˜aÔ K×3CÑ3CÔ$CØ×'×'Ð'Ü—‘ØVÐX\×XhÑXhÐjuôð ,1�Ô(àÐ%Ð%r   c                ó    <€ V ^8„  d   QhRS[ /# ©r   Úadd_qk)r	   )r   r   s   "€r   r   rv   Ó   s   ø€ ÷ ñ ¡Yñ r   c                óè  € V P                   '       g)   V P                  P                  R R7      V n        R V n         V P                  f   R# V P                  P	                  VP
                  ^ ,          4      pV P                  P	                  VP
                  ^,          4      pVe   Vf   \        P                  RV4       R# W#8w  d   \        P                  RV4       R# VP
                  ^,          # )T)ÚupdateNzone of the inputs of %s is Nonez)the shape of two inputs of %s is not same)r   r   Úinfer_runtime_shaper~   Úget_edge_shaperˆ   r—   r˜   )r$   rŸ   Úinput_0_shapeÚinput_1_shapes   &&  r   Úget_add_qk_strÚ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ÙàÔ)Ü�L‰LÐDÀfÔMÙà�|‰|˜A�Ðr   c                ó    <€ V ^8„  d   QhRS[ /# rž   r:   )r   r   s   "€r   r   rv   è   s   ø€ ÷  ñ  ¡Sñ  r   c                óÌ  a€ VR ,           o\        \        V3R lV P                  4      4      p\        V4      ^8X  d   S# \        V4      ^ 8X  g   Q hV P                  P                  R4      p\        P                  ! R\        V P                  4       Uu. uF  qANK  	  upS.V^R7      pV P                  P                  V4       V P                  V P                  V&   S# u upi )Ú_maskc                 ó0   <€ V P                   ^ ,          S8H  # r1   )Úoutput)ÚnodeÚmask_output_names   &€r   Ú<lambda>Ú0FusionAttention.reshape_add_qk.<locals>.<lambda>î   s   ø€ ¨t¯{©{¸1­~ÐAQÒ/Qr   r”   ©r@   rA   rB   Úaxis)ru   ÚfilterÚnodes_to_addr2   r   rO   r   rP   Úrangern   ÚappendÚthis_graph_nameÚnode_name_to_graph_name)r$   rŸ   Úconcat_nodeÚconcat_node_nameÚ_Úconcat_add_qk_fp32r®   s   &&    @r   Úreshape_add_qkÚFusionAttention.reshape_add_qkè   sÜ   ø€ ð " GÕ+Ðô œ6Ô"QÐSW×SdÑSdÓeÓfˆÜˆ{Ó˜qÔ Ø#Ð#ä�;Ó 1Ô$Ð$Ð$ØŸ:™:×6Ñ6°xÓ@ÐÜ#×-Ò-ØÜ$)¨$¯.©.Ô$9Ó:Ñ$9˜q’FÑ$9Ñ:Ø%Ð&Ø!Øô
Ðð 	×Ñ× Ñ Ð!3Ô4Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6àÐùò ;s   Â
C!
c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r   Úpast_kÚpast_vr9   r:   )r   r   s   "€r   r   rv     s"   ø€ ÷ 5ñ 5¡ð 5©Sð 5±Sñ 5r   c                óZ  € V P                   P                  R4      pV P                   P                  R4      pVR,           P                  RR4      pVR,           P                  RR4      p\        P                  ! RV.V.V^ .R7      p\        P                  ! RV.V.V^ .R7      pV P
                  P                  V4       V P
                  P                  V4       V P                  V P                  V&   V P                  V P                  V&   V P                   P                  R4      p	VP                  RR4      P                  RR4      P                  R	R
4      p
\        P                  ! RWV.V
.V	^ R7      pV P
                  P                  V4       V P                  V P                  V	&   V
# )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@   rA   rB   rC   r”   z.valuez.kvÚ_valueÚ_kvr±   )	r   rO   Úreplacer   rP   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Ð   Ú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ˆÜ×$Ò$ØØÐ)Ø#Ð$Ø!Øô
ˆ	ð 	×Ñ× Ñ  Ô+Ø9=×9MÑ9Mˆ×$Ñ$Ð%5Ñ6àÐr   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r   Úpresent_k_nameÚpresent_v_nameÚkv_noder:   )r   r   s   "€r   r   rv   8  s'   ø€ ÷ +Kñ +K¡sð +K¹Cð +KÉ#ñ +Kr   c                ó„  € RRrTV P                   P                  V4      pV P                   P                  V4      pVfT   \        P                  ! \        P
                  ! ^ RR7      VR7      pV P                   P                  W`P                  4       VfT   \        P                  ! \        P
                  ! ^RR7      VR7      pV P                   P                  WpP                  4       V P                   P                  R4      pV P                   P                  R4      p	\        P                  ! RW4.V.V^ R7      p
\        P                  ! RW5.V.V	^ R7      pV P                  P                  V
4       V P                  P                  V4       V P                  V P                  V&   V P                  V P                  V	&   R# )	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_1NÚint64)Údtype)rB   ÚGatherr±   )r   rT   r   Ú
from_arrayr‹   ÚarrayrU   r·   rO   r   rP   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_kvÚFusionAttention.split_kv8  ss  € ð % i�Ø—
‘
×*Ñ*¨7Ó3ˆØ—
‘
×*Ñ*¨7Ó3ˆØŠ=Ü ×+Ò+¬B¯HªH°Q¸gÔ,FÈWÔUˆEØ�J‰J×&Ñ& u×.BÑ.BÔCØŠ=Ü ×+Ò+¬B¯HªH°Q¸gÔ,FÈWÔUˆEØ�J‰J×&Ñ& u×.BÑ.BÔCð Ÿ
™
×3Ñ3°HÓ=ˆØŸ
™
×3Ñ3°HÓ=ˆÜ×$Ò$ØØÐ%Ø#Ð$ØØô
ˆ	ô ×$Ò$ØØÐ%Ø#Ð$ØØô
ˆ	ð 	×Ñ× Ñ  Ô+Ø×Ñ× Ñ  Ô+Ø6:×6JÑ6Jˆ×$Ñ$ ]Ñ3Ø6:×6JÑ6Jˆ×$Ñ$ ]Ó3r   c                ób   <€ V ^8„  d   QhRS[ RS[ R,          RS[ R,          RS[RS[ R,          /# )r   Úq_addÚk_addNÚv_addÚname_prefixr9   )r	   r;   )r   r   s   "€r   r   rv   e  sL   ø€ ÷ ñ áðñ ˜4Õðñ ˜4Õð	ñ
 ðñ 
�TÕ	ñr   c                ó  € V P                   P                  VP                  ^,          4      ;'       g-    V P                   P                  VP                  ^ ,          4      p\        P                  ! V4      p\
        P                  ! V4      p\
        P                  ! V4      pVew   V P                   P                  VP                  ^,          4      ;'       g-    V P                   P                  VP                  ^ ,          4      p	\        P                  ! V	4      pVew   V P                   P                  VP                  ^,          4      ;'       g-    V P                   P                  VP                  ^ ,          4      p
\        P                  ! V
4      p\
        P                  ! WgV3^ R7      p^\
        P                  ! VP                  4      ,          pVR,           pV P                  VVP                  V.VR7       V# )é   ©r²   Ú	_qkv_bias©rB   rG   rH   rI   )r   rT   rˆ   r   Úto_arrayr‹   Ú
zeros_likeÚstackÚprodÚshaperU   rG   )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_biasÚ(FusionAttention.create_combined_qkv_biase  s€  € ð —‘×+Ñ+¨E¯K©K¸­NÓ;×iÐi¸t¿z¹z×?YÑ?YÐZ_×ZeÑZeÐfgÕZhÓ?iˆÜ×!Ò! &Ó)ˆÜ�]Š]˜2ÓˆÜ�]Š]˜2ÓˆØÒØ—Z‘Z×/Ñ/°·±¸AµÓ?×mÐmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÕ^lÓCmˆFÜ×%Ò% fÓ-ˆBØÒØ—Z‘Z×/Ñ/°·±¸AµÓ?×mÐ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   c                óz   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ R,          RS[ R,          RS[S[ S[ S[ 3,          /# )	r   Úq_matmulÚk_matmulÚv_matmulré   rê   Nrë   r9   )r	   r†   )r   r   s   "€r   r   rv   ƒ  sp   ø€ ÷ M,ñ M,áðM,ñ ðM,ñ ð	M,ñ
 ðM,ñ ˜4ÕðM,ñ ˜4ÕðM,ñ 
‰y™)¡YÐ.Õ	/ñM,r   c                óÈ  € V P                   P                  R4      pVP                  ^ ,          VP                  ^ ,          8X  d*   VP                  ^ ,          VP                  ^ ,          8X  g   Q hV P                   P                  VP                  ^,          4      pV P                   P                  VP                  ^,          4      p	V P                   P                  VP                  ^,          4      p
\        P
                  ! V4      p\        P
                  ! V	4      p\        P
                  ! V
4      pVP                  VP                  8X  d   VP                  VP                  8X  g   Q hVP                  ^ ,          p\        P                  ! W¼V3^R7      P                  V^V,          34      pVR,           pV P                  VVP                  VP                  ^ ,          VP                  ^,          .VR7       VR,           p\        P                  ! RVP                  ^ ,          V.V.VR7      pV P                  V P                  V&   V.pVR,           pV P                  V\         P"                  ^.^ .RR	7       VR
,           pV P                  V\         P"                  ^.V.RR	7       VR,           pV P                  V\         P"                  ^.^V,          .RR	7       VR,           pV P                  V\         P"                  ^.^V,          .RR	7       VR,           pV P                  V\         P"                  ^.R.RR	7       VR,           p\        P                  ! RVVVV.V.V P                   P                  R4      R7      pV P                  V P                  VP$                  &   VR,           p\        P                  ! RVVVV.V.V P                   P                  R4      R7      pV P                  V P                  VP$                  &   VR,           p\        P                  ! RVVVV.V.V P                   P                  R4      R7      pV P                  V P                  VP$                  &   TpTp Tp!VP'                  VVV.4       V P(                  '       Ed¡   VeÝ   V P                   P                  VP                  ^,          4      '       d   ^M^ p"\        P*                  ! \        P
                  ! V P                   P                  VP                  V",          4      4      4      '       dM   VVP                  ^V",
          &   TpVP-                  V4       V P                  V P                  VP$                  &   VeÝ   V P                   P                  VP                  ^,          4      '       d   ^M^ p"\        P*                  ! \        P
                  ! V P                   P                  VP                  V",          4      4      4      '       dM   VVP                  ^V",
          &   Tp VP-                  V4       V P                  V P                  VP$                  &   VeÝ   V P                   P                  VP                  ^,          4      '       d   ^M^ p"\        P*                  ! \        P
                  ! V P                   P                  VP                  V",          4      4      4      '       dM   VVP                  ^V",
          &   Tp!VP-                  V4       V P                  V P                  VP$                  &   V P.                  P'                  V4       VV V!3# )a9  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ï   Ú_qkv_weightrñ   Ú_qkv_outr?   Ú_q_start_indexFrF   Ú_k_start_indexÚ_v_start_indexÚ_end_of_qkv_indexÚ_qkv_last_axisÚ_q_outÚSliceÚ_k_outÚ_v_outéÿÿÿÿ)r   rO   rˆ   rT   r   rò   rö   r‹   rô   ÚreshaperU   rG   r   rP   r·   r¸   r
   rW   rB   rR   rq   Ú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_nodeÚ-FusionAttention.create_packed_qkv_matmul_nodeƒ  s7  € ð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 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Ñ1ØÒ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÅN×)SÒ)S¡AÐYZÐ!Ü—6’6œ+×.Ò.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÕJhÓ/iÓj×kÒkØ9G�E—K‘K Ð$5Õ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ØÒ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÅN×)SÒ)S¡AÐYZÐ!Ü—6’6œ+×.Ò.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÕJhÓ/iÓj×kÒkØ9G�E—K‘K Ð$5Õ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ØÒ Ø)-¯©×)CÑ)CÀEÇKÁKÐPQÅN×)SÒ)S¡AÐYZÐ!Ü—6’6œ+×.Ò.¨t¯z©z×/IÑ/IÈ%Ï+É+ÐVgÕJhÓ/iÓj×kÒkØ9G�E—K‘K Ð$5Õ 5Ñ6Ø$�HØ×$Ñ$ UÔ+Ø?C×?SÑ?S�D×0Ñ0°·±Ñ<ð 	×Ñ× Ñ  Ô+Ø˜ 8Ð+Ð+r   c          %      óì   <€ V ^8„  d   QhRS[ RS[ S[,          R,          RS[ S[,          R,          RS[ RS[ R,          RS[ R,          RS[R	S[R
S[RS[RS[RS[RS[RS[RS[RS[RS[RS[ R,          /# )r   r  r  Nr  ré   rê   rë   rn   rm   r¬   Úkey_padding_maskrŸ   ÚunidirectionalrÀ   rÁ   rä   rå   Ú
packed_qkvr9   )r	   r;   rs   rt   )r   r   s   "€r   r   rv     sô   ø€ ÷ wñ 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r   c                ó~  € V^ 8”  g   Q hV^ 8”  d&   W‡,          ^ 8w  d   \         P                  RW‡4       R# V P                  P                  4       P                   Uu0 uF  pVP
                  kK  	  ppV P                  P                  R4      p. pV'       dd   V P                  VVVVVV4      w  pppVP                  VP                  ^ ,          VP                  ^ ,          VP                  ^ ,          .4       EMf\        V\        4      '       d¹   \        V\        4      '       d£   V P                  '       dI   VP                  VP                  ^ ,          VP                  ^ ,          VP                  ^ ,          .4       MàVP                  VP                  ^ ,          VP                  ^ ,          VP                  ^ ,          .4       M˜\        V\        4      '       d�   \        V\        4      '       dk   VV9   dd   VV9   d]   V P                  '       d&   VP                  VP                  ^ ,          W#.4       M'VP                  VP                  ^ ,          W#.4       MR# V P                  '       g&   V P                  WEVV4      pVP                  V4       MVP                  R4       V'       d   V'       d   VP                  W«WÞ.4       M"V
'       g	   V'       d   VP                  W«.4       V	.pV'       d   V'       d   VP                  VV.4       \         P"                  ! RVVVR7      pRVn        VP&                  P                  \         P(                  ! RV4      4       V'       d:   VP&                  P                  \         P(                  ! R	\+        V4      4      4       V P-                  R4       V# u upi )
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.
ú9input hidden size %d is not a multiple of num of heads %dNry   Ú rx   r?   úcom.microsoftrn   r6  )r—   r˜   r   Úgraphrˆ   rB   rO   r2  rR   r¬   rŠ   r	   rq   r;   r   r¶   r   rP   ÚdomainrQ   rS   rs   Úincrease_counter)r$   r  r  r  ré   rê   rë   rn   rm   r¬   r5  rŸ   r6  rÀ   rÁ   rä   rå   r7  r­   Úgraph_input_namesÚmha_node_nameÚ
mha_inputsr)  r+  r-  rÿ   Úmha_outputsÚmha_nodes   &&&&&&&&&&&&&&&&&&          r   Úcreate_multihead_attention_nodeÚ/FusionAttention.create_multihead_attention_node  sñ  € ð^ ˜1Œ}Ðˆ}à˜Œ? Õ 7¸AÔ=Ü�L‰LÐTÐVaÔmÙà37·:±:×3CÑ3CÓ3E×3KÒ3KÓLÑ3K¨4˜TŸYœYÑ3KÐÐLØŸ
™
×3Ñ3°KÓ@ˆð ˆ
ßØ(,×(JÑ(JØØØØØØó)Ñ%ˆG�W˜gð ×Ñ˜wŸ~™~¨aÕ0°'·.±.ÀÕ2CÀWÇ^Á^ÐTUÕEVÐWÖXÜ˜¤)×,Ò,´¸HÄi×1PÒ1PØ×5×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Ø×!Ñ! 5§<¡<°¥?°HÐ"GÕHà×!Ñ! 8§?¡?°1Õ#5°xÐ"JÕKáð ×5×5Ð5Ø×5Ñ5°eÀ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   ÁN:c          '      ó¶   <€ V ^8„  d   QhRS[ R,          RS[RS[RS[RS[RS[RS[R	S[R
S[RS[ RS[ RS[ RS[RS[ RS[ RS[ RS[ RS[R,          RS[R,          /# )r   r-   Nr  r  r  ré   rê   rë   rn   rm   Úfirst_inputr¬   Ú
add_qk_strÚcausalrÀ   rÁ   rä   rå   Úscaler9   )r;   r	   rs   rt   Úfloat)r   r   s   "€r   r   rv   Œ  së   ø€ ÷ hñ há˜$•Jðhñ ðhñ ð	hñ
 ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ ðhñ  ð!hñ" ð#hñ$ ð%hñ& �t�|ð'hñ( 
�TÕ	ñ)hr   c                óÆ  € V^ 8”  g   Q hV	^ 8”  d&   W˜,          ^ 8w  d   \         P                  RW˜4       R# RpVf   Vf   Vf   RpV P                  P                  VP                  ^,          4      pV P                  P                  VP                  ^,          4      pV P                  P                  VP                  ^,          4      pRRRpppV'       EdC   V P                  P                  VP                  ^,          4      ;'       g-    V P                  P                  VP                  ^ ,          4      pV P                  P                  VP                  ^,          4      ;'       g-    V P                  P                  VP                  ^ ,          4      pV P                  P                  VP                  ^,          4      ;'       g-    V P                  P                  VP                  ^ ,          4      pV'       d   V'       d   V'       d	   V'       g   R# Vf"   \        VP                  ^,           R24       R# \        P                  ! V4      p\        P                  ! V4      p\        P                  ! V4      pVP                  VP                  8X  g   Q hVP                  ^ ,          pVP                  ^ ,          pVP                  ^ ,          pVTu;8X  d	   V8X  g   Q h Q hV	^ 8”  d   V	V8w  d   \         P                  RV	V4       Rp VP                  VP                  8w  d   Rp \        P                  ! VP                  R,          4      p!\        P                  ! VP                  R,          4      p"\        P                  ! VP                  R,          4      p#^ p$V '       d-   \        P                  ! VVV3^R7      p%V!V",           V#,           p$M$\        P                  ! VVV3^R7      p%^V!,          p$^ p&Rp'V'       Ed   \        P                  ! V4      p(\        P                  ! V4      p)\        P                  ! V4      p*\        P                  ! V(P                  4      p+\        P                  ! V)P                  4      p,\        P                  ! V*P                  4      p-V+T,u;8X  d	   V!8X  g   Q h Q hV-V#8X  g   Q hV '       d-   \        P                  ! V(V)V*3^ R7      p'V+V,,           V-,           p&M$\        P                  ! V(V)V*3^ R7      p'^V+,          p&V P                  P                  R	4      p.V P                  '       g2   V P!                  V.R
,           VP"                  V\%        V$4      .V%R7       V'       d1   V P!                  V.R,           VP"                  \%        V&4      .V'R7       V P                  '       d£   V'       d   \         P                  R4       R# VP&                  ^ ,          VP&                  ^ ,          VP&                  ^ ,          V.R,           .p/Ve   V/P)                  V4       \*        P,                  ! RV/V.V.R7      p0V P/                  R4       EM@T
V.R
,           V'       d
   V.R,           MR.p/Ve   V/P)                  V4       MV/P)                  R4       T;'       d    Tp1V1'       d#   V P1                  Wï4      p2V/P)                  V24       V'       d+   V1'       g   V/P)                  R4       V/P)                  V4       V.p3V'       d_   V'       dW   VP3                  RR4      P3                  RR4      P3                  RR4      p4V3P)                  V44       V P5                  VVV44       \*        P,                  ! R	V/V3V.R7      p0V P/                  R	4       RV0n        V0P8                  P;                  \*        P<                  ! RV4      .4       V'       d2   V0P8                  P;                  \*        P<                  ! R^4      .4       Ve2   V0P8                  P;                  \*        P<                  ! RV4      .4       V '       d5   V0P8                  P;                  \*        P<                  ! RV!V"V#.4      .4       V P>                  eE   V0P8                  P;                  \*        P<                  ! R\A        V P>                  4      4      .4       V0# )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.
r9  NTFzl 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 0:rî   NNrï   ry   r  rñ   rð   zVMultiHeadAttention does not support relative_position_bias: cannot fuse the attention.rx   r?   r:  z.keyÚ_keyrÅ   r»   r;  rn   r6  rJ  Úqkv_hidden_sizesr{   )!r—   r˜   r   rT   rˆ   Úprintr   rò   rö   r™   r‹   rõ   Úconcatenaterô   rO   rp   rU   rG   rs   r¬   r¶   r   rP   r>  rÐ   rÈ   ræ   r=  rQ   rR   rS   r{   rK  )5r$   r-   r  r  r  ré   rê   rë   rn   rm   rG  r¬   rH  rI  rÀ   rÁ   rä   rå   rJ  Ú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_nodeÚ%FusionAttention.create_attention_nodeŒ  s(  € ð\ ˜1Œ}Ðˆ}à˜Œ? Õ 7¸AÔ=Ü�L‰LÐTÐVaÔmÙàˆØŠ=˜Uš]¨uª}ØˆHà—:‘:×-Ñ-¨h¯n©n¸QÕ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÕ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÕ.?Ó@ˆà!% t¨T˜�ˆßˆ8Ø—Z‘Z×/Ñ/°·±¸AµÓ?×mÐmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÕ^lÓCmˆFØ—Z‘Z×/Ñ/°·±¸AµÓ?×mÐmÀ4Ç:Á:×C]ÑC]Ð^c×^iÑ^iÐjkÕ^lÓCmˆFØ—Z‘Z×/Ñ/°·±¸AµÓ?×mÐ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 r�lÓ+ˆÜ—g’g˜bŸh™h r�lÓ+ˆÜ—g’g˜bŸh™h r�lÓ+ˆàˆßÜŸš¨¨R°¨¸1Ô=ˆJØ(¨;Õ6¸ÕD‰NäŸš 2 r¨2 ,°QÔ7ˆJØ �_ˆNàˆØ&*ˆßˆ8Ü×%Ò% 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                óp  € TpTpVP                   R 8X  dX   V P                  P                  VR^ 4      pVe   TpM3V P                  P                  VP                  ^ ,          4      e   TpMR# V P                  P                  V. RO. RO4      pRpVe   Vw   ršr¼M-V P                  P                  V. R O. R!O4      pVe   Vw  r˜r¼MR# . p\        VP                  4       F[  w  rïWó9  d    V P                  P                  V4      f   K*  W÷^ ,          P                  ^ ,          8X  d   KJ  VP                  V4       K]  	  \        V4      ^8w  d   R# V^ ,          pV P                  P                  VR^ 4      pVe‰   VVP                  ^ ,          ,          pVeA   \        V4      ^8X  d1   V^,          pVP                   R 8X  d   VP                  ^ ,          pMuR# Ve%   \        V4      ^8X  d   VP                  ^ ,          pMKR# VP                   R"9   d9   VV,          pV F)  pVP                   R 8X  g   K  VP                  ^ ,          pK+  	  VV9   dH   VV,          pVP                   R8X  d.   \        VP                  4      ^8X  d   VP                  ^ ,          pVV,          pV Uu. uF  pVP                   NK  	  ppVP                  R4      ^8w  d   R# V P                  P                  V. R#O. R$O4      pVf   \        P                  R4       R# Vw   p	ppRpRpRpRpR	. R%O. R&O3R
. R'O. R&O3R. R(O. R)O3R. R*O. R+O3R. R,O. R-O3R. R.O. R/O3/pRp VP                  4        F^  w  p!p"V P                  P                  VV"^ ,          V"^,          4      p V f   K7  V!R8X  d   RpMV!R8X  d   RpMV!R8X  d   RpM	V!R8X  d   Rp M	  V f   \        P                  R4       R# Rp#Rp$Rp%Rp&V'       d	   V w  p	p%p$p	M7V'       d	   V w  p	p#p%p$M'V'       d   V w   p	p$MV'       d
   V w  p	p#p$p&p	MV w  p	p#p	p$T&;'       g    T$p&V P                  P                  V&. R#O. R0O4      p'V'f=   V P                  P                  V&. R1O. R2O4      p'V'f   \        P                  R4       R# V'R3,          p(V'R4,          p)V'R5,          p*T$p+V'       dB   V P                  P                  V$RR.^R.4      p,V,f   \        P                  R4       R# V,w  p+p	V P                  P                  T+. R#OV'       d   ^ M^^ ^ R.4      p-V-f=   V P                  P                  V$. R6O. R7O4      p-V-f   \        P                  R4       R# V-R4,          p.V-R5,          p/Rp0Rp1V'       d8   V P                  P                  V%. R8O. R-O3. R9O. R-O3. R:O. R;O3.V4      w  p	p0p	M¯V'       db   V P                  P                  V%. R<O. R;O3. R9O. R-O3.V4      w  p	p0p	V#e.   V P                  V#4      p1V1f   \        P                  RV#4       R# MFV'       d   M=V P                  P                  V#. R=O. R>O3. R?O. R@O3. RAO. RBO3. RCO. RDO3.V4      w  p	p0p	V'       g   V0f   \        P                  R4       R# V'       g¬   \        V04      ^8”  dœ   V P                  P!                  V0^ ,          4      w  p	p2V2eG   \#        V2\$        P&                  4      '       d'   V2P(                  ^8X  d   V2P+                  4       ^ 8¼  d   R# V2P+                  4       RE8w  d   V2P+                  4       V n        VP                  ^ ,          V8X  EdÏ   V*P                  ^ ,          V8X  Ed´   V/P                  ^ ,          V8X  Ed™   V'       g4   V P.                  P1                  V0R5,          P                  ^ ,          4      MRp3Vf   X
MTp4V P3                  V(4      w  p5p6V5^ 8:  g   V6^ 8:  d   \        P5                  R4       R# V P7                  V3V*V/VV)V.VV5V6VV4P                  ^ ,          V1R7      p7V7f   R# V P8                  P                  V74       V P:                  V P<                  V7P>                  &   VeÎ   VP                  ^ ,          p8RV8,           p9V PA                  RV8,           \B        PD                  ^.^ ^ V5\G        V6V5,          4      .RR7      p:V P                  PI                  \J        PL                  ! RV4P                  ^ ,          V:P>                  .V9.RV8,           4      V P:                  4       V9VP                  ^ &   V PN                  PQ                  V4W¼.4       V PN                  PQ                  V 4       V PN                  PQ                  V PR                  '       g   T'MV'RR5 4       V PN                  PQ                  V PR                  '       g   T-MV-RR5 4       V PN                  PQ                  V PR                  '       g   TMVRR5 4       RV n*        R# R# R# R# u upi )Frk   ÚAddNr  ÚReshapeÚMulrj   z&fuse_attention: failed to match v pathFÚpath1Úpath2Úpath3Úpath4Úpath5ÚsdpaÚSqrtTz'fuse_attention: failed to match qk pathz&fuse_attention: failed to match q pathz/fuse_attention: failed to match mul sqrt q pathz&fuse_attention: failed to match k pathr:  z6fuse_attention: failed to verify shape inference of %sz)fuse_attention: failed to match mask pathzmFailed to detect num_heads and hidden_size for Attention fusion. Please specify those parameters in argument.)r-   r  r  r  ré   rê   rë   rn   rm   rG  r¬   rH  Úedge_modified_Úshape_modified_tensorrF   Úreshape_modified_)rg  r  rh  Ú	Transposer  )NNr   r   r   )rg  ÚEinsumrt  r  )rî   Nr   r   )rk   rj   )rt  rh  rg  r  )rî   r   r   N)ÚSoftmaxrg  ÚDivr  )r   r   Nr   )rv  rg  ri  r  )rv  ÚWherer  rw  )r   r   r   r   )rv  rg  rx  r  )r   r   r   r   )rv  rw  r  )r   r   r   )rv  rg  r  ri  rp  )r   r   Nr   rî   )r   r   r   N)rw  rt  rh  rg  r  )r   r   r   r   Néýÿÿÿéþÿÿÿr  )rt  rt  rh  rg  r  )rî   r   r   r   N)ÚExpandrh  ÚEqual)r|  rÃ   rÃ   )ÚCastr{  rh  r|  )r   r   r   r   )r}  r|  rÃ   rÃ   )ri  ÚSubr}  rÃ   rÃ   )Nr   rî   r   r   )ri  r~  rÃ   rÃ   )Nr   rî   r   )rx  r}  r~  r{  rÃ   rÃ   )Nr   r   rî   r   r   )rx  r}  r~  r}  r{  rÃ   rÃ   )Nr   r   rî   r   r   r   iðØÿÿ)+r–   r   Úmatch_parentrL   rˆ   Úmatch_parent_pathÚ	enumerater¬   r¶   r2   Úcountr—   r˜   ÚitemsÚmatch_parent_pathsr¦   Úget_constant_inputrŠ   r‹   rŒ   r�   Úitemr{   ro   r_   r›   r™   rd  r´   r·   r¸   rB   rU   r
   rW   rs   rX   r   rP   Únodes_to_removerR   rp   Ú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_nodesrH  Úmul_valr-   Úattention_last_nodeÚq_num_headsÚq_hidden_sizeÚnew_nodeÚunique_indexÚnew_edgeÚshape_tensors;   &&&&                                                       r   ÚfuseÚ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Ñ;� °
áàˆÜ'¨
×(8Ñ(8Ö9‰NˆBØÔ4Ø—:‘:×.Ñ.¨zÓ:ÒBÙà 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Û!�Ø—=‘=Ð$8Ö8Ø!&§¡¨a¥’Jñ "ð Ð,Ô,Ø-¨jÕ9ˆKØ×"Ñ"Ð&>Ô>Ä3À{×GYÑGYÓCZÐ^_ÔC_Ø(×/Ñ/°Õ2�
à& zÕ2ˆÙ5=Ó>±X¨E˜%Ÿ-œ-±XˆÐ>Ø×Ñ Ó)¨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Ò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Ð(XÔYØ× Ñ ×'Ñ'¨Ô1ð × Ñ ×'Ñ'°t×7T×7TÐ7T©ÐZaÐbeÐceÐZfÔgØ× Ñ ×'Ñ'°t×7T×7TÐ7T©ÐZaÐbeÐceÐZfÔgØ× Ñ ×'Ñ'°t×7T×7TÐ7T©ÐZaÐbeÐceÐZfÔgð  $ˆDÖñI TsÑ/NÑ*ùòq ?s   Ê&h3)ro   rq   rm   r}   r{   rn   r|   rˆ  r~   r   rp   )r:  r:  Fr:  r:  r:  r:  F)r:  Fr:  r:  r:  r:  N)ra   rb   rc   rd   re   r%   r�   r›   r¦   r½   rÐ   ræ   r   r2  rD  rd  r¼  rf   rg   Ú__classcell__)r�   r   s   @@r   ri   ri   g   s¦   ù‡ € ñð 04Ø).Ø27Ø&>Ð@TÐ%U÷%õ %÷40ð 0÷>,&ð ,&÷\ð ÷* ð  ÷25ð 5÷n+Kð +K÷Zð ÷<M,ð M,÷`wò w÷rhò h÷Tx$ò x$r   ri   )Úloggingr   Únumpyr‹   Úfusion_baser   Úfusion_optionsr   Úfusion_utilsr   r   Úonnxr	   r
   r   r   Ú
onnx_modelr   ra   r—   r   ri   © r   r   Ú<module>rÇ     sD   ðõ
 ã Ý Ý .ß 1ß =Ó =Ý  á	�8Ó	€÷Sñ SôlG$�fö G$r   