
     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  e j        e          Z G d	 d
e          ZdS )    N)Optional)FusionMultiHeadAttentionSam2)FusionLayerNormalizationNCHW)FusionOptions)is_installed)
ModelProto)BertOnnxModelc                        e Zd Zddededef fdZd Z fdZdd	ee	         fd
Z
dd	ee	         defdZdd	ee	         fdZd Z xZS )Sam2OnnxModelr   model	num_headshidden_sizec                     |dk    r|dk    s|dk    r	||z  dk    sJ t                                          |||           dS )aG  Initialize SAM2 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_sam2.pyr   zSam2OnnxModel.__init__   s\     Q;!#3#3Q;YbKbfgKgKgKgKg)MMMMM    c                 V    |                                   |                                  d S N)prune_graphremove_unused_constant)r   s    r   postprocesszSam2OnnxModel.postprocess    s,    ##%%%%%r   c                     t                                                       t          |           }|                                 d S r   )r   fuse_layer_normr   apply)r   fusionr   s     r   r   zSam2OnnxModel.fuse_layer_norm$   s7    !!!-d33r   Noptionsc                 d    t          | | j        | j                  }|                                 d S r   )r   r   r   r   )r   r   
mha_fusions      r   fuse_multi_head_attentionz'Sam2OnnxModel.fuse_multi_head_attention*   s0    1$8H$.YY
r   Fadd_dynamic_axesc                 \   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   zsam2 fusion)initialdescz<tqdm is not installed. Run optimization without progress bar)r   r%   tqdm.contrib.loggingr&   range	_optimizeloggerinfo)r   r   r#   r%   r&   stepsprogress_bars          r   optimizezSam2OnnxModel.optimize.   s    
	*KKKBBBBBB&&(( 6 6#yyuq}yUU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                 2   ||j         s|                                  | j                                         |r|                    d           | j                                         |r|                    d           ||j        r|                                  |r|                    d           ||j        r| 	                                 |r|                    d           | 
                                 |r|                    d           ||j        r|                     |           |r|                    d           ||j        r|                                  |r|                    d           |                                  |r|                    d           | j                                         |r|                    d           ||j        r|                                  |r|                    d           ||j        r|                                  |r|                    d           |                                  |r|                    d           t,                              d|                                             d S )N   zopset version: )enable_shape_inferencedisable_shape_inferenceutilsremove_identity_nodesupdateremove_useless_cast_nodesenable_layer_normr   enable_gelu	fuse_gelufuse_reshapeenable_attentionr"   enable_skip_layer_normfuse_skip_layer_norm
fuse_shaperemove_useless_reshape_nodesenable_bias_skip_layer_normfuse_add_bias_skip_layer_normenable_gelu_approximationgelu_approximationr   r-   r.   get_opset_version)r   r   r0   s      r   r,   zSam2OnnxModel._optimize;   s   )G((***
((*** 	#""" 	
,,... 	#"""O 9O  """ 	#"""O 3ONN 	#""" 	#"""O 8O**7333 	#"""O >O%%''' 	#""" 	#""" 	
//111 	#"""O CO..000 	#"""7#D##%%% 	#""" 	#"""@d&<&<&>&>@@AAAAAr   c                     i }g d}|D ])}|                      |          }t          |          ||<   *t                              d|            |S )z8
        Returns node count of fused operators.
        )MultiHeadAttentionLayerNormalizationSkipLayerNormalizationzOptimized operators:)get_nodes_by_op_typelenr-   r.   )r   op_countopsopnodess        r   get_fused_operator_statisticsz+Sam2OnnxModel.get_fused_operator_statisticsz   so     
 
 
  	& 	&B--b11Eu::HRLL5855666r   )r   r   r   )NF)NN)__name__
__module____qualname__r   intr   r   r   r   r   r"   boolr1   r,   rR   __classcell__)r   s   @r   r   r      s       
N 
Nj 
NS 
N3 
N 
N 
N 
N 
N 
N& & &     -1H    * * 7 *RV * * * *=B =B-!8 =B =B =B =B~      r   r   )loggingtypingr   fusion_attention_sam2r   fusion_layernormr   fusion_optionsr   import_utilsr   onnxr   onnx_model_bertr	   	getLoggerrS   r-   r    r   r   <module>rc      s           > > > > > > 9 9 9 9 9 9 ( ( ( ( ( ( % % % % % %       ) ) ) ) ) )		8	$	$w w w w wM w w w w wr   