
    `iS<                         S SK Jr  S SK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)    )Dict)	getLogger)helper)	OnnxModel)Fusion)FusionUtilsc                   D   ^  \ rS rSrSrSS\4U 4S jjjrS rS rSr	U =r
$ )	FusionEmbedLayerNoMask   a  
Embed Layer Normalization will fuse embeddings and mask processing into one node.
The embeddings before conversion:

(input_ids) -------->  Gather ----------+       (segment_ids)
   |                                    |            |
   |                                    v            v
   +--> Shape --> Expand -> Gather---->Add         Gather
   |                ^                   |            |
   |                |                   v            v
   +---(optional graph)               SkipLayerNormalization

 Optional graph is used to generate position list (0, 1, ...) per batch. It can be a constant in some model.

 (input_ids) --> Gather -----+           Slice
                             |            |
                             v            v
(segment_ids)--> Gather --->Add        Reshape
                             |            |
                             v            v
                         SkipLayerNormalization
modelc                 \   > [         TU ]  USSS/U5        [        U5      U l        S U l        g )NEmbedLayerNormalizationSkipLayerNormalizationLayerNormalization)super__init__r   utils	attention)selfr   description	__class__s      o/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnxruntime_tools/transformers/fusion_embedlayer.pyr   FusionEmbedLayerNoMask.__init__'   s2     9<TVj;kmxy '
    c                    S nS nUR                   S:X  ag  U R                  R                  US/S/5      nUc?  U R                  R                  USS/SS/5      nUc  [        R	                  S5        g Uu  pOUUS   nOOUR                   S:X  a?  U R                  R                  U/ SQ/ S	Q5      nUc  [        R	                  S5        g Uu    pUR
                  S   nU R                  R                  W5        U R                  R                  U5      (       a   U R                  R                  U5      u  pXV4$ U R                  R                  U5      u  pZU R                  R                  U
/ S
Q/ SQ4/ SQ/ SQ4/U5      u  pnU(       a  U(       a  UR
                  S   US   R
                  S   :X  a  [        R                  S5        U R                  R                  [        R                   " SUR
                  S   /S/S95        U R                  R                  [        R                   " SS/S/[        R"                  " S[$        R&                  R(                  S/S/5      S95        SnXV4$ )Nr   Gather   Addr   z<Segment embedding is not found. Embed layer cannot be fused.r   r   r   r   )r   r   r   )ConstantOfShapeConcat	Unsqueezer   ShapeCast)r   r   r   r   r   r   )r    r!   r"   r   r#   )r   r   r   r   r   zSimplify semgent id path...r#   input_shape)inputsoutputsr    zeros_for_input_shapevalue)r'   r(   r*   )op_typer   match_parent_pathloggerinfoinputnodes_to_removeextendfind_graph_inputr   cast_graph_input_to_int32cast_input_to_int32match_parent_pathsdebugadd_noder   	make_nodemake_tensoronnxTensorProtoINT32)r   normalize_nodeinput_name_to_nodesoutput_name_to_nodeinput_ids_cast_nodesegment_idssegment_embedding_gathersegment_embedding_path_castedsegment_ids_cast_nodesegment_id_paths               r   match_segment_path)FusionEmbedLayerNoMask.match_segment_path,   sm   #' !!%==%)ZZ%A%A.S[R\_`^a%b"%-)-)E)EnW\^fVgjkmnio)p&)1KK ^_.D+++A!+D(##';;%)ZZ%A%A.Rjlu%v"%-Z[-C*Aq.44Q7##$:;::&&{33"&**"F"F{"SF* 44' 261O1OP[1\.K %)JJ$A$A%WYklOQ`acdw%y!A
 #6;N;T;TUV;W[jkm[n[t[tuv[w;w:;

##$$W6I6O6OPQ6R5S^k]lmo

##$$%6-:O.E-F+1+=+=gtGWGWG]G]`a_befdg+hjk
 644r   c                     SnU R                   R                  USS/SS/5      ci  U R                   R                  US/S/5       cH  [        R                  S5        UR                  S:w  d"  U R                   R                  USS/SS/5      c  g U R                   R                  USUSS	9U l        U R                  cp  UR                  S   U;  a  g X!R                  S      n[        U Vs/ s H  ofR                  PM     sn5      nU/ S
Q:w  a  U/ SQ:w  a  [        R                  S5        g UnS n	U R                   R                  USS/SS/5      n
U
b  U
u  pOU R                   R                  U/ SQ/ SQ5      n
U
b  U
u  pnO|U R                   R                  US/S/5      n
U
bD  U
S   nSnSSK	J
n  SS KnU" UR                  5      U" S5      ::  a  [        R                  S5        g O[        R                  S5        g UR                  S   nS nS nU R                   R                  USS/SS/5      nUb  Uu  nnGOEU R                   R                  USS/SS/5      nUb  Uu  nnGOU R                   R                  U	/ SQ/ SQ5      nUb  Uu  nnnOU R                   R                  U	/ SQ/ SQ5      nUb
  Uu  nn    nnOU R                   R                  U	SS/SS/5      nUb  Uu  nnOkU R                   R                  U	SS/SS/5      nUb  Uu  nnOAU R                   R                  U/ SQ/ SQ5      nUb  Uu  nnnO[        R                  S5        g Ub)  UR                  S   U:w  a  [        R                  S5        g U(       af  U(       a_  U R                   R!                  USU5      nU R                   R#                  UU(       a  U/O/ U5      nU R$                  R'                  U5        U R$                  R'                  U
5        U R$                  R'                  U5        U R$                  R'                  U/5        S nU R                   R)                  U5      (       a  U R*                  R-                  U5      u  nnOU R*                  R/                  U5      u  nnU R                   R1                  S5      nUS -   nUR                  S:X  a  UR                  S   nUR                  S!   nO.UR                  S":X  a  UR                  S!   nUR                  S#   nS nUS:X  aM  U R3                  XUU5      nUc  g Uu  nnUUUR                  S   UR                  S   UR                  S   WW/nO#US$UR                  S   UR                  S   S$WW/n[4        R6                  " SUUS -   US%-   /US&9n S'U l        UR:                   H1  n!U!R<                  S(:X  d  M  U R:                  R'                  U!/5        M3     [?        U R:                  5      S:X  a1  U R:                  R'                  [4        R@                  " S(S)5      /5        U R                   RC                  UR                  S   U5        U RD                  RG                  U 5        g s  snf )*NFr   r   r   ziFailed to match path SkipLayerNormalization[0] <-- Add <-- Gather or SkipLayerNormalization[0] <-- Gatherr   r   	Attention)	recursive)MatMulrM   rM   r   )rM   rM   rM   r#   r#   r   z@No Attention like subgraph in children of SkipLayerNormalizationr   )r   r   r   T)Versionz1.4.0z\Please install onnxruntime with version > 1.4.0 for embedlayer fusion support for distilbertz>Word embedding path is not found. Embed layer cannot be fused.ExpandReshapeSlice)r   rO   r#   )r   r   r   )r   rO   r!   r"   r   r#   )r   r   r   r   r   r   )r   r   rQ   )r   r   r   zBPosition embedding path is not found. Embed layer cannot be fused.zCposition and word embedding is expected to be applied on same inputr   _output   r       _dummy_mask_index)r(   namezcom.microsoftepsilong-q=)$r   r,   r-   r6   r+   find_first_child_by_typer   outputsortedpackaging.versionrN   onnxruntime__version__warningr.   r/   
get_parentget_parent_subgraph_nodesr0   r1   r2   r   r3   r4   create_node_namerH   r   r8   domain	attributerW   lenmake_attributereplace_input_of_all_nodesnodes_to_addappend)"r   noder>   r?   
is_distillchildrenchildchildren_typesr=   r7   word_embedding_pathword_embedding_gatherrD   rN   r]   	input_ids%position_embedding_node_before_gatherposition_embedding_shapeposition_embedding_pathposition_embedding_weight_nodeinput_parentsubgraph_nodesr@   rE   	node_nameoutput_namegammabetaembed_node_inputssegment_pathrA   rB   
embed_nodeatts"                                     r   fuseFusionEmbedLayerNoMask.fuse_   s   
::''uh.?!QHPUYU_U_UqUqxj1#V'*.V/LL{ ||33tzz7S7STX[`bjZknoqrms7t7|<<T;Pcot<u>>!{{1~%88*;;q>:H#$Iu]]$IJN!YY^l q _ _` "jj::>ES[K\_`bc^de*.A+H+"&**">">~Ogir"s".5H22&*jj&B&B>T\S]`a_b&c#&2,?,B)!%J9&{66777;KKz| L
 KK `a)//2	04-#' "&**">">~PXZbOc@A1v#G".TkQ*,Q&*jj&B&B>T]_fSgjkmnio&p#&24K11*.***F*FxQnGP+R'*6 wNs24Y[s.2jj.J.J "`bt/v+.: D[  A68]_`bcef  iA 37**2N2NxZbdlYmpqstou2v/2>d{a:<a6:jj6R6RS[^fho]pTUWXSY7[36Bh e >@e:>**:V:VWe  hB  DM  ;N 7#:#F pG$lA'EGl$*KK0t$u$*+7<T<Z<Z[\<]aj<jKK ef05M::001I1NabL!ZZAABgT`<.fhBUWN   ''7##$78##$;<##^$45 #::&&y11 $

 D DY OFI-1ZZ-K-KI-V*I*JJ//0IJ	)+!!%99"((+E!''*D##'??"((+E!''*D 22>Xk3FHL#8D55 )//2288;,2215%! %++A..44Q7! %%&?&7/89/DiReFe.f+46

 ,
 "++Cxx9$$$++SE2 ,
 z##$)  '')>)>y')R(ST

--n.C.CA.FT  ,q %Js   *Z)r   r   )zno mask)__name__
__module____qualname____firstlineno____doc__r   r   rH   r   __static_attributes____classcell__r   s   @r   r
   r
      s+    ,i  
15fi- i-r   r
   c                   <   ^  \ rS rSrS\4U 4S jjrU 4S jrSrU =r$ )FusionEmbedLayerNormalizationi  r   c                 &   > [         TU ]  US5        g )Nz	with mask)r   r   )r   r   r   s     r   r   &FusionEmbedLayerNormalization.__init__  s    ,r   c                 "  > [        U R                  5      n[        TU ]  XU5        [        U R                  5      U:X  a  g U R                  b  U R                  R
                  S   nXS;   a  X5   nUR                  S:X  a  U R                  R                  5       nUR
                  S   nU R                  R                  U/5        UR
                  R                  U5        XVR                  S'   U R                  R                  U5        SU l        g )NrT   	ReduceSumr   r   T)re   rh   r   r   r   r/   r+   popr0   r1   ri   rZ   prune_graph)	r   rj   r>   r?   	old_count
mask_indexr~   mask_input_namer   s	           r   r   "FusionEmbedLayerNormalization.fuse  s    ))*	T0CDt  !Y.>>%--a0J0*6<<;.!%!2!2!6!6!8J&*jjmO((//7$$++O<+5%%a(%%,,Z8r   )r   )	r   r   r   r   r   r   r   r   r   r   s   @r   r   r     s    -i -   r   r   N)typingr   loggingr   r:   r   
onnx_modelr   fusion_baser   fusion_utilsr   r   r-   r
   r    r   r   <module>r      s?          $	8	x-V x-v $:  r   