
     Ng*$                         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
 d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dlmZ d dlmZ  e j        e          Z G d de          ZdS )    N)Optional)FusionAttentionUnet)FusionBiasAdd)FusionBiasSplitGelu)FusionGroupNorm)FusionNhwcConv)FusionOptions)FusionSkipGroupNorm)FusionInsertTransposeFusionTranspose)is_installed)
ModelProto)	OnnxModel)BertOnnxModelc                        e Zd Zddededef fdZd Zd Zd Zd	 Z	d
 Z
ddee         fdZd Zddee         fdZddee         fdZd Z xZS )UnetOnnxModelr   model	num_headshidden_sizec                     |dk    r|dk    s|dk    r	||z  dk    sJ t                                          |||           dS )aG  Initialize UNet ONNX Model.

        Args:
            model (ModelProto): the ONNX model
            num_heads (int, optional): number of attention heads. Defaults to 0 (detect the parameter automatically).
            hidden_size (int, optional): hidden dimension. Defaults to 0 (detect the parameter automatically).
        r   )r   r   N)super__init__)selfr   r   r   	__class__s       d/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_unet.pyr   zUnetOnnxModel.__init__   s\     Q;!#3#3Q;YbKbfgKgKgKgKg)MMMMM    c                 .    |                                   d S N)remove_useless_divr   s    r   
preprocesszUnetOnnxModel.preprocess&   s    !!!!!r   c                 V    |                                   |                                  d S r   )prune_graphremove_unused_constantr    s    r   postprocesszUnetOnnxModel.postprocess)   s,    ##%%%%%r   c                    d |                                  D             }g }|D ]1}|                     |d          dk    r|                    |           2|D ].}|                     |j        d         |j        d                    /|r?|                     |           t                              dt          |                     dS dS )zRemove Div by 1c                 (    g | ]}|j         d k    |S )Div)op_type).0nodes     r   
<listcomp>z4UnetOnnxModel.remove_useless_div.<locals>.<listcomp>/   s$    LLLddle6K6KT6K6K6Kr   g      ?   r   zRemoved %d Div nodesN)
nodesfind_constant_inputappendreplace_input_of_all_nodesoutputinputremove_nodesloggerinfolen)r   	div_nodesnodes_to_removedivr+   s        r   r   z UnetOnnxModel.remove_useless_div-   s    LLdjjllLLL	 	, 	,C''S11Q66&&s+++# 	K 	KD++DKNDJqMJJJJ 	Fo...KK.O0D0DEEEEE	F 	Fr   c                 P    t          | d          }|                                 d S )NT)update_weight)r   apply)r   conv_to_nhwc_convs     r   convert_conv_to_nhwcz"UnetOnnxModel.convert_conv_to_nhwc=   s-    *4tDDD!!!!!r   c           	         t          |           }|                                 d}|                     d          }|D ]}t          j        |d          }t          |t                    sJ |t          t          t          |                              k    r]| 	                    |j
        d                   s@|                     |j        d                   s | 	                    |j        d                   rJ |                     |j
        d         |j        d                    |                     |           |dz  }t          |j                  |z   }|rt                               d|           d S d S )Nr   	Transposepermr-   zRemoved %d Transpose nodes)r   r=   get_nodes_by_op_typer   get_node_attribute
