§
    º¯Åjq  ã                   ó’   — 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 j        e¦  «        Z G d„ d	e¦  «        ZdS )
é    N)ÚFusionLayerNormalization)Ú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       €úZC:\Projects\Historical\venv\Lib\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                 óL   — t          | ¦  «        }|                     ¦   «          d S r   )r   r   )r   r!   s     r   Úfuse_multi_head_attentionz(MmditOnnxModel.fuse_multi_head_attention-   s    € Ý.¨tÑ4Ô4ˆØ�Š‰Œˆˆˆ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.optimize1   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   r0   Úget_opset_version)r   r%   r2   s      r   r/   zMmditOnnxModel._optimize@   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   r0   )r   Úop_countÚopsÚopÚnodess        r   Úget_fused_operator_statisticsz,MmditOnnxModel.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   )NF)NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r"   r$   r   Úboolr3   r/   rL   Ú__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_mmditr   Úfusion_optionsr   Úimport_utilsr   Úonnxr   Úonnx_model_bertr   Ú	getLoggerrM   r   r
   © r   r   ú<module>r\      sÌ   ðð €€€à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø :Ð :Ð :Ð :Ð :Ð :Ø (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ð^ð ^ð ^ð ^ð ^�]ñ ^ô ^ð ^ð ^ð ^r   