§
    kŠtjÏ�  ã                   óî   — d dl Z 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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 G d„ de¦  «        ZdS )é    N)ÚAttentionMaskÚFusionAttention)ÚFusion)Ú"FusionSimplifiedLayerNormalizationÚ&FusionSkipSimplifiedLayerNormalization)ÚNumpyHelper)Ú	NodeProtoÚTensorProtoÚhelper)Ú	OnnxModel)ÚBertOnnxModelc                   óò   ‡ — e Zd ZdZdedededefˆ fd„Zdedz  d	e	d
e	de	dedededededz  de
de	dz  fd„Zdededededz  dedz  dedz  dedz  dededz  dedz  dedede	dz  fd„Zd„ Zd„ Zd„ Zˆ xZS )ÚFusionT5Attentionz=
    Fuse T5 Attention subgraph into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsÚattention_maskc                 óf   •— t          ¦   «                              ||||ddg¬¦  «         d| _        d S )NFÚSoftmax)Úuse_multi_head_attentionÚsearch_op_typesé   )ÚsuperÚ__init__Ú	static_kv)Úselfr   r   r   r   Ú	__class__s        €úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_t5.pyr   zFusionT5Attention.__init__   sG   ø€ õ 	‰Œ×ÒØØØØØ%*Ø&˜Kð 	ñ 	
ô 	
ð 	
ð ˆŒˆˆó    Ú
mask_indexNÚq_matmulÚk_matmulÚv_matmulÚinputÚoutputÚ	attn_biasÚscaleÚreturnc                 ó,  — |dk    sJ ‚|dk    r+||z  dk    r"t                                d|› d|› �¦  «         dS | j                             |j        d         ¦  «        }| j                             |j        d         ¦  «        }| j                             |j        d         ¦  «        }|�|�|€)|€|n|€|n|}t          |j        d         › d�¦  «         dS t          j        |¦  «        }t          j        |¦  «        }t          j        |¦  «        }|j        |j        k    sJ ‚|j        d         }|j        d         }|j        d         }||cxk    r|k    sn J ‚|dk    r'||k    r!t            	                    d|› d|› d	�¦  «         t          j        |j        dd…         ¦  «        }t          j        |||fd¬
¦  «        }d|z  }| j                             d¦  «        }t          j        |dz   t           j        ||g|                     ¦   «         d¬¦  «        }| j                             || j        ¦  «         ||dz   dg}|r|                     |¦  «         n|                     d¦  «         |	r*|                     d¦  «         |                     |	¦  «         |r.|d         dk    r"|                     ¦   «          |r|d         dk    °"t          j        d||g|¬¦  «        }d|_        |j                             t          j        d|¦  «        g¦  «         |
�.|j                             t          j        d|
¦  «        g¦  «         | j        �@|j                             t          j        dt;          | j        ¦  «        ¦  «        g¦  «         |S )a¼  Create an Attention node.
        Args:
            mask_index (str): 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
            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 (str): input name
            output (str): output name
        Returns:
            Union[NodeProto, None]: the node created or None if failed.
        r   úinput hidden size ú# is not a multiple of num of heads Nr   zl is not an initializer. Please set do_constant_folding=True in torch.onnx.export to unblock attention fusionzInput hidden size (z3) is not same as weight matrix dimension of q,k,v (z:). Please provide a correct input hidden size or pass in 0)Úaxisé   Ú	AttentionÚ_qkv_weightT©ÚnameÚ	data_typeÚdimsÚvalsÚrawÚ éÿÿÿÿ©ÚinputsÚoutputsr1   úcom.microsoftr   r'   Úmask_filter_value)ÚloggerÚdebugr   Úget_initializerr$   Úprintr   Úto_arrayÚshapeÚwarningÚnpÚprodÚstackÚcreate_node_namer   Úmake_tensorr
   ÚFLOATÚtobytesÚadd_initializerÚthis_graph_nameÚappendÚpopÚ	make_nodeÚdomainÚ	attributeÚextendÚmake_attributer<   Úfloat)r   r    r!   r"   r#   r   r   r$   r%   r&   r'   Úq_weightÚk_weightÚv_weightÚmatmulÚqwÚkwÚvwÚ
