o
    g                     @   sj   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	 d dl
mZ e eZG dd deZdS )	    N)FusionGptAttention)FusionGptAttentionMegatron)FusionGptAttentionNoPast)FusionRotaryAttention)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__ _/var/www/visachat/venv/lib/python3.10/site-packages/onnxruntime/transformers/onnx_model_gpt2.pyr	      s   zGpt2OnnxModel.__init__c                 C   s~   t | jjjdkst | jjjdkrt| | j}|  nt| | j}|  t	| | j}|  t
| | j| j}|  d S )N   )lenr   graphinputoutputr   r   applyr   r   r   r   )r
   fusionr   r   r   fuse_attention   s   $
zGpt2OnnxModel.fuse_attentionc                 C   s  t d |  }|  }d}| dD ]}| j|d|dd}| |ddgddg|}|du rP| |dd	gddg|}|du rP| |dd
gddg|}|du rPq|\}}| 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SkipLayerNormalization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nodesreshape_before_gemm	root_nodematmul_node_namematmul_nodeadd_node_namer6   r   r   r   postprocess"   sb   



zGpt2OnnxModel.postprocess)__name__
__module____qualname__r	   r   rB   __classcell__r   r   r   r   r      s    r   )loggingr2   fusion_gpt_attentionr   fusion_gpt_attention_megatronr   fusion_gpt_attention_no_pastr   fusion_rotary_attentionr   onnx_model_bertr   	getLoggerrC   r*   r   r   r   r   r   <module>   s   
