§
    kŠtj±S  ã                   ó˜  — d dl mZ d dlZ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 d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z; d dl<m=Z=  ee>¦  «        Z? G d„ de=¦  «        Z@dS )é    )Ú	getLoggerN)ÚPackingMode)ÚAttentionMaskÚFusionAttention)ÚFusionBartAttention)ÚFusionBiasGelu)ÚFusionConstantFold)ÚFusionEmbedLayerNormalization)ÚFusionFastGelu)Ú
FusionGelu)ÚFusionGeluApproximation)ÚFusionGemmFastGelu)ÚFusionLayerNormalizationÚFusionLayerNormalizationTF)ÚAttentionMaskFormatÚFusionOptions)ÚFusionQOrderedAttention)ÚFusionQOrderedGelu)Ú FusionQOrderedLayerNormalization)ÚFusionQOrderedMatMul)ÚFusionQuickGelu)ÚFusionReshape)ÚFusionRotaryEmbeddings)ÚFusionShape)Ú"FusionSimplifiedLayerNormalizationÚ&FusionSkipSimplifiedLayerNormalization)Ú FusionBiasSkipLayerNormalizationÚFusionSkipLayerNormalization)ÚFusionUtils)Ú
ModelProtoÚTensorProtoÚhelperÚnumpy_helper)Ú	OnnxModelc                   ó  ‡ — e Zd Zd-dededefˆ fd„Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd.d„Zd„ Zd„ Zd„ Zdedee         defd„Zdefd„Zd„ Zd/d„Zd „ Zd!„ Zd"„ Zd#„ Z d0d&e!d$z  d'efd(„Z"d)„ Z#d1d*„Z$d2d+efd,„Z%ˆ xZ&S )3ÚBertOnnxModelr   ÚmodelÚ	num_headsÚhidden_sizec                 óˆ  •— |dk    r|dk    s|dk    r	||z  dk    sJ ‚t          ¦   «                              |¦  «         || _        || _        t	          | ¦  «        | _        t          | | j        | j        | j        ¦  «        | _        t          | | j        | j        | j        ¦  «        | _	        t          | ¦  «        | _        dS )aG  Initialize BERT ONNX Model.

        Args:
            model (ModelProto): the ONNX model
            num_heads (int, optional): number of attention heads. Defaults to 0 (detect the parameter automatically).
            hidden_size (int, optional): hidden dimension. Defaults to 0 (detect the parameter automatically).
        r   N)ÚsuperÚ__init__r(   r)   r   Úattention_maskr   Úattention_fusionr   Úqordered_attention_fusionr   Úutils)Úselfr'   r(   r)   Ú	__class__s       €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_bert.pyr,   zBertOnnxModel.__init__'   sÅ   ø€ ð ˜Q’� ;°!Ò#3Ð#3¸ÀQº¸È;ÐYbÑKbÐfgÒKgÐKgÐKgÐhå‰Œ×Ò˜ÑÔÐØ"ˆŒØ&ˆÔå+¨DÑ1Ô1ˆÔÝ /°°dÔ6FÈÌÐX\ÔXkÑ lÔ lˆÔÝ)@Ø�$Ô" D¤N°DÔ4Gñ*
