o
    ;ήc<                     @   s^   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 e 
eZG dd de	ZdS )    N)FusionGptAttention)FusionGptAttentionMegatron)FusionGptAttentionNoPast)BertOnnxModelc                       s,   e Zd Z fddZdd Zdd Z  ZS )Gpt2OnnxModelc                    s   t  ||| d S )N)super__init__)selfmodel	num_headshidden_size	__class__ O/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/onnx_model_gpt2.pyr      s   zGpt2OnnxModel.__init__c                 C   sh   t | jjjdkst | jjjdkrt| | j}|  d S t| | j}|  t	| | j}|  d S )N   )
lenr
   graphinputoutputr   r   applyr   r   )r	   fusionr   r   r   fuse_attention   s   $zGpt2OnnxModel.fuse_attentionc                 C   s~  t d |  }|  }d}| dD ]}| j|d|dd}g }| |ddgddg|}|du rB| |dd	gddg|}|du rBq|\}}	| d
d}
tj	j
d
|
d |jd g|
d g|
d}| dd}tj	j
d|
d |jd g|d g|d}| |jd |d  | |	jd |
d  |
d |	jd< | |jd |d  | | | | |d7 }q|   t d|  dS )z-
        Remove extra reshape nodes.
        zstart postprocessing...r   GemmReshapeF)	recursiveFastGeluNLayerNormalizationMatMulFullyConnect_MatMul_inputr   _output)inputsoutputsnameAddFullyConnect_Add   z"postprocess: remove Reshape count:)loggerdebuginput_name_to_nodesoutput_name_to_nodeget_nodes_by_op_typefind_first_child_by_typematch_parent_pathcreate_node_nameonnxhelper	make_noder   replace_input_of_all_nodesr   add_nodeprune_graphinfo)r	   r*   r+   reshape_count	gemm_nodereshape_after_gemmreturn_indicenodesreshape_before_gemm	root_nodematmul_node_namematmul_nodeadd_node_namer4   r   r   r   postprocess   sV   



zGpt2OnnxModel.postprocess)__name__
__module____qualname__r   r   rA   __classcell__r   r   r   r   r      s    
r   )loggingr0   fusion_gpt_attentionr   fusion_gpt_attention_megatronr   fusion_gpt_attention_no_pastr   onnx_model_bertr   	getLoggerrB   r(   r   r   r   r   r   <module>   s   
