Ë
    �…j`Ù  ã                   óv   — d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ  ee«      Z G d„ de«      Zy)	é    )Ú	getLoggerN)ÚFusion)ÚNumpyHelper)Ú	NodeProtoÚTensorProtoÚhelper)Ú	OnnxModelc                   ó  ‡ — e Zd ZdZdedededededefˆ fd„Zd$d	ed
edefd„Z	d„ Z
	 d$d	eded
edeeef   fd„Zdededededededededz  fd„Zdededededededededz  fd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd efd!„Zd"„ Zd#„ Zˆ xZS )%ÚFusionAttentionUnetzB
    Fuse Attention subgraph of UNet into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsÚis_cross_attentionÚenable_packed_qkvÚenable_packed_kvc                 ó˜   •— t         ‰| �  ||r|rdnddg«       || _        || _        || _        || _        || _        d| _        d| _        y )NÚ	AttentionÚMultiHeadAttentionÚLayerNormalizationT)	ÚsuperÚ__init__r   r   r   r   r   Únum_heads_warningÚhidden_size_warning)Úselfr   r   r   r   r   r   Ú	__class__s          €úo/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_attention_unet.pyr   zFusionAttentionUnet.__init__   sc   ø€ ô 	‰ÑØÙ-Ñ2C‰KÐI]Ø!Ð"ô	
ð
 'ˆÔØ"ˆŒØ"4ˆÔð "3ˆÔØ 0ˆÔð "&ˆÔØ#'ˆÕ ó    Ú	reshape_qÚ	is_torch2Úreturnc                 ód  — d}|r¬| j                   j                  |d«      }|r÷|j                  dk(  rèt        |j                  «      dk(  rÐ| j                   j                  |j                  d   «      }t        |t        j                  «      rŽt        |j                  «      dgk(  rut        |«      }ni| j                   j                  |j                  d   «      }t        |t        j                  «      r't        |j                  «      dgk(  rt        |d   «      }t        |t        «      r|dkD  r|S y)zòDetect num_heads from a reshape node.

        Args:
            reshape_q (NodeProto): reshape node for Q
            is_torch2 (bool): graph pattern is from PyTorch 2.*
        Returns:
            int: num_heads, or 0 if not found
        r   é   ÚConcaté   é   )r   Ú
get_parentÚop_typeÚlenÚinputÚget_constant_valueÚ
isinstanceÚnpÚndarrayÚlistÚshapeÚint)r   r   r   r   Úreshape_parentÚq_shape_values         r   Úget_num_headsz!FusionAttentionUnet.get_num_heads2   sú   € ð ˆ	Ùà!ŸZ™Z×2Ñ2°9¸aÓ@ˆNÙ .×"8Ñ"8¸HÒ"DÌÈ^×MaÑMaÓIbÐfgÒIgØ ŸJ™J×9Ñ9¸.×:NÑ:NÈqÑ:QÓR�	Ü˜i¬¯©Ô4¼¸i¿o¹oÓ9NÐSTÐRUÒ9UÜ # I£‘Ið !ŸJ™J×9Ñ9¸)¿/¹/È!Ñ:LÓMˆMÜ˜-¬¯©Ô4¼¸m×>QÑ>QÓ9RÐWXÐVYÒ9YÜ ¨aÑ 0Ó1�	ä�i¤Ô%¨)°aª-ØÐàr   c                 óœ   — | j                   j                  |j                  d   «      }|r"t        j                  |«      j
                  d   S y)zÚDetect hidden_size from LayerNormalization node.
        Args:
            layernorm_node (NodeProto): LayerNormalization node before Q, K and V
        Returns:
            int: hidden_size, or 0 if not found
        r%   r   )r   Úget_initializerr)   r   Úto_arrayr/   )r   Úlayernorm_nodeÚlayernorm_biass      r   Úget_hidden_sizez#FusionAttentionUnet.get_hidden_sizeN   sE   € ð Ÿ™×3Ñ3°N×4HÑ4HÈÑ4KÓLˆÙÜ×'Ñ'¨Ó7×=Ñ=¸aÑ@Ð@àr   r7   c                 óð  — | j                  ||«      }|dk  r| j                  }| j                  dkD  rH|| j                  k7  r9| j                  r-t        j	                  d| j                  › d|› d�«       d| _        | j                  |«      }|dk  r| j                  }| j                  dkD  rH|| j                  k7  r9| j                  r-t        j	                  d| j                  › d|› d�«       d| _        ||fS )aF  Detect num_heads and hidden_size.

        Args:
            reshape_q (NodeProto): reshape node for Q
            is_torch2 (bool): graph pattern is from PyTorch 2.*
            layernorm_node (NodeProto): LayerNormalization node before Q, K, V
        Returns:
            Tuple[int, int]: num_heads and hidden_size
        r   z--num_heads is z. Detected value is z. Using detected value.Fz--hidden_size is )r3   r   r   ÚloggerÚwarningr9   r   r   )r   r   r7   r   r   r   s         r   Úget_num_heads_and_hidden_sizez1FusionAttentionUnet.get_num_heads_and_hidden_size[   sõ   € ð ×&Ñ& y°)Ó<ˆ	Ø˜Š>ØŸ™ˆIà�>‰>˜AÒ )¨t¯~©~Ò"=Ø×%Ò%Ü—‘ °·±Ð0@Ð@TÐU^ÐT_Ð_vÐwÔxØ).�Ô&à×*Ñ*¨>Ó:ˆØ˜!ÒØ×*Ñ*ˆKà×Ñ˜aÒ K°4×3CÑ3CÒ$CØ×'Ò'Ü—‘Ø'¨×(8Ñ(8Ð'9Ð9MÈkÈ]ÐZqÐrôð ,1�Ô(à˜+Ð%Ð%r   Úq_matmulÚk_matmulÚv_matmulr)   ÚoutputNc           
      óx  — | j                    }|rv|j                  d   |k7  s$|j                  d   |k7  s|j                  d   |k7  rÃt        j                  d|j                  d   |j                  d   |j                  d   «       y|j                  d   |k7  s1|j                  d   |j                  d   k7  s|j                  d   |k(  r@t        j                  d|j                  d   |j                  d   |j                  d   «       y|dkD  r$||z  dk7  rt        j                  d|› d|› �«       y| j                  j                  |j                  d   «      }	| j                  j                  |j                  d   «      }
| j                  j                  |j                  d   «      }|	r|
r|sy|	j                  }t        j                  |	«      }t        j                  |
«      }t        j                  |«      }t        j                  d|j                  › d	|j                  › d
|j                  › d|› �«       |�rÉ|j                  |j                  k7  s|j                  |j                  k7  ry|j                  d   }|dkD  r||k7  rt        d|› d|› d�«      ‚t        t        j                  |j                  dd «      «      }| j                  �rÝ| j                  j                  d«      }|}|}||z  }t        j                   |j#                  |||«      |j#                  |||«      |j#                  |||«      g«      j#                  ||dz  |z  «      }| j                  j                  dd¬«      }| j%                  |dz   ||j                  d   |j                  d   g|¬«       t'        j(                  d|j                  d   |dz   g|dz   g|¬«      }| j*                  | j,                  |j.                  <   | j%                  |dz   t0        j2                  dgdd|d|gd¬«       t'        j(                  d|dz   |dz   g|dz   g|dz   ¬«      }| j*                  | j,                  |j.                  <   | j4                  j7                  ||g«       | j8                  j7                  |||g«       �n£t        j:                  |||fd¬«      }d|z  }| j                  j                  d «      }| j%                  |d!z   |||g|¬«       �nM| j                  j                  d«      }| j<                  �r%|j                  |j                  k7  ry|j                  d   }|j                  d   }||k(  sJ ‚|j                  d   }|j                  d   }|j                  d   }||k(  r||k(  sJ ‚|}|}||z  }t        j                   |j#                  |||«      |j#                  |||«      g«      j#                  ||d"z  |z  «      }| j                  j                  dd#¬«      }| j%                  |dz   ||j                  d   |j                  d   g|¬«       t'        j(                  d|j                  d   |dz   g|dz   g|¬«      }| j*                  | j,                  |j.                  <   | j%                  |dz   t0        j2                  dgdd|d"|gd¬«       t'        j(                  d|dz   |dz   g|d$z   g|dz   ¬«      }| j*                  | j,                  |j.                  <   | j4                  j7                  ||g«       | j8                  j7                  ||g«       t        j>                  d|gt        j@                  ¬%«      } d|z  }!| j%                  |d&z   ||!g| ¬«       |r| j                  s||d!z   |d&z   g}"nX|dz   g}"nQ| j<                  s1|jB                  d   |jB                  d   |jB                  d   |d&z   g}"n|jB                  d   |d$z   g}"t'        j(                  |r| j                  sd nd|"|g|¬«      }#d'|#_"        |#jF                  j7                  t'        jH                  d(|«      g«       |r| j                  sd)n,d*jK                  | j                  rd+n| j<                  rd,nd-«      }$| jM                  |$«       |#S ).á•  Create an Attention node.

        Args:
            q_matmul (NodeProto): MatMul node in fully connection for Q
            k_matmul (NodeProto): MatMul node in fully connection for K
            v_matmul (NodeProto): MatMul node in fully connection for V
            num_heads (int): number of attention heads. If a model is pruned, it is the number of heads after pruning.
            hidden_size (int): hidden dimension. If a model is pruned, it is the hidden dimension after pruning.
            input (str): input name
            output (str): output name

        Returns:
            Union[NodeProto, None]: the node created or None if failed.
        r   úRFor self attention, input hidden state for q and k/v shall be same. Got %s, %s, %sNúXFor cross attention, input hidden state for q and k/v shall be different. Got %s, %s, %súinput hidden size ú# is not a multiple of num of heads r"   úqw=ú kw=ú vw=ú hidden_size=úInput hidden size (ú,) is not same as weight dimension of q,k,v (ú:). Please provide a correct input hidden size or pass in 0r   é   ÚMatMulÚ
MatMul_QKV©Úname_prefixÚ_weight©ÚnameÚ	data_typeÚdimsÚvalsÚ_out©ÚinputsÚoutputsrV   Ú_reshape_shapeé   F©rV   rW   rX   rY   ÚrawÚReshapeÚ
_qkv_inputÚ_reshape)Úaxisr   Ú_qkv_weightr%   Ú	MatMul_KVÚ	_kv_input©ÚdtypeÚ	_qkv_biasúcom.microsoftr   úAttention (self attention)úMultiHeadAttention ({})úself attention with packed qkvúcross attention with packed kvúcross attention)'r   r)   r;   Údebugr   r5   rW   r   r6   r/   Ú
ValueErrorr0   r,   Úprodr   Úcreate_node_nameÚdstackÚreshapeÚadd_initializerr   Ú	make_nodeÚthis_graph_nameÚnode_name_to_graph_namerV   r   ÚINT64Únodes_to_addÚextendÚnodes_to_removeÚstackr   ÚzerosÚfloat32rA   ÚdomainÚ	attributeÚmake_attributeÚformatÚincrease_counter)%r   r>   r?   r@   r   r   r)   rA   Úis_self_attentionÚq_weightÚk_weightÚv_weightÚ
float_typeÚqwÚkwÚvwÚ
qw_in_sizeÚqw_out_sizeÚattention_node_nameÚcÚnÚhÚ
qkv_weightÚmatmul_node_nameÚmatmul_nodeÚreshape_nodeÚqkv_weight_dimÚ
kw_in_sizeÚ
vw_in_sizeÚkw_out_sizeÚvw_out_sizeÚ	kv_weightÚqkv_biasÚqkv_bias_dimÚattention_inputsÚattention_nodeÚcounter_names%                                        r   Úcreate_attention_nodez)FusionAttentionUnet.create_attention_node}   sÿ  € ð0 !%× 7Ñ 7Ð7ÐáØ�~‰~˜aÑ  EÒ)¨X¯^©^¸AÑ->À%Ò-GÈ8Ï>É>ÐZ[ÑK\Ð`eÒKeÜ—‘ØhØ—N‘N 1Ñ%Ø—N‘N 1Ñ%Ø—N‘N 1Ñ%ô	ð à�~‰~˜aÑ  EÒ)¨h¯n©n¸QÑ.?À8Ç>Á>ÐRSÑCTÒ.TÐZb×ZhÑZhÐijÑZkÐotÒZtÜ—‘ØnØ—N‘N 1Ñ%Ø—N‘N 1Ñ%Ø—N‘N 1Ñ%ô	ð à˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐ-¨k¨]Ð:]Ð^gÐ]hÐiÔjØà—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆÙ™X©(Øð ×'Ñ'ˆ
ä×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ�‰�s˜2Ÿ8™8˜* D¨¯©¨
°$°r·x±x°jÀÈkÈ]Ð[Ô\ò Ø�x‰x˜2Ÿ8™8Ò# r§x¡x°2·8±8Ò';ØàŸ™ !™ˆJà˜QŠ ;°*Ò#<Ü Ø)¨+¨Ð6bÐcmÐbnð oNð Nóð ô œbŸg™g b§h¡h¨q¨r lÓ3Ó4ˆKà×%Ó%Ø&*§j¡j×&AÑ&AÐBVÓ&WÐ#à�Ø�Ø 9Ñ,�ô  ŸY™Y¨¯
©
°1°a¸Ó(;¸R¿Z¹ZÈÈ1ÈaÓ=PÐRT×R\ÑR\Ð]^Ð`aÐcdÓReÐ'fÓg×oÑoØ�q˜1‘u˜q‘yó�
ð $(§:¡:×#>Ñ#>¸xÐUaÐ#>Ó#bÐ Ø×$Ñ$Ø)¨IÑ5Ø(Ø$×*Ñ*¨1Ñ-¨z×/?Ñ/?ÀÑ/BÐCØ#ð	 %ô ô %×.Ñ.ØØ$ŸN™N¨1Ñ-Ð/?À)Ñ/KÐLØ-°Ñ6Ð7Ø)ô	�ð BF×AUÑAU�×,Ñ,¨[×-=Ñ-=Ñ>à×$Ñ$Ø)Ð,<Ñ<Ü)×/Ñ/Ø˜Ø˜Q  1 a˜Øð %ô ô  &×/Ñ/Øà(¨6Ñ1Ø(Ð+;Ñ;ðð 1°<Ñ?Ð@Ø)¨JÑ6ô �ð CG×BVÑBV�×,Ñ,¨\×->Ñ->Ñ?Ø×!Ñ!×(Ñ(¨+°|Ð)DÔEØ×$Ñ$×+Ñ+¨X°xÀÐ,JÖKô  ŸX™X r¨2¨r l¸Ô;�
Ø!" [¡�à&*§j¡j×&AÑ&AÀ+Ó&NÐ#à×$Ñ$Ø,¨}Ñ<Ø(Ø$ nÐ5Ø#ð	 %ö ð #'§*¡*×"=Ñ"=Ð>RÓ"SÐØ×$Ó$Ø—8‘8˜rŸx™xÒ'ØàŸX™X a™[�
ØŸX™X a™[�
Ø! ZÒ/Ð/Ð/à Ÿh™h q™k�Ø Ÿh™h q™k�Ø Ÿh™h q™k�Ø" kÒ1°kÀ[Ò6PÐPÐPà�Ø�Ø 9Ñ,�ô ŸI™I r§z¡z°!°Q¸Ó':¸B¿J¹JÀqÈ!ÈQÓ<OÐ&PÓQ×YÑYÐZ[Ð]^ÐabÑ]bÐefÑ]fÓg�	à#'§:¡:×#>Ñ#>¸xÐU`Ð#>Ó#aÐ Ø×$Ñ$Ø)¨IÑ5Ø(Ø#Ÿ/™/¨!Ñ,¨i¯o©o¸aÑ.@ÐAØ"ð	 %ô ô %×.Ñ.ØØ$ŸN™N¨1Ñ-Ð/?À)Ñ/KÐLØ-°Ñ6Ð7Ø)ô	�ð BF×AUÑAU�×,Ñ,¨[×-=Ñ-=Ñ>à×$Ñ$Ø)Ð,<Ñ<Ü)×/Ñ/Ø˜Ø˜Q  1 a˜Øð %ô ô  &×/Ñ/Øà(¨6Ñ1Ø(Ð+;Ñ;ðð 1°;Ñ>Ð?Ø)¨JÑ6ô �ð CG×BVÑBV�×,Ñ,¨\×->Ñ->Ñ?Ø×!Ñ!×(Ñ(¨+°|Ð)DÔEØ×$Ñ$×+Ñ+¨X°xÐ,@ÔAô —8‘8˜Q Ð,´B·J±JÔ?ˆØ˜;‘ˆà×ÑØ$ {Ñ2Ø Ø�Øð	 	ô 	
ñ Ø×)Ò)àØ'¨-Ñ7Ø'¨+Ñ5ð$Ñ ð %8¸,Ñ$FÐ#GÑ à×(Ò(à—O‘O AÑ&Ø—O‘O AÑ&Ø—O‘O AÑ&Ø'¨+Ñ5ð	$Ñ ð —O‘O AÑ&Ø'¨+Ñ5ð$Ð ô
  ×)Ñ)Ù-°d×6LÒ6L‰KÐSgØ#Ø�HØ$ô	