ô *
ˆÔ&õ ! Ñ&Ô&ˆŒ
ˆ
ˆ
ó    c                 óL   — t          | ¦  «        }|                     ¦   «          d S ©N)r	   Úapply©r1   Úfusions     r3   Úfuse_constant_foldz BertOnnxModel.fuse_constant_fold<   ó    € Ý# DÑ)Ô)ˆØ�Š‰Œˆˆˆr4   c                 ój   — | j                              ¦   «          | j                             ¦   «          d S r6   )r.   r7   r/   ©r1   s    r3   Úfuse_attentionzBertOnnxModel.fuse_attention@   s2   € ØÔ×#Ò#Ñ%Ô%Ð%àÔ&×,Ò,Ñ.Ô.Ð.Ð.Ð.r4   c                 ó  — t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t	          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r   r   r   r8   s     r3   Ú	fuse_geluzBertOnnxModel.fuse_geluE   sn   € Ý˜DÑ!Ô!ˆØ�Š‰ŒˆÝ Ñ%Ô%ˆØ�Š‰ŒˆÝ  Ñ&Ô&ˆØ�Š‰Œˆå# DÑ)Ô)ˆØ�Š‰Œˆˆˆr4   c                 óN   — t          | |¦  «        }|                     ¦   «          d S r6   )r   r7   )r1   Úis_fastgelur9   s      r3   Úfuse_bias_geluzBertOnnxModel.fuse_bias_geluP   s"   € Ý  kÑ2Ô2ˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úgelu_approximationz BertOnnxModel.gelu_approximationT   s    € Ý(¨Ñ.Ô.ˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_gemm_fast_geluz!BertOnnxModel.fuse_gemm_fast_geluX   r;   r4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_add_bias_skip_layer_normz+BertOnnxModel.fuse_add_bias_skip_layer_norm\   s    € Ý1°$Ñ7Ô7ˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_reshapezBertOnnxModel.fuse_reshape`   s    € Ý˜tÑ$Ô$ˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Ú
fuse_shapezBertOnnxModel.fuse_shaped   s    € Ý˜TÑ"Ô"ˆØ�Š‰Œˆˆˆr4   c                 óN   — t          | |¦  «        }|                     ¦   «          d S r6   )r
   r7   )r1   Úuse_mask_indexr9   s      r3   Úfuse_embed_layerzBertOnnxModel.fuse_embed_layerh   s"   € Ý.¨t°^ÑDÔDˆØ�Š‰Œˆˆˆr4   c                 óØ   — t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r   r   r8   s     r3   Úfuse_layer_normzBertOnnxModel.fuse_layer_norml   sV   € Ý)¨$Ñ/Ô/ˆØ�Š‰Œˆå+¨DÑ1Ô1ˆØ�Š‰Œˆõ 2°$Ñ7Ô7ˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_simplified_layer_normz(BertOnnxModel.fuse_simplified_layer_normw   s    € Ý3°DÑ9Ô9ˆØ�Š‰Œˆˆˆr4   Tc                 óP   — t          | |¬¦  «        }|                     ¦   «          d S )N)Úshape_infer)r   r7   )r1   rV   r9   s      r3   Úfuse_skip_layer_normz"BertOnnxModel.fuse_skip_layer_norm{   s%   € Ý-¨dÀÐLÑLÔLˆØ�Š‰Œˆˆˆr4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_skip_simplified_layer_normz-BertOnnxModel.fuse_skip_simplified_layer_norm   s    € Ý7¸Ñ=Ô=ˆØ�Š‰Œˆˆˆr4   c                 óÌ  — t          | ¦  «        }|                     ¦   «          t          t          d„ | j        j        j        ¦  «        ¦  «        }d„ |D ¦   «         }d}|t          | j        j        ¦  «        k     rh| j        j        |         }d|j	        v r)|j
        |vr | j        j                             |¦  «         n|dz  }|t          | j        j        ¦  «        k     °fd S d S )Nc                 ó.   — | j         dk    o
| j        dk    S )NÚRotaryEmbeddingúcom.microsoft)Úop_typeÚdomain)Únodes    r3   ú<lambda>z6BertOnnxModel.fuse_rotary_embeddings.<locals>.<lambda>‰   s   € ˜Tœ\Ð->Ò>ÐaÀ4Ä;ÐRaÒCa€ r4   c                 ó   — h | ]	}|j         ’Œ
S © )r_   )Ú.0r`   s     r3   ú	<setcomp>z7BertOnnxModel.fuse_rotary_embeddings.<locals>.<setcomp>�   s   € Ð!HÐ!HÐ!H°$ $¤+Ð!HÐ!HÐ!Hr4   r   r\   é   )r   r7   ÚlistÚfilterr'   Úgraphr`   ÚlenÚ	functionsÚnamer_   Úremove)r1   r9   Úrot_emb_nodesÚnon_ms_domains_to_keepÚiÚfns         r3   Úfuse_rotary_embeddingsz$BertOnnxModel.fuse_rotary_embeddingsƒ   sñ   € Ý'¨Ñ-Ô-ˆØ�Š‰ŒˆåÝØaÐaØ”
Ô Ô%ñô ñ
ô 
ˆð "IÐ!H¸-Ð!HÑ!HÔ!HÐØˆØ•#�d”jÔ*Ñ+Ô+Ò+Ð+Ø”Ô% aÔ(ˆBØ  B¤GÐ+Ð+°´	ÐAWÐ0WÐ0WØ”
Ô$×+Ò+¨BÑ/Ô/Ð/Ð/à�Q‘�ð •#�d”jÔ*Ñ+Ô+Ò+Ð+Ð+Ð+Ð+Ð+r4   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r6   )r   r7   r8   s     r3   Úfuse_qordered_mamtulz"BertOnnxModel.fuse_qordered_mamtul—   s    € Ý% dÑ+Ô+ˆØ�Š‰Œˆˆˆr4   r^   Úinput_indicesÚcastedc                 óš  ‡
— g }|                       ¦   «         }|                      |¦  «        }|D ]›Š
ˆ
fd„|D ¦   «         }|D ]ˆ}|                      |¦  «        r|s|                     |¦  «         Œ/||v rU||         }	|	j        dk    rB|                      |	j        d         ¦  «        �"|r |                     |	j        d         ¦  «         Œ‰Œœ|S )zÉ
        Get graph inputs that feed into node type (like EmbedLayerNormalization or Attention).
        Returns a list of the graph input names based on the filter whether it is casted or not.
        c                 óZ   •— g | ]'}|t          ‰j        ¦  «        k     ¯‰j        |         ‘Œ(S rc   )rj   Úinput)rd   rp   r`   s     €r3   ú
