§
    ¹¯Åj²O  ã                   óŒ  — d dl m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-m.Z.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:  ee;¦  «        Z< G d„ de:¦  «        Z=dS )é    )Ú	getLogger)Ú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)Ú	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       €úYC:\Projects\Historical\venv\Lib\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©r0   Úfusions     r2   Úfuse_constant_foldz BertOnnxModel.fuse_constant_fold;   ó    € Ý# DÑ)Ô)ˆØ�Š‰Œˆˆˆr3   c                 ój   — | j                              ¦   «          | j                             ¦   «          d S r5   )r-   r6   r.   ©r0   s    r2   Úfuse_attentionzBertOnnxModel.fuse_attention?   s2   € ØÔ×#Ò#Ñ%Ô%Ð%àÔ&×,Ò,Ñ.Ô.Ð.Ð.Ð.r3   c                 ó  — t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t	          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r   r   r   r7   s     r2   Ú	fuse_geluzBertOnnxModel.fuse_geluD   sn   € Ý˜DÑ!Ô!ˆØ�Š‰ŒˆÝ Ñ%Ô%ˆØ�Š‰ŒˆÝ  Ñ&Ô&ˆØ�Š‰Œˆå# DÑ)Ô)ˆØ�Š‰Œˆˆˆr3   c                 óN   — t          | |¦  «        }|                     ¦   «          d S r5   )r   r6   )r0   Úis_fastgelur8   s      r2   Úfuse_bias_geluzBertOnnxModel.fuse_bias_geluO   s"   € Ý  kÑ2Ô2ˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úgelu_approximationz BertOnnxModel.gelu_approximationS   s    € Ý(¨Ñ.Ô.ˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_gemm_fast_geluz!BertOnnxModel.fuse_gemm_fast_geluW   r:   r3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_add_bias_skip_layer_normz+BertOnnxModel.fuse_add_bias_skip_layer_norm[   s    € Ý1°$Ñ7Ô7ˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_reshapezBertOnnxModel.fuse_reshape_   s    € Ý˜tÑ$Ô$ˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Ú
fuse_shapezBertOnnxModel.fuse_shapec   s    € Ý˜TÑ"Ô"ˆØ�Š‰Œˆˆˆr3   c                 óN   — t          | |¦  «        }|                     ¦   «          d S r5   )r
   r6   )r0   Úuse_mask_indexr8   s      r2   Úfuse_embed_layerzBertOnnxModel.fuse_embed_layerg   s"   € Ý.¨t°^ÑDÔDˆØ�Š‰Œˆˆˆr3   c                 óØ   — t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r   r   r7   s     r2   Úfuse_layer_normzBertOnnxModel.fuse_layer_normk   sV   € Ý)¨$Ñ/Ô/ˆØ�Š‰Œˆå+¨DÑ1Ô1ˆØ�Š‰Œˆõ 2°$Ñ7Ô7ˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_simplified_layer_normz(BertOnnxModel.fuse_simplified_layer_normv   s    € Ý3°DÑ9Ô9ˆØ�Š‰Œˆˆˆr3   Tc                 óP   — t          | |¬¦  «        }|                     ¦   «          d S )N)Úshape_infer)r   r6   )r0   rU   r8   s      r2   Úfuse_skip_layer_normz"BertOnnxModel.fuse_skip_layer_normz   s%   € Ý-¨dÀÐLÑLÔLˆØ�Š‰Œˆˆˆr3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_skip_simplified_layer_normz-BertOnnxModel.fuse_skip_simplified_layer_norm~   s    € Ý7¸Ñ=Ô=ˆØ�Š‰Œˆˆˆr3   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    r2   ú<lambda>z6BertOnnxModel.fuse_rotary_embeddings.<locals>.<lambda>ˆ   s   € ˜Tœ\Ð->Ò>ÐaÀ4Ä;ÐRaÒCa€ r3   c                 ó   — h | ]	}|j         ’Œ