ˆð !0ˆÔØ× Ñ ×'Ñ'¬×)>Ñ)>¸{ÈIÓ)VÐ(WÔXñ !¨×)?Ò)?ñ )à*×1Ñ1à×)Ò)ñ 1ð ×(Ò(ñ 6à&óð 	ð 	×Ñ˜lÔ+ØÐr   Úq_matmul_addÚk_matmul_addÚv_matmul_addc           
      ó¾   — | j                    }| j                  j                  |dd«      }	| j                  j                  |dd«      }
| j                  j                  |dd«      }| j                  |«      }|€y|\  }}| j                  |«      }|€y|\  }}| j                  |«      }|€y|\  }}|rí|	j                  d   |k7  s$|
j                  d   |k7  s|j                  d   |k7  r@t
        j                  d|	j                  d   |
j                  d   |j                  d   «       y|j                  d   |k7  s%|j                  d   |k7  s|j                  d   |k7  �rFt
        j                  d|j                  d   |j                  d   |j                  d   «       y|	j                  d   |k7  s1|
j                  d   |j                  d   k7  s|
j                  d   |k(  r@t
        j                  d|	j                  d   |
j                  d   |j                  d   «       y|j                  d   |k7  s1|j                  d   |j                  d   k7  s|
j                  d   |k(  r@t
        j                  d|j                  d   |j                  d   |j                  d   «       y|dkD  r$||z  dk7  rt
        j                  d|› d	|› �«       y| j                  j                  |	j                  d
   «      }| j                  j                  |
j                  d
   «      }| j                  j                  |j                  d
   «      }|r|r|sy|j                  dk(  rt
        j                  d«       yt        j                  |«      }t        j                  |«      }t        j                  |«      }t
        j                  d|j                  › d|j                  › d|j                  › d|› �«       |�ré|j                  |j                  k7  s|j                  |j                  k7  ry|j                  d   }|dkD  r||k7  rt        d|› d|› d�«      ‚t        t        j                  |j                  d