<listcomp>zABertOnnxModel.get_graph_inputs_from_node_type.<locals>.<listcomp>¥   s1   ø€ ÐWÐWÐW¨QÀ1ÅsÈ4Ì:ÁÄÒCVÐCV˜4œ: aœ=ÐCVÐCVÐCVr4   ÚCastr   )Úoutput_name_to_nodeÚget_nodes_by_op_typeÚfind_graph_inputÚappendr^   ry   )r1   r^   ru   rv   Úgraph_inputsr|   ÚnodesÚbert_inputsÚ
bert_inputÚparentr`   s             @r3   Úget_graph_inputs_from_node_typez-BertOnnxModel.get_graph_inputs_from_node_type›   s  ø€ ð
 ˆà"×6Ò6Ñ8Ô8ÐØ×)Ò)¨'Ñ2Ô2ˆØð 
	Að 
	AˆDØWÐWÐWÐW°-ÐWÑWÔWˆKØ)ð Að A�
Ø×(Ò(¨Ñ4Ô4ð AØ!ð 8Ø$×+Ò+¨JÑ7Ô7Ð7øØÐ#6Ð6Ð6Ø0°Ô<�FØ”~¨Ò/Ð/°D×4IÒ4IÈ&Ì,ÐWXÌ/Ñ4ZÔ4ZÐ4fØ!ð AØ(×/Ò/°´¸Q´Ñ@Ô@Ð@øðAð Ðr4   c                 ón   — |                       dg d¢|¦  «        }||                       ddg|¦  «        z  }|S )NÚEmbedLayerNormalization)r   rf   é   Ú	Attentioné   )r…   )r1   rv   Úinputss      r3   Ú!get_graph_inputs_from_fused_nodesz/BertOnnxModel.get_graph_inputs_from_fused_nodes±   sE   € Ø×5Ò5Ð6OÐQZÐQZÐQZÐ\bÑcÔcˆØ�$×6Ò6°{ÀQÀCÈÑPÔPÑPˆØˆr4   c                 ó  — |                       ¦   «         }d}d}|j        D ]>}|                      |t          j        ¦  «        \  }}|r|dz  }|t          |¦  «        z  }Œ?t                               d|› d|› d�¦  «         dS )zPChange data type of all graph inputs to int32 type, and add Cast node if needed.r   rf   z)Graph inputs are changed to int32. Added z Cast nodes, and removed z Cast nodes.N)ri   ry   Úchange_graph_input_typer!   ÚINT32rj   ÚloggerÚinfo)r1   ri   Úadd_cast_countÚremove_cast_countÚgraph_inputÚnew_nodeÚremoved_nodess          r3   Úchange_graph_inputs_to_int32z*BertOnnxModel.change_graph_inputs_to_int32¶   sº   € à—
’
‘”ˆØˆØÐØ œ;ð 	4ð 	4ˆKØ&*×&BÒ&BÀ;ÕP[ÔPaÑ&bÔ&bÑ#ˆH�mØð $Ø !Ñ#�Ø¥ ]Ñ!3Ô!3Ñ3ÐÐÝ�Šð A¸ð  Að  AÐarð  Að  Að  Añ	
ô 	
ð 	
ð 	
ð 	
r4   Ú
batch_sizeÚmax_seq_lenc                 ó˜  — |                       d¬¦  «        |                       d¬¦  «        z   }| j        j        j        D ]S}|j        |v rH|j        j        j        j        d         }||_	        |�#|j        j        j        j        d         }||_	        ŒT| j        j        j
        D ]%}|j        j        j        j        d         }||_	        Œ&dS )zD
        Update input and output shape to use dynamic axes.
        T)rv   Fr   Nrf   )rŒ   r'   ri   ry   rl   ÚtypeÚtensor_typeÚshapeÚdimÚ	dim_paramÚoutput)r1   Údynamic_batch_dimÚdynamic_seq_lenÚbert_graph_inputsry   Ú	dim_protor    s          r3   Úuse_dynamic_axeszBertOnnxModel.use_dynamic_axesÄ   sæ   € ð !×BÒBØð Cñ 
ô 
à×2Ò2¸%Ð2Ñ@Ô@ñAÐð ”ZÔ%Ô+ð 	:ð 	:ˆEØŒzÐ.Ð.Ð.Ø!œJÔ2Ô8Ô<¸QÔ?�	Ø&7�	Ô#Ø"Ð.Ø %¤
Ô 6Ô <Ô @ÀÔ C�IØ*9�IÔ'øà”jÔ&Ô-ð 	4ð 	4ˆFØœÔ/Ô5Ô9¸!Ô<ˆIØ"3ˆIÔÐð	4ð 	4r4   c                 ó.   — |                       ¦   «          d S r6   )Úadjust_reshape_and_expandr=   s    r3   Ú
preprocesszBertOnnxModel.preprocessØ   s   € Ø×&Ò&Ñ(Ô(Ð(Øˆr4   c                 ól  — g }|                       ¦   «         D �]X}|j        dk    �rI|                      |j        d         ¦  «        }|�N|j        dk    rC|                     |g¦  «         |                      |j        d         |j        d         ¦  «         Œ|                      |g d¢g d¢|  	                    ¦   «         ¦  «        }|�©|d         }|                      |j        d         ¦  «        }|d         }|                      |j        d         ¦  «        }|d         }	|�O|�Mt          |¦  «        d	k    r:t          |¦  «        dk    r'|d         |d         k    r|	j        d         |j        d<   �ŒZ|rA|                      |¦  «         t                               d
t          |¦  «        › �¦  «         d S d S )NÚReshaperf   r   )ÚExpandr«   rª   ÚSlice)r   r   r   r   éýÿÿÿéþÿÿÿéÿÿÿÿé   z"Removed Reshape and Expand count: )r�   r^   Úget_constant_valuery   ÚsizeÚextendÚreplace_input_of_all_nodesr    Úmatch_parent_pathr|   rj   Úremove_nodesr�   r‘   )
r1   Únodes_to_remover`   Úreshape_shapeÚreshape_pathÚexpand_nodeÚexpand_shape_valueÚreshape_before_expandÚshape_valueÚ
slice_nodes
             r3   r§   z'BertOnnxModel.adjust_reshape_and_expandÜ   sÛ  € ØˆØ—J’J‘L”Lð !	=ñ !	=ˆDØŒ|˜yÒ(Ñ(ð !%× 7Ò 7¸¼
