§
    kŠtjó  ã                   óª   — d dl Z d dlmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ  e j        e¦  «        Z G d„ de¦  «        Z G d	„ d
e¦  «        ZdS )é    N)ÚAttentionMaskÚFusionAttention)ÚNumpyHelper)Ú	NodeProtoÚhelper)Ú	OnnxModel)ÚBertOnnxModelc                   ól   ‡ — e Zd ZdZdedededefˆ fd„Z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 )ÚFusionTnlrAttentionz˜
    Fuse TNLR Attention subgraph into one Attention node.
    TNLR Attention has extra addition after qk nodes and adopts [S, B, NH] as I/O shape.
    ÚmodelÚhidden_sizeÚ	num_headsÚattention_maskc                 óP   •— t          ¦   «                              ||||¦  «         d S ©N)ÚsuperÚ__init__)Úselfr   r   r   r   Ú	__class__s        €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_tnlr.pyr   zFusionTnlrAttention.__init__   s)   ø€ õ 	‰Œ×Ò˜ ¨Y¸ÑGÔGÐGÐGÐGó    Ú
mask_indexÚmatmulÚaddÚinputÚoutputÚ
add_qk_strÚreturnNc	                 ó  — |dk    sJ ‚|dk    r+||z  dk    r"t                                d|› d|› �¦  «         d S | j                             |j        d         ¦  «        }	| j                             |j        d         ¦  «        p$| j                             |j        d         ¦  «        }
|	�|
€d S t          j        |	¦  «        }t          j        |
¦  «        }| j                             d¦  «        }|	j        }t          j
        |¦  «        }t          j        |dz   ||d|z  g|                     |¦  «                             ¦   «         d¬	¦  «        }	| j                             |	| j        ¦  «         t          j        |d
z   |d|z  g|                     |¦  «                             ¦   «         d¬	¦  «        }
| j                             |
| j        ¦  «         ||dz   |d
z   g}|�|                     |¦  «         n|                     d¦  «         |�*|                     d¦  «         |                     |¦  «         t          j        d||g|¬¦  «        }d|_        |j                             t          j        d|¦  «        g¦  «         |S )Nr   zinput hidden size z# is not a multiple of num of heads é   Ú	AttentionÚ_qkv_weighté   T)ÚnameÚ	data_typeÚdimsÚvalsÚrawÚ	_qkv_biasÚ )ÚinputsÚoutputsr$   zcom.microsoftr   )ÚloggerÚdebugr   Úget_initializerr   r   Úto_arrayÚcreate_node_namer%   r   Útensor_dtype_to_np_dtypeÚmake_tensorÚastypeÚtobytesÚadd_initializerÚthis_graph_nameÚappendÚ	make_nodeÚdomainÚ	attributeÚextendÚmake_attribute)r   r   r   r   r   r   r   r   r   ÚweightÚbiasÚ
qkv_weightÚqkv_biasÚattention_node_nameÚtensor_dtypeÚnp_typeÚattention_inputsÚattention_nodes                     r   Úcreate_attention_nodez)FusionTnlrAttention.create_attention_node   s¯  € ð ˜1Š}ˆ}ˆ}ˆ}Ø˜Š?ˆ? ¨iÑ 7¸AÒ=Ð=Ý�LŠLÐi¨kÐiÐiÐ^gÐiÐiÑjÔjÐjØ�4à”×+Ò+¨F¬L¸¬OÑ<Ô<ˆØŒz×)Ò)¨#¬)°A¬,Ñ7Ô7Ðc¸4¼:×;UÒ;UÐVYÔV_Ð`aÔVbÑ;cÔ;cˆàˆ>˜T˜\Ø�4å Ô)¨&Ñ1Ô1ˆ
ÝÔ'¨Ñ-Ô-ˆà"œj×9Ò9¸+ÑFÔFÐàÔ'ˆÝÔ1°,Ñ?Ô?ˆÝÔ#Ø$ }Ñ4Ø"Ø˜q ;™Ð/Ø×"Ò" 7Ñ+Ô+×3Ò3Ñ5Ô5Øð
ñ 
ô 
ˆð 	Œ
×"Ò" 6¨4Ô+?Ñ@Ô@Ð@åÔ!Ø$ {Ñ2Ø"Ø�k‘/Ð"Ø—’ Ñ)Ô)×1Ò1Ñ3Ô3Øð
ñ 
ô 
ˆð 	Œ
×"Ò" 4¨Ô)=Ñ>Ô>Ð>ð Ø -Ñ/Ø +Ñ-ð
Ðð
 Ð!Ø×#Ò# JÑ/Ô/Ð/Ð/à×#Ò# BÑ'Ô'Ð'àÐ!Ø×#Ò# BÑ'Ô'Ð'Ø×#Ò# JÑ/Ô/Ð/åÔ)ØØ#Ø�HØ$ð	