d «      «      }| j                   �rR| j                  j#                  d«      }|}|}||z  } t        j$                  |j'                  ||| «      |j'                  ||| «      |j'                  ||| «      g«      j'                  ||dz  | z  «      }!| j                  j#                  dd¬«      }"| j)                  |"dz   t*        j,                  |!j                  d   |!j                  d
   g|!¬«       t/        j0                  d|
j                  d   |"dz   g|"dz   g|"¬«      }#| j2                  | j4                  |#j6                  <   |j6                  dz   }$| j)                  |$t*        j8                  dgdd|| gd¬«       | j                  j#                  d d!¬«      }%t/        j0                  d |j:                  d   |$g|%dz   g|%¬«      }&| j2                  | j4                  |&j6                  <   | j                  j#                  d d"¬«      }'t/        j0                  d |j:                  d   |$g|'dz   g|'¬«      }(| j2                  | j4                  |(j6                  <   | j                  j#                  d d#¬«      })t/        j0                  d |j:                  d   |$g|)dz   g|)¬«      }*| j2                  | j4                  |*j6                  <   | j                  j#                  d$d%¬«      }+t/        j0                  d$|&j:                  d   |(j:                  d   |*j:                  d   g|+dz   g|+¬«      },|,j<                  j?                  t/        j@                  d&d«      g«       | j2                  | j4                  |,j6                  <   |,j6                  dz   }-| j)                  |-t*        j8                  dgdd|dz  | z  gd¬«       | j                  j#                  d d'¬«      }.t/        j0                  d |,j:                  d   |-g|.dz   g|.¬«      }/| j2                  | j4                  |/j6                  <   | j                  j#                  d(d)¬«      }0t/        j0                  d(|/j:                  d   |#j:                  d   g|0dz   g|0¬«      }1| j2                  | j4                  |1j6                  <   |0dz   }2| j)                  |2t*        j8                  d*gdd|d| gd¬«       t/        j0                  d |1j:                  d   |2g|d+z   g|0d,z   ¬«      }3| j2                  | j4                  |3j6                  <   | jB                  j?                  |#|&|(|*|,|/|1|3g«       | jD                  j?                  |	|
||||g«       �nIy| j                  j#                  d«      }| jF                  �r|j                  |j                  k7  ry|j                  d   }4|j                  d   }5|4|5k(  sJ ‚|j                  d
   }|j                  d
   }6|j                  d
   }7||7k(  r|6|7k(  sJ ‚|4}|}|6|z  } t        j$                  |j'                  ||| «      |j'                  ||| «      g«      j'                  ||d-z  | z  «      }8| j                  j#                  dd.¬«      }"| j)                  |"dz   t*        j,                  |8j                  d   |8j                  d
   g|8¬«       t/        j0                  d|
