Ë
    �…j//  ã                   ón   — d dl mZ d dlZd dlmZ d dlmZmZm	Z	m
Z
 d dlmZ  ee«      Z G d„ de«      Zy)é    )Ú	getLoggerN)ÚFusion)Ú	NodeProtoÚTensorProtoÚhelperÚnumpy_helper)Ú	OnnxModelc                   óŽ   ‡ — e Zd ZdZdededefˆ fd„Zdededeeef   f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z  fd„Zd„ Zˆ xZS )ÚFusionAttentionVaezI
    Fuse Attention subgraph of Vae Decoder into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsc                 ób   •— t         ‰| �  |ddg«       || _        || _        d| _        d| _        y )NÚ	AttentionÚSoftmaxT)ÚsuperÚ__init__r   r   Únum_heads_warningÚhidden_size_warning)Úselfr   r   r   Ú	__class__s       €ún/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_attention_vae.pyr   zFusionAttentionVae.__init__   s7   ø€ Ü‰Ñ˜ ¨i¨[Ô9Ø&ˆÔØ"ˆŒð "&ˆÔØ#'ˆÕ ó    Ú	reshape_qÚadd_qÚreturnc                 óô  — | j                   j                  |d«      }|�t        |j                  «      dk7  r| j                  | j
                  fS | j                   j                  |j                  d   «      }|�)t        |t        j                  «      r|j                  dk(  s| j                  | j
                  fS t        |«      }|dk  r| j                  | j
                  fS | j                   j                  |«      \  }}|�)t        |t        j                  «      r|j                  dk7  r| j                  | j
                  fS |j                  d   }| 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
            add_q (NodeProto): add node for Q

        Returns:
            Tuple[int, int]: num_heads and hidden_size
        é   é   é   r   z?Detected number of attention heads is %d. Ignore --num_heads %dFz3Detected hidden size is %d. Ignore --hidden_size %d)r   Ú
