Ë
    �…j±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@y)é    )Ú	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 d+d!e!d z  d"efd#„Z"d$„ Z#d,d%„Z$d-d&efd'„Z%ˆ xZ&S ).ÚBertOnnxModelÚmodelÚ	num_headsÚhidden_sizec                 óv  •— |dk(  r|dk(  s|dkD  r||z  dk(  sJ ‚t         ‰| �  |«       || _        || _        t	        | «      | _        t        | | j                  | j                  | j
                  «      | _        t        | | j                  | j                  | j
                  «      | _	        t        | «      | _        y)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       €úi/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_model_bert.pyr,   zBertOnnxModel.__init__'   s®   ø€ ð ˜Q’ ;°!Ò#3¸ÀQºÈ;ÐYbÑKbÐfgÒKgÐhÐhä‰Ñ˜ÔØ"ˆŒØ&ˆÔä+¨DÓ1ˆÔÜ /°°d×6FÑ6FÈÏÉÐX\×XkÑXkÓ lˆÔÜ)@Ø�$×"Ñ" D§N¡N°D×4GÑ4Gó*
ˆÔ&ô ! Ó&ˆ�
ó    c                 ó:   — t        | «      }|j                  «        y ©N)r	   Úapply©r1   Úfusions     r3   Úfuse_constant_foldz BertOnnxModel.fuse_constant_fold<   ó   € Ü# DÓ)ˆØ�‰�r4   c                 ól   — | j                   j                  «        | j                  j                  «        y r6   )r.   r7   r/   ©r1   s    r3   Úfuse_attentionzBertOnnxModel.fuse_attention@   s&   € Ø×Ñ×#Ñ#Ô%à×&Ñ&×,Ñ,Õ.r4   c                 óÜ   — t        | «      }|j                  «        t        | «      }|j                  «        t        | «      }|j                  «        t	        | «      }|j                  «        y r6   )r   r7   r   r   r   r8   s     r3   Ú	fuse_geluzBertOnnxModel.fuse_geluE   sN   € Ü˜DÓ!ˆØ�‰ŒÜ Ó%ˆØ�‰ŒÜ  Ó&ˆØ�‰Œä# DÓ)ˆØ�‰�r4   c                 ó<   — t        | |«      }|j                  «        y r6   )r   r7   )r1   Úis_fastgelur9   s      r3   Úfuse_bias_geluzBertOnnxModel.fuse_bias_geluP   s   € Ü  kÓ2ˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úgelu_approximationz BertOnnxModel.gelu_approximationT   s   € Ü(¨Ó.ˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_gemm_fast_geluz!BertOnnxModel.fuse_gemm_fast_geluX   r;   r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_add_bias_skip_layer_normz+BertOnnxModel.fuse_add_bias_skip_layer_norm\   s   € Ü1°$Ó7ˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_reshapezBertOnnxModel.fuse_reshape`   s   € Ü˜tÓ$ˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Ú
fuse_shapezBertOnnxModel.fuse_shaped   s   € Ü˜TÓ"ˆØ�‰�r4   c                 ó<   — t        | |«      }|j                  «        y r6   )r
   r7   )r1   Úuse_mask_indexr9   s      r3   Úfuse_embed_layerzBertOnnxModel.fuse_embed_layerh   s   € Ü.¨t°^ÓDˆØ�‰�r4   c                 ó¦   — t        | «      }|j                  «        t        | «      }|j                  «        t        | «      }|j                  «        y r6   )r   r7   r   r   r8   s     r3   Úfuse_layer_normzBertOnnxModel.fuse_layer_norml   s=   € Ü)¨$Ó/ˆØ�‰Œä+¨DÓ1ˆØ�‰Œô 2°$Ó7ˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_simplified_layer_normz(BertOnnxModel.fuse_simplified_layer_normw   s   € Ü3°DÓ9ˆØ�‰�r4   c                 ó>   — t        | |¬«      }|j                  «        y )N)Úshape_infer)r   r7   )r1   rV   r9   s      r3   Úfuse_skip_layer_normz"BertOnnxModel.fuse_skip_layer_norm{   s   € Ü-¨dÀÔLˆØ�‰�r4   c                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_skip_simplified_layer_normz-BertOnnxModel.fuse_skip_simplified_layer_norm   s   € Ü7¸Ó=ˆØ�‰�r4   c                 ó.  — t        | «      }|j                  «        t        t        d„ | j                  j
                  j                  «      «      }|D �ch c]  }|j                  ’Œ }}d}|t        | j                  j                  «      k  r„| j                  j                  |   }d|j                  v r4|j                  |vr&| j                  j                  j                  |«       n|dz  }|t        | j                  j                  «      k  rŒƒy y c c}w )Nc                 óB   — | j                   dk(  xr | j                  dk7  S )NÚRotaryEmbeddingúcom.microsoft)Úop_typeÚdomain)Únodes    r3   ú<lambda>z6BertOnnxModel.fuse_rotary_embeddings.<locals>.<lambda>‰   s   € ˜TŸ\™\Ð->Ñ>ÒaÀ4Ç;Á;ÐRaÑCa€ r4   r   r\   é   )r   r7   ÚlistÚfilterr'   Úgraphr`   r_   ÚlenÚ	functionsÚnameÚremove)r1   r9   Úrot_emb_nodesr`   Únon_ms_domains_to_keepÚiÚfns          r3   Úfuse_rotary_embeddingsz$BertOnnxModel.fuse_rotary_embeddingsƒ   sà   € Ü'¨Ó-ˆØ�‰ŒäÜÙaØ—
