
     Ng(                         d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZ  ee          Z G d de          Zd	S )
    )	getLogger)DictListUnion)Fusion)NumpyHelper)	NodeProtoTensorProtohelper)	OnnxModelc                        e Zd Zdef fdZdedeedf         fdZde	deedf         fdZ
d	ed
ee	ee         f         dee	ef         fdZ xZS )FusionGemmFastGelumodelc                 l    t                                          |ddd           d | _        d| _        d S )NGemmFastGeluFastGeluF)super__init__shape_infershape_infer_done)selfr   	__class__s     h/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_gemmfastgelu.pyr   zFusionGemmFastGelu.__init__   s7    
NKKK %    tensor_protoreturnNc                     |j         j                            d          r#t          |j         j        j        j                  S d S )Nshape)typetensor_typeHasFieldlenr   dim)r   r   s     r    get_dimensions_from_tensor_protoz3FusionGemmFastGelu.get_dimensions_from_tensor_proto   s=    (11':: 	|(4:>???4r   
input_namec                    | j                             |          }|r|                     |          S | j        s'| j                             d          | _        d| _        | j        %|                     | j        j        |                   S d S )NT)update)r   find_graph_inputr$   r   infer_runtime_shaper   	known_vi_)r   r%   graph_inputs      r   get_dimensionsz!FusionGemmFastGelu.get_dimensions   s    j11*== 	F88EEE$ 	)#z==T=JJD$(D!'889I9ST^9_```tr   nodeinput_name_to_nodesoutput_name_to_nodec                    d}t          |j                  dk    rd}| j                            |dgdg          }|dS |d         }d}d}d}	t	          |j                  D ]X\  }
}| j                            |          }|!|                     |j        |
                   }B|
}t          j        |          }	Y|	dS t          |	j	                  dk    rdS |t          |	j	                  k     rdS d}|rmd}t	          |j                  D ]8\  }
}| j                            |          }|"|
}t          j        |          } |dS t          |j	                  dk    rdS ||g}| j        
                    ||j        d         g||          sdS | j                            |           |r)|j        d|z
           |j        |         |j        |         gn|j        d|z
           |j        |         g}t          j        d	||j        | j                            d	          
          }d|_        | j                            |           | j        | j        |j        <   dS )z
        This pattern is from PyTorch bert model
        Fuse MatMul with FastGelu into one node:

            [root] --> MatMul --> FastGelu -->

        F   TMatMulr   N   r   )inputsoutputsnamezcom.microsoft)r"   inputr   match_parent_path	enumerateget_initializerr,   r   to_arrayr   is_safe_to_fuse_nodesoutputnodes_to_removeextendr   	make_nodecreate_node_namedomainnodes_to_addappendthis_graph_namenode_name_to_graph_namer7   )r   r-   r.   r/   has_biasmatch_nodesmatmulweight_indexx_dimsweightir8   initializer
bias_indexbias_weightsubgraph_nodesr5   
fused_nodes                     r   fusezFusionGemmFastGelu.fuse+   s    tz??aHj224(aSIIFQ !&,// 	; 	;HAu*44U;;K",,V\!_== $-k::>Fv|!!FC%%%%F 
 	K%dj11  5"j88??&
)2;??";$%%**z//T[^,.ACV
 
 	 F##N333 NV\!l*+V\,-GT^I_``,q</0&,|2LM 	 %K,,^<<	
 
 

 ,
  ,,,8<8L$Z_555r   )__name__
__module____qualname__r   r   r
   r   intr$   strr,   r	   r   r   rT   __classcell__)r   s   @r   r   r      s        &i & & & & & &
[ USVX\S\M]     sDy1A    OMOM "#tI"67OM "#y.1	OM OM OM OM OM OM OM OMr   r   N)loggingr   typingr   r   r   fusion_baser   fusion_utilsr   onnxr	   r
   r   
onnx_modelr   rU   loggerr    r   r   <module>rc      s          $ $ $ $ $ $ $ $ $ $       $ $ $ $ $ $ / / / / / / / / / /            	8		iM iM iM iM iM iM iM iM iM iMr   