S © )r^   )Ú.0r_   s     r2   ú	<setcomp>z7BertOnnxModel.fuse_rotary_embeddings.<locals>.<setcomp>Œ   s   € Ð!HÐ!HÐ!H°$ $¤+Ð!HÐ!HÐ!Hr3   r   r[   é   )r   r6   ÚlistÚfilterr&   Úgraphr_   ÚlenÚ	functionsÚnamer^   Úremove)r0   r8   Úrot_emb_nodesÚnon_ms_domains_to_keepÚiÚfns         r2   Ú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Ô*Ñ+Ô+Ò+Ð+Ð+Ð+Ð+Ð+r3   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r5   )r   r6   r7   s     r2   Úfuse_qordered_mamtulz"BertOnnxModel.fuse_qordered_mamtul–   s    € Ý% dÑ+Ô+ˆØ�Š‰Œˆˆˆr3   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 rb   )ri   Úinput)rc   ro   r_   s     €r2   ú
<listcomp>zABertOnnxModel.get_graph_inputs_from_node_type.<locals>.<listcomp>¤   s1   ø€ ÐWÐWÐW¨QÀ1ÅsÈ4Ì:ÁÄÒCVÐCV˜4œ: aœ=ÐCVÐCVÐCVr3   ÚCastr   )Úoutput_name_to_nodeÚget_nodes_by_op_typeÚfind_graph_inputÚappendr]   rx   )r0   r]   rt   ru   Úgraph_inputsr{   ÚnodesÚbert_inputsÚ
bert_inputÚparentr_   s             @r2   Ú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ð Ðr3   c                 ón   — |                       dg d¢|¦  «        }||                       ddg|¦  «        z  }|S )NÚEmbedLayerNormalization)r   re   é   Ú	Attentioné   )r„   )r0   ru   Úinputss      r2   Ú!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ˆØˆr3   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   re   z)Graph inputs are changed to int32. Added z Cast nodes, and removed z Cast nodes.N)rh   rx   Úchange_graph_input_typer!   ÚINT32ri   ÚloggerÚinfo)r0   rh   Úadd_cast_countÚremove_cast_countÚgraph_inputÚnew_nodeÚremoved_nodess          r2   Ú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ñ	
ô 	
ð 	
ð 	
ð 	
r3   Ú
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)ru   Fr   Nre   )r‹   r&   rh   rx   rk   ÚtypeÚtensor_typeÚshapeÚdimÚ	dim_paramÚoutput)r0   Údynamic_batch_dimÚdynamic_seq_lenÚbert_graph_inputsrx   Ú	dim_protorŸ   s          r2   Ú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ð 	4r3   c                 ó.   — |                       ¦   «          d S r5   )Úadjust_reshape_and_expandr<   s    r2   Ú
preprocesszBertOnnxModel.preprocess×   s   € Ø×&Ò&Ñ(Ô(Ð(Øˆr3   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ÚReshapere   r   )ÚExpandrª   r©   ÚSlice)r   r   r   r   éýÿÿÿéþÿÿÿéÿÿÿÿé   z"Removed Reshape and Expand count: )r€   r]   Úget_constant_valuerx   ÚsizeÚextendÚreplace_input_of_all_nodesrŸ   Úmatch_parent_pathr{   ri   Úremove_nodesr�   r�   )
r0   Únodes_to_remover_   Úreshape_shapeÚreshape_pathÚexpand_nodeÚexpand_shape_valueÚreshape_before_expandÚshape_valueÚ
slice_nodes
             r2   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r3   c                 ó"  — |                       ¦   «         }g }|                      ¦   «         D �]Í}ddddœ}|j        |v r”||j                 }|                      |g d¢|dddddg|¦  «        }|�e|\  }}}	}
}}|j        d         |                      ¦   «         j        d         j        k    r)|j        d         |j        d<   |                       ¦   «         }|j        dk    �r|                      |g d¢g d¢|¦  «        }|�ý|d	         j        d         |                      ¦   «         j        d         j        k    rÄt          j	        d|j        dt          |j        ¦  «        dz
  …         |j        |j        d
