
    g(                         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y	)
    )	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                 F    t         |   |ddd       d | _        d| _        y )NGemmFastGeluFastGeluF)super__init__shape_infershape_infer_done)selfr   	__class__s     a/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_gemmfastgelu.pyr   zFusionGemmFastGelu.__init__   s&    
NK %    tensor_protoreturnNc                     |j                   j                  j                  d      r3t        |j                   j                  j                  j
                        S y )Nshape)typetensor_typeHasFieldlenr   dim)r   r   s     r    get_dimensions_from_tensor_protoz3FusionGemmFastGelu.get_dimensions_from_tensor_proto   sB    ((11':|((44::>>??r   
input_namec                 0   | j                   j                  |      }|r| j                  |      S | j                  s(| j                   j	                  d      | _        d| _        | j
                  (| j                  | j
                  j                  |         S y )NT)update)r   find_graph_inputr$   r   infer_runtime_shaper   	known_vi_)r   r%   graph_inputs      r   get_dimensionsz!FusionGemmFastGelu.get_dimensions   s    jj11*=88EE$$#zz==T=JD$(D!'889I9I9S9ST^9_``r   nodeinput_name_to_nodesoutput_name_to_nodec                    d}t        |j                        dk(  rd}| j                  j                  |dgdg      }|y|d   }d}d}d}	t	        |j                        D ]X  \  }
}| j                  j                  |      }|| j                  |j                  |
         }B|
}t        j                  |      }	Z |	yt        |	j                        dk7  ry|t        |	j                        k  ryd}|rqd}t	        |j                        D ];  \  }
}| j                  j                  |      }|$|
}t        j                  |      } n |yt        |j                        dk7  ry||g}| j                  j                  ||j                  d   g||      sy| j                  j                  |       |r/|j                  d|z
     |j                  |   |j                  |   gn |j                  d|z
     |j                  |   g}t        j                  d	||j                  | j                  j!                  d	      
      }d|_        | j$                  j'                  |       | j(                  | j*                  |j,                  <   y)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+   sr    tzz?aHjj224(aSIQ !&,,/HAu**44U;K",,V\\!_= $--k: 0 >v||!C%% 
K%djj15"jj88?&
)22;? 2 ";$$%*zz//T[[^,.ACV
 ##N3  \\!l*+V\\,-GT^I_`,,q</0&,,|2LM 	 %%KK,,^<	

 ,
  ,8<8L8L$$Z__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r   r   N)loggingr   typingr   r   r   fusion_baser   fusion_utilsr   onnxr	   r
   r   
onnx_modelr   rU   loggerr    r   r   <module>rc      s9     $ $  $ / /  	8	iM iMr   