o
    )wi                     @   sf   d dl mZ d dlmZ d dlmZ d dlZd dlZd dlm	Z	 d dl
mZ eeZG dd dZdS )	    )Sequence)	getLogger)AnyN)helper)	OnnxModelc                   @   s   e Zd ZdZdejfddZdeddfdd	Zd
e	ddfddZ
d
e	dededdfddZd%ddZd%ddZd&de	dedee dedef
ddZd'deddfdd Zd%d!d"Zed%d#d$ZdS )(DynamoOnnxHelperzK
    Helper class for processing ONNX models exported by Torch Dynamo.
    modelc                 C   s   t || _d S )N)r   r   )selfr    r
   h/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/onnxruntime/transformers/dynamo_onnx_helper.py__init__   s   zDynamoOnnxHelper.__init__edge_mappingreturnNc                 C   s   | j j jjD ]8}tt|jD ]}|j| |v r"||j|  |j|< qtt|jD ]}|j| |v r=||j|  |j|< q*q| j j jjD ]}|j|v rR||j |_qE| j j jjD ]}|j|v rf||j |_qYdS )zP
        Updates the edges in the model according to the given mapping.
        N)r   graphnoderangeleninputoutputname)r	   r   r   igraph_inputgraph_outputr
   r
   r   update_edges   s&   

zDynamoOnnxHelper.update_edges	func_namec                 C   sR  t d| d g }g }g }g }| jjjjD ]}|j|kr0|| |t|j	t|j
  qd}| jjjD ]}|j|krV|t|j |t|j	t|j
  |}q8t|t|ksaJ |D ]}| jjjj| qc|D ]}| jjjj| qq|dur| jjj| i }	tt|D ]}
||
 }||
 }||kr||	|< q| |	S )zH
        Unrolls the function with the given name in the model.
        zUnrolling function z...N)loggerdebugr   r   r   op_typeappendextendlistr   r   	functionsr   r   remover   r   )r	   r   nodes_to_removenodes_to_addedges_to_removeedges_to_addr   func_to_removefr   r   kvr
   r
   r   unroll_function,   s@   



z DynamoOnnxHelper.unroll_functioninput_id	output_idc                 C   sr   i }g }| j j jjD ]}|j|dkr#|j| ||j| < || q
|D ]}| j j jj| q&| 	| dS )z4
        Removes the function in the model.
        N)
r   r   r   r   findr   r   r   r"   r   )r	   r   r,   r-   r   r#   r   r
   r
   r   remove_functionS   s   
z DynamoOnnxHelper.remove_functionc                 C   s   t d | ddd dS )z9
        Removes the dropout layer in the model.
        zRemoving dropout layer...Dropoutr   Nr   r   r0   r	   r
   r
   r   remove_dropout_layerb   s   
z%DynamoOnnxHelper.remove_dropout_layerc                 C   s   t d | ddd dS )z9
        Removes the LM head layer in the model.
        zRemoving LM head layer...Linear_lm_head   r   Nr2   r3   r
   r
   r   remove_lm_head_layeri   s   
z%DynamoOnnxHelper.remove_lm_head_layerTr   	data_typedimsvalsrawc           	      C   sv   |r)t |}t|tjstj||d }n|| }t j||||dd}n
t j||||dd}| j	
| |S )N)dtypeT)r   r8   r9   r:   r;   F)r   tensor_dtype_to_np_dtype
isinstancenpndarrayarraytobytesastypemake_tensorr   add_initializer)	r	   r   r8   r9   r:   r;   np_typebytestensorr
   r
   r   rE   q   s*   
z DynamoOnnxHelper.add_initializer   min_sizec                 C   s   t d| d | jd}g }|D ]8}| j|jd }|du s'|j|k r(q|jD ]}|jdkrE| j	|jd |j
jt|j|d  nq+|| q| j| dS )zT
        Converts Constant ops of size [min_size] or higher to initializers
        z'Converting constants greater than size z to initializersConstantr   Nvalue)r   r8   r9   r:   )r   r   r   get_nodes_by_op_typeget_constant_valuer   size	attributer   rE   tr8   r    shaper   remove_nodes)r	   rJ   constant_nodesr#   r   np_dataattr
   r
   r   !convert_constants_to_initializers   s&   

	z2DynamoOnnxHelper.convert_constants_to_initializersc                 C   s8   | j  D ]}|d q| j  D ]}|d qdS )z4
        Clear metadata fields in all nodes
        metadata_propsN)r   graphs
ClearFieldnodes)r	   r   r   r
   r
   r   clear_metadata   s
   zDynamoOnnxHelper.clear_metadatac           	      C   s   ddl m} | jj D ]b\}}| }t|dkrn|d jdkrn|d }|j	d}|du r:|
|j  }n|
|j | }|j|j|j||j|d}|j|jd | || jj|< |jj|dd	 qdS )
z]
        Constant fold Transpose initializers without changing the initializer names
        r   )irrI   	TransposepermN)r   rR   typeconst_valueT)safe)
onnxscriptr]   r   initializersitems	consumersr   r   
attributesgetrH   ra   numpy	transposeas_intsValuer   rR   
TensorTyper<   conveniencereplace_all_uses_withoutputsr"   )	r   r]   r   initializer
user_nodestranspose_noder_   transposed_tensornew_initializerr
   r
   r   fold_transpose_initializers   s(   
z,DynamoOnnxHelper.fold_transpose_initializers)r   N)T)rI   )__name__
__module____qualname____doc__onnx
ModelProtor   dictr   strr+   intr0   r4   r7   r   r   boolrE   rW   r\   staticmethodrv   r
   r
   r
   r   r      s    '

$
!	r   )collections.abcr   loggingr   typingr   ri   r?   r{   r   
onnx_modelr   rw   r   r   r
   r
   r
   r   <module>   s   