qw_in_sizeÚ
kw_in_sizeÚ
vw_in_sizeÚqw_out_sizeÚ
qkv_weightÚqkv_weight_dimÚattention_node_nameÚweightÚattention_inputsÚattention_nodes                               r   Úmake_attention_nodez%FusionT5Attention.make_attention_node)   s  € ð4 ˜1Š}ˆ}ˆ}ˆ}à˜Š?ˆ? ¨iÑ 7¸AÒ=Ð=Ý�LŠLÐi¨kÐiÐiÐ^gÐiÐiÑjÔjÐjØ�4à”:×-Ò-¨h¬n¸QÔ.?Ñ@Ô@ˆØ”:×-Ò-¨h¬n¸QÔ.?Ñ@Ô@ˆØ”:×-Ò-¨h¬n¸QÔ.?Ñ@Ô@ˆàÐ˜xÐ/°8Ð3CØ!)Ð!1�X�XÀ8ÐCS°x°xÐYaˆFÝØ”< ”?ð gð gð gñô ð ð �4åÔ! (Ñ+Ô+ˆÝÔ! (Ñ+Ô+ˆÝÔ! (Ñ+Ô+ˆð Œx˜2œ8Ò#Ð#Ð#Ð#à”X˜a”[ˆ
Ø”X˜a”[ˆ
Ø”X˜a”[ˆ
à˜ZÐ5Ð5Ò5Ð5¨:Ò5Ð5Ð5Ð5Ð5Ð5à˜Š?ˆ?˜{¨jÒ8Ð8Ý�NŠNðJ kð Jð JÐfpð Jð Jð Jñô ð õ
 ”g˜bœh q r rœlÑ+Ô+ˆÝ”X˜r 2 r˜l°Ð3Ñ3Ô3ˆ
Ø˜[™ˆà"œj×9Ò9¸+ÑFÔFÐåÔ#Ø$ }Ñ4Ý!Ô'Ø˜nÐ-Ø×#Ò#Ñ%Ô%Øð
ñ 
ô 
ˆð 	Œ
×"Ò" 6¨4Ô+?Ñ@Ô@Ð@ð Ø -Ñ/Øð
Ðð
 ð 	(Ø×#Ò# JÑ/Ô/Ð/Ð/à×#Ò# BÑ'Ô'Ð'àð 	/Ø×#Ò# BÑ'Ô'Ð'Ø×#Ò# IÑ.Ô.Ð.àð 	#Ð#3°BÔ#7¸2Ò#=Ð#=Ø× Ò Ñ"Ô"Ð"ð ð 	#Ð#3°BÔ#7¸2Ò#=Ð#=õ  Ô)ØØ#Ø�HØ$ð	
ñ 
ô 
ˆð !0ˆÔØÔ ×'Ò'­Ô)>¸{ÈIÑ)VÔ)VÐ(WÑXÔXÐXàÐØÔ$×+Ò+­VÔ-BÀ7ÈEÑ-RÔ-RÐ,SÑTÔTÐTàÔ!Ð-ØÔ$×+Ò+­VÔ-BÐCVÕX]Ð^bÔ^tÑXuÔXuÑ-vÔ-vÐ,wÑxÔxÐxàÐr   ÚqueryÚkeyÚvalueÚpast_keyÚ
past_valueÚpresent_keyÚpresent_valuec                 ó|  — |dk    r|dk    r|r|r|sJ ‚||z  dk    r"t                                d|› d|› �¦  «         d S | j                             d¦  «        }|||dg}|r|                     |¦  «         n|                     d¦  «         |r|                     |¦  «         n|                     d¦  «         |r.|sJ ‚|                     |¦  «         |                     |¦  «         |r.|d         dk    r"|                     ¦   «          |r|d         dk    °"|g}|	r.|
sJ ‚|                     |	¦  «         |                     |
¦  «         t          d|›d|›d	|›�¦  «         t          j        d|||¬
¦  «        }d|_	        |j
                             t          j        d|¦  «        g¦  «         |j
                             t          j        dd¦  «        g¦  «         | j        �@|j
                             t          j        dt          | j        ¦  «        ¦  «        g¦  «         |                      d¦  «         |S )Nr   r*   r+   ÚMultiHeadAttentionr6   r7   zattention_inputs=z, attention_outputs=z, attention_node_name=r8   r;   r   r'   ç      ð?r<   )r=   r>   r   rG   rM   rN   r@   r   rO   rP   rQ   rR   rS   r<   rT   Úincrease_counter)r   rg   rh   ri   r    r&   rj   rk   r%   rl   rm   r   r   rb   rd   Úattention_outputsre   s                    r   Úcreate_mha_nodez!FusionT5Attention.create_mha_nodeš   s´  € ð ˜1Š}ˆ} ¨q¢ °U ¸s Àu  ÐLà˜)Ñ#¨Ò)Ð)Ý�LŠLÐi¨kÐiÐiÐ^gÐiÐiÑjÔjÐjØ�4à"œj×9Ò9Ð:NÑOÔOÐàØØØð	
Ðð ð 	(Ø×#Ò# JÑ/Ô/Ð/Ð/à×#Ò# BÑ'Ô'Ð'àð 	(Ø×#Ò# IÑ.Ô.Ð.Ð.à×#Ò# BÑ'Ô'Ð'àð 	0ØÐÐ�:Ø×#Ò# HÑ-Ô-Ð-Ø×#Ò# JÑ/Ô/Ð/àð 	#Ð#3°BÔ#7¸2Ò#=Ð#=Ø× Ò Ñ"Ô"Ð"ð ð 	#Ð#3°BÔ#7¸2Ò#=Ð#=ð $˜HÐØð 	4Ø Ð Ð �=Ø×$Ò$ [Ñ1Ô1Ð1Ø×$Ò$ ]Ñ3Ô3Ð3åÐRÐ!ÐRÐRÐ&7ÐRÐRÐ<OÐRÐRÑSÔSÐSÝÔ)Ø Ø#Ø%Ø$ð	
ñ 
ô 
ˆð !0ˆÔØÔ ×'Ò'­Ô)>¸{ÈIÑ)VÔ)VÐ(WÑXÔXÐXØÔ ×'Ò'­Ô)>¸wÈÑ)LÔ)LÐ(MÑNÔNÐNØÔ!Ð-ØÔ$×+Ò+­VÔ-BÐCVÕX]Ð^bÔ^tÑXuÔXuÑ-vÔ-vÐ,wÑxÔxÐxà×ÒÐ2Ñ3Ô3Ð3ØÐr   c                 óf   — |                       |||¦  «        rd S |                      |||¦  «         d S ©N)Úfuse_t5_encoderÚfuse_t5_decoder)r   ÚnodeÚinput_name_to_nodesÚoutput_name_to_nodes       r   ÚfusezFusionT5Attention.fuseà   sC   € Ø×Ò Ð&9Ð;NÑOÔOð 	ØˆFà×Ò˜TÐ#6Ð8KÑLÔLÐLÐLÐLr   c                 óÎ  ‡ — |j         dk    sJ ‚| j                             |g d¢g d¢|¬¦  «        }|€dS |\  }}}| j                             |g d¢g d¢|¦  «        }|€dS |d         }	| j                             |g d	¢g d
¢|¦  «        }
|
€dS |
\  }}}| j                             |g d¢g d¢|¦  «        }|€dS |\  }}}| j                             |g d¢g d¢|¦  «        }|d u }|�	|d         }nP| j                             |g d¢g d¢|¦  «        }|€%| j                             |g d¢g d¢|¦  «        }|€dS |d         }| j                             |¦  «        \  }}|€dS |dk    rt          |¦  «        | _        | j                             |d         g d¢g d¢|¦  «        Š | j                             |d         g d¢g d¢|¦  «        }‰ �‚t          ˆ fd„| j                             ¦   «         j	        D ¦   «         ¦  «        rK|�I‰ d         j	        d         |d         j	        d         k    r!t          ‰ d         j	        ¦  «        dk    rd}n+| j                             |d         j	        d         ¦  «        }d }| j                             |ddgddg¦  «        }|€"|r | j                             |g d¢g d
¢¦  «        }|€dS |d         j        d         }| j                             |g d	¢g d
¢¦  «        }|€dS |\  }}}| j                             |g d	¢g d¢¦  «        }|€dS |\  }}}|j	        d         |	j	        d         k    rdS |                      |¦  «        \  }}|                      |||||||	j	        d         |j        d         |d¬ ¦
  «
        }|€dS | j                             |¦  «         | j        | j        |j        <   | j                             |¦  «         d!| _        d!S )"Nr   ©ÚMatMulÚ	TransposeÚReshape©©r   r   r‚   r‚   ©Úedgesry   F©ÚConcatÚ	UnsqueezeÚGatherÚShape©r   r   r   r   r7   ©r   r€   r~   ©r   r   r   ©r   ÚAddr~   ©r   r   r   ©rŽ   ÚMulÚSubÚCastr‡   r‡   ©r   r   r   r   r   r   r   )rŽ   ÚSlicer‘   r’   r‡   r‡   )r   r   r   r   r   r   ©rŽ   r•   r‘   r’   r“   r‡   r‡   ©r   r   r   r   r   r   r   é   éðØÿÿ)ÚConstantOfShaper†   r‡   rˆ   r‰   ©r   r   r   r   r   )r   r   r   r   r   c              3   óP   •K  — | ] }|j         ‰d          j        d         k    V — Œ!dS )r7   r   N)r1   r$   )Ú.0r$   Úmask_nodes_2s     €r   ú	<genexpr>z4FusionT5Attention.fuse_t5_encoder.<locals>.<genexpr>F  s7   øè è € ÐbÐbÀ�E”J ,¨rÔ"2Ô"8¸Ô";Ò;ÐbÐbÐbÐbÐbÐbr   r   r6   rŽ   ÚRelativePositionBias)rŽ   r•   r    rp   )r   r   r$   r%   r&   r'   T)Úop_typer   Úmatch_child_pathÚmatch_parent_pathÚget_constant_inputrT   r<   ÚanyÚgraphr$   Úlenr   Úprocess_maskr%   Úget_num_heads_and_hidden_sizerf   Únodes_to_addrM   rL   Únode_name_to_graph_namer1   Únodes_to_removeÚprune_graph)!r   Úsoftmax_nodery   rz   Ú	qkv_nodesÚ
