§
    kŠtjk  ã                   óž   — 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)ÚFusionLayerNormalization)ÚFusionMultiHeadAttentionDiT)ÚFusionMultiHeadAttentionMMDit)ÚFusionOptions)Úis_installed)Ú
ModelProto)ÚBertOnnxModelc                   ór   ‡ — e Zd Zddededefˆ fd„Zd„ Zd„ Zd„ Zdde	d	z  de
fd„Zdde	d	z  fd„Zd„ Zˆ xZS )ÚMmditOnnxModelr   ÚmodelÚ	num_headsÚhidden_sizec                 óŠ   •— |dk    r|dk    s|dk    r	||z  dk    sJ ‚t          ¦   «                              |||¬¦  «         dS )ak  Initialize Multimodal Diffusion Transformer (MMDiT) 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       €úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_mmdit.pyr   zMmditOnnxModel.__init__   s\   ø€ ð ˜Q’� ;°!Ò#3Ð#3¸ÀQº¸È;ÐYbÑKbÐfgÒKgÐKgÐKgÐhÝ‰Œ×Ò˜¨)ÀÐÑMÔMÐMÐMÐMó    c                 óV   — |                       ¦   «          |                      ¦   «          d S ©N)Úprune_graphÚremove_unused_constant)r   s    r   ÚpostprocesszMmditOnnxModel.postprocess   s,   € Ø×ÒÑÔÐØ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                 óŒ   — d}t                                d¦  «         t          | | d¬¦  «        }|                     ¦   «          d S )NTzwThe optimized model requires LayerNormalization with broadcast support. Please use onnxruntime-gpu>=1.21 for inference.)Úcheck_constant_and_dimensionÚforce)ÚloggerÚwarningr   Úapply)r   Úlayernorm_support_broadcastÚfusions      r   Úfuse_layer_normzMmditOnnxModel.fuse_layer_norm#   sX   € Ø&*Ð#Ý�Šð>ñ	
ô 	
ð 	
õ *ØÐ3NÐ/NÐVZð
ñ 
ô 
ˆð 	�Š‰Œˆˆˆr   c                 ó’   — t          | ¦  «        }|                     ¦   «          t          | ¦  «        }|                     ¦   «          d S r   )r   r    r   )r   r"   Ú
dit_fusions      r   Úfuse_multi_head_attentionz(MmditOnnxModel.fuse_multi_head_attention.   sC   € å.¨tÑ4Ô4ˆØ�Š‰Œˆõ 1°Ñ6Ô6ˆ
Ø×ÒÑÔÐÐÐr   NFÚoptionsÚadd_dynamic_axesc                 ód  — |rJ ‚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é   r"   )ÚinitialÚdescz<tqdm is not installed. Run optimization without progress bar)r   r*   Útqdm.contrib.loggingr+   ÚrangeÚ	_optimizer   Úinfo)r   r'   r(   r*   r+   ÚstepsÚprogress_bars          r   ÚoptimizezMmditOnnxModel.optimize8   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   ¨>A3Á3A7Á:A7c                 ó´  — |�|j         s|                      ¦   «          | j                             ¦   «          |r|                     d¦  «         |�|j        r(|                      ¦   «          |                      ¦   «          |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_useless_cast_nodesÚupdateÚenable_layer_normr#   Úfuse_simplified_layer_normÚenable_geluÚ	fuse_geluÚenable_attentionr&   r   r   r2   Úget_opset_version)r   r'   r4   s      r   r1   zMmditOnnxModel._optimizeG   sm  € ØÐ¨Ô)GÐØ×(Ò(Ñ*Ô*Ð*ð 	Œ
×,Ò,Ñ.Ô.Ð.Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 9ˆOØ× Ò Ñ"Ô"Ð"Ø×+Ò+Ñ-Ô-Ð-Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 3ˆOØ�NŠNÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 8ˆOØ×*Ò*Ñ,Ô,Ð,Øð 	#Ø×Ò Ñ"Ô"Ð"à×ÒÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"å�ŠÐ@ d×&<Ò&<Ñ&>Ô&>Ð@Ð@ÑAÔAÐAÐAÐAr   c                 ó¤   — i }g d¢}|D ])}|                       |¦  «        }t          |¦  «        ||<   Œ*t                               d|› �¦  «         |S )z8
        Returns node count of fused operators.
        )ÚFastGeluÚMultiHeadAttentionÚLayerNormalizationÚSimplifiedLayerNormalizationzOptimized operators:)Úget_nodes_by_op_typeÚlenr   r2   )r   Úop_countÚopsÚopÚnodess        r   Úget_fused_operator_statisticsz,MmditOnnxModel.get_fused_operator_statisticsf   so   € ð ˆð
ð 
ð 
ˆð ð 	&ð 	&ˆBØ×-Ò-¨bÑ1Ô1ˆEÝ˜u™:œ:ˆH�R‰LˆLå�ŠÐ5¨8Ð5Ð5Ñ6Ô6Ð6Øˆr   )r   r   )NF)NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r#   r&   r   Úboolr5   r1   rN   Ú__classcell__)r   s   @r   r   r      sô   ø€ € € € € ð	Nð 	N˜jð 	N°Sð 	NÈ3ð 	Nð 	Nð 	Nð 	Nð 	Nð 	Nð&ð &ð &ð	ð 	ð 	ðð ð ð*ð * °Ñ 4ð *Ètð *ð *ð *ð *ðBð B °Ñ!5ð Bð Bð Bð Bð>ð ð ð ð ð ð r   r   )ÚloggingÚfusion_layernormr   Úfusion_mha_ditr   Úfusion_mha_mmditr   Úfusion_optionsr   Úimport_utilsr   Úonnxr   Úonnx_model_bertr	   Ú	getLoggerrO   r   r   © r   r   ú<module>r_      sÞ   ðð €€€à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø :Ð :Ð :Ð :Ð :Ð :Ø (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ðdð dð dð dð d�]ñ dô dð dð dð dr   