z   ¬¦  «        }d|_        |j                             t          j        d| j        ¦  «        g¦  «         |                      ||                      |¦  «        j        ¦  «         |                     |¦  «         �ŒÏ|                      |¦  «         d S )Nre   r   r‰   )r†   Ú	ReduceSumrˆ   )rz   ÚConstantOfShapeÚConcatÚ	UnsqueezeÚGatherÚShaperˆ   )r¿   rz   rÀ   rÄ   )r‰   r   r   r   r®   Ú_remove_mask)rŠ   Úoutputsrk   r\   r'   )r{   r€   r]   r´   rx   rh   rk   rŸ   r"   Ú	make_noderi   r^   Ú	attributer²   Úmake_attributer'   Úadd_nodeÚget_graph_by_noder~   rµ   )r0   r{   r¶   r_   Úop_input_idro   Úparent_nodesÚcastÚconstantOfShapeÚconcatÚ	unsqueezeÚgatherrœ   Úattention_nodes                 r2   Úclean_graphzBertOnnxModel.clean_graph  s@  € Ø"×6Ò6Ñ8Ô8ÐØˆØ—J’J‘L”Lð <	5ñ <	5ˆDð 78ÀaÐVWÐXÐXˆKØŒ|˜{Ð*Ð*Ø ¤Ô-�Ø#×5Ò5Øðð ð ð ˜˜1˜a  AÐ&Ø'ñ ô  �ð  Ð+ð %ñØØ'ØØ!ØØà”{ 1”~¨¯ª©¬Ô);¸AÔ)>Ô)CÒCÐCØ38´<À´?˜Ô-¨aÑ0Ø.2×.FÒ.FÑ.HÔ.HÐ+àŒ|˜{Ò*Ñ*ð
  $×5Ò5ØØEÐEÐEØ �L�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È^Ñ6\Ô6\Ô6aÑbÔbÐbØ'×.Ò.¨tÑ4Ô4Ð4ùØ×Ò˜/Ñ*Ô*Ð*Ð*Ð*r3   c                 óV   — |                       ¦   «          |                      ¦   «          d S r5   )rÔ   Úprune_graphr<   s    r2   ÚpostprocesszBertOnnxModel.postprocessF  s,   € Ø×ÒÑÔÐØ×ÒÑÔÐÐÐr3   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)rA   Fzopset version: )4Úenable_shape_inferenceÚdisable_shape_inferencer/   Úremove_identity_nodesÚremove_useless_cast_nodesr9   Úenable_layer_normrQ   rS   Úenable_gelur?   r§   rJ   Úenable_skip_layer_normrV   rX   Úenable_rotary_embeddingsrq   r,   Úset_mask_formatÚattention_mask_formatÚuse_multi_head_attentionÚ
isinstancer-   r   r   r(   r'   Úenable_attentionr=   Úenable_qordered_matmulrs   rL   Úenable_embed_layer_normr   ÚMaskIndexEndrO   Úremove_useless_reshape_nodesr×   Úenable_bias_gelurB   Úenable_bias_skip_layer_normrH   Úenable_gelu_approximationrD   Úenable_gemm_fast_gelurF   Úremove_unused_constantr¤   r�   r�   Úget_opset_version)r0   rØ   rÙ   rN   s       r2   ÚoptimizezBertOnnxModel.optimizeJ  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ÐAr3   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|   ri   r�   r�   )r0   Úop_countÚopsÚq_opsÚopr€   s         r2   Ú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Øˆr3   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    €r2   r  z2BertOnnxModel.is_fully_optimized.<locals>.op_countÅ  s   ø€ Ø!×%Ò% gÑ.Ô.Ð3°!Ð3r3   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)	r0   r
  r  ÚembedÚ	attentionÚgeluÚ
layer_normÚsimple_layer_normÚ
is_perfects	    `       r2   Ú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àÐr3   Úuse_symbolic_shape_inferc                 óN   — t          | ¦  «        }|                     |¦  «         d S r5   )r   Úconvert)r0   r  Úpacking_modes      r2   Úconvert_to_packing_modez%BertOnnxModel.convert_to_packing_modeæ  s*   € Ý" 4Ñ(Ô(ˆØ×ÒÐ5Ñ6Ô6Ð6Ð6Ð6r3   )r   r   )T)r—   r˜   )NFr5   )F)'Ú__name__Ú
__module__Ú__qualname__r    Úintr+   r9   r=   r?   rB   rD   rF   rH   rJ   rL   rO   rQ   rS   rV   rX   rq   rs   r  rf   Úboolr„   r‹   r–   r¤   r§   r¦   rÔ   r×   r   rò   r  r  r  Ú__classcell__)r1   s   @r2   r%   r%   %   s}  ø€ € € € € ð'ð '˜jð '°Sð 'È3ð 'ð 'ð 'ð 'ð 'ð 'ð*ð ð ð/ð /ð /ð
	ð 	ð 	ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð	ð 	ð 	ðð ð ðð ð ð ðð ð ðð ð ð(ð ð ð°sð È4ÐPSÌ9ð Ð^bð ð ð ð ð,¸ð ð ð ð ð

ð 
ð 
ð4ð 4ð 4ð 4ð(ð ð ð'Uð 'Uð 'UðR@+ð @+ð @+ðDð ð ð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ð 7r3   r%   N)>Úloggingr   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"   Ú
onnx_modelr#   r  r�   r%   rb   r3   r2   ú<module>r9     sR  ðð Ð Ð Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 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Ø _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ø $Ð $Ð $Ð $Ð $Ð $Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðC7ð C7ð C7ð C7ð C7�Iñ C7ô C7ð C7ð C7ð C7r3   