matmul_qkvÚ_Úreshape_qkvÚqkv_shape_nodesÚinput_shape_nodeÚv_nodesÚ	reshape_vÚmatmul_vÚqk_nodesÚadd_qkÚ	matmul_qkÚ
mask_nodesÚis_pattern_for_one_graph_inputÚmul_nodeÚmul_valÚmask_nodes_3r    Úres_pos_biasÚ	rpb_nodesÚk_nodesÚmatmul_kÚq_nodesÚ	reshape_qÚmatmul_qÚq_num_headsÚq_hidden_sizeÚnew_noderž   s!                                   @r   rv   z!FusionT5Attention.fuse_t5_encoderæ   s5  ø€ ØÔ# yÒ0Ð0Ð0Ð0Ø”J×/Ò/ØØ.Ð.Ð.Ø*Ð*Ð*Ø 3ð	 0ñ 
ô 
ˆ	ð ÐØ�5Ø%.Ñ"ˆ
�A�{àœ*×6Ò6ØØ6Ð6Ð6ØˆLˆLØñ	
ô 
ˆð Ð"Ø�5Ø*¨2Ô.Ðà”*×.Ò.ØØ.Ð.Ð.ØˆIˆIØñ	
ô 
ˆð ˆ?Ø�5Ø!(Ñˆˆ9�hð ”:×/Ò/ØØ(Ð(Ð(ØˆIˆIØñ	
ô 
ˆð ÐØ�5Ø'Ñˆˆ6�9à”Z×1Ò1ØØCÐCÐCØÐÐØñ	
ô 
ˆ
ð *4°tÐ);Ð&ØÐ!Ø! !”}ˆHˆHð œ×5Ò5ØØHÐHÐHØ"Ð"Ð"Ø#ñ	ô ˆJð Ð!Ø!œZ×9Ò9ØØTÐTÐTØ)Ð)Ð)Ø'ñ	ô �
ð Ð%Ø ˜5Ø! !”}ˆHà”Z×2Ò2°8Ñ<Ô<‰
ˆˆ7Øˆ?Ø�5à�fÒÐÝ%*¨7¡^¤^ˆDÔ"ð ”z×3Ò3Ø�rŒNØIÐIÐIØˆOˆOØñ	
ô 
ˆð ”z×3Ò3Ø�rŒNØIÐIÐIØˆOˆOØñ	
ô 
ˆð Ð$ÝÐbÐbÐbÐbÈÌ×IYÒIYÑI[ÔI[ÔIaÐbÑbÔbÑbÔbð %àÐ(Ø˜RÔ Ô& qÔ)¨\¸"Ô-=Ô-CÀAÔ-FÒFÐFÝ�L ”OÔ)Ñ*Ô*¨aÒ/Ð/àˆJˆJàÔ,×9Ò9¸*ÀR¼.Ô:NÈqÔ:QÑRÔRˆJàˆØ”J×0Ò0ØØÐ*Ð+Ø�ˆFñ
ô 
ˆ	ð
 ÐÐ!?Ðàœ
×4Ò4ØØ8Ð8Ð8Ø�	�	ñô ˆIð
 ÐØ�5à  ”}Ô+¨AÔ.ˆà”*×.Ò.ØØ.Ð.Ð.ØˆIˆIñ
ô 
ˆð
 ˆ?Ø�5Ø ‰ˆˆ1ˆhð ”*×.Ò.ØØ.Ð.Ð.ØˆIˆIñ
ô 
ˆð
 ˆ?Ø�5à!(Ñˆˆ9�hð Œ>˜!ÔÐ 0Ô 6°qÔ 9Ò9Ð9Ø�5à%)×%GÒ%GÈ	Ñ%RÔ%RÑ"ˆ�]à×+Ò+ØØØØØ!Ø%Ø"Ô(¨Ô+ØÔ% aÔ(Ø"Øð ,ñ 
ô 
ˆð ÐØ�5àÔ× Ò  Ñ*Ô*Ð*Ø6:Ô6JˆÔ$ X¤]Ñ3àÔ×#Ò# KÑ0Ô0Ð0ØˆÔØˆtr   c                 ó(  — |j         dk    sJ ‚| j                             |g d¢g d¢|¬¦  «        }|€d S |\  }}}| j                             |g d¢g d¢¦  «        }|€d S |d         }	d }
d }d }| j                             |g d¢g d	¢¦  «        }|€•| j                             |g d
¢g d¢¦  «        }|�R|\  }}}|j        d         }
|j        d         }d|vrd S |j        d         |	j        d         k    rd| _        npd| _        nh|j        d         }||v rd S d|vrd S d| _        nG|\  }}}}|j        d         }||v rd S d|vrd S |j        d         }d|vrd S |j        d         }
d| _        | j                             |g d¢g d¢¦  «        }|€d S |\  }}}d }d }| j        dk    r­| j                             |g d¢g d¢¦  «        }|�	|d         }n,| j                             |g d¢g d¢¦  «        }|€d S |d         }| j                             |¦  «        \  }}|dk    r|| _        | j	         
                    |d         j        d         ¦  «        }n]| j                             |ddgddgfddgddgfg|¦  «        \  }}}|dk     rt                               d¦  «         d S |j        d         }d }d }d }| j        dk    rÎ| j                             |g d