isinstancelistranger7   find_graph_outputr2   find_graph_inputr3   r1   remove_noder9   r5   r6   )r   fusion_transposeremove_countr.   r+   permutationtotals          r   merge_adjacent_transposez&UnetOnnxModel.merge_adjacent_transposeB   s~   *400   ))+66 	 	D#6tVDDKk400000d5[)9)9#:#:;;;;&&t{1~66((A77 ))$*Q-88   ++DKNDJqMJJJT"""ALL$455D 	=KK4e<<<<<	= 	=r   Noptionsc                     |d u p|j         }t          | | j        | j        d|d          }|                                 |d u p|j        }t          | | j        | j        dd|          }|                                 d S )NF)is_cross_attentionenable_packed_qkvenable_packed_kvT)rS   r   r   r   r=   rT   )r   rP   rS   self_attention_fusionrT   cross_attention_fusions         r   fuse_multi_head_attentionz'UnetOnnxModel.fuse_multi_head_attention^   s    $_J1J 3N$/"!
 !
 !
 	##%%% $tOH0H!4N##-"
 "
 "
 	$$&&&&&r   c                 L    t          |           }|                                 d S r   )r   r=   )r   fusions     r   fuse_bias_addzUnetOnnxModel.fuse_bias_addw   s     t$$r   c                 \   t          d          rldd l}ddlm}  |            5  d}|                    t	          |          dd          }|                     ||           d d d            d S # 1 swxY w Y   d S t                              d           |                     |d            d S )Ntqdmr   )logging_redirect_tqdm   rY   )initialdescz<tqdm is not installed. Run optimization without progress bar)r   r\   tqdm.contrib.loggingr]   rG   	_optimizer5   r6   )r   rP   r\   r]   stepsprogress_bars         r   optimizezUnetOnnxModel.optimize{   s    
	*KKKBBBBBB&&(( 6 6#yyuqxyPPw5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 KKVWWWNN7D)))))s   >A//A36A3c                 p   ||j         s|                                  | j                                         |r|                    d           | j                                         |r|                    d           ||j        r|                                  |r|                    d           ||j        r| 	                                 |r|                    d           | 
                                 |r|                    d           |                                  |r|                    d           ||j        rR|d u p|j        }t          | |          }|                                 t!          |           }|                                 |r|                    d           ||j        r#t%          |           }|                                 |r|                    d           ||j        r|                     |           |r|                    d           ||j        r|                                  |r|                    d           |                                  |r|                    d           | j                                         |r|                    d           ||j        r#t5          |           }|                                 |r|                    d           ||j        r|                                  |r|                    d           ||j        r|                                  |r|                    d           ||j        r(|                                   | !                                 |r|                    d           ||j"        r| #                                 |r|                    d           | $                                 |r|                    d           tJ          &                    d| '                                            d S )Nr-   zopset version: )(enable_shape_inferencedisable_shape_inferenceutilsremove_identity_nodesupdateremove_useless_cast_nodesenable_layer_normfuse_layer_normenable_gelu	fuse_gelur!   fuse_reshapeenable_group_normgroup_norm_channels_lastr   r=   r   enable_bias_splitgelur   enable_attentionrW   enable_skip_layer_normfuse_skip_layer_norm
fuse_shaperemove_useless_reshape_nodesenable_skip_group_normr
   enable_bias_skip_layer_normfuse_add_bias_skip_layer_normenable_gelu_approximationgelu_approximationenable_nhwc_convr?   rO   enable_bias_addrZ   r%   r5   r6   get_opset_version)r   rP   rd   channels_lastgroup_norm_fusioninsert_transpose_fusionbias_split_gelu_fusionskip_group_norm_fusions           r   rb   zUnetOnnxModel._optimize   s   )G((***
((*** 	#""" 	
,,... 	#"""O 9O  """ 	#"""O 3ONN 	#""" 	#""" 	#"""O 9O$_Q1QM /m D D##%%%&;D&A&A##))+++ 	#"""O =O%8%>%>""((*** 	#"""O 8O**7333 	#"""O >O%%''' 	#""" 	#""" 	
//111 	#"""O >O%8%>%>""((*** 	#"""O CO..000 	#"""7#D##%%% 	#"""?g6?%%'''))+++ 	#"""7#:    	#""" 	#"""@d&<&<&>&>@@AAAAAr   c                     i }g d}|D ])}|                      |          }t          |          ||<   *t                              d|            |S )z8
        Returns node count of fused operators.
        )		AttentionMultiHeadAttentionLayerNormalizationSkipLayerNormalizationBiasSplitGelu	GroupNormSkipGroupNormNhwcConvBiasAddzOptimized operators:)rC   r7   r5   r6   )r   op_countopsopr.   s        r   get_fused_operator_statisticsz+UnetOnnxModel.get_fused_operator_statistics   so     

 

 

  	& 	&B--b11Eu::HRLL5855666r   )r   r   r   )NN)__name__
__module____qualname__r   intr   r!   r%   r   r?   rO   r   r	   rW   rZ   re   rb   r   __classcell__)r   s   @r   r   r      sI       
N 
Nj 
NS 
N3 
N 
N 
N 
N 
N 
N" " "& & &F F F " " "
= = =8' '-1H ' ' ' '2  * * 7 * * * *cB cB-!8 cB cB cB cBJ      r   r   ) loggingtypingr   fusion_attention_unetr   fusion_bias_addr   fusion_biassplitgelur   fusion_group_normr   fusion_nhwc_convr   fusion_optionsr	   fusion_skip_group_normr
   rK   r   r   import_utilsr   onnxr   
onnx_modelr   onnx_model_bertr   	getLoggerr   r5   r    r   r   <module>r      sP          5 5 5 5 5 5 ) ) ) ) ) ) 4 4 4 4 4 4 - - - - - - + + + + + + ( ( ( ( ( ( 6 6 6 6 6 6 C C C C C C C C % % % % % %                   ) ) ) ) ) )		8	$	$j j j j jM j j j j jr   