§
    kŠtj'$  ã                   óÞ   — 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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)Ú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dz  fd„Zd„ Zddedz  fd„Zddedz  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       €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_unet.pyr   zUnetOnnxModel.__init__   s\   ø€ ð ˜Q’� ;°!Ò#3Ð#3¸ÀQº¸È;ÐYbÑKbÐfgÒKgÐKgÐKgÐhå‰Œ×Ò˜¨)ÀÐÑ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ÐL˜d°d´lÀeÒ6KÐ6K�TÐ6KÐ6KÐ6Kr   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ÐL d§j¢j¡l¤lÐLÑLÔLˆ	àˆØð 	,ð 	,ˆCØ×'Ò'¨¨SÑ1Ô1°QÒ6Ð6Ø×&Ò& sÑ+Ô+Ð+øà#ð 	Kð 	KˆDØ×+Ò+¨D¬K¸¬N¸D¼JÀq¼MÑJÔJÐJÐJàð 	FØ×Ò˜oÑ.Ô.Ð.Ý�KŠKÐ.µ°OÑ0DÔ0DÑ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-   € å*¨4¸tÐ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Úranger6   Úfind_graph_outputr1   Úfind_graph_inputr2   r0   Úremove_noder8   r4   r5   )r   Úfusion_transposeÚremove_countr-   r*   ÚpermutationÚtotals          r   Úmerge_adjacent_transposez&UnetOnnxModel.merge_adjacent_transposeA   s~  € Ý*¨4Ñ0Ô0ÐØ×ÒÑ Ô Ð àˆØ×)Ò)¨+Ñ6Ô6ˆØð 	ñ 	ˆDÝ#Ô6°t¸VÑDÔDˆKÝ˜k­4Ñ0Ô0Ð0Ð0Ð0Ø�d¥5­¨[Ñ)9Ô)9Ñ#:Ô#:Ñ;Ô;Ò;Ð;Øà×&Ò& t¤{°1¤~Ñ6Ô6ðà×(Ò(¨¬°A¬Ñ7Ô7ðð ×)Ò)¨$¬*°Q¬-Ñ8Ô8ðð ð ð ×+Ò+¨D¬K¸¬N¸D¼JÀq¼MÑJÔJÐJà×Ò˜TÑ"Ô"Ð"Ø˜AÑˆL‰LåÐ$Ô4Ñ5Ô5¸ÑDˆØð 	=Ý�KŠKÐ4°eÑ<Ô<Ð<Ð<Ð<ð	=ð 	=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)rR   r   r   r   r<   rS   )r   rO   rR   Úself_attention_fusionrS   Úcross_attention_fusions         r   Úfuse_multi_head_attentionz'UnetOnnxModel.fuse_multi_head_attention]   s®   € à$¨˜_ÐJ°Ô1JÐÝ 3ØØÔØŒNØ$Ø/Ø"ð!
ñ !
ô !
Ðð 	×#Ò#Ñ%Ô%Ð%ð $ t˜OÐH°Ô0HÐÝ!4ØØÔØŒNØ#Ø#Ø-ð"
ñ "
ô "
Ðð 	×$Ò$Ñ&Ô&Ð&Ð&Ð&r   c                 óL   — t          | ¦  «        }|                     ¦   «          d S r   )r   r<   )r   Úfusions     r   Úfuse_bias_addzUnetOnnxModel.fuse_bias_addv   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é   rX   )ÚinitialÚdescz<tqdm is not installed. Run optimization without progress bar)r   r[   Útqdm.contrib.loggingr\   rF   Ú	_optimizer4   r5   )r   rO   r[   r\   ÚstepsÚprogress_bars         r   ÚoptimizezUnetOnnxModel.optimizez   s  € Ý˜ÑÔð 
	*ØˆKˆKˆKØBÐBÐBÐBÐBÐBà&Ð&Ñ(Ô(ð 6ð 6Ø�Ø#Ÿyšy­¨u©¬¸qÀx˜yÑPÔP�Ø—’˜w¨Ñ5Ô5Ð5ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð 6ð 6õ
 �KŠKÐVÑWÔWÐWØ�NŠN˜7 DÑ)Ô)Ð)Ð)Ð)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_attentionrV   Ú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>   rN   Úenable_bias_addrY   r$   r4   r5   Úget_opset_version)r   rO   rc   Úchannels_lastÚgroup_norm_fusionÚinsert_transpose_fusionÚbias_split_gelu_fusionÚskip_group_norm_fusions           r   ra   zUnetOnnxModel._optimize‡   sˆ  € ØÐ¨Ô)GÐØ×(Ò(Ñ*Ô*Ð*àŒ
×(Ò(Ñ*Ô*Ð*Øð 	#Ø×Ò Ñ"Ô"Ð"ð 	Œ
×,Ò,Ñ.Ô.Ð.Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 9ˆOØ× Ò Ñ"Ô"Ð"Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 3ˆOØ�NŠNÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"à�ŠÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"à×ÒÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 9ˆOØ$¨˜_ÐQ°Ô1QˆMÝ /°°mÑ DÔ DÐØ×#Ò#Ñ%Ô%Ð%å&;¸DÑ&AÔ&AÐ#Ø#×)Ò)Ñ+Ô+Ð+Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô =ˆOÝ%8¸Ñ%>Ô%>Ð"Ø"×(Ò(Ñ*Ô*Ð*Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 8ˆOà×*Ò*¨7Ñ3Ô3Ð3Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô >ˆOØ×%Ò%Ñ'Ô'Ð'Øð 	#Ø×Ò Ñ"Ô"Ð"à�ŠÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"ð 	Œ
×/Ò/Ñ1Ô1Ð1Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô >ˆOÝ%8¸Ñ%>Ô%>Ð"Ø"×(Ò(Ñ*Ô*Ð*Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô CˆOà×.Ò.Ñ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:)rB   r6   r4   r5   )r   Úop_countÚopsÚopr-   s        r   Úget_fused_operator_statisticsz+UnetOnnxModel.get_fused_operator_statisticsì   so   € ð ˆð

ð 

ð 

ˆð ð 	&ð 	&ˆBØ×-Ò-¨bÑ1Ô1ˆEÝ˜u™:œ:ˆH�R‰LˆLå�ŠÐ5¨8Ð5Ð5Ñ6Ô6Ð6Øˆr   )r   r   r   )NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r    r$   r   r>   rN   r   rV   rY   rd   ra   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'ð '°ÀÑ1Eð 'ð 'ð 'ð 'ð2ð ð ð*ð * °Ñ 4ð *ð *ð *ð *ðcBð cB °Ñ!5ð cBð cBð cBð cBðJð ð ð ð ð ð r   r   )ÚloggingÚfusion_attention_unetr   Úfusion_bias_addr   Úfusion_biassplitgelur   Úfusion_group_normr   Úfusion_nhwc_convr   Úfusion_optionsr   Úfusion_skip_group_normr	   rJ   r
   r   Úimport_utilsr   Úonnxr   Ú
onnx_modelr   Úonnx_model_bertr   Ú	getLoggerr”   r4   r   © r   r   ú<module>r§      s>  ðð €€€à 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   