j                  d   |"dz   g|"dz   g|"¬«      }#| j2                  | j4                  |#j6                  <   |j6                  dz   }9| j)                  |9t*        j8                  dgdd|| gd¬«       | j                  j#                  d d"¬«      }'t/        j0                  d |j:                  d   |9g|'dz   g|'¬«      }(| j2                  | j4                  |(j6                  <   | j                  j#                  d d#¬«      })t/        j0                  d |j:                  d   |9g|)dz   g|)¬«      }*| j2                  | j4                  |*j6                  <   | j                  j#                  d$d/¬«      }:t/        j0                  d$|(j:                  d   |*j:                  d   g|:dz   g|:¬«      };|;j<                  j?                  t/        j@                  d&d«      g«       | j2                  | j4                  |;j6                  <   |;j6                  dz   }<| j)                  |<t*        j8                  dgdd|d-z  | z  gd¬«       | j                  j#                  d d0¬«      }=t/        j0                  d |;j:                  d   |<g|=dz   g|=¬«      }>| j2                  | j4                  |>j6                  <   | j                  j#                  d(d1¬«      }?t/        j0                  d(|>j:                  d   |#j:                  d   g|?dz   g|?¬«      }@| j2                  | j4                  |@j6                  <   |?dz   }2| j)                  |2t*        j8                  d*gdd|d-| gd¬«       t/        j0                  d |@j:                  d   |2g|d2z   g|?d,z   ¬«      }3| j2                  | j4                  |3j6                  <   | jB                  j?                  |#|(|*|;|>|@|3g«       | jD                  j?                  |
|||g«       nyt        jH                  d|gt        jJ                  ¬3«      }Ad|z  }B| j)                  |d4z   t*        j,                  |Bg|A¬«       |r| j                   sy|d+z   g}Cn!| jF                  sy|j:                  d   |d2z   g}Ct/        j0                  |r| j                   sd5ndC|g|¬«      }Dd6|D_&        |Dj<                  j?                  t/        j@                  d7|«      g«       |r| j                   sd8n,d9jO                  | j                   rd:n| jF                  rd;nd<«      }E| jQ                  |E«       DS )=rC   rP   r   NrD   z_For self attention, input hidden state for LoRA q and k/v weights shall be same. Got %s, %s, %srE   zeFor cross attention, input hidden state for LoRA q and k/v weights shall be different. Got %s, %s, %srF   rG   r"   é
   zBweights are in fp16. Please run fp16 conversion after optimizationrH   rI   rJ   rK   rL   rM   rN   r   rO   rQ   rR   rT   rU   rZ   r[   r^   r$   Fr`   rb   ÚReshape_LoRA_QÚReshape_LoRA_KÚReshape_LoRA_Vr#   ÚConcat_LoRA_QKVre   ÚReshape_LoRA_QKVÚAddÚAdd_Weights_QKVr_   rc   rd   r%   rg   ÚConcat_LoRA_KVÚReshape_LoRA_KVÚAdd_Weights_KVrh   ri   rk   r   rl   r   rm   rn   ro   rp   rq   ))r   r   Úmatch_parentÚmatch_lora_pathr)   r;   rr   r5   rW   r   r6   r/   rs   r0   r,   rt   r   ru   rv   rw   rx   r   ÚFLOATr   ry   rz   r{   rV   r|   rA   r„   r~   r…   r}   r   r   r�   r‚   rƒ   r†   r‡   )Fr   r¦   r§   r¨   r   r   r)   rA   rˆ   r>   r?   r@   Úq_lora_nodesÚq_lora_last_nodeÚq_lora_matmul_1Úk_lora_nodesÚk_lora_last_nodeÚk_lora_matmul_1Úv_lora_nodesÚv_lora_last_nodeÚv_lora_matmul_1r‰   rŠ   r‹   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   Úlora_weight_shape_tensor_nameÚq_lora_reshape_node_nameÚq_lora_reshape_nodeÚk_lora_reshape_node_nameÚk_lora_reshape_nodeÚv_lora_reshape_node_nameÚv_lora_reshape_nodeÚqkv_lora_concat_node_nameÚqkv_lora_concat_nodeÚ'reshaped_lora_weights_shape_tensor_nameÚqkv_lora_reshaped_node_nameÚqkv_lora_reshaped_nodeÚadd_weights_node_nameÚadd_weights_nodeÚshape_tensor_namer™   r›   rœ   r�   rž   rŸ   Ú kv_lora_weight_shape_tensor_nameÚkv_lora_concat_node_nameÚkv_lora_concat_nodeÚ*reshaped_kv_lora_weights_shape_tensor_nameÚkv_lora_reshaped_node_nameÚkv_lora_reshaped_nodeÚadd_kv_weights_node_nameÚadd_kv_weights_noder    r¡   r¢   r£   r¤   sF                                                                         r   Úcreate_attention_node_loraz.FusionAttentionUnet.create_attention_node_lora  s'  € ð0 !%× 7Ñ 7Ð7Ðà—:‘:×*Ñ*¨<¸À1ÓEˆØ—:‘:×*Ñ*¨<¸À1ÓEˆØ—:‘:×*Ñ*¨<¸À1ÓEˆà×+Ñ+¨LÓ9ˆØÐØØ.:Ñ+Ð	˜?à×+Ñ+¨LÓ9ˆØÐØØ.:Ñ+Ð	˜?à×+Ñ+¨LÓ9ˆØÐØØ.:Ñ+Ð	˜?áØ�~‰~˜aÑ  EÒ)¨X¯^©^¸AÑ->À%Ò-GÈ8Ï>É>ÐZ[ÑK\Ð`eÒKeÜ—‘ØhØ—N‘N 1Ñ%Ø—N‘N 1Ñ%Ø—N‘N 1Ñ%ô	ð ð  ×%Ñ% aÑ(¨EÒ1Ø"×(Ñ(¨Ñ+¨uÒ4Ø"×(Ñ(¨Ñ+¨uÓ4ä—‘ØuØ#×)Ñ)¨!Ñ,Ø#×)Ñ)¨!Ñ,Ø#×)Ñ)¨!Ñ,ô	ð à�~‰~˜aÑ  EÒ)¨h¯n©n¸QÑ.?À8Ç>Á>ÐRSÑCTÒ.TÐZb×ZhÑZhÐijÑZkÐotÒZtÜ—‘ØnØ—N‘N 1Ñ%Ø—N‘N 1Ñ%Ø—N‘N 1Ñ%ô	ð ð  ×%Ñ% aÑ(¨EÒ1Ø#×)Ñ)¨!Ñ,°×0EÑ0EÀaÑ0HÒHØ—N‘N 1Ñ%¨Ò.ä—‘ð)ð $×)Ñ)¨!Ñ,Ø#×)Ñ)¨!Ñ,Ø#×)Ñ)¨!Ñ,ôð à˜Š? ¨iÑ 7¸AÒ=Ü�L‰LÐ-¨k¨]Ð:]Ð^gÐ]hÐiÔjØà—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆØ—:‘:×-Ñ-¨h¯n©n¸QÑ.?Ó@ˆÙ™X©(Øð ×Ñ Ò#Ü�L‰LÐ]Ô^Øä×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ×!Ñ! (Ó+ˆÜ�‰�s˜2Ÿ8™8˜* D¨¯©¨
°$°r·x±x°jÀÈkÈ]Ð[Ô\ò Ø�x‰x˜2Ÿ8™8Ò# r§x¡x°2·8±8Ò';ØàŸ™ !™ˆJà˜QŠ ;°*Ò#<Ü Ø)¨+¨Ð6bÐcmÐbnð oNð Nóð ô œbŸg™g b§h¡h¨q¨r lÓ3Ó4ˆKà×%Ó%Ø&*§j¡j×&AÑ&AÐBVÓ&WÐ#à�Ø�Ø 9Ñ,�ô  ŸY™Y¨¯
©
°1°a¸Ó(;¸R¿Z¹ZÈÈ1ÈaÓ=PÐRT×R\ÑR\Ð]^Ð`aÐcdÓReÐ'fÓg×oÑoØ�q˜1‘u˜q‘yó�
ð $(§:¡:×#>Ñ#>¸xÐUaÐ#>Ó#bÐ Ø×$Ñ$Ø)¨IÑ5Ü)×/Ñ/Ø$×*Ñ*¨1Ñ-¨z×/?Ñ/?ÀÑ/BÐCØ#ð	 %ô ô %×.Ñ.ØØ$ŸN™N¨1Ñ-Ð/?À)Ñ/KÐLØ-°Ñ6Ð7Ø)ô	�ð BF×AUÑAU�×,Ñ,¨[×-=Ñ-=Ñ>ð 1A×0EÑ0EÐHXÑ0XÐ-à×$Ñ$Ø6Ü)×/Ñ/Ø˜Ø˜Q  1˜Øð %ô ð ,0¯:©:×+FÑ+FÀyÐ^nÐ+FÓ+oÐ(Ü&,×&6Ñ&6ØØ,×3Ñ3°AÑ6Ð8UÐVØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð ,0¯:©:×+FÑ+FÀyÐ^nÐ+FÓ+oÐ(Ü&,×&6Ñ&6ØØ,×3Ñ3°AÑ6Ð8UÐVØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð ,0¯:©:×+FÑ+FÀyÐ^nÐ+FÓ+oÐ(Ü&,×&6Ñ&6ØØ,×3Ñ3°AÑ6Ð8UÐVØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð -1¯J©J×,GÑ,GÈÐ^oÐ,GÓ,pÐ)Ü'-×'7Ñ'7Øà+×2Ñ2°1Ñ5Ø+×2Ñ2°1Ñ5Ø+×2Ñ2°1Ñ5ðð
 7¸Ñ?Ð@Ø2ô	(Ð$ð %×.Ñ.×5Ñ5´v×7LÑ7LÈVÐUVÓ7WÐ6XÔYØJN×J^ÑJ^�×,Ñ,Ð-A×-FÑ-FÑGð ;O×:SÑ:SÐVfÑ:fÐ7Ø×$Ñ$Ø@Ü)×/Ñ/Ø˜Ø˜Q  A¡¨¡	Ð*Øð %ô ð /3¯j©j×.IÑ.IÈ)ÐasÐ.IÓ.tÐ+Ü)/×)9Ñ)9ØØ0×7Ñ7¸Ñ:Ð<cÐdØ8¸6ÑAÐBØ4ô	*Ð&ð MQ×L`ÑL`�×,Ñ,Ð-C×-HÑ-HÑIð )-¯
©
×(CÑ(CÀEÐWhÐ(CÓ(iÐ%Ü#)×#3Ñ#3ØØ2×9Ñ9¸!Ñ<¸k×>PÑ>PÐQRÑ>SÐTØ2°VÑ;Ð<Ø.ô	$Ð ð GK×FZÑFZ�×,Ñ,Ð-=×-BÑ-BÑCð %:Ð<LÑ$LÐ!Ø×$Ñ$Ø*Ü)×/Ñ/Ø˜Ø˜Q  1 a˜Øð %ô ô  &×/Ñ/ØØ,×3Ñ3°AÑ6Ð8IÐJØ0°<Ñ?Ð@Ø.°Ñ;ô	 �ð CG×BVÑBV�×,Ñ,¨\×->Ñ->Ñ?à×!Ñ!×(Ñ(à#Ø+Ø+Ø+Ø,Ø.Ø(Ø$ð	ôð ×$Ñ$×+Ñ+¨X°xÀÈ<ÐYeÐgsÐ,tÖuð à"&§*¡*×"=Ñ"=Ð>RÓ"SÐØ×$Ó$Ø—8‘8˜rŸx™xÒ'ØàŸX™X a™[�
ØŸX™X a™[�
Ø! ZÒ/Ð/Ð/à Ÿh™h q™k�Ø Ÿh™h q™k�Ø Ÿh™h q™k�Ø" kÒ1°kÀ[Ò6PÐPÐPà�Ø�Ø 9Ñ,�ô ŸI™I r§z¡z°!°Q¸Ó':¸B¿J¹JÀqÈ!ÈQÓ<OÐ&PÓQ×YÑYÐZ[Ð]^ÐabÑ]bÐefÑ]fÓg�	à#'§:¡:×#>Ñ#>¸xÐU`Ð#>Ó#aÐ Ø×$Ñ$Ø)¨IÑ5Ü)×/Ñ/Ø#Ÿ/™/¨!Ñ,¨i¯o©o¸aÑ.@ÐAØ"ð	 %ô ô %×.Ñ.ØØ$ŸN™N¨1Ñ-Ð/?À)Ñ/KÐLØ-°Ñ6Ð7Ø)ô	�ð BF×AUÑAU�×,Ñ,¨[×-=Ñ-=Ñ>ð 4D×3HÑ3HÐK[Ñ3[Ð0Ø×$Ñ$Ø9Ü)×/Ñ/Ø˜Ø˜Q  1˜Øð %ô ð ,0¯:©:×+FÑ+FÀyÐ^nÐ+FÓ+oÐ(Ü&,×&6Ñ&6ØØ,×3Ñ3°AÑ6Ð8XÐYØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð ,0¯:©:×+FÑ+FÀyÐ^nÐ+FÓ+oÐ(Ü&,×&6Ñ&6ØØ,×3Ñ3°AÑ6Ð8XÐYØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð ,0¯:©:×+FÑ+FÀxÐ]mÐ+FÓ+nÐ(Ü&,×&6Ñ&6ØØ/×6Ñ6°qÑ9Ð;N×;UÑ;UÐVWÑ;XÐYØ5¸Ñ>Ð?Ø1ô	'Ð#ð $×-Ñ-×4Ñ4´f×6KÑ6KÈFÐTUÓ6VÐ5WÔXØIM×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð >Q×=UÑ=UÐXhÑ=hÐ:Ø×$Ñ$ØCÜ)×/Ñ/Ø˜Ø˜Q  A¡¨¡	Ð*Øð %ô ð .2¯Z©Z×-HÑ-HÈÐ`qÐ-HÓ-rÐ*Ü(.×(8Ñ(8ØØ/×6Ñ6°qÑ9Ð;eÐfØ7¸&Ñ@ÐAØ3ô	)Ð%ð LP×K_ÑK_�×,Ñ,Ð-B×-GÑ-GÑHð ,0¯:©:×+FÑ+FÀuÐZjÐ+FÓ+kÐ(Ü&,×&6Ñ&6ØØ1×8Ñ8¸Ñ;¸[×=OÑ=OÐPQÑ=RÐSØ5¸Ñ>Ð?Ø1ô	'Ð#ð JN×I]ÑI]�×,Ñ,Ð-@×-EÑ-EÑFð %=Ð?OÑ$OÐ!Ø×$Ñ$Ø*Ü)×/Ñ/Ø˜Ø˜Q  1 a˜Øð %ô ô  &×/Ñ/ØØ/×6Ñ6°qÑ9Ð;LÐMØ0°;Ñ>Ð?Ø1°JÑ>ô	 �ð CG×BVÑBV�×,Ñ,¨\×->Ñ->Ñ?Ø×!Ñ!×(Ñ(à#Ø+Ø+Ø+Ø-Ø+Ø$ðô
ð ×$Ñ$×+Ñ+¨X°xÀÈ|Ð,\Õ]ð ô —8‘8˜Q Ð,´B·J±JÔ?ˆØ˜;‘ˆØ×ÑØ$ {Ñ2Ü!×'Ñ'Ø�Øð	 	ô 	
ñ Ø×)Ò)àà$7¸,Ñ$FÐ#GÑ à×(Ò(àð !×'Ñ'¨Ñ*Ø'¨+Ñ5ð$Ð ô
  ×)Ñ)Ù-°d×6LÒ6L‰KÐSgØ#Ø�HØ$ô	
