
    fPihH                     j    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dS )    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                 N    t                                          |||           d S N)super__init__)selfmodel	num_headshidden_size	__class__s       /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_bert_keras.pyr
   zBertOnnxModelKeras.__init__   s%    	;77777    c                     |                      |g dg d          }||S |                      |g dg d          }||S |                      |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   s    ++%---OO
 


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


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


 r   c                 0   g }|||fD ]}|j         d         }||         }	|	|k    r|	j        dk    r2|	j         d         |j        d         k    r|                    |	           [t                              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VWHX2X2X$$Y///LLYYYv}UVGWYYZZZ"9]""r   c                 B
   |                                   |                                 }g }d}|                     d          }|D ]}|                     |d          }|	|j        dvr{|j        dk    rI|                     |d          }|	|j        dvr't
                              d||j        nd             wn(t
                              d||j        nd             	 |                     |g dg d          }|t
                              d	           |\  }}	}
}}}t
                              d
           |                     |g dg d          }|t
                              d           4|\  }}}}}|                     |g dg d          }|-|\  }}}|                     |g dg d          }|	|\  }}}}}}n|                     |g dg d          }|9|                     |g dg d          }|t
                              d           |\  }}} }|                     |g dg d          }||\  }}}}}|t
                              d           &|                     |g dg d          }!|!t
                              d           _|!\  }"}#}$}%}&|                     |d                   }'|'t
                              d           | 	                    |'d         d          st
                              d           | 
                    ||&|||          \  }(})|(r| j                            |'d         j        d                   }*t
                              d           | j                            |*||&|||$|| j        | j        |j        d         |j        d                   }+|+|                     |+           |dz  }|                    |||g           |                    |           |                    |           |                    |!           |                    |           |                    |'           |                    |)           |                    |	           |                     ||	j        d         |
j        d                    yt
                              d           |                     |           |                                  t
                              d|            d S ) 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.)
