
    `i/2                         S SK Jr  S SKJrJr  S SKJr  S SKJr  S SKJ	r	J
r
  S SKJrJr  S SKJr  S SKJrJr  S S	KJr  S S
KJr  S SKJr  S SKJr  \" \5      r " S S5      r " S S\5      rg)    )	getLogger)TensorProtohelper)	OnnxModel)FusionReshape)FusionLayerNormalizationFusionLayerNormalizationTF)FusionSkipLayerNormalization FusionBiasSkipLayerNormalization)FusionEmbedLayerNormalization)FusionAttentionAttentionMask)
FusionGelu)FusionFastGelu)FusionBiasGelu)FusionGeluApproximationc                       \ rS rSrS rSrg)BertOptimizationOptions   c                     SU l         SU l        SU l        SU l        SU l        SU l        SU l        SU l        US:X  a  SU l        g g )NTFgpt2)enable_geluenable_layer_normenable_attentionenable_skip_layer_normenable_embed_layer_normenable_bias_skip_layer_normenable_bias_geluenable_gelu_approximation)self
model_types     k/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/transformers/BertOnnxModel.py__init__ BertOptimizationOptions.__init__   sW    !% $&*#'+$+/( $).&*/D'      )r   r   r   r   r   r   r   r   N)__name__
__module____qualname____firstlineno__r#   __static_attributes__ r%   r"   r   r      s    0r%   r   c                      ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rSS jrS rS rSS jrS rS rS rSS\4S jjrS rS rSrU =r$ )BertOnnxModel%   c                    > US:  d   eX2-  S:X  d   e[         TU ]  U5        X l        X0l        / U l        [        U 5      U l        [        X R                  U R                  U R                  5      U l        g )Nr   )	superr#   	num_headshidden_sizebert_inputsr   attention_maskr   attention_fusion)r    modelr1   r2   	__class__s       r"   r#   BertOnnxModel.__init__&   so    1}}&!+++"&+D1 /6F6FX\XkXk lr%   c                 8    U R                   R                  5         g N)r5   applyr    s    r"   fuse_attentionBertOnnxModel.fuse_attention2   s    ##%r%   c                 p    [        U 5      nUR                  5         [        U 5      nUR                  5         g r:   )r   r;   r   r    fusions     r"   	fuse_geluBertOnnxModel.fuse_gelu5   s(    D!%r%   c                 :    [        X5      nUR                  5         g r:   )r   r;   )r    is_fastgelurA   s      r"   fuse_bias_geluBertOnnxModel.fuse_bias_gelu;   s    2r%   c                 :    [        U 5      nUR                  5         g r:   )r   r;   r@   s     r"   gelu_approximation BertOnnxModel.gelu_approximation?   s    (.r%   c                 :    [        U 5      nUR                  5         g r:   )r   r;   r@   s     r"   fuse_add_bias_skip_layer_norm+BertOnnxModel.fuse_add_bias_skip_layer_normC   s    1$7r%   c                 :    [        U 5      nUR                  5         g r:   )r   r;   r@   s     r"   fuse_reshapeBertOnnxModel.fuse_reshapeG   s    t$r%   c                 N   U R                   (       a  U R                   R                  O0 nU R                   (       a  U R                   R                  O0 n[        XU5      nUR	                  5         UR
                  (       a&  U R                  R                  UR
                  5        g g r:   )r4   mask_indicemask_castedr   r;   mask_input_namer3   append)r    rR   rS   rA   s       r"   fuse_embed_layerBertOnnxModel.fuse_embed_layerK   sw    9=9L9Ld))55RT9=9L9Ld))55RT.t+N!!##F$:$:; "r%   c                 p    [        U 5      nUR                  5         [        U 5      nUR                  5         g r:   )r   r;   r	   r@   s     r"   fuse_layer_normBertOnnxModel.fuse_layer_normS   s(    )$/+D1r%   c                 :    [        U 5      nUR                  5         g r:   )r
   r;   r@   s     r"   fuse_skip_layer_norm"BertOnnxModel.fuse_skip_layer_normZ   s    -d3r%   c                 F    U(       a  U R                   $ U R                   S S $ )N   )r3   )r    include_masks     r"   get_bert_inputsBertOnnxModel.get_bert_inputs^   s"    #/tIT5E5Ebq5IIr%   c                    U R                  5       nU R                  5       nUR                   GH  nUR                  U;   d  M  UR                  R
                  nUR                  S5      (       d  MD  S nUR                  R                  S   nUR                  S5      (       a  UR                  nO+UR                  S5      (       a  [        UR                  5      nS nUR                  R                  S   nUR                  S5      (       a  UR                  nO+UR                  S5      (       a  [        UR                  5      nXW4s  $    g)Nshaper   	dim_value	dim_param   )NN)graphra   inputnametypetensor_typeHasFieldrd   dimre   strrf   )r    rh   r3   ri   rl   
batch_sizedsequence_lengths           r"   get_bert_input_shape"BertOnnxModel.get_bert_input_shapea   s   

**,[[Ezz[(#jj44((11!%J#))--a0A

;//%&[[
**[11%(%5
&*O#))--a0A

;//*+++**[11*-akk*:%66# !& r%   c           	         U R                   R                  S   R                  nU R                  5       nU R	                  5       u  p4/ nU R                  5       nUR                   H  nUR                  U;   a  U R                  UR                  5        [        U[        5      (       a  UOS[        U[        5      (       a  UOS/n[        R                  " UR                  [        R                  U5      n	UR                  U	5        M  UR                  U5        M     [        R                   " UR"                  SUUR$                  UR&                  UR(                  S9n
[        R*                  " U
SS9U l         [        U[,        5      (       d  [        U[,        5      (       a@  U R/                  [        U[,        5      (       a  UOS [        U[,        5      (       a  UOS 5        XR                   R                  S   l        g )Nr   rg      zint32 inputs)initializer
value_infozbert model optimizer)producer_name)r6   opset_importversionrh   rs   ra   ri   rj   remove_cast_int32
isinstanceintr   make_tensor_value_infor   INT32rU   
make_graphnodeoutputrw   rx   
make_modelro   use_dynamic_axes)r    original_opset_versionrh   rp   rr   new_graph_inputsr3   ri   input_shapeint32_input	graph_defs              r"   change_input_to_int32#BertOnnxModel.change_input_to_int32y   s   !%!8!8!;!C!C

&*&?&?&A#
**,[[Ezz[(&&uzz2",Z"="=J1'1/3'G'GOS %;;EJJHYHY[fg ''4 ''. ! %%ejj&4&6&+ll272C2C161A1AC	 &&y@VW
j#&&*_c*J*J!!
:s0K0K*QU5?QT5U5U/[_a .D

"*r%   c                 4   U R                  5       n0 nU R                  R                  R                   H  nU H  nXeR                  :X  d  M  UR
                  R                  R                  R                  S   nXl	        Uc  ML  UR
                  R                  R                  R                  S   nX'l	        M     M     U R                  R                  R                   H6  nUR
                  R                  R                  R                  S   nXl	        M8     g)z4
Update input and output shape to use dynamic axes.
r   Nrg   )ra   r6   rh   ri   rj   rk   rl   rd   rn   rf   r   )	r    dynamic_batch_dimdynamic_seq_lenr3   dynamic_batch_inputsri   
bert_input	dim_protor   s	            r"   r   BertOnnxModel.use_dynamic_axes   s     **,!ZZ%%++E)
+ %

 6 6 < < @ @ CI*;'&2$)JJ$:$:$@$@$D$DQ$G	.=+ * , jj&&--F//5599!<I"3 .r%   c                     g r:   r+   r<   s    r"   
preprocessBertOnnxModel.preprocess   s    r%   c                 `   U R                  5       n/ n/ nU R                  5        GH  nUR                  S:X  d  UR                  S:X  a  UR                  S:X  a  SOSnU R                  U/ SQUSSSSS/U5      nUbj  Uu  pxppUR                  S   U R                  5       R                  S   R                  :X  a,  UR                  S   UR                  S'   U R                  5       nUR                  S:X  d  M  U R                  U/ SQ/ SQU5      nUc  M  US	   R                  S   U R                  5       R                  S   R                  :X  d  GM.  [        R                  " SUR                  S[        UR                  5      S-
   UR                  UR                  S