ˆð !0ˆÔØ× Ñ ×'Ñ'¬×)>Ñ)>¸{ÈIÓ)VÐ(WÔXñ !¨×)?Ò)?ñ )à*×1Ñ1à×)Ò)ñ 1ð ×(Ò(ñ 6à&óð 	ð 	×Ñ˜lÔ+ØÐr   c           
      ó¸  — | j                  |||«      ry | j                  j                  |dd«      }|€)| j                  s| j                  j                  |dd«      }|€y |j                  d   }||   }d }|D ]  }|j
                  dk(  sŒ|} n |€y | j                  ||«      xs | j                  ||«      }	|	�r|	\  }
}}}}}}|}| j                  |||
«      \  }}|dk  rt        j                  d«       y | j                  ||||||j                  d   |j                  d   ¬«      }|€Íy | j                  ||«      xs | j                  ||«      }	|	€y |	\  }
}}}}}}|}| j                  |||
«      \  }}|dk  rt        j                  d«       y | j                  ||||||j                  d   |j                  d   ¬«      }|€y | j                  |||
«      \  }}|dk  rt        j                  d«       y | j                  j!                  |«       | j"                  | j$                  |j&                  <   | j(                  j+                  ||g«       d| _        y )Nr°   r   rb   ú*fuse_attention: failed to detect num_heads©r)   rA   T)Úfuse_a1111_fp16r   rµ   r   rA   r'   Úmatch_qkv_torch1Úmatch_qkv_torch2r=   r;   rr   r¥   Úmatch_qkv_torch1_loraÚmatch_qkv_torch2_lorarØ   r}   Úappendrz   r{   rV   r   r~   Úprune_graph)r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚnode_before_layernormÚ
root_inputÚchildren_nodesÚskip_addÚnodeÚ	match_qkvr   Úreshape_qkvÚtranspose_qkvr   Úmatmul_qÚmatmul_kÚmatmul_vÚattention_last_nodeÚq_num_headsÚq_hidden_sizeÚnew_nodeÚmatmul_add_qÚmatmul_add_kÚmatmul_add_vs                           r   ÚfusezFusionAttentionUnet.fuseU  sÐ  € Ø×Ñ Ð0CÐEXÔYØà $§
¡
× 7Ñ 7¸ÈÈqÓ QÐð !Ð(°×1HÒ1HØ$(§J¡J×$;Ñ$;¸NÈIÐWXÓ$YÐ!à Ð(Øà*×1Ñ1°!Ñ4ˆ
à,¨ZÑ8ˆØˆØ"ò 	ˆDØ�|‰|˜uÓ$Ø�Ùð	ð ÐØà×)Ñ)¨*°hÓ?ÒnÀ4×CXÑCXÐYcÐemÓCnˆ	ØÐ Ø]fÑZˆI�{ M°9¸hÈÐRZà"-Ðà)-×)KÑ)KÈIÐWeÐgpÓ)qÑ&ˆK˜Ø˜aÒÜ—‘ÐIÔJØð ×1Ñ1ØØØØØØ$×+Ñ+¨AÑ.Ø*×1Ñ1°!Ñ4ð 2ó ˆHð ÐØð ×2Ñ2°:¸xÓHò ÈD×LfÑLfØ˜HóMˆIð Ð ØàirÑfˆI�{ M°9¸lÈLÐZfà"-Ðà)-×)KÑ)KÈIÐWeÐgpÓ)qÑ&ˆK˜Ø˜aÒÜ—‘ÐIÔJØð ×6Ñ6ØØØØØØ$×+Ñ+¨AÑ.Ø*×1Ñ1°!Ñ4ð 7ó ˆHð ÐØà)-×)KÑ)KÈIÐWeÐgpÓ)qÑ&ˆK˜Ø˜aÒÜ—‘ÐIÔJØà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ñ3à×Ñ×#Ñ#Ð%8¸-Ð$HÔIð  ˆÕr   c           
      óú  — |j                   d   |k(  rdnd}| j                  j                  |g d¢|dddddg«      }|€y|\  }}}}}}| j                  j                  |g d¢g d¢«      }	|	€t        j	                  d«       y|	\  }}}}