‘
× Ñ ×%Ñ%óó
ˆð ;HÖ!H°$ $§+£+Ð!HÐÐ!HØˆØ”#�d—j‘j×*Ñ*Ó+Ò+Ø—‘×%Ñ% aÑ(ˆBØ  B§G¡GÑ+°·	±	ÐAWÑ0WØ—
‘
×$Ñ$×+Ñ+¨BÕ/à�Q‘�ð ”#�d—j‘j×*Ñ*Ó+Õ+ùò "Is   ÁDc                 ó:   — t        | «      }|j                  «        y r6   )r   r7   r8   s     r3   Úfuse_qordered_mamtulz"BertOnnxModel.fuse_qordered_mamtul—   s   € Ü% dÓ+ˆØ�‰�r4   r^   Úinput_indicesÚcastedc                 óÜ  — g }| j                  «       }| j                  |«      }|D ]¾  }|D �cg c]*  }|t        |j                  «      k  sŒ|j                  |   ‘Œ, }	}|	D ]‚  }
| j	                  |
«      r|rŒ|j                  |
«       Œ)|
|v sŒ.||
   }|j                  dk(  sŒC| j	                  |j                  d   «      €Œb|sŒe|j                  |j                  d   «       Œ„ ŒÀ |S c c}w )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.
        ÚCastr   )Úoutput_name_to_nodeÚget_nodes_by_op_typerf   ÚinputÚfind_graph_inputÚappendr^   )r1   r^   rq   rr   Úgraph_inputsru   Únodesr`   rl   Úbert_inputsÚ
bert_inputÚparents               r3   Úget_graph_inputs_from_node_typez-BertOnnxModel.get_graph_inputs_from_node_type›   sò   € ð
 ˆà"×6Ñ6Ó8ÐØ×)Ñ)¨'Ó2ˆØò 
	AˆDØ2?ÖW¨QÀ1ÄsÈ4Ï:É:ÃÓCV˜4Ÿ:™: a›=ÐWˆKÐWØ)ò A�
Ø×(Ñ(¨Ô4Ú!Ø$×+Ñ+¨JÕ7ØÐ#6Ò6Ø0°Ñ<�FØ—~‘~¨Ó/°D×4IÑ4IÈ&Ï,É,ÐWXÉ/Ó4ZÑ4fÚ!Ø(×/Ñ/°·±¸Q±Õ@ñAð
	Að Ðùò Xs   ­C)ÁC)c                 ó^   — | j                  dg d¢|«      }|| j                  ddg|«      z  }|S )NÚEmbedLayerNormalization)r   rb   é   Ú	Attentioné   )r   )r1   rr   Úinputss      r3   Ú!get_graph_inputs_from_fused_nodesz/BertOnnxModel.get_graph_inputs_from_fused_nodes±   s9   € Ø×5Ñ5Ð6OÒQZÐ\bÓcˆØ�$×6Ñ6°{ÀQÀCÈÓPÑPˆØˆr4   c                 óö   — | j                  «       }d}d}|j                  D ]:  }| j                  |t        j                  «      \  }}|r|dz  }|t        |«      z  }Œ< t        j                  d|› d|› d�«       y)zPChange data type of all graph inputs to int32 type, and add Cast node if needed.r   rb   z)Graph inputs are changed to int32. Added z Cast nodes, and removed z Cast nodes.N)re   rw   Úchange_graph_input_typer!   ÚINT32rf   ÚloggerÚinfo)r1   re   Ú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ˆKØ&*×&BÑ&BÀ;ÔP[×PaÑPaÓ&bÑ#ˆH�mÙØ !Ñ#�Ø¤ ]Ó!3Ñ3Ñð		4ô
 	�‰Ø7¸Ð7GÐG`ÐarÐ`sÐsð  Aõ	
r4   c                 ó>  — | j                  d¬«      | j                  d¬«      z   }| j                  j                  j                  D ]|  }|j                  |v sŒ|j
                  j                  j                  j                  d   }||_	        |€ŒI|j
                  j                  j                  j                  d   }||_	        Œ~ | j                  j                  j                  D ]6  }|j
                  j                  j                  j                  d   }||_	        Œ8 y)zD
        Update input and output shape to use dynamic axes.
        T)rr   Fr   Nrb   )r†   r'   re   rw   rh   ÚtypeÚtensor_typeÚshapeÚdimÚ	dim_paramÚoutput)r1   Údynamic_batch_dimÚdynamic_seq_lenÚbert_graph_inputsrw   Ú	dim_protor˜   s          r3   Úuse_dynamic_axeszBertOnnxModel.use_dynamic_axesÄ   s  € ð !×BÑBØð Có 
à×2Ñ2¸%Ð2Ó@ñAÐð —Z‘Z×%Ñ%×+Ñ+ò 	:ˆEØ�z‰zÐ.Ò.Ø!ŸJ™J×2Ñ2×8Ñ8×<Ñ<¸QÑ?�	Ø&7�	Ô#Ø"Ñ.Ø %§
¡
× 6Ñ 6× <Ñ <× @Ñ @ÀÑ C�IØ*9�IÕ'ð	:ð —j‘j×&Ñ&×-Ñ-ò 	4ˆFØŸ™×/Ñ/×5Ñ5×9Ñ9¸!Ñ<ˆIØ"3ˆIÕñ	4r4   c                 ó$   — | j                  «        y r6   )Úadjust_reshape_and_expandr=   s    r3   Ú
preprocesszBertOnnxModel.preprocessØ   s   € Ø×&Ñ&Ô(Ør4   c                 ó"  — g }| j                  «       D �]D  }|j                  dk(  sŒ| j                  |j                  d   «      }|�N|j                  dk(  r?|j                  |g«       | j                  |j                  d   |j                  d   «       Œ‚| j                  |g d¢g d¢| j                  «       «      }|€Œ«|d   }| j                  |j                  d   «      }|d   }| j                  |j                  d   «      }|d   }	|€Œù|€Œüt        |«      d	k(  s�Œt        |«      dk(  s�Œ|d   |d   k(  s�Œ)|	j                  d   |j                  d<   �ŒG |r3| j                  |«       t        j                  d
t        |«      › �«       y y )NÚReshaperb   r   )ÚExpandr£   r¢   ÚSlice)r   r   r   r   éýÿÿÿéþÿÿÿéÿÿÿÿé   z"Removed Reshape and Expand count: )r{   r^   Úget_constant_valuerw   ÚsizeÚextendÚreplace_input_of_all_nodesr˜   Úmatch_parent_pathru   rf   Ú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ó !	=ˆDØ�|‰|˜yÓ(ð !%× 7Ñ 7¸¿
¹
À1¹Ó F�Ø Ð,°×1CÑ1CÀqÒ1HØ#×*Ñ*¨D¨6Ô2Ø×3Ñ3°D·K±KÀ±NÀDÇJÁJÈqÁMÔRØð  $×5Ñ5ØÚ<Ú Ø×,Ñ,Ó.ó	 �ð  Ñ+Ø".¨rÑ"2�KØ)-×)@Ñ)@À×ARÑARÐSTÑAUÓ)VÐ&à,8¸Ñ,<Ð)Ø"&×"9Ñ"9Ð:O×:UÑ:UÐVWÑ:XÓ"Y�Kà!-¨bÑ!1�Jà*Ñ6Ø'Ñ3ÜÐ 2Ó3°qÔ8Ü Ó,°Ô1Ø.¨qÑ1°[À±^ÔCà(2×(9Ñ(9¸!Ñ(<˜Ÿ
™
 1›ðC!	=ñF Ø×Ñ˜oÔ.Ü�K‰KÐ<¼SÀÓ=QÐ<RÐSÕTð r4   c                 óÞ  — | j                  «       }g }| j                  «       D �]6  }ddddœ}|j                  |v �rË||j                     }| j                  |g d¢|dddddg|«      }|���|\  }}}	}
}}|j                  d   | j                  «       j                  d   j                  k(  �r\|j                  d   |j                  d<   t        j                  |d«      }t        j                  |d«      }|��|�ÿt        j                  |«      j                  d   }t        j                  |«      }t        j                  t!        j"                  |g|¬«      «      }t%        |j&                  «      D ]H  \  }}|j                  dk(  sŒ|j&                  |   j)                  t        j*                  d|«      «        n | j-                  |j                  d   |j                  d   «       |j/                  |«       | j                  «       }|j                  d	k(  s�Œõ| j                  |g d
¢g d¢|«      }|€| j                  |g d¢g d¢|«      }|€�Œ+|d   j                  d   | j                  «       j                  d   j                  k(  s�Œgt        j0                  d	|j                  dt3        |j                  «      dz
   |j                  |j                  dz   ¬«      }d|_        |j&                  j7                  t        j*                  d| j8                  «      g«       | j;                  || j=                  |«      j                  «       |j/                  |«       �Œ9 | j?                  |«       y )Nrb   r   r„   )r�   Ú	ReduceSumrƒ   )rt   ÚConstantOfShapeÚConcatÚ	UnsqueezeÚGatherÚShapeÚtoÚvalue)Údtyperƒ   )r¸   rt   r¹   r½   )r„   r   r   r   )r¸   r¹   r½   )r„   r   r   r§   Ú_remove_mask)r…   Úoutputsrh   r]   r(   ) ru   r{   r^   r­   rw   re   rh   r˜   r$   Úget_node_attributer#   Úto_arrayÚflatr"   Útensor_dtype_to_np_dtypeÚ
from_arrayÚnpÚarrayÚ	enumerateÚ	attributeÚCopyFromÚmake_attributer¬   ry   Ú	make_noderf   r_   r«   r(   Úadd_nodeÚget_graph_by_noder®   )r1   ru   r¯   r`   Úop_input_idrl   Ú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  s8  € Ø"×6Ñ6Ó8ÐØˆØ—J‘J“Ló S	5ˆDð 78ÀaÐVWÑXˆKØ�|‰|˜{Ò*Ø §¡Ñ-�Ø#×5Ñ5Øòð ˜˜1˜a  AÐ&Ø'ó �ð  Ñ+ð %ñØØ)ØØ!ØØà—{‘{ 1‘~¨¯©«×);Ñ);¸AÑ)>×)CÑ)CÓCØ5:·\±\À!±_Ð)×/Ñ/°Ñ2ô (1×'CÑ'CÀDÈ$Ó'O˜Ü%.×%AÑ%AÐBSÐU\Ó%]˜
Ø'Ñ3¸
Ð8NÜ'3×'<Ñ'<¸ZÓ'H×'MÑ'MÈaÑ'P˜HÜ'-×'FÑ'FÀ|Ó'T˜HÜ&2×&=Ñ&=¼b¿h¹hÈÀzÐYaÔ>bÓ&c˜GÜ+4Ð5F×5PÑ5PÓ+Qò *¡  4Ø#'§9¡9°Ó#7Ø$5×$?Ñ$?ÀÑ$B×$KÑ$KÌF×LaÑLaÐbiÐkrÓLsÔ$tÙ$)ð*ð !×;Ñ;¸D¿K¹KÈ¹NÐL]×LdÑLdÐefÑLgÔhØ+×2Ñ2°4Ô8à.2×.FÑ.FÓ.HÐ+à�|‰|˜{Ô*ð
  $×5Ñ5ØÚEÚ Ø'ó	 �ð  Ð'à#'×#9Ñ#9ØÚAÚ!Ø+ó	$�Lð  Ò+Ø# BÑ'×-Ñ-¨aÑ0°D·J±J³L×4FÑ4FÀqÑ4I×4NÑ4NÔNÜ)/×)9Ñ)9Ø'Ø#'§:¡:¨a´#°d·j±j³/ÀAÑ2EÐ#FØ$(§K¡KØ!%§¡¨^Ñ!;ô	*˜ð 1@˜Ô-Ø&×0Ñ0×7Ñ7¼×9NÑ9NÈ{Ð\`×\jÑ\jÓ9kÐ8lÔmØŸ™ n°d×6LÑ6LÈTÓ6R×6WÑ6WÔXØ'×.Ñ.¨tÖ4ðgS	5ðh 	×Ñ˜/Õ*r4   c                 óD   — | j                  «        | j                  «        y r6   )rß   Úprune_graphr=   s    r3   ÚpostprocesszBertOnnxModel.postprocess^  s   € Ø×ÑÔØ×ÑÕr4   NÚoptionsÚadd_dynamic_axesc                 ól  — |�|j                   s| j                  «        | j                  j                  «        | j                  j	                  «        | j                  «        |�|j                  r | j                  «        | j                  «        |�|j                  r| j                  «        | j                  «        | j                  «        |�|j                  r+| j                  |j                   «       | j                  «        |�|j                   r| j#                  «        |�‡| j$                  j'                  |j(                  «       |j*                  rVt-        | j.                  t0        «      s<t3        | | j4                  | j6                  | j$                  |j*                  «      | _        |�|j8                  r| j;                  «        |�|j<                  r| j?                  «        | jA                  «        |�|jB                  r.|j(                  tD        jF                  k(  }| jI                  |«       | j                  jK                  «        | jM                  «        |�|jN                  r$| jQ                  d¬«       | jQ                  d¬«       |�|jR                  r| jU                  «        |�|jV                  r| jY                  «        |�|jZ                  r| j]                  «        | j_                  «        |r| ja                  «        tb        je                  d| jg                  «       › �«       y )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_embeddingsrn   r-   Úset_mask_formatÚattention_mask_formatÚuse_multi_head_attentionÚ
