§
    kŠtj¼5  ã                   óx   — d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
  ee¦  «        Z G d„ de¦  «        ZdS )	é    )Ú	getLogger)ÚAttentionMaskÚFusionAttention)ÚAttentionMaskFormat)Ú	NodeProto)Ú	OnnxModelc                   óV   ‡ — e Zd ZdZdededefˆ fd„Zdedeeef         fd„Z	d	„ Z
ˆ xZS )
ÚFusionAttentionClipzB
    Fuse Attention subgraph of Clip into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsc                 ó˜   •— t          |¦  «        }t          j        |_        t	          ¦   «                              ||||ddg¬¦  «         d S )NFÚSkipLayerNormalization)Úuse_multi_head_attentionÚsearch_op_types)r   r   ÚNoMaskÚmask_formatÚsuperÚ__init__)Úselfr   r   r   Úattention_maskÚ	__class__s        €úl/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_attention_clip.pyr   zFusionAttentionClip.__init__   s]   ø€ õ ' uÑ-Ô-ˆÝ%8Ô%?ˆÔ"å‰Œ×ÒØØØØØ%*Ø5Ð6ð 	ñ 	
ô 	
ð 	
ð 	
ð 	
ó    Ú	reshape_qÚreturnc                 ól  — | j                              |dd¦  «        }|�t          |j        ¦  «        dk    r| j        | j        fS | j                              |j        d         ¦  «        }|€| j        | j        fS t          |¦  «        dk    s|d         dk    r| j        | j        fS |d         }| j                              |j        d         ¦  «        }|€| j        | j        fS t          |¦  «        dk    s|d         dk    r| j        | j        fS |d         }||z  }| j        dk    r?|| j        k    r4| j        r-t           	                    d| j        › d	|› d
�¦  «         d| _        | j        dk    r?|| j        k    r4| j
        r-t           	                    d| j        › d	|› d
�¦  «         d| _
        ||fS )zÏDetect num_heads and hidden_size for ONNX model from MiDaS
        Args:
            reshape_q (NodeProto): reshape node for q
        Returns:
            Tuple[int, int]: num_heads and hidden_size
        ÚConcaté   Né   é   r   é   z--num_heads is z. Detected value is z. Using detected value.Fz--hidden_size is )r   Úmatch_parentÚlenÚinputr   r   Úget_constant_valueÚnum_heads_warningÚloggerÚwarningÚhidden_size_warning)r   r   ÚconcatÚnum_head_valuer   Úhead_size_valueÚ	head_sizer   s           r   Úget_num_heads_and_hidden_sizez1FusionAttentionClip.get_num_heads_and_hidden_size&   së  € ð ”×(Ò(¨°H¸aÑ@Ô@ˆØˆ>�S ¤Ñ.Ô.°!Ò3Ð3Ø”> 4Ô#3Ð3Ð3ð œ×6Ò6°v´|ÀA´ÑGÔGˆØÐ!Ø”> 4Ô#3Ð3Ð3åˆ~ÑÔ !Ò#Ð# ~°aÔ'8¸AÒ'=Ð'=Ø”> 4Ô#3Ð3Ð3à" 1Ô%ˆ	àœ*×7Ò7¸¼ÀQ¼ÑHÔHˆØÐ"Ø”> 4Ô#3Ð3Ð3åˆÑÔ 1Ò$Ð$¨¸Ô(:¸aÒ(?Ð(?Ø”> 4Ô#3Ð3Ð3à# AÔ&ˆ	à )Ñ+ˆàŒ>˜AÒÐ )¨t¬~Ò"=Ð"=ØÔ%ð /Ý—’Ðw°´ÐwÐwÐU^ÐwÐwÐwÑxÔxÐxØ).�Ô&àÔ˜aÒÐ K°4Ô3CÒ$CÐ$CØÔ'ð 1Ý—’Ør¨Ô(8ÐrÐrÈkÐrÐrÐrñô ð ð ,1�Ô(à˜+Ð%Ð%r   c                 ó†  — d }d }dD ]$}| j                              |d|¦  «        }|�|}|}Œ%d }|�|j        d         }n~dD ]w}d }| j                              |d|¦  «        }	| j                              |d|¦  «        }
|	�|	}n|
�|
}|€ŒH| j                              |d|d¦  «        }|€Œh|j        d         }|} |€d S | j                              |g d¢d	|z
  d d dddg¦  «        }|€>| j                              |g d