| j                  j                  |g d¢g d	¢«      }|�|\  }}}nA| j                  j                  |g d
¢g d¢«      }|�|\  }}}}nt        j	                  d«       y| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}}d||||||
fS )z.Match Q, K and V paths exported by PyTorch 1.*r   r"   )r°   rP   rb   Ú	Transposerb   rP   N©rb   rú   rb   rP   ©r"   r   r   r   ú&fuse_attention: failed to match v path©ÚSoftmaxÚMulrP   ©r   r   r   ©rÿ   r°   r   rP   ©r   r   r   r   ú'fuse_attention: failed to match qk pathú&fuse_attention: failed to match q path)rú   rb   rú   rb   rP   ©r"   r   r   r   r   ú&fuse_attention: failed to match k pathF©r)   r   Úmatch_parent_pathr;   rr   )r   rç   ré   Úanother_inputÚ	qkv_nodesÚ_rì   rí   Ú
matmul_qkvÚv_nodesrð   Úqk_nodesÚ_softmax_qkÚ_mul_qkÚ	matmul_qkÚ	_add_zeroÚq_nodesÚ_transpose_qr   rî   Úk_nodesrï   s                         r   rÝ   z$FusionAttentionUnet.match_qkv_torch1¯  s   € à%Ÿ^™^¨AÑ.°*Ò<™À!ˆØ—J‘J×0Ñ0ØÚJØ˜D $¨¨1¨aÐ0ó
ˆ	ð ÐØà<EÑ9ˆˆAˆ{˜M¨1¨jð —*‘*×.Ñ.¨zÒ;hÒjvÓwˆØˆ?Ü�L‰LÐAÔBØØ%ÑˆˆAˆq�(à—:‘:×/Ñ/°
Ò<XÒZcÓdˆØÐØ08Ñ-ˆ[˜'¡9à—z‘z×3Ñ3°JÒ@cÒeqÓrˆHØÐ#Ø?GÑ<�˜i¨±)ä—‘ÐFÔGØà—*‘*×.Ñ.¨yÒ:gÒiuÓvˆØˆ?Ü�L‰LÐAÔBØØ18Ñ.ˆˆL˜) Xà—*‘*×.Ñ.ØÒQÒSbó
ˆð ˆ?Ü�L‰LÐAÔBØà!(ÑˆˆAˆq�!�Xà�k =°)¸XÀxÐQYÐYÐYr   c           	      ó  — |j                   d   |k(  rdnd}| j                  j                  |g d¢|ddddg«      }|€y|\  }}}}}| j                  j                  |g d¢g d¢«      }	|	€t        j	                  d«       y|	\  }}}
| j                  j                  |dd	gddg«      }|�|\  }}nt        j	                  d
«       y| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|�|d   |k7  rt        j	                  d«       yd||||||
fS )z.Match Q, K and V paths exported by PyTorch 2.*r   r"   )r°   rP   rb   rú   rP   N)rú   rb   rP   ©r"   r   r   rý   rÿ   rP   r  )r   rú   rb   rP   ©r   Nr   r   r  ©r"   Nr   r   r  ©ÚSqrtÚDivr  ÚCastÚSliceÚShaperú   rb   ©Nr   r"   r   r   r   r   r   éÿÿÿÿz*fuse_attention: failed to match mul_q pathTr  )r   rç   ré   r
  r  r  rì   rí   r  r  rð   r  r  r  r  Úmul_qr  r   rî   r  Ú_mul_krï   Úmul_q_nodess                          r   rÞ   z$FusionAttentionUnet.match_qkv_torch2à  s­  € à%Ÿ^™^¨AÑ.°*Ò<™À!ˆØ—J‘J×0Ñ0ØÚ?Ø˜D $¨¨1Ð-ó