isinstancer.   r   r   r)   r(   Úenable_attentionr>   Úenable_qordered_matmulrp   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Ò)GØ×(Ñ(Ô*à�
‰
×(Ñ(Ô*ð 	�
‰
×,Ñ,Ô.ð 	×ÑÔ!àˆO × 9Ò 9Ø× Ñ Ô"Ø×+Ñ+Ô-àˆO × 3Ò 3Ø�N‰NÔà�‰Ôà×ÑÔàˆO × >Ò >Ø×%Ñ% g×&DÑ&DÔEØ×0Ñ0Ô2àˆO × @Ò @Ø×'Ñ'Ô)àÐØ×Ñ×/Ñ/°×0MÑ0MÔNØ×/Ò/¼
À4×CXÑCXÔZmÔ8nÜ(7ØØ×$Ñ$Ø—N‘NØ×'Ñ'Ø×4Ñ4ó)�Ô%ð ˆO × 8Ò 8Ø×ÑÔ!ð ˆO × >Ò >Ø×%Ñ%Ô'à�‰ÔàˆO × ?Ò ?Ø$×:Ñ:Ô>Q×>^Ñ>^Ñ^ˆNØ×!Ñ! .Ô1ð 	�
‰
×/Ñ/Ô1à×ÑÔð ˆO × 8Ò 8à×Ñ¨DÐÔ1Ø×Ñ¨EÐÔ2àˆO × CÒ Cà×.Ñ.Ô0àÐ 7×#DÒ#DØ×#Ñ#Ô%àÐ 7×#@Ò#@Ø×$Ñ$Ô&à×#Ñ#Ô%ñ Ø×!Ñ!Ô#ä�‰�o d×&<Ñ&<Ó&>Ð%?Ð@ÕAr4   c                 óœ   — i }g d¢}g d¢}||z   D ]!  }| j                  |«      }t        |«      ||<   Œ# t        j                  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: )rv   rf   rŠ   r‹   )r1   Úop_countÚopsÚq_opsÚopr{   s         r3   Úget_fused_operator_statisticsz+BertOnnxModel.get_fused_operator_statistics¶  sd   € ð ˆò
ˆò
ˆð ˜‘+ò 	&ˆBØ×-Ñ-¨bÓ1ˆEÜ˜u›:ˆH�RŠLð	&ô 	�‰Ð+¨H¨:Ð6Ô7Øˆr4   c                 óR  ‡— ‰€| j                  «       Šdt        fˆfd„} |d«      } |d«       |d«      z    |d«      z   } |d«       |d«      z    |d	«      z   } |d
«       |d«      z   } |d«       |d«      z   }|dkD  xr  |dkD  xr ||k(  xr |d|z  k\  xs |d|z  k\  }|dk(  rt        j                  d«       |dk(  rt        j                  d«       |dk(  rt        j                  d«       |dk(  rt        j                  d«       |dk(  rt        j	                  d«       |S )zA
        Returns True when the model is fully optimized.
        Úop_namec                 ó.   •— ‰j                  | «      xs 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Ö  sV  ø€ ð Ð!Ø!×?Ñ?ÓAˆNð	4œcõ 	4ñ Ð2Ó3ˆÙ˜[Ó)©HÐ5IÓ,JÑJÉXÐViÓMjÑjˆ	Ù˜Ó¡(¨:Ó"6Ñ6¹À*Ó9MÑMˆÙÐ2Ó3±hÐ?WÓ6XÑXˆ
Ù$Ð%CÓDÁxÐPrÓGsÑsÐð �Q‰Yò XØ˜Q‘òXà˜dÑ"òXð   I¡Ñ-ÒVÐ3DÈÈIÉÑ3Uð	 	ð ˜Š?Ü�L‰LÐ8Ô9à Ò!Ü�L‰LÐ?Ô@à�1Š9Ü�L‰LÐ7Ô8à�AŠ:Ü�L‰LÐ<Ô=à˜Š>Ü�N‰NÐHÔIàÐr4   Úuse_symbolic_shape_inferc                 ó<   — t        | «      }|j                  |«       y r6   )r   Úconvert)r1   r   Úpacking_modes      r3   Úconvert_to_packing_modez%BertOnnxModel.convert_to_packing_modeþ  s   € Ü" 4Ó(ˆØ×ÑÐ5Õ6r4   )r   r   )T)Ú
batch_sizeÚmax_seq_len)NFr6   )F)'Ú__name__Ú
__module__Ú__qualname__r    Úintr,   r:   r>   r@   rC   rE   rG   rI   rK   rM   rP   rR   rT   rW   rY   rn   rp   r  rc   Ú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ò(ò'UòRW+òrñRB °Ñ 4ð RBÈtó RBòhó@&ñP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&   © r4   r3   ú<module>rH     ss   ðõ ã Ý /ß ;Ý 5Ý *Ý 3Ý ;Ý *Ý "Ý =Ý 2ß Qß =Ý =Ý 3Ý FÝ 7Ý ,Ý (Ý :Ý $ß rß _Ý $ß >Ó >Ý  á	�8Ó	€ôZ7�Iõ Z7r4   