¢g d¢¦  «        }|€t
                               d¦  «         d S |d         |d         |d         }}}| j                              |g d¢g d¢¦  «        }|€>| j                              |g d¢g d¢¦  «        }|€t
                               d¦  «         d S |d         |d         }}d }d }g }| j                              |g d¢g d¢|¬¦  «        }|€Ù| j                              |ddgddg¦  «        }|€¶| j                              |g d¢g d¢¦  «        }|�	|d	         }n´| j                              |g d¢g d¢¦  «        }|€i| j                              |g d¢g d ¢¦  «        }|�	|d         }ng| j                              |g d!¢g d"¢¦  «        }|€t
                               d#¦  «         d S n(t          |¦  «        d	k    sJ ‚d	|d         z
  }|d         }|d         }| j                              |g d$¢g d%¢¦  «        }|€G| j                              |g d¢g d&¢¦  «        }|€t
                               d'¦  «         d S |d	         }n|d         }|d         |d         }}| j                              |g d(¢g d)¢¦  «        }|€>| j                              |g d¢g d¢¦  «        }|€t
                               d*¦  «         d S |d         |d         }}|j        d         |k    s"|j        d         |k    s|j        d         |k    rt
                               d+¦  «         d S |  	                    |¦  «        \  }} |dk    s| dk    rt
                               d,¦  «         d S |}!d-}"d }#d }$|�¶|j        d	         d.k    r|j        d	         }"n—| j                              |g d/¢g d0¢¦  «        }%|%�|j        d	         }"ng| j                              |g d1¢|dddddg¦  «        }#| j                              |g d2¢|ddddg¦  «        }$|#€|$€t
                               d3¦  «         d S |  
                    d |||||||| ||!j        d         |"d |#d up|$d u¬4¦  «        }&|&€t
                               d5¦  «         d S | j                             |&¦  «         | j        | j        |&j        <   | j                             |!|g¦  «         d6| _        d S )7N)r   r   r   r   )r   r   ÚAddÚLayerNormalizationF)r1   ÚMatMulÚReshapeÚ	Transposer4   r3   r   )r1   r3   r4   r5   r3   )r   Nr   r   r   z(fuse_attention: failed to match qkv pathr!   r"   éÿÿÿÿ)r4   r5   r4   r1   r3   )r   r   r   r   N)r5   r4   r1   r3   )r   r   r   Nz&fuse_attention: failed to match v pathéþÿÿÿ)ÚSoftmaxr4   r1   r4   r3   )r   r   r   Nr   )Úreturn_indicer8   r3   )r8   r1   ÚMulr3   )r   r   r   r   )r8   r:   r3   )r   r   r   )ÚCastr;   r8   r1   r:   r3   )r   r   r   r   r   r   )r;   r;   r8   r:   r3   )r   r   r   r   r   z'fuse_attention: failed to match qk path)r4   r5   r4   r:   r1   r3   )r   r   r   r   NN)r   r   r   Nz&fuse_attention: failed to match q path)r5   r4   r5   r4   r1   r3   )r   r   r   r   r   Nz&fuse_attention: failed to match k pathz>fuse_attention: expect to have same input to q, k and v matmulz9fuse_attention: failed to detect num_heads or hidden_sizeÚ r   )	ÚWhereÚSubr;   ÚExpandÚ	Unsqueezer@   r4   r4   r;   )	r   r!   r   r   r   r   r   r   r   )r   r?   r@   r@   r=   ÚLess)r?   r@   r@   r=   rA   z4fuse_attention: failed to match causal mask subgraph)Ú
mask_indexÚq_matmulÚk_matmulÚv_matmulÚq_addÚk_addÚv_addr   r   Úfirst_inputÚoutputÚ
add_qk_strÚscaleÚcausalz+fuse_attention: failed to create fused nodeT)r   r#   rJ   Úfind_first_child_by_typeÚmatch_parent_pathr(   Údebugr$   r%   r/   Úcreate_attention_nodeÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_nameÚnameÚnodes_to_removeÚextendÚprune_graph)'r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚskip_input_indexÚnode_before_layer_normÚiÚparentÚ
root_inputÚnode_before_layer_norm_1Únode_before_layer_norm_2ÚchildÚ	qkv_nodesÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚv_nodesÚadd_vÚmatmul_vÚcausal_mask_input_indexÚadd_maskÚadd_mask_indicesÚqk_nodesÚ	matmul_qkÚq_nodesr   Úadd_qÚmatmul_qÚk_nodesÚadd_kÚmatmul_kr   r   Úattention_last_nodeÚadd_qkÚcausal_mask_nodes_1Úcausal_mask_nodes_2Úadd_qk_nodesÚnew_nodes'                                          r   ÚfusezFusionAttentionClip.fuseT   s½  € ØÐØ!%ÐØð 	0ð 	0ˆAØ”Z×,Ò,¨^Ð=UÐWXÑYÔYˆFØÐ!Ø#$Ð Ø)/Ð&øàˆ
Ø!Ð-Ø/Ô6°qÔ9ˆJˆJð ð (ð (�Ø)-Ð&à+/¬:×+BÒ+BÀ>ÐSXÐZ[Ñ+\Ô+\Ð(Ø+/¬:×+BÒ+BÀ>ÐSgÐijÑ+kÔ+kÐ(Ø+Ð7ð .FÐ*Ð*Ø-Ð9ð .FÐ*à)Ð1ØØœ
×;Ò;Ø*Ø(Ø'Øñ	ô �ð �=ØØ"œ\¨!œ_�
Ø#$Ð ØàÐ'Ø�à”J×0Ò0ØØJÐJÐJØÐ!Ñ! 4¨¨q°!°QÐ7ñ
ô 
ˆ	ð
 ÐØœ
×4Ò4ØØCÐCÐCØ"Ð"Ð"ñô ˆIð
 Ð Ý—’ÐGÑHÔHÐHØ�à�aŒLØ�aŒLØ�bŒMð %/�]ˆð ”*×.Ò.ØØ@Ð@Ð@ØÐÐñ
ô 
ˆð
 ˆ?Ø”j×2Ò2ØÐEÐEÐEÀÀÀñô ˆGð ˆÝ—’ÐEÑFÔFÐFØ�à! "œ+ w¨r¤{ˆxˆà"&ÐØˆØÐØ”:×/Ò/ØØ>Ð>Ð>ØÐÐØ*ð	 0ñ 
ô 
ˆð ÐØ”z×3Ò3ØØ˜HÐ%Ø�A�ñô ˆHð
 ÐØœ:×7Ò7¸
ÐDgÐDgÐDgÐiuÐiuÐiuÑvÔv�ØÐ'Ø'¨œ{�H�Hð  $œz×;Ò;¸JÐHdÐHdÐHdÐfoÐfoÐfoÑpÔp�HØÐ'à#'¤:×#?Ò#?Ø&ØOÐOÐOØ.Ð.Ð.ñ$ô $˜ð
 $Ð/Ø'/°¤{˜H˜Hð (,¤z×'CÒ'CØ *Ø LÐ LÐ LØ /  ñ(ô (˜Hð
  (Ð/Ý &§¢Ð-VÑ WÔ WÐ WØ & øåÐ'Ñ(Ô(¨AÒ-Ð-Ð-Ð-Ø&'Ð*:¸1Ô*=Ñ&=Ð#Ø ”{ˆHà˜R”Lˆ	à”*×.Ò.ØØGÐGÐGØ$Ð$Ð$ñ
ô 
ˆð
 ˆ?Ø”j×2Ò2ØÐDÐDÐDÀoÀoÀoñô ˆGð ˆÝ—’ÐEÑFÔFÐFØ�à œ
ˆIˆIà œ
ˆIà! "œ+ w¨r¤{ˆxˆà”*×.Ò.ØØMÐMÐMØ!Ð!Ð!ñ
ô 
ˆð
 ˆ?Ø”j×2Ò2ØÐDÐDÐDÀoÀoÀoñô ˆGð ˆÝ—’ÐEÑFÔFÐFØ�à! "œ+ w¨r¤{ˆxˆàŒ>˜!Ô 
Ò*Ð*¨h¬n¸QÔ.?À:Ò.MÐ.MÐQYÔQ_Ð`aÔQbÐfpÒQpÐQpÝ�LŠLÐYÑZÔZÐZØˆFà!%×!CÒ!CÀIÑ!NÔ!NÑˆ	�;Ø˜Š>ˆ>˜[¨AÒ-Ð-Ý�LŠLÐTÑUÔUÐUØˆFà)ÐàˆØ"ÐØ"ÐØÐØŒ~˜aÔ Ð$4Ò4Ð4Ø!œ¨Ô*��ð  $œz×;Ò;Øð
ð 
ð 
ð 0Ð/Ð/ñ ô  �ð  Ð+Ø%œ^¨AÔ.�F�Fð +/¬*×*FÒ*FØ ØWÐWÐWØ0°!°Q¸¸1¸aÐ@ñ+ô +Ð'ð +/¬*×*FÒ*FØ ØMÐMÐMØ0°!°Q¸¸1Ð=ñ+ô +Ð'ð +Ð2Ð7JÐ7RÝŸšÐ%[Ñ\Ô\Ð\Ø˜à×-Ò-ØØØØØØØØØ#Ø"Ø&Ô-¨aÔ0ØØØ'¨tÐ3ÐYÐ9LÐTXÐ9Xð .ñ 
ô 
ˆð  ÐÝ�LŠLÐFÑGÔGÐGØˆFàÔ× Ò  Ñ*Ô*Ð*Ø6:Ô6JˆÔ$ X¤]Ñ3ØÔ×#Ò#Ð%8¸-Ð$HÑIÔIÐIð  ˆÔÐÐr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   Útupler/   r}   Ú__classcell__)r   s   @r   r
   r
      s¥   ø€ € € € € ðð ð
àð
ð ð
ð ð	
ð 
ð 
ð 
ð 
ð 
ð$,&°yð ,&ÀUÈ3ÐPSÈ8Ä_ð ,&ð ,&ð ,&ð ,&ð\@ ð @ ð @ ð @ ð @ ð @ ð @ r   r
   N)Úloggingr   Úfusion_attentionr   r   Úfusion_optionsr   Úonnxr   Ú
onnx_modelr   r~   r(   r
   © r   r   ú<module>r‹      s´   ðð
 Ð Ð Ð Ð Ð à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðE ð E ð E ð E ð E ˜/ñ E ô E ð E ð E ð E r   