ˆ	ð ÐØà9BÑ6ˆˆAˆ{˜M¨:à—*‘*×.Ñ.¨zÒ;]Ò_hÓiˆØˆ?Ü�L‰LÐAÔBØØ"ÑˆˆAˆxà—:‘:×/Ñ/°
¸YÈÐ<QÐTUÐWXÐSYÓZˆØÐØ'/Ñ$ˆ[™)ä�L‰LÐBÔCØà—*‘*×.Ñ.¨yÒ:cÒetÓuˆØˆ?Ü�L‰LÐAÔBØØ5<Ñ2ˆ�˜i¨à—*‘*×.Ñ.¨yÒ:cÒetÓuˆØˆ?Ü�L‰LÐAÔBØà#*Ñ ˆ��A�xð —j‘j×2Ñ2ØÚUÚ'ó
ˆð
 Ð +¨b¡/°YÒ">Ü�L‰LÐEÔFØà�[ -°¸HÀhÐPXÐXÐXr   c                 óþ  — |j                   d   |k(  rdnd}| j                  j                  |g d¢|ddddddg«      }|€y|\  }}}}}}}| j                  j                  |g d¢g d¢«      }	|	€t        j	                  d«       y|	\  }}}}
| j                  j                  |g d¢g d	¢«      }|�|\  }}}nA| j                  j                  |g d
¢g d¢«      }|�|\  }}}}nt        j	                  d«       y| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}}d||||||
fS )zJMatch Q, K and V paths exported by PyTorch 1 that contains LoRA patterns.*r   r"   )r°   r°   rP   rb   rú   rb   rP   N)rb   rú   rb   r°   rü   ú+fuse_attention: failed to match LoRA v pathrþ   r  r  r  ú,fuse_attention: failed to match LoRA qk pathú+fuse_attention: failed to match LoRA q path)rú   rb   rú   rb   r°   r  ú+fuse_attention: failed to match LoRA k pathFr  )r   rç   ré   r
  r  r  rì   rí   r  r  r÷   r  r  r  r  r  r  r  r   rõ   r  rö   s                         r   rß   z)FusionAttentionUnet.match_qkv_torch1_lora  s¤  € à%Ÿ^™^¨AÑ.°*Ò<™À!ˆØ—J‘J×0Ñ0ØÚQØ˜A˜t T¨1¨a°Ð3ó
ˆ	ð
 ÐØà?HÑ<ˆˆAˆq�+˜}¨a°ð —*‘*×.Ñ.¨zÒ;eÒgsÓtˆØˆ?Ü�L‰LÐFÔGØØ")ÑˆˆAˆq�,à—:‘:×/Ñ/°
Ò<XÒZcÓdˆØÐØ08Ñ-ˆ[˜'¡9à—z‘z×3Ñ3°JÒ@cÒeqÓrˆHØÐ#Ø?GÑ<�˜i¨±)ä—‘ÐKÔLØà—*‘*×.Ñ.¨yÒ:dÒfrÓsˆØˆ?Ü�L‰LÐFÔGØØ5<Ñ2ˆˆL˜) \à—*‘*×.Ñ.ØÒNÒP_ó
ˆð ˆ?Ü�L‰LÐFÔGØà%,Ñ"ˆˆAˆq�!�\à�k =°)¸\È<ÐYeÐeÐer   c           
      ó   — |j                   d   |k(  rdnd}| j                  j                  |g d¢|dddddg«      }|€y|\  }}}}}}| j                  j                  |g d¢g d¢«      }	|	€t        j	                  d«       y|	\  }}}
| j                  j                  |dd	gddg«      }|�|\  }}nt        j	                  d
«       y| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|�|d   |k7  rt        j	                  d«       yd||||||
fS )zJMatch Q, K and V paths exported by PyTorch 2 that contains LoRA patterns.*r   r"   )r°   r°   rP   rb   rú   rP   N)rú   rb   r°   r  r'  rÿ   rP   r(  )r   rú   rb   r°   r  r)  r  r*  r  r!  r"  z/fuse_attention: failed to match LoRA mul_q pathTr  )r   rç   ré   r
  r  r  rì   rí   r  r  r÷   r  r  r  r  r#  r  r   rõ   r  r$  rö   r%  s                          r   rà   z)FusionAttentionUnet.match_qkv_torch2_loraD  s±  € à%Ÿ^™^¨AÑ.°*Ò<™À!ˆØ—J‘J×0Ñ0ØÚFØ˜A˜t T¨1¨aÐ0ó
ˆ	ð
 ÐØà<EÑ9ˆˆAˆq�+˜}¨jà—*‘*×.Ñ.¨zÒ;ZÒ\eÓfˆØˆ?Ü�L‰LÐFÔGØØ&ÑˆˆAˆ|à—:‘:×/Ñ/°
¸YÈÐ<QÐTUÐWXÐSYÓZˆØÐØ'/Ñ$ˆ[™)ä�L‰LÐGÔHØà—*‘*×.Ñ.¨yÒ:`ÒbqÓrˆØˆ?Ü�L‰LÐFÔGØØ9@Ñ6ˆ�˜i¨à—*‘*×.Ñ.¨yÒ:`ÒbqÓrˆØˆ?Ü�L‰LÐFÔGØà'.Ñ$ˆ��A�|ð —j‘j×2Ñ2ØÚUÚ'ó
ˆð
 Ð +¨b¡/°YÒ">Ü�L‰LÐJÔKØà�[ -°¸LÈ,ÐXdÐdÐdr   Úadd_nodec                 ó  — | j                   j                  |ddgddg«      }|�	|\  }}||fS | j                   j                  |g d¢g d¢«      }|�
|\  }}}||fS | j                   j                  |g d¢g d¢«      }|�|\  }}}}||fS y )NrP   r"   r   )r   rP   rP   r  )r   r   rP   rP   rü   )r   r	  )r   r,  Ú
lora_nodesÚlora_matmul_2_nodeÚlora_matmul_1_nodeÚlora_mul_noder  s          r   r¶   z#FusionAttentionUnet.match_lora_pathw  sÏ   € ð —Z‘Z×1Ñ1ØØ�xÐ Ø�ˆFó
ˆ
ð Ð!Ø7AÑ4ÐÐ!3Ø&Ð(:Ð;Ð;ð —Z‘Z×1Ñ1ØÚ'Úó
ˆ
ð Ð!Ø5?Ñ2ˆ]˜AÐ1Ø!Ð#5Ð6Ð6ð —Z‘Z×1Ñ1ØÚ.Úó
ˆ
ð Ð!Ø8BÑ5ˆ]˜A˜qÐ"4Ø!Ð#5Ð6Ð6àr   c           
      óD  — | j                   j                  |ddgddg«      }|€$| j                   j                  |ddgddg«      }|€y|\  }}|j                  d   }||   }d}	|D ]  }
|
j                  dk(  sŒ|
}	 n |	€y| j	                  ||	«      }|€y|\  }}}}}}| j                   j                  |dd«      }| j                   j                  |dd«      }| j                   j                  |dd«      }|�|�| j                  s||k(  rn||k7  r||k(  sy|j                  d   |j                  d   k7  ry|}| j                  |d«      xs | j                  |d«      }|dk  rt        j                  d«       y| j                  |«      }| j                  ||||||j                  d   |j                  d   ¬	«      }|€y| j                  j                  |«       | j                  | j                   |j"                  <   | j$                  j'                  ||g«       d| _        y)
zPFuse attention of fp16 UNet exported in A1111 (stable diffusion webui) extensionr  r°   r   Nrb   FTrÚ   rÛ   )r   r	  rA   r'   Úmatch_qkv_a1111rµ   r   r)   r3   r;   rr   r9   r¥   r}   rá   rz   r{   rV   r   r~   râ   )r   rã   rä   rå   Ú
entry_pathÚ_castræ   rç   rè   ré   rê   rë   rì   rí   r   rî   rï   rð   Úcast_qÚcast_kÚcast_vrñ   rò   ró   rô   s                            r   rÜ   z#FusionAttentionUnet.fuse_a1111_fp16£  sr  € à—Z‘Z×1Ñ1°.À6È5À/ÐTUÐWXÐSYÓZˆ
ØÐØŸ™×5Ñ5°nÀvÈyÐFYÐ\]Ð_`Ð[aÓbˆJØÐ!ØØ'1Ñ$ˆÐ$à*×1Ñ1°!Ñ4ˆ
à,¨ZÑ8ˆØˆØ"ò 	ˆDØ�|‰|˜uÓ$Ø�Ùð	ð ÐØà×(Ñ(¨°XÓ>ˆ	ØÐØð ñ	
ØØØØØØð —‘×(Ñ(¨°6¸1Ó=ˆØ—‘×(Ñ(¨°6¸1Ó=ˆØ—‘×(Ñ(¨°6¸1Ó=ˆàÐØÐ"Ø)-×)@Ò)@�˜6Ó!ÀfÐPVÒFVØ˜&Ò àà�<‰<˜‰?˜n×3Ñ3°AÑ6Ò6Øà)Ðà×(Ñ(¨°DÓ9Òa¸T×=OÑ=OÐPYÐ[`Ó=aˆØ˜!ÒÜ�L‰LÐEÔFØà×,Ñ,¨^Ó<ˆð ×-Ñ-ØØØØØØ—.‘. Ñ#Ø&×-Ñ-¨aÑ0ð .ó 
ˆð ÐØà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ñ3à×Ñ×#Ñ#Ð%8¸-Ð$HÔIð  ˆÔØr   c           
      ó¤  — |j                   d   |k(  rdnd}| j                  j                  |g d¢|dddddg«      }|€y|\  }}}}}}	| j                  j                  |	g d¢g d¢«      }
|
€t        j	                  d«       y|
\  }}}}| j                  j                  |	g d¢g d	¢«      }|�	|\  }}}}}nt        j	                  d
«       y| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}| j                  j                  |g d¢g d¢«      }|€t        j	                  d«       y|\  }}}}||||||fS )zKMatch Q, K and V paths exported by A1111 (stable diffusion webui) extensionr   r"   )r°   rP   rb   rú   rb   ÚEinsumNrû   rü   rý   )r  r  rÿ   r   r:  )r   r   r   r   Nr  r  r  r  r  )r   rç   ré   r
  r  r  rì   rí   Úreshape_einsumÚ
einsum_qkvr  rð   r  r  Ú	einsum_qkr  r  r   rî   r  rï   s                        r   r3  z#FusionAttentionUnet.match_qkv_a1111ñ  so  € à%Ÿ^™^¨AÑ.°*Ò<™À!ˆØ—J‘J×0Ñ0ØÚJØ˜D $¨¨1¨aÐ0ó
ˆ	ð ÐØàIRÑFˆˆAˆ{˜M¨>¸:à—*‘*×.Ñ.¨zÒ;hÒjvÓwˆØˆ?Ü�L‰LÐAÔBØØ%ÑˆˆAˆq�(à—:‘:×/Ñ/ØÒDÒFXó
ˆð ÐØ08Ñ-ˆQ��; ¡9ä�L‰LÐBÔCØà—*‘*×.Ñ.¨yÒ:gÒiuÓvˆØˆ?Ü�L‰LÐAÔBØØ18Ñ.ˆˆL˜) Xà—*‘*×.Ñ.¨yÒ:gÒiuÓvˆØˆ?Ü�L‰LÐAÔBØà%ÑˆˆAˆq�(à˜M¨9°hÀÈ(ÐRÐRr   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r0   Úboolr   r   r3   r9   Útupler=   Ústrr¥   rØ   rø   rÝ   rÞ   rß   rà   r¶   rÜ   r3  Ú__classcell__)r   s   @r   r   r      s�  ø„ ñð(àð(ð ð(ð ð	(ð
 !ð(ð  ð(ð õ(ñ: yð ¸Tð Ècó ò8ð RWñ &Ø"ð &Ø4=ð &ØJNð &à	ˆs�Cˆx‰ó &ðD@àð@ð ð@ð ð	@ð
 ð@ð ð@ð ð@ð ð@ð 
�TÑ	ó@ðDTàðTð  ðTð  ð	Tð
 ðTð ðTð ðTð ðTð 
�TÑ	óTòlX òt/Zòb2Yòh.fò`1eðf*àó*òXLö\*Sr   r   )Úloggingr   Únumpyr,   Úfusion_baser   Úfusion_utilsr   Úonnxr   r   r   Ú
onnx_modelr	   r>  r;   r   © r   r   ú<module>rM     s6   ðõ
 ã Ý Ý $ß /Ñ /Ý  á	�8Ó	€ôKS˜&õ KSr   