
    YjA*                         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	  ee
          Zd Z G d de          Z G d	 d
e          ZdS )    )	getLogger)Fusion)NumpyHelper)helper)	OnnxModelc                 $   t          |           dk    rdS t          |          dk    r0|d         dk    o#|d         | d         k    o|d         | d         k    S t          |          dk    r$|d         | d         k    o|d         | d         k    S dS )zCheck if skip_shape can broadcast to input_shape for SkipLayerNormalization.

    The kernel supports: input 3D (B,S,H) with skip 3D (1,S,H) or skip 2D (S,H).
       Fr         )len)input_shape
skip_shapes     j/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_skiplayernorm.py_is_broadcast_skipr      s    
 ;1u
:!!}!ijm{1~&Ei*UV-[fgh[iJii
:!!}A.R:a=KPQN3RR5    c            	       H     e Zd ZdZ	 	 	 ddedededef fd	Zd
 Zd Z	 xZ
S )FusionSkipLayerNormalizationz
    Fuse Add + LayerNormalization into one node: SkipLayerNormalization.
    Supports broadcasting of the skip input: (1, sequence_length, hidden_size)
    or (sequence_length, hidden_size) will be broadcast to match the input shape.
    SkipLayerNormalizationLayerNormalizationTmodelfused_op_typesearch_op_typesshape_inferc                     t                                          |||           |rG| j                            dddd          | _        | j        t
                              d           d S d S d S )N      )
batch_sizeseq_lenT)updatez,symbolic shape inference disabled or failed.)super__init__r   infer_runtime_shapeshape_infer_helperloggerwarning)selfr   r   r   r   	__class__s        r   r!   z%FusionSkipLayerNormalization.__init__%   s     	??? 	O&*j&D&DTUbcEdEdmq&D&r&rD#&.MNNNNN	O 	O /.r   c                 (   | j                             |j        d                   }| j                             |j        d                   }||dS ||k    rt          |          dk    rdndS t	          ||          rdS t	          ||          rdS dS )	zIdentify which Add input is the skip tensor (the one that may broadcast).

        Returns (skip_index, broadcast):
            skip_index: 0 or 1 (which Add input is skip), -1 if incompatible
            broadcast: True if broadcasting is needed
        r   r
   N)Fr	   )r
   F)r
   T)r   T)r#   get_edge_shapeinputr   r   )r&   addshape_ashape_bs       r   get_skip_indexz+FusionSkipLayerNormalization.get_skip_index4   s     )881FF)881FF?go9g!$W!2!2::C gw// 	7gw// 	7yr   c           	      "   | j                             |d|          }||j        dk    rd S t          |j                  dk    rd S |j        D ]}| j                             |           d S  || j        v rd S |j        dk    }d}d}t          | d          rv| j        S| 	                    |          \  }}|dk     r4t                              d|j        d         |j        d                    d S nt                              d	           d S | j                             |d
gd g          }	|	Q| j                             |	d         j        d                   &| j                             |	d         dgdg          d S |rYt          d          D ]I}
| j                             ||
|          }|)|j        d
k    rt                              d|
            d S J| j                             |j        d                   d u}|p+t          | j                             ||                    dk    }|j        }|r!|                    |j        d         g           |j        d         g}|r#|                    dd|j        d         g           | j                             ||g|||          rd| j                            ||g           d|z
  }|s2|j        |         |j        |         |j        d         |j        d         gn%|j        |         |j        |         |j        d         g}t)          j        | j        ||| j                             | j        d                    }d|_        |j        D ](}|j        dk    r|j                            |g           )t          |j                  dk    r.|j                            t)          j        dd          g           | j                            |           | j        | j        |j        <   d S d S )Nr   Addr   SimplifiedLayerNormalizationr
   Fr#   zUskip SkipLayerNormalization fusion since shapes of inputs (%s, %s) are not compatiblezHskip SkipLayerNormalization fusion since symbolic shape inference failedGatherConstantOfShapez]skip SkipLayerNormalization broadcast fusion since Add input %d comes from Gather (embedding) SkipLayerNorm)name_prefixinputsoutputsnamecom.microsoftepsilon-q=) r   
