o
    ¢Äiì  ã                   @   sn   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 e  e¡ZG dd	„ d	eƒZdS )
é    N)ÚFusionMultiHeadAttentionSam2)ÚFusionLayerNormalizationNCHW)ÚFusionOptions)Úis_installed)Ú
ModelProto)ÚBertOnnxModelc                       sˆ   e Zd Zddededef‡ fdd„Zdd„ Z‡ fd	d
„ZddedB fdd„Z	ddedB de
fdd„ZddedB fdd„Zdd„ Z‡  ZS )ÚSam2OnnxModelr   ÚmodelÚ	num_headsÚhidden_sizec                    s>   |dkr|dks|dkr|| dksJ ‚t ƒ j|||d 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__© úb/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/onnx_model_sam2.pyr      s   (zSam2OnnxModel.__init__c                 C   s   |   ¡  |  ¡  d S ©N)Zprune_graphZremove_unused_constant)r   r   r   r   Úpostprocess   s   zSam2OnnxModel.postprocessc                    s   t ƒ  ¡  t| ƒ}| ¡  d S r   )r   Úfuse_layer_normr   Úapply)r   Zfusionr   r   r   r   #   s   
zSam2OnnxModel.fuse_layer_normNÚoptionsc                 C   s   t | | j| jƒ}| ¡  d S r   )r   r   r
   r   )r   r   Z
mha_fusionr   r   r   Úfuse_multi_head_attention)   s   z'Sam2OnnxModel.fuse_multi_head_attentionFÚadd_dynamic_axesc                 C   s†   t dƒr6dd l}ddlm} |ƒ  d}|jt|ƒddd}|  ||¡ W d   ƒ d S 1 s/w   Y  d S t d¡ |  |d ¡ d S )NÚtqdmr   )Úlogging_redirect_tqdmé   zsam2 fusion)ÚinitialZdescz<tqdm is not installed. Run optimization without progress bar)r   r   Ztqdm.contrib.loggingr   ÚrangeÚ	_optimizeÚloggerÚinfo)r   r   r   r   r   ZstepsÚprogress_barr   r   r   Úoptimize-   s   "ý
zSam2OnnxModel.optimizec                 C   s’  |d ur|j s|  ¡  | j ¡  |r| d¡ | j ¡  |r#| d¡ |d u s*|jr.|  ¡  |r5| d¡ |d u s<|jr@|  	¡  |rG| d¡ |  
¡  |rR| d¡ |d u sY|jr^|  |¡ |re| d¡ |d u sl|jrp|  ¡  |rw| d¡ |  ¡  |r‚| d¡ | j ¡  |rŽ| d¡ |d u s•|jr™|  ¡  |r | d¡ |d ur«|jr«|  ¡  |r²| d¡ |  ¡  |r½| d¡ t d|  ¡ › ¡ d S )Né   zopset version: )Zenable_shape_inferenceZdisable_shape_inferenceÚutilsZremove_identity_nodesÚupdateZremove_useless_cast_nodesZenable_layer_normr   Zenable_geluZ	fuse_geluZfuse_reshapeZenable_attentionr   Zenable_skip_layer_normZfuse_skip_layer_normZ
fuse_shapeZremove_useless_reshape_nodesZenable_bias_skip_layer_normZfuse_add_bias_skip_layer_normZenable_gelu_approximationZgelu_approximationr   r    r!   Zget_opset_version)r   r   r"   r   r   r   r   :   sZ   















zSam2OnnxModel._optimizec                 C   s@   i }g d¢}|D ]}|   |¡}t|ƒ||< qt d|› ¡ |S )z8
        Returns node count of fused operators.
        )ZMultiHeadAttentionZLayerNormalizationZSkipLayerNormalizationzOptimized operators:)Zget_nodes_by_op_typeÚlenr    r!   )r   Zop_countÚopsÚopÚnodesr   r   r   Úget_fused_operator_statisticsy   s   
z+Sam2OnnxModel.get_fused_operator_statistics)r   r   r   )NF)NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r   r   r   Úboolr#   r   r+   Ú__classcell__r   r   r   r   r      s    ?r   )ÚloggingZfusion_attention_sam2r   Zfusion_layernormr   Zfusion_optionsr   Zimport_utilsr   Zonnxr   Zonnx_model_bertr   Ú	getLoggerr,   r    r   r   r   r   r   Ú<module>   s   