mask_indexq_matmulk_matmulv_matmulq_addk_addv_addr   r   first_inputr!   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*   r9   attention_nodes,                                               r   fuse_attentionz!BertOnnxModelKeras.fuse_attention;   s     """"6688 $ 9 9:R S S3 O	 O	N__^Q77F~ 8 " " >U**!__^Q??F~ @ * * %wY_Ykv~~qu%w%wxxx * LL!sU[Ug6>>mq!s!sttt ..NNN%%% I
  8999 LL,---,,DDD G
 5666IPF[)UOX--j:V:V:VXaXaXabbH#2:/VY00OOO))) 
 &  #!'   11*>a>a>acrcrcrss##55jBeBeBegvgvgvwwH'%>??? :B7VVY00HHH#OO 
 &QXN[)UOX5666,,DDD G
 5666IPF[)UOX--hqk::J!8999**:a=!<< Z[[[*.*D*D(Hf6I+ +'L-  !!0==jn>RST>UVV
8999!%!6!L!L)%%%"n $ 0 &a 0&-a0 "M " " ")n---1$&&]J'OPPP&&x000&&w///&&w///&&w///&&z222&&}555&&777''_-CA-FVWHXYYYY5666/***>_>>?????r   c                 ~    |                                   |                                  |                                  d S r   )process_embedding	fuse_maskskip_reshape)r   s    r   
preprocesszBertOnnxModelKeras.preprocess   s<       r   c                 R   |                                   |                                  d}|                     d          }|D ]?}|                     |d          }|%|j        dk    r|j        d         |j        d<   |dz  }@|dk    rt                              d|            d S d S )Nr   r   r   zSkip consequent Reshape count: )rA   r)   rB   rC   r    r   r#   rN   )r   countr*   reshape_noder(   s        r   rv   zBertOnnxModelKeras.skip_reshape   s      """  """11)<<) 	 	L__\155F!fn	&A&A(.Q"1%
199KKA%AABBBBB 9r   c                 0	   |j         dk    sJ t                              d|j        d          d           |                     |g dg d|          }|t                              d           dS |\  }}}|                     |j        d                   }|t                              d	           dS t          j        |          }t          |j
                  d
k    r2t                              d|j         d|j
                    |j        }	n,t                              d|j         d|j
                    dS |                     |j        d                   }
|
t          j        |
          }t          |j
                  dk    r|j
        d         dk    rt          j        |                    |j
        d         |j
        d
         f          d          }|                     |           t                              d|
j         d|j
        dd                      d}n3t                              d|
j         d|j
                    dS |                     |ddgddg|          }|t                              d           dS |\  }}|                     |j        d                   }
|
t                              d           dS t          j        |
          }t          |j
                  d
k    r2t                              d|
j         d|j
                    |
j        }n,t                              d|
j         d|j
                    dS |                     |d|          }||j         dk    rt                              d           dS |                     |j        d                   }|t                              d           dS t          j        |          }t          |j
                  d
k    r2t                              d|j         d|j
                    |j        }n,t                              d|j         d|j
                    dS t                              d           |                     ||	||           dS )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:r}   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shaperN   name
from_arrayreshapeadd_initializerrC   create_embedding_subgraph)r   noder)   word_embed_path	skip_noderI   gather_nodeword_initializertempword_embeddingpos_initializertensorr   pos_embed_path
pos_gather	pos_slicegathersegment_initializersegment_embeddings                      r   fuse_embeddingz!BertOnnxModelKeras.fuse_embedding   s   |33333XT[QR^XXXYYY007O7O7OQZQZQZ\opp"LL:;;;5+:(	8[//0A!0DEE#LL9:::5$%566tz??aKKa6F6KaaUYU_aabbb-2NNKKj?O?Tjj^b^hjjkkk5..x~a/@AA&(99D4:!##
1(:(:%0tz!}djYZm>\1]1]_stt$$V,,,lo>Rll\`\fghgigi\jllmmm%9""qG[qqeieoqqrrru!33Hx>QTUWXSY[nooN%=>>>u$2!J	"22:3CA3FGGO&<===u(99D4:!##d/:NddX\Xbddeee%4%9""qG[qqeieoqqrrruA/BCC>V^x77LL/0005"226<?CC&LL<===5$%899tz??aKKg9L9Qgg[_[egghhh 3 8KKpBUBZppdhdnppqqq5+,,,&&t^=NPbccctr   c                     t                               d           |                                 }|                                 D ])}|j        dk    r|                     ||          r dS  dS *dS )zM
        Automatically detect word, segment and position embeddings.
        z#start processing embedding layer...r|   N)r#   rN   r)   nodesr    r   )r   r)   r   s      r   rt   z$BertOnnxModelKeras.process_embedding7  s     	9:::"6688JJLL 	 	D|333&&t-@AA FF 4	 	r   c                    g }|                                  D ]}|j        dk    r|                     |d          r|                     |g dg d          }|D|\  }}}}| j                                        }|j        d         |k    r!t          d|j        d          d|            t          j	        
                    d|gd	gd
dg          }	t          j	        
                    dd	gdgddg          }
t          j	        
                    ddgdg          }|j                            t          j	                            dd          g           |                     ||j        d         d           |                    |||g           |                     |	           |                     |
           |                     |           |                     |           t#          |          dk    r|                                  t&                              t#          |          dk    rdnd           d S )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_2r~   r   mask_fuse_cast_output)r   r   toz
Fused maskzFailed to fuse mask)r   r    rD   r   rE   get_first_maskr   printonnxhelper	make_node	attributerJ   make_attributerK   rI   rL   r   prune_graphr#   rN   )r   rO   r   	mask_pathsub_node	cast_node
slice_nodeunsqueeze_nodemask_input_nameunsqueeze_added_1unsqueeze_added_2cast_node_2s               r   ru   zBertOnnxModelKeras.fuse_maskC  sq   JJLL (	+ (	+D|u$$)@)@v)N)N$ 2249^9^9^`l`l`lmm	$BK?)Z"&"5"D"D"F"F!'*o==e(<Q(?eeTceefff$(K$9$9+,:;+ %: % %! %)K$9$99::;+ %: % %! #k339:45 4  
 %,,dk.H.Hq.Q.Q-RSSS''(.2CE\]]]&&
NI'NOOO/000/000k***/*** !##C$8$81$<$<LLBWXXXXXr   c           
         |                      d          }d}|D ]}|                     |g dg d          }| |\	  }}}}}	}
}}}|j        d         |
j        d<   |                     |           |	j        d         |j        d<   |                     |           |j        d         |j        d<   |                     |           |dz  }|S )Nr0   r   )	r2   r   r3   r   Gelur2   r   r3   r0   )	r   r   r   r   r   r   r   r   r   r   rB   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_reshapew  s   "778PQQ"5 $	! $	!))"
 
 
 ,++ D | 
%_Q/EKNY''' $AHN1Y'''%_Q/EKNY'''q OOr   c                    |                      d          }d}|D ]}|                     |g dg d          }| |\
  }}}}}	}
}}}}|j        d         |j        d<   |                     |           |j        d         |
j        d<   |                     |           |	j        d         |j        d<   |                     |           |j        d         |j        d<   |                     |           |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Q"5 -	! -	!))"   211 D  |  !. 4Q 7HN1Y'''%_Q/EKNY''' $AHN1Y'''%_Q/EKNY'''q OOr   c                     |                                  |                                 z   }t                              d| d           |                                  d S )NzRemove z Reshape nodes.)r   r   r#   rN   r   )r   r   s     r   postprocesszBertOnnxModelKeras.postprocess  sZ    33558S8S8U8UU>o>>>???r   )__name__
__module____qualname__r
   r   r.   rr   rw   rv   r   rt   ru   r   r   r   __classcell__)r   s   @r   r   r      s        8 8 8 8 8  0# # # Z@ Z@ Z@x  
C C CJ J JX
 
 
2Y 2Y 2Yh) ) )V2 2 2h      r   r   )	loggingr   r   onnx_model_bert_tfr   	getLoggerr   r#   r    r   r   <module>r      s            . . . . . .		8	$	$K K K K K K K K K Kr   