
    fPi                         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       }/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_mmdit.pyr   zMmditOnnxModel.__init__   s\     Q;!#3#3Q;YbKbfgKgKgKg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/NVZ
 
 
 	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   #### 
	*KKKBBBBBB&&(( 6 6#yyuqxyPPw5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
 KKVWWWNN7D)))))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 9O  """++--- 	#"""O 3ONN 	#"""O 8O**,,, 	#""" 	#"""@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1Eu::HRLL58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   