¢g d¢¦  «        }|�g|\  } }!}|!j        d         }||!j        d                  }"|"D ]2}#| j                             |#j        d         ¦  «        }$|$�	|$j        } nŒ3|€d S d|vrd S �nÆ| j                             |dgdg¦  «        }|€d S |d         } | j        d         }||v rd S d |vrd S �n�| j                             |g d!¢g d"¢fg d#¢g d$¢fg|¦  «        \  }%}}d }&d }"|�Ä|d         |d%         }!}'|!j        d         }|%dk    r!||'j        d                  }&|&j        d         }n|'j        d         }||v rd S d&|vrd S |%dk    rI||'j        d                  }"|"D ]2}#| j                             |#j        d         ¦  «        }$|$�	|$j        } nŒ3n|'j        d         }|€d S d'|vrd S n‰| j                             |g d
¢g d¢¦  «        }|€d S |\  }}!}|!j        d         }||!j        d                  }"|"D ]2}#| j                             |#j        d         ¦  «        }$|$�	|$j        } nŒ3|€d S d'|vrd S | j                             |g d
¢g d¢¦  «        }(|(€d S |(\  })}*}+|+j        d         |	j        d         k    rd S |                      |*¦  «        \  },}-| j        dk    r
|�|}|}
d }d }|r|
r|,dk    r|-dk    sd S |                      |+j        d         ||
|||||j        d         |||,|-¬(¦  «        }.|.rÅ| j                             |.¦  «         | j        | j        |.j        <   |s|rp||fD ]k}/|/r| j                             |/¦  «        st-          d)|/›d*�¦  «          d S |/|v sJ ‚|/d+z   ||/         j        d<   | j                             |/|/d+z   ¦  «         Œl| j                             |¦  «         d,| _        d S d S )-Nr   r}   r�   rƒ   r…   rŠ   r7   )r†   r   r€   r~   )r   r   r   r   r‹   rŒ   r   rm   r   Úpast_value_crossÚpast_value_selfÚpresent_value_selfr�   r�   r�   r”   r–   r—   r˜   r™   rŽ   r•   r    zGSkip MultiHeadAttention fusion since attention bias pattern not matchedÚpresent_key_crossr   Úpast_key_cross)r   r†   r€   r~   )r   r   r   r   )r   r†   r   r€   r~   )r   r   r   r   r   éþÿÿÿÚpast_key_selfÚpresent_key_self)rg   rh   ri   r    r&   rj   rk   r%   rl   rm   r   r   zgraph_output=z does not exist in graph outputÚ_copyF)r¡   r   r¢   r£   r$   r%   r   r¤   r<   r   r¨   Úmatch_parent_pathsr=   r>   Úfind_graph_outputr1   r©   rs   rª   rM   rL   r«   r@   Úreplace_input_of_all_nodesr¬   r­   )0r   r®   ry   rz   r¯   r°   Ú_transpose_qkvr²   r³   r´   ri   rk   rm   rµ   Útranspose_vr¶   r·   Úconcat_vr±   r¸   r¹   rº   r    rÀ   r»   r½   r¾   Úmatched_path_indexrh   rj   rl   rÂ   Útranspose_kÚ	reshape_kÚpresent_key_transpose_nodesÚpresent_key_transpose_nodeÚpresent_key_candidateÚidxÚpast_key_transpose_nodeÚconcat_krÄ   Útranspose_qrÅ   rÆ   rÇ   rÈ   rÉ   Úgraph_outputs0                                                   r   rw   z!FusionT5Attention.fuse_t5_decoder‘  sw	  € ØÔ# yÒ0Ð0Ð0Ð0à”J×/Ò/ØØ.Ð.Ð.Ø*Ð*Ð*Ø 3ð	 0ñ 
ô 
ˆ	ð ÐØˆFØ2;Ñ/ˆ
�N Kàœ*×6Ò6ØØ6Ð6Ð6ØˆLˆLñ
ô 
ˆð
 Ð"ØˆFØ*¨2Ô.ÐàˆØˆ