À1¼Ñ FÔ F�Ø Ð,°Ô1CÀqÒ1HÐ1HØ#×*Ò*¨D¨6Ñ2Ô2Ð2Ø×3Ò3°D´KÀ´NÀDÄJÈqÄMÑRÔRÐRØð  $×5Ò5ØØ<Ð<Ð<Ø �L�LØ×,Ò,Ñ.Ô.ñ	 ô  �ð  Ð+Ø".¨rÔ"2�KØ)-×)@Ò)@ÀÔARÐSTÔAUÑ)VÔ)VÐ&à,8¸Ô,<Ð)Ø"&×"9Ò"9Ð:OÔ:UÐVWÔ:XÑ"YÔ"Y�Kà!-¨bÔ!1�Jà*Ð6Ø'Ð3ÝÐ 2Ñ3Ô3°qÒ8Ð8Ý Ñ,Ô,°Ò1Ð1Ø.¨qÔ1°[À´^ÒCÐCà(2Ô(9¸!Ô(<˜œ
 1™ùàð 	UØ×Ò˜oÑ.Ô.Ð.Ý�KŠKÐS½SÀÑ=QÔ=QÐSÐSÑTÔTÐTÐTÐTð	Uð 	Ur4   c                 ó®  — |                       ¦   «         }g }|                      ¦   «         D �]}ddddœ}|j        |v �r»||j                 }|                      |g d¢|dddddg|¦  «        }|��‹|\  }}}	}
}}|j        d         |                      ¦   «         j        d         j        k    �rN|j        d         |j        d<   t          j	        |d¦  «        }t          j	        |d¦  «        }|�ù|�÷t          j        |¦  «        j        d         }t          j        |¦  «        }t          j        t!          j        |g|¬¦  «        ¦  «        }t%          |j        ¦  «        D ]E\  }}|j        dk    r5|j        |                              t          j        d|¦  «        ¦  «          nŒF|                      |j        d         |j        d         ¦  «         |                     |¦  «         |                       ¦   «         }|j        d	k    �r9|                      |g d
¢g d¢|¦  «        }|€|                      |g d¢g d¢|¦  «        }|�ý|d         j        d         |                      ¦   «         j        d         j        k    rÄt          j        d	|j        dt3          |j        ¦  «        dz
  …         |j        |j        dz   ¬¦  «        }d|_        |j                             t          j        d| j        ¦  «        g¦  «         |                      ||                      |¦  «        j        ¦  «         |                     |¦  «         �Œ|                      |¦  «         d S )Nrf   r   rŠ   )r‡   Ú	ReduceSumr‰   )r{   ÚConstantOfShapeÚConcatÚ	UnsqueezeÚGatherÚShapeÚtoÚvalue)Údtyper‰   )rÀ   r{   rÁ   rÅ   )rŠ   r   r   r   )rÀ   rÁ   rÅ   )rŠ   r   r   r¯   Ú_remove_mask)r‹   Úoutputsrl   r]   r(   ) r|   r�   r^   rµ   ry   ri   rl   r    r$   Úget_node_attributer#   Úto_arrayÚflatr"   Útensor_dtype_to_np_dtypeÚ