get_parentop_typer   r+   get_initializernodes_to_removehasattrr#   r/   r$   debugmatch_parent_pathfind_graph_inputrangefind_graph_outputoutputget_childrenextendis_safe_to_fuse_nodesr   	make_noder   create_node_namedomain	attributer;   make_attributenodes_to_addappendthis_graph_namenode_name_to_graph_name)r&   nodeinput_name_to_nodesoutput_name_to_noder,   	add_input
simplified
skip_index
_broadcastgather_pathiparentadd_has_graph_output#residual_add_has_multiple_consumersoutputs_to_keepr:   input_indexr9   normalize_nodeatts                       r   fusez!FusionSkipLayerNormalization.fuseL   sw   j##D!-@AA ;#+..F sy>>QF 	 	Iz)))44@ A $&&&F \%CC


4-.. 	&2)-)<)<S)A)A&
J>>LLo	!	!  
 F " ghhhj223
TFKK"tz'B'B;q>CWXYCZ'['['cz++KN=N<ORSQTUU]
  	1XX  ..sA7JKK%&.H*D*DLLw   FF  $z;;CJqMJJRVV ^C
(?(?EX(Y(Y$Z$Z]^$^ 	, +. 	4""CJqM?333;q>" / 	4NNBCJqM2333:++S$KJ]_rss 	U ''d444j.K "T;':)>
1tzZ[}]]i,ci
.CTZPQ]S 
 $-"Z001CQ`0aa	  N %4N! ~ ; ;8y((",33SE::: >+,,11(//1FyRY1Z1Z0[\\\$$^444@D@TD()<===7	U 	Ur   )r   r   T)__name__
__module____qualname____doc__r   strboolr!   r/   rf   __classcell__r'   s   @r   r   r      s          63 O OO O 	O
 O O O O O O  0iU iU iU iU iU iU iUr   r   c                   *     e Zd Zdef fdZd Z xZS ) FusionBiasSkipLayerNormalizationr   c                 P    t                                          |ddd           d S )Nr   zadd bias)r    r!   )r&   r   r'   s     r   r!   z)FusionBiasSkipLayerNormalization.__init__   s*     8:RT^_____r   c           	         t          |j                  dk    rd S g }| j                            |ddgd d g||          }||\  }}n/g }| j                            |g dg d||          }||\  }}}nd S t          |          dk    st          |          dk    sJ |d         }	|	dk    rd S |j        |d	                  }
|j        d	|d	         z
           }|j        d	|	z
           }| j                            |          }|d S t          j        |          }|t                              d
           d S t          |j	                  d	k    rt                              d           d S ||g}| j        
                    ||j        ||          st                              d           d S | j                            |           |
||j        d         |j        d         |g}t          j        d||j        | j                            dd                    }d|_        |j        D ](}|j        dk    r|j                            |g           )t          |j                  dk    r.|j                            t          j        dd          g           | j                            |           | j        | j        |j        <   d S )Nr   r1   MatMul)r1   Castrs   )NNNr   r	   r   r
   zBias weight not foundzBias weight is not 1DzASkip fusing SkipLayerNormalization with Bias since it is not safer   SkipLayerNorm_AddBias_r8   r<   r=   r>   )r   r+   r   rE   rA   r   to_arrayr$   rD   shaperL   rI   rB   rK   r   rM   rN   rO   rP   r;   rQ   rR   rS   rT   rU   )r&   rV   rW   rX   return_indicenodesr,   _matmul_castadd_input_index	sln_input
bias_input
skip_inputinitializerbias_weightsubgraph_nodesr9   new_nodere   s                      r   rf   z%FusionBiasSkipLayerNormalization.fuse   s   tz??aF
,,TE83DtTlTgivww"NS'' MJ00///1C1C1CEXZg E  (-%eWW=!!Q&&#m*<*<*A*A*A*A'*aFImA./	Yq=#334
ZO 34
 j00<<F!*;77LL0111F{ !!Q&&LL0111Fz//M`buvv 	LL\]]]F##N333JqMJqM
 #$K,,-EG_``	
 
 
 * > 	1 	1Cx9$$"))3%000 x!""a''%%v'<Y'P'P&QRRR  ***6:6J$X]333r   )rg   rh   ri   r   r!   rf   rm   rn   s   @r   rp   rp      sh        `i ` ` ` ` ` `FK FK FK FK FK FK FKr   rp   N)loggingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rg   r$   r   r   rp    r   r   <module>r      s               $ $ $ $ $ $                  	8		  WU WU WU WU WU6 WU WU WUtJK JK JK JK JKv JK JK JK JK JKr   