ØˆØ”*×.Ò.ØØ8Ð8Ð8ØˆLˆLñ
ô 
ˆð
 ˆ?Ø”j×2Ò2ØØ2Ð2Ð2Ø�	�	ñô ˆGð
 Ð"Ø3:Ñ0�˜Y¨Ø!œ¨Ô*�Ø +Ô 2°1Ô 5�Ø"¨-Ð7Ð7Ø�FØ”> !Ô$Ð(8Ô(>¸qÔ(AÒAÐAØ%&�D”N�Nà%&�D”N�Nà'Ô-¨aÔ0�
ØÐ!4Ð4Ð4Ø�FØ%¨ZÐ7Ð7Ø�FØ!"�”�à(/Ñ%ˆH�a˜ AØ!œ¨Ô*ˆJØÐ0Ð0Ð0Ø�Ø ¨
Ð2Ð2Ø�Ø$œO¨AÔ.ˆMØ#¨=Ð8Ð8Ø�Ø”O AÔ&ˆEØˆDŒNà”:×/Ò/ØØ(Ð(Ð(ØˆIˆIñ
ô 
ˆð
 ÐØˆFØ'Ñˆˆ6�9àˆ
ØˆØŒ>˜QÒÐØœ×5Ò5ØØGÐGÐGØ"Ð"Ð"ñô ˆJð
 Ð%Ø% aœ=��à!œZ×9Ò9ØØTÐTÐTØ)Ð)Ð)ñô �
ð
 Ð%Ø�FØ% aœ=�àœ×6Ò6°xÑ@Ô@‰JˆAˆwØ˜&Ò Ð Ø)0�Ô&àÔ,×9Ò9¸*ÀR¼.Ô:NÈqÔ:QÑRÔRˆJˆJà'+¤z×'DÒ'DØà˜WÐ%¨¨1 vÐ.ØÐ3Ð4°q¸!°fÐ=ðð $ñ(ô (Ñ$Ð  1ð " AÒ%Ð%Ý—’ÐfÑgÔgÐgØ�à!œ<¨œ?ˆLàˆØˆØˆØŒ>˜QÒÐØ”j×2Ò2ØØ2Ð2Ð2Ø�	�	ñô ˆGð
 Ð"Ø,3Ñ)�˜Y¨Ø”o aÔ(�Ø.AÀ)ÔBRÐSTÔBUÔ.VÐ+Ø2Mð ð Ð.Ø,0¬J×,HÒ,HÐIcÔIjÐklÔImÑ,nÔ,nÐ)Ø,Ð8Ø&;Ô&@˜Ø˜ð 9ð Ð&Ø�FØ&¨kÐ9Ð9Ø�Fñ :ð œ*×6Ò6ØØ �MØ�Cñô �ð
 �?Ø�FØ% aœj�à&Ô,¨QÔ/�ØÐ2Ð2Ð2Ø�FØ#¨8Ð3Ð3Ø�Fñ 4ð #œj×;Ò;ØàAÐAÐAÀ<À<À<ÐPØNÐNÐNÐP_ÐP_ÐP_Ð`ðð $ñô ‰OˆC�˜!ð '+Ð#Ø*.Ð'ØÐ"Ø&-¨a¤j°'¸"´+˜)�Ø”o aÔ(�à˜!’8�8Ø.AÀ(Ä.ÐQRÔBSÔ.TÐ+Ø6Ô<¸QÔ?�H�Hà'œ~¨aÔ0�HØÐ2Ð2Ð2Ø�FØ"¨(Ð2Ð2Ø�Fà˜!’8�8Ø2EÀhÄoÐVWÔFXÔ2YÐ/Ø6Qð "ð "Ð2Ø04´
×0LÒ0LÐMgÔMnÐopÔMqÑ0rÔ0rÐ-Ø0Ð<Ø*?Ô*D˜KØ!˜Eð =øð #+¤/°!Ô"4�KØÐ&Ø�FØ%¨[Ð8Ð8Ø�Fð 9ð œ*×6Ò6ØØ6Ð6Ð6Ø�I�Iñô �ð
 �?Ø�FØ")‘��9˜aØ”o aÔ(�Ø.AÀ)ÔBRÐSTÔBUÔ.VÐ+Ø2Mð ð Ð.Ø,0¬J×,HÒ,HÐIcÔIjÐklÔImÑ,nÔ,nÐ)Ø,Ð8Ø&;Ô&@˜Ø˜ð 9ð Ð&Ø�FØ%¨[Ð8Ð8Ø�Fà”*×.Ò.ØØ.Ð.Ð.ØˆIˆIñ
