
    g                         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y)    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 )Sam2OnnxModelmodel	num_headshidden_sizec                 \    |dk(  r|dk(  s|dkD  r||z  dk(  sJ t         |   |||       y)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       ]/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_model_sam2.pyr   zSam2OnnxModel.__init__   sA     Q;!#3Q;YbKbfgKghh)M    c                 D    | j                          | j                          y N)prune_graphremove_unused_constant)r   s    r   postprocesszSam2OnnxModel.postprocess    s    ##%r   c                 X    t         |           t        |       }|j                          y r   )r   fuse_layer_normr   apply)r   fusionr   s     r   r   zSam2OnnxModel.fuse_layer_norm$   s!    !-d3r   optionsc                 f    t        | | j                  | j                        }|j                          y r   )r   r   r   r   )r   r   
mha_fusions      r   fuse_multi_head_attentionz'Sam2OnnxModel.fuse_multi_head_attention*   s&    1$8H8H$..Y
r   add_dynamic_axesc                    t        d      rLdd l}ddlm}  |       5  d}|j                  t	        |      dd      }| j                  ||       d d d        y t        j                  d       | j                  |d        y # 1 sw Y   y xY w)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.   so    B&(#yyuq}yUw5 )(
 KKVWNN7D) )(s   2B  B	c                    ||j                   s| j                          | j                  j                          |r|j	                  d       | j                  j                          |r|j	                  d       ||j                  r| j                          |r|j	                  d       ||j                  r| j                          |r|j	                  d       | j                          |r|j	                  d       ||j                  r| j                  |       |r|j	                  d       ||j                  r| j                          |r|j	                  d       | j                          |r|j	                  d       | j                  j!                          |r|j	                  d       ||j"                  r| j%                          |r|j	                  d       ||j&                  r| j)                          |r|j	                  d       | j+                          |r|j	                  d       t,        j/                  d| j1                                 y )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)G((*

((*" 	

,,."O 9 9  ""O 3 3NN""O 8 8**73"O > >%%'"" 	

//1"O C C..0"7#D#D##%""od&<&<&>%?@Ar   c                     i }g d}|D ]!  }| j                  |      }t        |      ||<   # t        j                  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   sT     
 B--b1Eu:HRL  	*8*5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      sn    
Nj 
NS 
N3 
N&-1H * 7 *RV *=B-!8 =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 ( %  )			8	$wM wr   