-   S9nSUl        UR                  R                  [        R                  " SU R                  5      /5        UR!                  U5        UR!                  U5        GM     U R#                  U5        U R%                  U5        g )NEmbedLayerNormalization	ReduceSumrg   r   )CastConstantOfShapeConcat	UnsqueezeGatherShape	Attention)r   r   r   r   )   r   r   r   _remove_mask)inputsoutputsrj   zcom.microsoftr1   )output_name_to_nodenodesop_typematch_parent_pathri   rh   rj   r   r   	make_nodelendomain	attributeextendmake_attributer1   rU   remove_nodes	add_nodes)r    r   nodes_to_addnodes_to_remover   iparent_nodescastconstantOfShapeconcat	unsqueezegatherrd   attention_nodes                 r"   clean_graphBertOnnxModel.clean_graph   s   "668JJLD ||88DLLK<W)BBA#55_bcefhiklnoqras' )  +NZKD6f{{1~););A)>)C)CC38<<?--a0.2.F.F.H+||{*
  $55d<m6BDW Y+#B'--a0DJJL4F4Fq4I4N4NN)/)9)9+AEAcRVR\R\o`aNaAbBF++?Cyy>?Y*[ 1@-&00779N9N{\`\j\j9k8lm$++N;'..t4I !J 	/*|$r%   c                 D    U R                  5         U R                  5         g r:   )r   prune_graphr<   s    r"   postprocessBertOnnxModel.postprocess   s    r%   optionsc                 r   Ub  UR                   (       a  U R                  5         Ub  UR                  (       a  U R                  5         U R	                  5         U R                  5         Ub  UR                  (       a  U R                  5         Ub  UR                  (       a  U R                  5         Ub  UR                  (       a  U R                  5         U R                  5         Ub  UR                  (       a  U R                  SS9  U R                  SS9  Ub  UR                  (       a  U R!                  5         Ub!  UR"                  (       a  U R%                  5         U R'                  5         U R)                  5         [*        R-                  SU R.                  R0                  S   R2                   35        g )NT)rE   Fzopset verion: r   )r   rY   r   rB   r   rO   r   r\   r   r=   r   rV   r   r   rF   r   rL   r   rI   remove_unused_constantr   loggerinfor6   rz   r{   )r    r   s     r"   optimizeBertOnnxModel.optimize   sH   O 9 9  "O 3 3NNO > >%%'O 8 8!O ? ?!!# 	 O 8 8D1E2O C C..0G$E$E##%##% 	nTZZ%<%<Q%?%G%G$HIJr%   c                     0 n/ SQnU H!  nU R                  U5      n[        U5      X'   M#     [        R                  SU 35        U$ )z(
Returns node count of fused operators.
)r   r   GeluFastGeluBiasGeluLayerNormalizationSkipLayerNormalizationzOptimized operators:)get_nodes_by_op_typer   r   r   )r    op_countopsopr   s        r"   get_fused_operator_statistics+BertOnnxModel.get_fused_operator_statistics  sR     
 B--b1Eu:HL  	*8*56r%   c                    U R                  5       nUS   nUS   nUS   US   -   US   -   nUS   US   -   nUS:  =(       a    US:  =(       a    X4:H  =(       a    US	U-  :  n[        R                  S
U SU SU SU SU 3
5        U$ )z1
Returns True when the model is fully optimized.
r   r   r   r   r   r   r   r   r_   zEmbedLayer=z, Attention=z, Gelu=z, LayerNormalization=z, Successful=)r   r   r   )r    r   embed	attentiongelu
layer_normis_optimizeds          r"   is_fully_optimized BertOnnxModel.is_fully_optimized  s     55723[)	(:"66*9MM23h?W6XX
	p	ApI<MpT^bcfoboTo%YKwtfDYZdYeers  sA  B	
 r%   )r5   r4   r3   r2   r6   r1   )T)rp   max_seq_lenr:   )r&   r'   r(   r)   r#   r=   rB   rF   rI   rL   rO   rV   rY   r\   ra   rs   r   r   r   r   r   r   r   r   r   r*   __classcell__)r7   s   @r"   r-   r-   %   s|    
m&<J0"DH4&*%X)K 7 )KV r%   r-   N)loggingr   onnxr   r   r   fusion_reshaper   fusion_layernormr   r	   fusion_skiplayernormr
   r   fusion_embedlayerr   fusion_attentionr   r   fusion_gelur   fusion_fastgelur   fusion_biasgelur   fusion_gelu_approximationr   r&   r   r   r-   r+   r%   r"   <module>r      sM     $  ( Q _ ; ; " * * =	8	0 0EI Er%   