o
    ˜º¥gï  ã                   @   sz   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  e¡ZG d	d
„ d
eƒZdS )é    N)ÚOptional)Ú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e	 fdd„Z
ddee	 defdd„Zddee	 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__© ú_/var/www/visachat/venv/lib/python3.10/site-packages/onnxruntime/transformers/onnx_model_sam2.pyr      s   (zSam2OnnxModel.__init__c                 C   s   |   ¡  |  ¡  d S ©N)Úprune_graphÚremove_unused_constant)r   r   r   r   Úpostprocess    s   zSam2OnnxModel.postprocessc                    s   t ƒ  ¡  t| ƒ}| ¡  d S r   )r   Úfuse_layer_normr   Úapply)r   Ú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   Ú
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)Ú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_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: )Ú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   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.
        )ÚMultiHeadAttentionÚLayerNormalizationÚSkipLayerNormalizationzOptimized operators:)Úget_nodes_by_op_typeÚlenr'   r(   )r   Úop_countÚopsÚopÚnodesr   r   r   Úget_fused_operator_statisticsz   s   
z+Sam2OnnxModel.get_fused_operator_statistics)r   r   r   )NF)NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r   r   r   r   Úboolr+   r&   rJ   Ú__classcell__r   r   r   r   r	      s    ?r	   )ÚloggingÚtypingr   Úfusion_attention_sam2r   Úfusion_layernormr   Úfusion_optionsr   Úimport_utilsr   Úonnxr   Úonnx_model_bertr   Ú	getLoggerrK   r'   r	   r   r   r   r   Ú<module>   s   