ô 
ˆð
 ˆ?ØˆFà+2Ñ(ˆ�Y àŒ>˜!ÔÐ 0Ô 6°qÔ 9Ò9Ð9ØˆFà%)×%GÒ%GÈ	Ñ%RÔ%RÑ"ˆ�]àŒ>˜QÒÐ 8Ð#7ØˆCØˆEØˆHØˆJàð 	˜ð 	 +°¢/ /°mÀaÒ6GÐ6GØˆFà×'Ò'Ø”/ !Ô$ØØØ!Ø"ØØ!ØÔ% aÔ(Ø#Ø'Ø!Ø%ð (ñ 
ô 
ˆð ð 	%ØÔ×$Ò$ XÑ.Ô.Ð.Ø:>Ô:NˆDÔ(¨¬Ñ7ð ð `˜mð `Ø%0°-Ð$@ð `ð `�LØ(ð ¨T¬Z×-IÒ-IÈ,Ñ-WÔ-Wð ÝÐO ÐOÐOÐOÑPÔPÐPØ˜˜Ø'Ð+>Ð>Ð>Ð>Ð>ØBNÐQXÑBXÐ'¨Ô5Ô<¸QÑ?Ø”J×9Ò9¸,ÈÐW^ÑH^Ñ_Ô_Ð_Ð_àÔ ×'Ò'¨Ñ4Ô4Ð4Ø$ˆDÔÐÐð	%ð 	%r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   Ústrr	   rT   rf   rs   r{   rv   rw   Ú__classcell__©r   s   @r   r   r      s  ø€ € € € € ðð ðàðð ðð ð	ð
 &ðð ð ð ð ð ð"oà˜$‘Jðoð ðoð ð	oð
 ðoð ðoð ðoð ðoð ðoð ˜‘:ðoð ðoð 
�TÑ	ðoð oð oð oðbDàðDð ðDð ð	Dð
 ˜$‘JðDð ˜‘:ðDð ˜‘*ðDð ˜$‘JðDð ðDð ˜4‘ZðDð ˜T‘zðDð ðDð ðDð 
�TÑ	ðDð Dð Dð DðLMð Mð Mðið ið iðVI%ð I%ð I%ð I%ð I%ð I%ð I%r   r   c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )ÚFusionRelativePositionBiasBlockr   c                 óP   •— t          ¦   «                              |ddg¦  «         d S )Nr    r   )r   r   )r   r   r   s     €r   r   z(FusionRelativePositionBiasBlock.__init__ž  s(   ø€ Ý‰Œ×Ò˜Ð 6¸¸ÑDÔDÐDÐDÐDr   c                 óÂ  — | j                              |g d¢g d¢|¦  «        }|€%| j                              |g d¢g d¢|¦  «        }|€d S |d         }|d         }|d         }|d         }|| j        v rd S | j                              |g d	¢g d
¢|¦  «        }	|	€d S | j                              |	d         j        d         ¦  «        }
|	d         }| j                              |g d¢g d¢|¦  «        }d}|€'| j                              |g d¢g d¢|¦  «        }d}|€d S |d         }t          t          j        t          j        |
¦  «        d|rdndz  z  ¦  «        ¦  «        }|dk    rt           
                    d|› d�¦  «         | j                              dd|rdndz   ¬¦  «        }| j                              |j        d         ¦  «        }|€d S t          j        |¦  «        }t          j        |¦  «        }t!          j        |dz   t$          j        t          j        |¦  «        d         t          j        |¦  «        d         g|                     ¦   «         d¬¦  «        }| j                              || j        ¦  «         |j        |j        d         |j        d         g}|d z   }||j        d<   t!          j        d||g|¬!¦  «        }d"|_        |j                             t!          j        d#|¦  «        g¦  «         |j                             t!          j        d$|¦  «        g¦  «         | j        | j        |j        <   | j                              |¦  «         d| _!        d S )%N)rŽ   rŽ   r•   r‡   r   rˆ   ÚWhere)r   r   r   r   r   r   r   )rŽ   rŽ   r•   r‡   r   rˆ   rŽ   rñ   )r   r   r   r   r   r   r   r   é   r7   r˜   r-   )	ÚMinrš   r‰   rŽ   r“   r‘   ÚDivÚLogrô   )	r˜   r   r   r   r   r   r   r   r   éýÿÿÿr   )r“   ÚNegró   rš   r‰   r’   r‡   ÚRange)r   r   r   r   r   r   r   r   F)r“   ÚAbsr’   r‡   rø   r›   Té    é   é€   zmax_distance is z], which is different from the default value 128. Please double check the model configuration.r    ÚRelPosBias_ÚencoderÚdecoder©Úname_prefixr   Ú_bias_table_weightr0   Ú_rel_pos_biasr8   r;   Úmax_distanceÚis_bidirectional)"r   r£   r¬   Úget_constant_valuer$   ré   rD   ÚroundÚexpr=   rC   rG   r?   r   rA   Ú	transposer   rH   r
   rI   rB   rJ   rK   rL   r1   rO   rP   rQ   rR   rS   r«   rª   rM   r­   )r   rx   ry   rz   Úcompute_bias_nodesÚgatherÚwhereÚsliceÚ	unsqueezeÚcompute_buckets_nodesÚlog_maxÚdivÚrange_nodesr  Ú