from_arrayÚnpÚarrayÚ	enumerateÚ	attributeÚCopyFromÚmake_attributer´   r   Ú	make_noderj   r_   r³   r(   Úadd_nodeÚget_graph_by_noder¶   )r1   r|   r·   r`   Úop_input_idrp   Úparent_nodesÚcastÚconstant_of_shapeÚconcatÚ	unsqueezeÚgatherr�   Úcast_to_typeÚ
cos_tensorÚfill_valÚnp_dtypeÚnew_valÚattrÚattention_nodes                       r3   Úclean_graphzBertOnnxModel.clean_graph  s�  € Ø"×6Ò6Ñ8Ô8ÐØˆØ—J’J‘L”Lð S	5ñ S	5ˆDð 78ÀaÐVWÐXÐXˆKØŒ|˜{Ð*Ñ*Ø ¤Ô-�Ø#×5Ò5Øðð ð ð ˜˜1˜a  AÐ&Ø'ñ ô  �ð  Ñ+ð %ñØØ)ØØ!ØØà”{ 1”~¨¯ª©¬Ô);¸AÔ)>Ô)CÒCÑCØ5:´\À!´_Ð)Ô/°Ñ2õ (1Ô'CÀDÈ$Ñ'OÔ'O˜Ý%.Ô%AÐBSÐU\Ñ%]Ô%]˜
Ø'Ð3¸
Ð8NÝ'3Ô'<¸ZÑ'HÔ'HÔ'MÈaÔ'P˜HÝ'-Ô'FÀ|Ñ'TÔ'T˜HÝ&2Ô&=½b¼hÈÀzÐYaÐ>bÑ>bÔ>bÑ&cÔ&c˜GÝ+4Ð5FÔ5PÑ+QÔ+Qð *ð *¡  4Ø#'¤9°Ò#7Ð#7Ø$5Ô$?ÀÔ$B×$KÒ$KÍFÔLaÐbiÐkrÑLsÔLsÑ$tÔ$tÐ$tØ$) Eð $8ð !×;Ò;¸D¼KÈ¼NÐL]ÔLdÐefÔLgÑhÔhÐhØ+×2Ò2°4Ñ8Ô8Ð8à.2×.FÒ.FÑ.HÔ.HÐ+àŒ|˜{Ò*Ñ*ð
  $×5Ò5ØØEÐEÐEØ �L�LØ'ñ	 ô  �ð  Ð'à#'×#9Ò#9ØØAÐAÐAØ!˜	˜	Ø+ñ	$ô $�Lð  Ð+Ø# BÔ'Ô-¨aÔ0°D·J²J±L´LÔ4FÀqÔ4IÔ4NÒNÐNÝ)/Ô)9Ø'Ø#'¤:¨aµ#°d´j±/´/ÀAÑ2EÐ.EÔ#FØ$(¤KØ!%¤¨^Ñ!;ð	*ñ *ô *˜ð 1@˜Ô-Ø&Ô0×7Ò7½Ô9NÈ{Ð\`Ô\jÑ9kÔ9kÐ8lÑmÔmÐmØŸš n°d×6LÒ6LÈTÑ6RÔ6RÔ6WÑXÔXÐXØ'×.Ò.¨tÑ4Ô4Ð4ùØ×Ò˜/Ñ*Ô*Ð*Ð*Ð*r4   c                 óV   — |                       ¦   «          |                      ¦   «          d S r6   )rç   Úprune_graphr=   s    r3   ÚpostprocesszBertOnnxModel.postprocess^  s,   € Ø×ÒÑÔÐØ×ÒÑÔÐÐÐr4   NFÚoptionsÚadd_dynamic_axesc                 ób  — |�|j         s|                      ¦   «          | j                             ¦   «          | j                             ¦   «          |                      ¦   «          |�|j        r(|                      ¦   «          |                      ¦   «          |�|j	        r|  
                    ¦   «          |                      ¦   «          |                      ¦   «          |�|j        r.|                      |j         ¦  «         |                      ¦   «          |�|j        r|                      ¦   «          |�l| j                             |j        ¦  «         |j        rFt-          | j        t0          ¦  «        s,t3          | | j        | j        | j        |j        ¦  «        | _        |�|j        r|                      ¦   «          |�|j        r|                      ¦   «          |                       ¦   «          |�|j!        r*|j        tD          j#        k    }|  $                    |¦  «         | j         %                    ¦   «          |  &                    ¦   «          |�|j'        r,|  (                    d¬¦  «         |  (                    d¬¦  «         |�|j)        r|  *                    ¦   «          |�|j+        r|  ,                    ¦   «          |�|j-        r|  .                    ¦   «          |  /                    ¦   «          |r|  0                    ¦   «          tb           2                    d|  3                    ¦   «         › �¦  «         d S )NT)rB   Fzopset version: )4Úenable_shape_inferenceÚdisable_shape_inferencer0   Úremove_identity_nodesÚremove_useless_cast_nodesr:   Úenable_layer_normrR   rT   Úenable_gelur@   r¨   rK   Úenable_skip_layer_normrW   rY   Úenable_rotary_embeddingsrr   r-   Úset_mask_formatÚattention_mask_formatÚuse_multi_head_attentionÚ
isinstancer.   r   r   r)   r(   Úenable_attentionr>   Úenable_qordered_matmulrt   rM   Úenable_embed_layer_normr   ÚMaskIndexEndrP   Úremove_useless_reshape_nodesrê   Úenable_bias_gelurC   Úenable_bias_skip_layer_normrI   Úenable_gelu_approximationrE   Úenable_gemm_fast_gelurG   Úremove_unused_constantr¥   r�   r‘   Úget_opset_version)r1   rë   rì   rO   s       r3   ÚoptimizezBertOnnxModel.optimizeb  s+  € ØÐ¨Ô)GÐØ×(Ò(Ñ*Ô*Ð*àŒ
×(Ò(Ñ*Ô*Ð*ð 	Œ
×,Ò,Ñ.Ô.Ð.ð 	×ÒÑ!Ô!Ð!àˆO Ô 9ˆOØ× Ò Ñ"Ô"Ð"Ø×+Ò+Ñ-Ô-Ð-àˆO Ô 3ˆOØ�NŠNÑÔÐà�ŠÑÔÐà×ÒÑÔÐàˆO Ô >ˆOØ×%Ò% gÔ&DÑEÔEÐEØ×0Ò0Ñ2Ô2Ð2àˆO Ô @ˆOØ×'Ò'Ñ)Ô)Ð)àÐØÔ×/Ò/°Ô0MÑNÔNÐNØÔ/ð ½
À4ÔCXÕZmÑ8nÔ8nð Ý(7ØØÔ$Ø”NØÔ'ØÔ4ñ)ô )�Ô%ð ˆO Ô 8ˆOØ×ÒÑ!Ô!Ð!ð ˆO Ô >ˆOØ×%Ò%Ñ'Ô'Ð'à�ŠÑÔÐàˆO Ô ?ˆOØ$Ô:Õ>QÔ>^Ò^ˆNØ×!Ò! .Ñ1Ô1Ð1ð 	Œ
×/Ò/Ñ1Ô1Ð1à×ÒÑÔÐð ˆO Ô 8ˆOà×Ò¨DÐÑ1Ô1Ð1Ø×Ò¨EÐÑ2Ô2Ð2àˆO Ô CˆOà×.Ò.Ñ0Ô0Ð0àÐ 7Ô#DÐØ×#Ò#Ñ%Ô%Ð%àÐ 7Ô#@ÐØ×$Ò$Ñ&Ô&Ð&à×#Ò#Ñ%Ô%Ð%ð ð 	$Ø×!Ò!Ñ#Ô#Ð#å�ŠÐ@ d×&<Ò&<Ñ&>Ô&>Ð@Ð@ÑAÔAÐAÐAÐAr4   c                 ó²   — i }g d¢}g d¢}||z   D ])}|                       |¦  «        }t          |¦  «        ||<   Œ*t                               d|› �¦  «         |S )z8
        Returns node count of fused operators.
        )r‡   r‰   ÚMultiHeadAttentionÚGeluÚFastGeluÚBiasGeluÚGemmFastGeluÚLayerNormalizationÚSimplifiedLayerNormalizationÚSkipLayerNormalizationÚ SkipSimplifiedLayerNormalizationr\   )ÚQOrderedAttentionÚQOrderedGeluÚQOrderedLayerNormalizationÚQOrderedMatMulzOptimized operators: )r}   rj   r�   r‘   )r1   Úop_countÚopsÚq_opsÚopr�   s         r3   Úget_fused_operator_statisticsz+BertOnnxModel.get_fused_operator_statistics¶  s„   € ð ˆð
ð 
ð 
ˆð
ð 
ð 
ˆð ˜‘+ð 	&ð 	&ˆBØ×-Ò-¨bÑ1Ô1ˆEÝ˜u™:œ:ˆH�R‰LˆLå�ŠÐ6¨HÐ6Ð6Ñ7Ô7Ð7Øˆr4   c                 óÔ  ‡— ‰€|                       ¦   «         Šdt          fˆfd„} |d¦  «        } |d¦  «         |d¦  «        z    |d¦  «        z   } |d¦  «         |d	¦  «        z    |d
¦  «        z   } |d¦  «         |d¦  «        z   } |d¦  «         |d¦  «        z   }|dk    o|dk    o||k    o|d|z  k    p|d|z  k    }|dk    rt                               d¦  «         |dk    rt                               d¦  «         |dk    rt                               d¦  «         |dk    rt                               d¦  «         |dk    rt                               d¦  «         |S )zA
        Returns True when the model is fully optimized.
        NÚop_namec                 ó2   •— ‰                      | ¦  «        pdS )Nr   )Úget)r  Úfused_op_counts    €r3   r  z2BertOnnxModel.is_fully_optimized.<locals>.op_countÝ  s   ø€ Ø!×%Ò% gÑ.Ô.Ð3°!Ð3r4   r‡   r‰   r  r  r  r
  r	  r  r  r  r  r   r°   zLayer Normalization not fusedz$Simple Layer Normalization not fusedzGelu (or FastGelu) not fusedz!EmbedLayerNormalization not fusedz+Attention (or MultiHeadAttention) not fused)r  Ústrr�   ÚdebugÚwarning)	r1   r  r  ÚembedÚ	attentionÚgeluÚ
layer_normÚsimple_layer_normÚ
is_perfects	    `       r3   Úis_fully_optimizedz BertOnnxModel.is_fully_optimizedÖ  sÒ  ø€ ð Ð!Ø!×?Ò?ÑAÔAˆNð	4�cð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð �Ð2Ñ3Ô3ˆØ�H˜[Ñ)Ô)¨H¨HÐ5IÑ,JÔ,JÑJÈXÈXÐViÑMjÔMjÑjˆ	Øˆx˜ÑÔ ( (¨:Ñ"6Ô"6Ñ6¸¸À*Ñ9MÔ9MÑMˆØ�XÐ2Ñ3Ô3°h°hÐ?WÑ6XÔ6XÑXˆ
Ø$˜HÐ%CÑDÔDÀxÀxÐPrÑGsÔGsÑsÐð �QŠYð XØ˜Q’ðXà˜dÒ"ðXð   I¡Ò-ÐVÐ3DÈÈIÉÒ3Uð	 	ð ˜Š?ˆ?Ý�LŠLÐ8Ñ9Ô9Ð9à Ò!Ð!Ý�LŠLÐ?Ñ@Ô@Ð@à�1Š9ˆ9Ý�LŠLÐ7Ñ8Ô8Ð8à�AŠ:ˆ:Ý�LŠLÐ<Ñ=Ô=Ð=à˜Š>ˆ>Ý�NŠNÐHÑIÔIÐIàÐr4   Úuse_symbolic_shape_inferc                 óN   — t          | ¦  «        }|                     |¦  «         d S r6   )r   Úconvert)r1   r(  Úpacking_modes      r3   Úconvert_to_packing_modez%BertOnnxModel.convert_to_packing_modeþ  s*   € Ý" 4Ñ(Ô(ˆØ×ÒÐ5Ñ6Ô6Ð6Ð6Ð6r4   )r   r   )T)r˜   r™   )NFr6   )F)'Ú__name__Ú
__module__Ú__qualname__r    Úintr,   r:   r>   r@   rC   rE   rG   rI   rK   rM   rP   rR   rT   rW   rY   rr   rt   r  rg   Úboolr…   rŒ   r—   r¥   r¨   r§   rç   rê   r   r  r  r'  r,  Ú__classcell__)r2   s   @r3   r&   r&   &   s}  ø€ € € € € ð'ð '˜jð '°Sð 'È3ð 'ð 'ð 'ð 'ð 'ð 'ð*ð ð ð/ð /ð /ð
	ð 	ð 	ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð	ð 	ð 	ðð ð ðð ð ð ðð ð ðð ð ð(ð ð ð°sð È4ÐPSÌ9ð Ð^bð ð ð ð ð,¸ð ð ð ð ð

ð 
ð 
ð4ð 4ð 4ð 4ð(ð ð ð'Uð 'Uð 'UðRW+ð W+ð W+ðrð ð ðRBð RB °Ñ 4ð RBÈtð RBð RBð RBð RBðhð ð ð@&ð &ð &ð &ðP7ð 7Àð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7r4   r&   )AÚloggingr   ÚnumpyrÐ   r,  r   Úfusion_attentionr   r   Úfusion_bart_attentionr   Úfusion_biasgelur   Úfusion_constant_foldr	   Úfusion_embedlayerr
   Úfusion_fastgelur   Úfusion_gelur   Úfusion_gelu_approximationr   Úfusion_gemmfastgelur   Úfusion_layernormr   r   Úfusion_optionsr   r   Úfusion_qordered_attentionr   Úfusion_qordered_gelur   Úfusion_qordered_layernormr   Úfusion_qordered_matmulr   Úfusion_quickgelur   Úfusion_reshaper   Úfusion_rotary_attentionr   Úfusion_shaper   Úfusion_simplified_layernormr   r   Úfusion_skiplayernormr   r   Úfusion_utilsr   Úonnxr    r!   r"   r#   Ú
onnx_modelr$   r-  r�   r&   rc   r4   r3   ú<module>rM     sd  ðð Ð Ð Ð Ð Ð à Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø *Ð *Ð *Ð *Ð *Ð *Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø *Ð *Ð *Ð *Ð *Ð *Ø "Ð "Ð "Ð "Ð "Ð "Ø =Ð =Ð =Ð =Ð =Ð =Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø =Ð =Ð =Ð =Ð =Ð =Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø FÐ FÐ FÐ FÐ FÐ FØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø (Ð (Ð (Ð (Ð (Ð (Ø :Ð :Ð :Ð :Ð :Ð :Ø $Ð $Ð $Ð $Ð $Ð $Ø rÐ rÐ rÐ rÐ rÐ rÐ rÐ rØ _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ø $Ð $Ð $Ð $Ð $Ð $Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðZ7ð Z7ð Z7ð Z7ð Z7�Iñ Z7ô Z7ð Z7ð Z7ð Z7r4   