ñ 
ô 
ˆð !0ˆÔØÔ ×'Ò'­Ô)>¸{ÈIÑ)VÔ)VÐ(WÑXÔXÐXàÐr   c                 ó”  — |}|j         dk    rd S | j                             |g d¢g d¢¦  «        }|�
|\  }}}}}	}
nd S g }t          |j        ¦  «        D ]7\  }}||vrŒ
||d         j        d         k    rŒ"|                     |¦  «         Œ8t          |¦  «        dk    rd S |d         }| j                             |
g d¢g d¢¦  «        }|€d S |\  }}}}}| j                             |dgdg¦  «        }|d         }| j                             |
g d	¢g d
¢¦  «        }|€d S |\  }}}| j                             |g d¢g d¢¦  «        }|€d S |d         }|d         }| j                             |g d¢g d¢¦  «        }|€d S |d         }|d         }| j                             |ddgddg¦  «        }|€d S |j        d         |k    �r…d }|}|                      |||| j	        | j
        ||j        d         |d         j        d         ¦  «        }|€d S | j                             |¦  «         | j        | j        |j        <   t          j        dd|j        z   g|j        d         gd|j        z   g d¢¬¦  «        }| j                             || j        ¦  «         |j        d         |j        d<   d|j        z   |j        d<   | j                             ||	|
g¦  «         | j                             |¦  «         | j                             |¦  «         | j                             |¦  «         | j                             |¦  «         d| _        d S d S )NÚSkipLayerNormalization)ÚWhereÚAddÚMatMulÚReshapeÚ	TransposerL   )r    r    r    r   r   r   r   r    )rN   rM   ÚSlicerK   rL   )r    r   r   r   r    rN   )ÚSoftmaxrK   rL   )r   r   r   )ÚMulrN   rM   rO   rK   rL   )r   r   r   r   r   r    éþÿÿÿéÿÿÿÿrM   rJ   Úback_transpose_in_Úback_transpose_)r    r   é   )ÚpermT)Úop_typer   Úmatch_parent_pathÚ	enumerater   r   r8   ÚlenrG   r   r   Únodes_to_addr7   Únode_name_to_graph_namer$   r   r9   Úadd_nodeÚnodes_to_remover<   Úprune_graph)r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚ
start_nodeÚ	qkv_nodesÚ_Úmatmul_belowÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚother_inputsÚ_ir   Ú
root_inputÚv_nodesr   r   Úupper_nodesÚ	transposeÚqk_nodesÚadd_qkÚ	matmul_qkÚq_nodesÚk_nodesÚrelative_position_bias_nodesr   Úattention_last_nodeÚnew_nodeÚback_transposes                                 r   ÚfusezFusionTnlrAttention.fuseg   s  € ð $ˆ
ØÔ!Ð%=Ò=Ð=ØˆFð ”J×0Ò0ØØHÐHÐHØÐÐñ
ô 
ˆ	ð
 Ð ØKTÑHˆQ��< ¨m¸Z¸ZàˆFàˆÝ" :Ô#3Ñ4Ô4ð 	'ð 	'‰IˆB�ØÐ/Ð/Ð/Øà˜	 !œÔ+¨AÔ.Ò.Ð.ØØ×Ò Ñ&Ô&Ð&Ð&Ýˆ|ÑÔ Ò!Ð!ØˆFà! !”_ˆ