range_noder  Ú	node_nameÚtable_weight_iÚtable_weightÚtable_weight_tÚ
bias_tabler9   Úbias_outputÚrpb_nodes                           r   r{   z$FusionRelativePositionBiasBlock.fuse¡  sõ  € Ø!œZ×9Ò9ØØPÐPÐPØ!Ð!Ð!Øñ	
ô 
Ðð Ð%Ø!%¤×!=Ò!=ØØ[Ð[Ð[Ø(Ð(Ð(Ø#ñ	"ô "Ðð "Ð)Ø�à# AÔ&ˆØ" 2Ô&ˆØ" 1Ô%ˆØ& qÔ)ˆ	ð ˜Ô,Ð,Ð,ØˆFà $¤
× <Ò <ØØZÐZÐZØ'Ð'Ð'Øñ	!
ô !
Ðð !Ð(ØˆFð ”*×/Ò/Ð0EÀbÔ0IÔ0OÐPQÔ0RÑSÔSˆà# BÔ'ˆà”j×2Ò2ØØ[Ð[Ð[Ø$Ð$Ð$Øñ	
ô 
ˆð !ÐØÐØœ*×6Ò6ØÐAÐAÐAÀ?À?À?ÐTgñô ˆKð  $ÐØÐ"Ø�Ø  ”_ˆ
õ �2œ8¥B¤F¨7¡O¤O°rÐCSÐ>Z¸a¸aÐYZÑ7[Ñ$\Ñ]Ô]Ñ^Ô^ˆØ˜3ÒÐÝ�NŠNð? <ð ?ð ?ð ?ñô ð ð
 ”J×/Ò/Ø"°ÐN^ÐAmÀÀÐdmÑ0nð 0ñ 
ô 
ˆ	ð œ×3Ò3°F´LÀ´OÑDÔDˆØÐ!ØˆFÝ"Ô+¨NÑ;Ô;ˆÝœ lÑ3Ô3ˆÝÔ'ØÐ1Ñ1Ý!Ô'Ý”(˜<Ñ(Ô(¨Ô+­R¬X°lÑ-CÔ-CÀAÔ-FÐGØ×'Ò'Ñ)Ô)Øð
ñ 
ô 
ˆ
ð 	Œ
×"Ò" :¨tÔ/CÑDÔDÐDðP ”/ :Ô#3°AÔ#6¸
Ô8HÈÔ8KÐLˆð   /Ñ1ˆØ$ˆŒ�A‰åÔ#Ø"ØØ �MØð	
ñ 
ô 
ˆð *ˆŒØÔ×!Ò!¥6Ô#8¸ÈÑ#VÔ#VÐ"WÑXÔXÐXØÔ×!Ò!¥6Ô#8Ð9KÐM]Ñ#^Ô#^Ð"_Ñ`Ô`Ð`Ø6:Ô6JˆÔ$ X¤]Ñ3ØÔ× Ò  Ñ*Ô*Ð*ØˆÔÐÐr   )rå   ræ   rç   r   r   r{   rë   rì   s   @r   rî   rî   �  sa   ø€ € € € € ðE˜ið Eð Eð Eð Eð Eð EðR ð R ð R ð R ð R ð R ð R r   rî   c                   ó\   ‡ — e Zd Zddedefˆ fd„Zd„ Zd„ Zdd„Zd	„ Zd
„ Z	d„ Z
d„ Zd„ Zˆ xZS )ÚT5OnnxModelr   r   r   c                 ó¬  •— t          ¦   «                              |||¦  «         t          | ¦  «        | _        t	          | j        j        j        ¦  «        dk    rddlm	} |j
        | j        _        t          | | j        | j        | j        ¦  «        | _        t!          | ¦  «        | _        t%          | ¦  «        | _        t)          | ¦  «        | _        d S )Nr   r   )ÚAttentionMaskFormat)r   r   r   r   r§   r   r¦   r$   Úfusion_optionsr  ÚNoMaskÚmask_formatr   r   r   Úattention_fusionr   Úlayer_norm_fusionr   Úskip_layer_norm_fusionrî   Ú
rpb_fusion)r   r   r   r   r  r   s        €r   r   zT5OnnxModel.__init__7  s¾   ø€ Ý‰Œ×Ò˜ 	¨;Ñ7Ô7Ð7Ý+¨DÑ1Ô1ˆÔõ ˆtŒzÔÔ%Ñ&Ô&¨!Ò+Ð+Ø:Ð:Ð:Ð:Ð:Ð:à.AÔ.HˆDÔÔ+å 1°$¸Ô8HÈ$Ì.ÐZ^ÔZmÑ nÔ nˆÔÝ!CÀDÑ!IÔ!IˆÔÝ&LÈTÑ&RÔ&RˆÔ#Ý9¸$Ñ?Ô?ˆŒˆˆr   c                 ó8   — | j                              ¦   «          d S ru   )r"  Úapply©r   s    r   Úfuse_attentionzT5OnnxModel.fuse_attentionF  s   € ØÔ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                 ó8   — | j                              ¦   «          d S ru   )r#  r'  r(  s    r   Úfuse_layer_normzT5OnnxModel.fuse_layer_normI  s   € ØÔ×$Ò$Ñ&Ô&Ð&Ð&Ð&r   Tc                 ó8   — | j                              ¦   «          d S ru   )r$  r'  )r   Úshape_infers     r   Úfuse_skip_layer_normz T5OnnxModel.fuse_skip_layer_normL  s   € ØÔ#×)Ò)Ñ+Ô+Ð+Ð+Ð+r   c           
      óä  — |                       ¦   «         D �]Y}|j        dk    �rJ|                      |g d¢g d¢¦  «        }|��)d„ | j        j        j        D ¦   «         }|d         j        d         |v rù|                      dd¬	¦  «        }t          j        d|d         j        d         g|d
