
    g!H                     f    d dl Z d dlZd dlmZ d dlmZ  e j
                  e      Z G d de      Zy)    N)numpy_helper)BertOnnxModelTFc                   `     e Zd Z 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 xZS )BertOnnxModelKerasc                 (    t         |   |||       y N)super__init__)selfmodel	num_headshidden_size	__class__s       c/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_model_bert_keras.pyr
   zBertOnnxModelKeras.__init__   s    	;7    c                     | j                  |g dg d      }||S | j                  |g dg d      }||S | j                  |g dg d      }|S )N)MulSubReshapeCast)   Nr   r   )r   r   r   Slice	Unsqueeze)r   r   r   r   r   )r   r   r   r   r   )r   Nr   r   r   )match_parent_path)r   add_or_sub_before_softmax
mask_nodess      r   match_mask_pathz"BertOnnxModelKeras.match_mask_path   sq    ++%-


 !++%8


 !++%<


 r   c                 0   g }|||fD ]  }|j                   d   }||   }	|	|k(  r|	j                  dk(  r1|	j                   d   |j                  d   k(  r|j                  |	       ]t        j                  d| d|j                  d           dg fc S  d|fS )Nr   r   zCheck attention input failed:z, FT)inputop_typeoutputappendloggerdebug)
r   matmul_qmatmul_kmatmul_vparentoutput_name_to_nodereshape_nodesx
root_input	root_nodes
             r   check_attention_inputz(BertOnnxModelKeras.check_attention_input+   s    Hh/AJ+J7IF"  I-)//!2DVWHX2X$$Y/LL8Bv}}UVGWFXYZ"9 0 ]""r   c                 *	   | j                          | j                         }g }d}| j                  d      }|D ]  }| j                  |d      }||j                  dvr|j                  dk(  rI| j                  |d      }||j                  dvrOt
        j                  d||j                  nd         ~t
        j                  d||j                  nd         	 | j                  |g dg d      }|t
        j                  d	       |\  }}	}
}}}t
        j                  d
       | j                  |g dg d      }|t
        j                  d       #|\  }}}}}| j                  |g dg d      }|)|\  }}}| j                  |g dg d      }|{|\  }}}}}}nq| j                  |g dg d      }|0| j                  |g dg d      }|t
        j                  d       |\  }}} }| j                  |g dg d      }||\  }}}}}|t
        j                  d       | j                  |g dg d      }!|!t
        j                  d       '|!\  }"}#}$}%}&| j                  |d         }'|'t
        j                  d       \| j                  |'d   d      st
        j                  d       | j                  |&|||      \  }(})|(rh| j                  j                  |'d   j                  d         }*t
        j                  d       | j                  j                  |*||&||$|| j                   | j"                  |j$                  d   |j$                  d   d       }+|+;| j'                  |+       |dz  }|j)                  |||g       |j)                  |       |j)                  |       |j)                  |!       |j)                  |       |j)                  |'       |j)                  |)       |j+                  |	       | j-                  ||	j$                  d   |
j$                  d          t
        j                  d       " | j/                  |       | j1                          t
        j3                  d|        y )Nr   SkipLayerNormalization)r0   EmbedLayerNormalizationAddr   zFirst input for skiplayernorm: )r2   r   MatMulr   	Transposer3   )Nr   r   r   r   r   zFailed to match qkv nodeszMatched qkv nodes)r4   r   r2   r   r3   )r   r   r   r   r   zFailed to match v path)Softmaxr   r3   r   r   r   )r   r4   r   r2   r   r3   )r   Nr   r   r   r   )r5   r2   r   r3   )r   r   r   N)r5   r2   Divr3   zFailed to match qk path)r   r   r   r   r   zFailed to match q pathzFailed to match k pathzFailed to match mask pathz;Sub node expected to have an input with constant value 1.0.zCreate an Attention node.zRoot node not matched.zFused Attention count:)input_name_to_nodesr)   get_nodes_by_op_type
get_parentr    r#   r$   r   r   has_constant_inputr.   attention_maskprocess_maskr   attention_fusioncreate_attention_noder   r   r!   add_nodeextendr"   replace_node_inputremove_nodesupdate_graphinfo),r   r)   nodes_to_removeattention_countskip_layer_norm_nodesnormalize_noder(   	qkv_nodesaddextra_reshape_0matmulreshape_qkvtranspose_qkv
matmul_qkvv_nodestranspose_v	reshape_vadd_vextra_reshape_1r'   qk_nodes
softmax_qksub_qk	matmul_qkq_nodesmul_qtranspose_q	reshape_qadd_qextra_reshape_2r%   add_qkmul_qkk_nodestranspose_k	reshape_kadd_kextra_reshape_3r&   r   is_same_rootr*   
mask_indexattention_nodes,                                               r   fuse_attentionz!BertOnnxModelKeras.fuse_attention;   s     ""668 $ 9 9:R S3N__^Q7F~ 8 " >>U*!__^Q?F~ @ * 'FY_Ykv~~quFv%wx LL#BU[Ug6>>mqBr!st ..N%I
  89 LL,-,,DG
 56IPF[)UOX--j:VXabH#2:/VY00O)
 &  #!'   11*>acrs##55jBegvwH'%>? :B7VVY00H#
 &QXN[)UOX56,,DG
 56IPF[)UOX--hqk:J!89**:a=!<Z[*.*D*D(Hf6I+'L- !00==jn>R>RST>UV
89!%!6!6!L!LNN$$MM!$&&q)" ")n-1$&&]J'OP&&x0&&w/&&w/&&w/&&z2&&}5&&7''_-C-CA-FVWHXY56a 4b 	/*,_,=>?r   c                 d    | j                          | j                          | j                          y r   )process_embedding	fuse_maskskip_reshape)r   s    r   
preprocesszBertOnnxModelKeras.preprocess   s$     r   c                 @   | j                          | j                          d}| j                  d      }|D ]H  }| j                  |d      }||j                  dk(  s(|j
                  d   |j
                  d<   |dz  }J |dkD  rt        j                  d|        y y )Nr   r   r   zSkip consequent Reshape count: )r9   r)   r:   r;   r    r   r#   rF   )r   countr*   reshape_noder(   s        r   ro   zBertOnnxModelKeras.skip_reshape   s      "  "11)<)L__\15F!fnn	&A(.Q""1%
	 * 19KK9%AB r   c                 	   |j                   dk(  sJ t        j                  d|j                  d    d       | j	                  |g dg d|      }|t        j                  d       y|\  }}}| j                  |j                  d         }|t        j                  d	       yt        j                  |      }t        |j                        d
k(  r<t        j                  d|j                   d|j                          |j                  }	n0t        j                  d|j                   d|j                          y| j                  |j                  d         }
|
t        j                  |
      }t        |j                        dk(  r|j                  d   dk(  rt        j                  |j                  |j                  d   |j                  d
   f      d      }| j                  |       t        j                  d|
j                   d|j                  dd          d}n4t        j                  d|
j                   d|j                          y| j	                  |ddgddg|      }|t        j                  d       y|\  }}| j                  |j                  d         }
|
t        j                  d       yt        j                  |
      }t        |j                        d
k(  r<t        j                  d|
j                   d|j                          |
j                  }n0t        j                  d|
j                   d|j                          y| j!                  |d|      }||j                   dk7  rt        j                  d       y| j                  |j                  d         }|t        j                  d       yt        j                  |      }t        |j                        d
k(  r<t        j                  d|j                   d|j                          |j                  }n0t        j                  d|j                   d|j                          yt        j                  d       | j#                  ||	||       y)NLayerNormalizationz-start fusing embedding from node with output=r   z...)r2   r2   Gatherr6   zfailed to match word_embed_pathFzfailed to get word initializer   zFound word embedding. name:z, shape:z$Failed to find word embedding. name:r      position_embeddingzFound position embedding. name:z(Failed to find position embedding. name:rv   r   zfailed to match pos_embed_pathzfailed to get pos initializerzfailed to get gatherz!failed to get segment initializerzFound segment embedding. name:z'Failed to find segment embedding. name:zCreate Embedding nodeT)r    r#   r$   r!   r   get_initializerr   r   to_arraylenshaperF   name
from_arrayreshapeadd_initializerr;   create_embedding_subgraph)r   noder)   word_embed_path	skip_noderA   gather_nodeword_initializertempword_embeddingpos_initializertensorry   pos_embed_path
pos_gather	pos_slicegathersegment_initializersegment_embeddings                      r   fuse_embeddingz!BertOnnxModelKeras.fuse_embedding   s   ||3333DT[[QR^DTTWXY007OQZ\op"LL:;+:(	8[//0A0A!0DE#LL9:$$%56tzz?aKK56F6K6K5LHUYU_U_T`ab-22NKK>?O?T?T>UU]^b^h^h]ijk..x~~a/@A&((9D4::!#

1(:%00tzz!}djjYZm>\1]_st$$V,=o>R>R=SS[\`\f\fghgi\j[klm%9"FG[G[F\\deieoeodpqr!33Hx>QTUWXSY[noN%=>$2!J	"22:3C3CA3FGO&<=((9D4::!#9/:N:N9OxX\XbXbWcde%4%9%9"FG[G[F\\deieoeodpqrA/BC>V^^x7LL/0"226<<?C&LL<=$$%89tzz?aKK89L9Q9Q8RRZ[_[e[eZfgh 3 8 8KKABUBZBZA[[cdhdndncopq+,&&t^=NPbcr   c                     t         j                  d       | j                         }| j                         D ]'  }|j                  dk(  s| j                  ||      r y y y)zM
        Automatically detect word, segment and position embeddings.
        z#start processing embedding layer...ru   N)r#   rF   r)   nodesr    r   )r   r)   r   s      r   rm   z$BertOnnxModelKeras.process_embedding8  sT     	9:"668JJLD||33&&t-@A	 !r   c                 ,   g }| j                         D ]  }|j                  dk(  s| j                  |d      s'| j                  |g dg d      }|A|\  }}}}| j                  j                         }|j                  d   |k7  rt        d|j                  d    d|        t        j                  j                  d|gd	gd
dg      }	t        j                  j                  dd	gdgddg      }
t        j                  j                  ddgdg      }|j                  j                  t        j                  j                  dd      g       | j                  ||j                  d   d       |j                  |||g       | j                  |	       | j                  |
       | j                  |        | j!                  |       t#        |      dkD  r| j%                          t&        j)                  t#        |      dkD  rd       y d       y )Nr   i)r   r   r   r   )r   r   r   r   r   zCast input z is not mask input r   mask_fuse_unsqueeze1_outputMask_UnSqueeze_1r   )inputsoutputsr~   axesmask_fuse_unsqueeze2_outputMask_UnSqueeze_2rw   r   mask_fuse_cast_output)r   r   toz
Fused maskzFailed to fuse mask)r   r    r<   r   r=   get_first_maskr   printonnxhelper	make_node	attributerB   make_attributerC   rA   rD   r|   prune_graphr#   rF   )r   rG   r   	mask_pathsub_node	cast_node
slice_nodeunsqueeze_nodemask_input_nameunsqueeze_added_1unsqueeze_added_2cast_node_2s               r   rn   zBertOnnxModelKeras.fuse_maskD  s   JJLD||u$)@)@v)N 2249^`lm	$BK?)Z"&"5"5"D"D"F!''*o=K(<(<Q(?'@@STcSdef$(KK$9$9+,:;+ %: %! %)KK$9$99::;+ %: %! #kk339:45 4 
 %%,,dkk.H.Hq.Q-RS''(..2CE\]&&
NI'NO/0/0k*Q !T 	/* !#C$81$<LXBWXr   c           
         | j                  d      }d}|D ]  }| j                  |g dg d      }||\	  }}}}}	}
}}}|j                  d   |
j                  d<   | j	                  |       |	j                  d   |j                  d<   | j	                  |       |j                  d   |j                  d<   | j	                  |       |dz  } |S )Nr0   r   )	r2   r   r3   r   Gelur2   r   r3   r0   )	r   r   r   r   r   r   r   r   r   rx   r:   r   r!   r   remove_node)r   skiplayernorm_nodesreshape_removedskiplayernorm_nodepathadd_1	reshape_1matmul_1	reshape_2geluadd_2	reshape_3matmul_2skiplayernorms                 r   remove_extra_reshapez'BertOnnxModelKeras.remove_extra_reshapex  s    "778PQ"5))"
 ,D | 