get_parentÚlenÚinputr   r   Úget_constant_valueÚ
isinstanceÚnpÚndarrayÚsizeÚintÚget_constant_inputÚndimÚshaper   ÚloggerÚwarningr   )	r   r   r   ÚconcatÚvaluer   Ú_Úbiasr   s	            r   Úget_num_heads_and_hidden_sizez0FusionAttentionVae.get_num_heads_and_hidden_size   s¤  € ð —‘×&Ñ& y°!Ó4ˆØˆ>œS §¡Ó.°!Ò3Ø—>‘> 4×#3Ñ#3Ð3Ð3à—
‘
×-Ñ-¨f¯l©l¸1©oÓ>ˆØÐ!¤j°¼¿
¹
Ô&CÈÏ
É
ÐVWÊØ—>‘> 4×#3Ñ#3Ð3Ð3Ü˜“Jˆ	Ø˜Š>Ø—>‘> 4×#3Ñ#3Ð3Ð3à—*‘*×/Ñ/°Ó6‰ˆˆ4ØˆL¤*¨T´2·:±:Ô">À4Ç9Á9ÐPQÂ>Ø—>‘> 4×#3Ñ#3Ð3Ð3à—j‘j ‘mˆà�>‰>˜AÒ )¨t¯~©~Ò"=Ø×%Ò%Ü—‘ØUÐW`Ðbf×bpÑbpôð */�Ô&à×Ñ˜aÒ K°4×3CÑ3CÒ$CØ×'Ò'Ü—‘ÐTÐVaÐcg×csÑcsÔtØ+0�Ô(à˜+Ð%Ð%r   Úq_matmulÚq_addÚk_matmulÚk_addÚv_matmulÚv_addÚ
input_nameÚoutput_nameNc                 ó2
  — |j                   d   |	k7  s$|j                   d   |	k7  s|j                   d   |	k7  r@t        j                  d|j                   d   |j                   d   |j                   d   «       y|dkD  r ||z  dk7  rt        j                  d||«       y| j                  j	                  |j                   d   «      }| j                  j	                  |j                   d   «      }| j                  j	                  |j                   d   «      }|r|r|sy| 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   «      }t        j                  |«      }t        j                  |«      }t        j                  |«      }t        j                  |j                  «      }t        j                  |j                  «      }t        j                  |j                  «      }|j                  dk(  rt        j                  d«       yt        j                  |«      }t        j                  |«      }t        j                  |«      }|j                  |j                  k7  s|j                  |j                  k7  ry|j                  d   }|j                  d   }|j                  d   }||k(  r||k(  sJ ‚|dkD  r||k7  rt        d|› d	|› d
�«      ‚t        j                  |j                  dd «      }t        j                  |||fd¬«      }dt        |«      z  }| j                  j                  d«      } ||cxk(  r|k(  sJ ‚ J ‚d}!t        j                  |||fd¬«      }"d|z  }!| j                  | dz   t         j"                  ||g|¬«       t        j$                  d|gt        j&                  ¬«      }"d|z  }!| j                  | dz   t         j"                  |!g|"¬«       |	| dz   | dz   g}#t)        j*                  d|#|
g| ¬«      }$d|$_        |$j.                  j1                  t)        j2                  d|«      g«       | j5                  d«       |$S )at  Create an Attention node.

        Args:
            q_matmul (NodeProto): MatMul node in fully connection for Q
            q_add (NodeProto): Add bias node in fully connection for Q
            k_matmul (NodeProto): MatMul node in fully connection for K
            k_add (NodeProto): Add bias node in fully connection for K
            v_matmul (NodeProto): MatMul node in fully connection for V
            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.
            input_name (str): input name
            output_name (str): output name

        Returns:
            Union[NodeProto, None]: the node created or None if failed.
        r   zRFor self attention, input hidden state for q and k/v shall be same. Got %s, %s, %sNz9input hidden size %d is not a multiple of num of heads %dr   é
   zBweights are in fp16. Please run fp16 conversion after optimizationzInput hidden size (z,) is not same as weight dimension of q,k,v (z:). Please provide a correct input hidden size or pass in 0)Úaxisé   r   Ú_qkv_weight)ÚnameÚ	data_typeÚdimsÚvals)ÚdtypeÚ	_qkv_bias)ÚinputsÚoutputsrA   zcom.microsoftr   zAttention (self attention))r#   r-   Údebugr   Úget_initializerr   Úto_arrayr&   Úprodr,   rB   Ú