z   g|¬¦  «        }t          j	        dt          j        dgdg¬¦  «        }|                      |¦  «         t          j        d|d
z   dg|dz   g|                      dd¬	¦  «        d¬¦  «        }|                      |¦  «         |                      |¦  «         |dz   |j        d<   |dz   |j        d<    d S �Œ[d S )Nr    )
rˆ   r‰   r   r€   r†   r‡   rˆ   r‰   ÚSimplifiedLayerNormalizationrˆ   )
r   r   r   r   r   r   r   r   r   r   c                 ó   — g | ]	}|j         ‘Œ
S © )r1   )r�   r$   s     r   ú
<listcomp>z?T5OnnxModel.adjust_rel_pos_bis_length_input.<locals>.<listcomp>f  s   € Ð(XÐ(XÐ(X¸¨¬Ð(XÐ(XÐ(Xr   r7   r   r‰   ÚAdded_Shape_r   Ú_Outputr8   ÚConstant_Index_1)r1   r2   r3   r4   rˆ   Ú_Output_Gather_1ÚAdded_Gather_r   )r9   r:   r1   r,   r˜   )Únodesr¡   r£   r   r¦   r$   rG   r   rO   rH   r
   ÚINT64rK   Úadd_node)r   rx   r9  Úgraph_input_namesr  Ú
shape_nodeÚ	indices_1r  s           r   Úadjust_rel_pos_bis_length_inputz+T5OnnxModel.adjust_rel_pos_bis_length_inputO  sÕ  € ð —J’J‘L”Lð 3	ñ 3	ˆDØŒ|Ð5Ò5Ñ5Ø×.Ò.Øðð ð ð 3Ð2Ð2ñô �ð" Ñ$Ø(XÐ(XÀÄÔAQÔAWÐ(XÑ(XÔ(XÐ%Ø˜R”y” qÔ)Ð->Ð>Ð>Ø$(×$9Ò$9¸'È~Ð$9Ñ$^Ô$^˜	Ý%+Ô%5Ø#Ø$)¨"¤I¤O°AÔ$6Ð#7Ø%.°Ñ%:Ð$;Ø!*ð	&ñ &ô &˜
õ %+Ô$6Ø!3Ý&1Ô&7Ø"# Ø"# ð	%ñ %ô %˜	ð ×,Ò,¨YÑ7Ô7Ð7å!'Ô!1Ø$Ø$-°	Ñ$9Ð;MÐ#NØ%.Ð1CÑ%CÐ$DØ!%×!6Ò!6°xÈ_Ð!6Ñ!]Ô!]Ø!"ð"ñ "ô "˜ð Ÿš jÑ1Ô1Ð1ØŸš fÑ-Ô-Ð-Ø(1Ð4FÑ(F˜œ
 1™Ø(1Ð4FÑ(F˜œ
 1™à��ñe 6ð3	ð 3	r   c                 óz  — g }|                       ¦   «         D ]£}|j        dk    r–|                      |g d¢g d¢¦  «        }|€Œ+|                      |dgdg¦  «        }|€ŒG|d         }|j        d         |j        d<   |                     |¦  «         |                     |¦  «         |                      |¦  «         Œ¤d S )NrŽ   )r‘   r’   r‘   r‡   r“   ÚLessOrEqualÚTiler†   r‡   rˆ   r‰   )r   r   r   r   r   r   r   r   r   r   r   r    r   ©r9  r¡   r£   r%   rR   rM   Úremove_nodes©r   r¬   rx   Úextended_mask_nodesrÁ   r  s         r   Ú!remove_extended_mask_decoder_initz-T5OnnxModel.remove_extended_mask_decoder_initˆ  sô   € ØˆØ—J’J‘L”Lð 	3ð 	3ˆDØŒ|˜uÒ$Ð$Ø&*×&<Ò&<Øðð ð ð 6Ð5Ð5ñ'ô 'Ð#ð" 'Ð.Øà ×2Ò2°4Ð:PÐ9QÐTUÐSVÑWÔW�	ØÐ$Øà$ Qœ<�Ø%)¤[°¤^�” Ñ"à×&Ò&Ð':Ñ;Ô;Ð;Ø×&Ò& tÑ,Ô,Ð,Ø×!Ò! /Ñ2Ô2Ð2øð?	3ð 	3r   c                 ó~  — g }|                       ¦   «         D ]¥}|j        dk    r˜|                      |g d¢g d¢¦  «        }|€Œ+|                      |ddgddg¦  «        }|€ŒI|d         }|j        d         |j        d<   |                     |¦  «         |                     |¦  «         |                      |¦  «         Œ¦d S )NrŽ   )r‘   r’   r‘   r‡   r†   r“   rA  rB  r†   r‡   rˆ   r‰   )r   r   r   r   r   r   r   r   r   r   r   r   r•   r    r   rC  rE  s         r   Úremove_extended_mask_decoderz(T5OnnxModel.remove_extended_mask_decoder«  sú   € ØˆØ—J’J‘L”Lð  	3ð  	3ˆDØŒ|˜uÒ$Ð$Ø&*×&<Ò&<Øðð ð ð 9Ð8Ð8ñ!'ô 'Ð#ð$ 'Ð.Øà ×2Ò2°4¸'ÐCYÐ9ZÐ]^Ð`aÐ\bÑcÔc�	ØÐ$Øà$ Qœ<�Ø%)¤[°¤^�” Ñ"à×&Ò&Ð':Ñ;Ô;Ð;Ø×&Ò& tÑ,Ô,Ð,Ø×!Ò! /Ñ2Ô2Ð2øðA 	3ð  	3r   c                 ó`   — |                       ¦   «          | j                             ¦   «          d S ru   )Úadjust_reshape_and_expandr%  r'  r(  s    r   Ú
preprocesszT5OnnxModel.preprocessÏ  s.   € Ø×&Ò&Ñ(Ô(Ð(ØŒ×ÒÑÔÐÐÐr   c                 ó¦   — |                       ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          d S ru   )rG  rI  r?  r­   r(  s    r   ÚpostprocesszT5OnnxModel.postprocessÓ  sP   € à×.Ò.Ñ0Ô0Ð0Ø×)Ò)Ñ+Ô+Ð+Ø×,Ò,Ñ.Ô.Ð.à×ÒÑÔÐÐÐr   r‚   )T)rå   ræ   rç   ré   r   r)  r+  r.  r?  rG  rI  rL  rN  rë   rì   s   @r   r  r  6  sÙ   ø€ € € € € ð@ð @¨ð @¸sð @ð @ð @ð @ð @ð @ð&ð &ð &ð'ð 'ð 'ð,ð ,ð ,ð ,ð6ð 6ð 6ðr!3ð !3ð !3ðF"3ð "3ð "3ðH ð  ð  ðð ð ð ð ð ð r   r  )ÚloggingÚnumpyrD   Úfusion_attentionr   r   Úfusion_baser   Úfusion_simplified_layernormr   r   Úfusion_utilsr   Úonnxr	   r
   r   Ú
onnx_modelr   Úonnx_model_bertr   Ú	getLoggerrå   r=   r   rî   r  r2  r   r   ú<module>rY     sh  ðð
 €€€à Ð Ð Ð Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø Ð Ð Ð Ð Ð Ø rÐ rÐ rÐ rÐ rÐ rÐ rÐ rØ $Ð $Ð $Ð $Ð $Ð $Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ðG
%ð G
%ð G
%ð G
%ð G
%˜ñ G
%ô G
%ð G
%ðTV ð V ð V ð V ð V  fñ V ô V ð V ðrcð cð cð cð c�-ñ cô cð cð cð cr   