%__Q/EKKNY' $AHNN1Y'%__Q/EKKNY'q OI #6L r   c                    | j                  d      }d}|D ]  }| j                  |g dg d      }||\
  }}}}}	}
}}}}|j                  d   |j                  d<   | j	                  |       |j                  d   |
j                  d<   | j	                  |       |	j                  d   |j                  d<   | j	                  |       |j                  d   |j                  d<   | j	                  |       |dz  } |S )Nr0   r   )
r2   r   r3   r   r   r2   r   r3   r   r0   )
Nr   r   r   r   r   r   r   r   r      r   )r   r   r   r   r   r   r   r   r   r   r   r   r   	reshape_4r   s                  r   remove_extra_reshape_2z)BertOnnxModelKeras.remove_extra_reshape_2  s   "778PQ"5))" 2D  |  !. 4 4Q 7HNN1Y'%__Q/EKKNY' $AHNN1Y'%__Q/EKKNY'q O[ #6^ r   c                     | j                         | j                         z   }t        j                  d| d       | j	                          y )NzRemove z Reshape nodes.)r   r   r#   rF   r   )r   r   s     r   postprocesszBertOnnxModelKeras.postprocess  s@    3358S8S8UUgo.o>?r   )__name__
__module____qualname__r
   r   r.   rk   rp   ro   r   rm   rn   r   r   r   __classcell__)r   s   @r   r   r      sI    80# [@z
CJX
2Yh)V2hr   r   )	loggingr   r   onnx_model_bert_tfr   	getLoggerr   r#   r    r   r   <module>r      s3       .			8	$L Lr   