ValueErrorÚstackr)   Úcreate_node_nameÚadd_initializerr   ÚFLOATÚzerosÚfloat32r   Ú	make_nodeÚdomainÚ	attributeÚextendÚmake_attributeÚincrease_counter)%r   r4   r5   r6   r7   r8   r9   r   r   r:   r;   Úq_weight_tensorÚk_weight_tensorÚv_weight_tensorÚq_bias_tensorÚk_bias_tensorÚv_bias_tensorÚq_biasÚk_biasÚv_biasÚq_bias_shapeÚk_bias_shapeÚv_bias_shapeÚq_weightÚk_weightÚv_weightÚ
qw_in_sizeÚ
kw_in_sizeÚ
vw_in_sizeÚqw_out_sizeÚ
qkv_weightÚqkv_weight_dimÚattention_node_nameÚqkv_bias_dimÚqkv_biasÚattention_inputsÚattention_nodes%                                        r   Úcreate_attention_nodez(FusionAttentionVae.create_attention_nodeF   s˜  € ð< �>‰>˜!Ñ 
Ò*¨h¯n©n¸QÑ.?À:Ò.MÐQY×Q_ÑQ_Ð`aÑQbÐfpÒQpÜ�L‰LØdØ—‘˜qÑ!Ø—‘˜qÑ!Ø—‘˜qÑ!ô	ð à˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐTÐVaÐclÔmØàŸ*™*×4Ñ4°X·^±^ÀAÑ5FÓGˆØŸ*™*×4Ñ4°X·^±^ÀAÑ5FÓGˆØŸ*™*×4Ñ4°X·^±^ÀAÑ5FÓGˆÙ¡O¹ØàŸ
™
×2Ñ2°5·;±;¸q±>ÓBÒpÀdÇjÁj×F`ÑF`Ðaf×alÑalÐmnÑaoÓFpˆØŸ
™
×2Ñ2°5·;±;¸q±>ÓBÒpÀdÇjÁj×F`ÑF`Ðaf×alÑalÐmnÑaoÓFpˆØŸ
™
×2Ñ2°5·;±;¸q±>ÓBÒpÀdÇjÁj×F`ÑF`Ðaf×alÑalÐmnÑaoÓFpˆä×&Ñ& }Ó5ˆÜ×&Ñ& }Ó5ˆÜ×&Ñ& }Ó5ˆä—w‘w˜vŸ|™|Ó,ˆÜ—w‘w˜vŸ|™|Ó,ˆÜ—w‘w˜vŸ|™|Ó,ˆð ×$Ñ$¨Ò*Ü�L‰LÐ]Ô^Øä×(Ñ(¨Ó9ˆÜ×(Ñ(¨Ó9ˆÜ×(Ñ(¨Ó9ˆð �>‰>˜XŸ^™^Ò+¨x¯~©~ÀÇÁÒ/OØà—^‘^ AÑ&ˆ
Ø—^‘^ AÑ&ˆ
Ø—^‘^ AÑ&ˆ
à˜ZÒ'¨J¸*Ò,DÐDÐDà˜Š?˜{¨jÒ8ÜØ% k ]Ð2^Ð_iÐ^jð kJð Jóð ô —g‘g˜hŸn™n¨Q¨RÐ0Ó1ˆä—X‘X˜x¨°8Ð<À1ÔEˆ
ØœS Ó-Ñ-ˆà"Ÿj™j×9Ñ9¸+ÓFÐà˜|Ô;¨|Ò;Ð;Ñ;Ð;Ð;àˆÜ—8‘8˜V V¨VÐ4¸1Ô=ˆØ˜<Ñ'ˆà×ÑØ$ }Ñ4Ü!×'Ñ'Ø˜nÐ-Øð	 	ô 	
ô —8‘8˜Q Ð,´B·J±JÔ?ˆØ˜;‘ˆà×ÑØ$ {Ñ2Ü!×'Ñ'Ø�Øð	 	ô 	
ð Ø -Ñ/Ø +Ñ-ð
Ðô  ×)Ñ)ØØ#Ø �MØ$ô	
ˆð !0ˆÔØ× Ñ ×'Ñ'¬×)>Ñ)>¸{ÈIÓ)VÐ(WÔXà×ÑÐ:Ô;ØÐr   c                 ó€  — | j                   j                  |d|d¬«      }|€y | j                   j                  |d|d¬«      }|€y | j                   j                  |d|d¬«      }|€y | j                   j                  |d|d¬«      }|€y | j                   j                  |d|d¬«      }|€y | j                   j                  |d|d¬«      }	|	€y | j                   j                  |	d|d¬«      }
|
€y | j                   j                  |g d¢g d¢«      }|€t        j	                  d	«       y |\  }}}}}| j                   j                  |g d
¢g d¢«      }|�|\  }}}}nt        j	                  d«       y | j                   j                  |g d¢g d¢«      }|€t        j	                  d«       y |\  }}}}}| j                   j                  |g d¢g d¢«      }|€t        j	                  d«       y |\  }}}}}}|}| j                  ||«      \  }}|dk  rt        j	                  d«       y | j                  |||||||||j                  d   |j                  d   «
      }|€y | j                  j                  |«       | j                  | j                  |j                  <   | j                  j                  ||g«       d| _        y )NÚMatMulF)Ú	recursiveÚReshapeÚ	TransposeÚAdd)rx   ry   rx   rz   rv   )r   r   r   r   Nz&fuse_attention: failed to match v path)r   rz   ÚMulrv   )r   r   r   r   z'fuse_attention: failed to match qk path)r   r   r   r   Nz&fuse_attention: failed to match q path)ry   rx   ry   rx   rz   rv   )r   r   r   r   r   Nz&fuse_attention: failed to match k pathr   z*fuse_attention: failed to detect num_headsT)r   Úfind_first_child_by_typeÚmatch_parent_pathr-   rI   r3   rt   r#   ÚoutputÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_namerA   Únodes_to_removerW   Úprune_graph) r   Úsoftmax_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚ
matmul_qkvÚreshape_qkvÚtranspose_qkvÚreshape_outÚ
matmul_outÚadd_outÚtranspose_outÚv_nodesr1   Úadd_vÚmatmul_vÚqk_nodesÚ_softmax_qkÚ	_add_zeroÚ_mul_qkÚ	matmul_qkÚq_nodesÚ_transpose_qr   r   Úmatmul_qÚk_nodesÚadd_kÚmatmul_kÚattention_last_nodeÚq_num_headsÚq_hidden_sizeÚnew_nodes                                    r   ÚfusezFusionAttentionVae.fuseÐ   s  € Ø—Z‘Z×8Ñ8¸ÀxÐQdÐpuÐ8Óvˆ
ØÐØà—j‘j×9Ñ9¸*ÀiÐQdÐpuÐ9ÓvˆØÐØàŸ
™
×;Ñ;Ø˜Ð&9ÀUð <ó 
ˆð Ð Øà—j‘j×9Ñ9Ø˜9Ð&9ÀUð :ó 
ˆð ÐØà—Z‘Z×8Ñ8¸ÀhÐPcÐotÐ8Óuˆ
ØÐØà—*‘*×5Ñ5°jÀ%ÐI\ÐhmÐ5ÓnˆØˆ?ØàŸ
™
×;Ñ;¸GÀ[ÐReÐqvÐ;ÓwˆØÐ Øà—*‘*×.Ñ.ØÒLÒN`ó
ˆð ˆ?Ü�L‰LÐAÔBØØ%,Ñ"ˆˆAˆq�%˜à—:‘:×/Ñ/°
Ò<_ÒamÓnˆØÐØ;CÑ8ˆ[˜) W©iä�L‰LÐBÔCØà—*‘*×.Ñ.ØÒKÒM_ó
ˆð ˆ?Ü�L‰LÐAÔBØØ8?Ñ5ˆˆL˜) U¨HØ—*‘*×.Ñ.ØÒXÒZoó
ˆð ˆ?Ü�L‰LÐAÔBØØ(/Ñ%ˆˆAˆq�!�U˜Hà)Ðà%)×%GÑ%GÈ	ÐSXÓ%YÑ"ˆ�]Ø˜!ÒÜ�L‰LÐEÔFØð ×-Ñ-ØØØØØØØØØ�N‰N˜1ÑØ×&Ñ& qÑ)ó
ˆð ÐØà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ñ3à×Ñ×#Ñ#Ð%8¸-Ð$HÔIð  ˆÕr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r)   r   r   Útupler3   Ústrrt   r¡   Ú__classcell__)r   s   @r   r   r      sÓ   ø„ ñð(˜ið (°cð (Àcõ (ð'&°yð '&Èð '&ÐW\Ð]`ÐbeÐ]eÑWfó '&ðRHàðHð ðHð ð	Hð
 ðHð ðHð ðHð ðHð ðHð ðHð ðHð 
�TÑ	óHöT\ r   r   )Úloggingr   Únumpyr&   Úfusion_baser   Úonnxr   r   r   r   Ú
onnx_modelr	   r¢   r-   r   © r   r   ú<module>r¯      s1   ðõ
 ã Ý ß =Ó =Ý  á	�8Ó	€ô] ˜õ ] r   