à”*×.Ò.ØØ>Ð>Ð>ØˆOˆOñ
ô 
ˆð
 ˆ?ØˆFØ!(ÑˆˆAˆq�#�và”j×2Ò2°6¸K¸=È1È#ÑNÔNˆØ ”Nˆ	à”:×/Ò/°
Ð<XÐ<XÐ<XÐZcÐZcÐZcÑdÔdˆØÐØˆFØ!)ÑˆˆF�Ià”*×.Ò.ØØEÐEÐEØÐÐñ
ô 
ˆð
 ˆ?ØˆFØ�bŒkˆØ˜”ˆà”*×.Ò.ØØ>Ð>Ð>ØˆOˆOñ
ô 
ˆð
 ˆ?ØˆFØ�bŒkˆØ˜”ˆà'+¤z×'CÒ'CÀFÈYÐX_ÐL`ÐcdÐfgÐbhÑ'iÔ'iÐ$Ø'Ð/ØˆFàŒ<˜Œ?˜jÒ(Ñ(ØˆJØ"-Ðð ×1Ò1ØØØØ”ØÔ ØØ#Ô*¨1Ô-Ø,¨QÔ/Ô5°aÔ8ñ	ô 	ˆHð ÐØ�àÔ×$Ò$ XÑ.Ô.Ð.Ø:>Ô:NˆDÔ(¨¬Ñ7õ $Ô-ØØ%¨¬Ñ5Ð6Ø” Ô#Ð$Ø! H¤MÑ1Ø�Y�Yðñ ô ˆNð ŒJ×Ò °Ô0DÑEÔEÐEØ )¤°Ô 2ˆHŒN˜1ÑØ!5¸¼Ñ!EˆHŒO˜AÑàÔ ×'Ò'Ð)<¸mÈZÐ(XÑYÔYÐYØÔ ×'Ò'¨Ñ1Ô1Ð1ØÔ ×'Ò'¨Ñ0Ô0Ð0ØÔ ×'Ò'¨Ñ0Ô0Ð0ØÔ ×'Ò'¨Ñ0Ô0Ð0ð  $ˆDÔÐÐðS )Ð(r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   Ústrr   rG   rz   Ú__classcell__©r   s   @r   r   r      s  ø€ € € € € ðð ð
HàðHð ðHð ð	Hð
 &ðHð Hð Hð Hð Hð HðFàðFð ðFð ð	Fð
 ðFð ðFð ðFð ðFð ðFð 
�TÑ	ðFð Fð Fð FðPq$ð q$ð q$ð q$ð q$ð q$ð q$r   r   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚTnlrOnnxModelc                 óÂ   •— t          ¦   «                              |||¦  «         t          | ¦  «        | _        t	          | | j        | j        | j        ¦  «        | _        d S r   )r   r   r   r   r   r   r   Úattention_fusion)r   r   r   r   r   s       €r   r   zTnlrOnnxModel.__init__Ü   sT   ø€ Ý‰Œ×Ò˜ 	¨;Ñ7Ô7Ð7Ý+¨DÑ1Ô1ˆÔÝ 3°D¸$Ô:JÈDÌNÐ\`Ô\oÑ pÔ pˆÔÐÐr   c                 ó8   — | j                              ¦   «          d S r   )r†   Úapply)r   s    r   Úfuse_attentionzTnlrOnnxModel.fuse_attentioná   s   € ØÔ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   )r{   r|   r}   r   r‰   r�   r‚   s   @r   r„   r„   Û   sL   ø€ € € € € ðqð qð qð qð qð
&ð &ð &ð &ð &ð &ð &r   r„   )ÚloggingÚfusion_attentionr   r   Úfusion_utilsr   Úonnxr   r   Ú
onnx_modelr   Úonnx_model_bertr	   Ú	getLoggerr{   r-   r   r„   © r   r   ú<module>r’      sï   ðð
 €€€à ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ðH$ð H$ð H$ð H$ð H$˜/ñ H$ô H$ð H$ðV&ð &ð &ð &ð &�Mñ &ô &ð &ð &ð &r   