
    /;jiI                        d dl mZmZmZ d dlZd dlmc mZ d dlmZ ddl	m
Z
mZ ddlmZ  e            rd dlmZmZ  ej        e          Zd Zd	 ZddefdZ G d dej        j                  Z G d dej                  Z G d dej                  Z G d dej                  Z G d dej                  ZdS )    )OptionalTupleUnionN)nn   )	deprecatelogging)is_transformers_available)CLIPTextModelCLIPTextModelWithProjectionc                    g }t          | t          t          f          rIt          | j        j        j                  D ])\  }}d| d}|j        }|                    ||f           *nt          d| j
        j                   |S )Ntext_model.encoder.layers.z
.self_attnz.do not know how to get attention modules for: )
isinstancer   r   	enumerate
text_modelencoderlayers	self_attnappend
ValueError	__class____name__)text_encoderattn_modulesilayernamemods         O/root/voice-cloning/.venv/lib/python3.11/site-packages/diffusers/models/lora.pytext_encoder_attn_modulesr    )   s    L,0K LMM m!,"9"A"HII 	- 	-HAu====D/Cs,,,,	-
 k,J`Jikklll    c                    g }t          | t          t          f          rIt          | j        j        j                  D ])\  }}|j        }d| d}|                    ||f           *nt          d| j
        j                   |S )Nr   z.mlpz(do not know how to get mlp modules for: )r   r   r   r   r   r   r   mlpr   r   r   r   )r   mlp_modulesr   r   mlp_modr   s         r   text_encoder_mlp_modulesr&   7   s    K,0K LMM g!,"9"A"HII 	0 	0HAuiG7777Dg////	0
 eLDZDceefffr!         ?
lora_scalec                 R   t          |           D ]O\  }}t          |j        t                    r0||j        _        ||j        _        ||j        _        ||j        _        Pt          |           D ]7\  }}t          |j	        t                    r||j	        _        ||j
        _        8d S N)r    r   q_projPatchedLoraProjectionr(   k_projv_projout_projr&   fc1fc2)r   r(   _attn_module
mlp_modules        r   adjust_lora_scale_text_encoderr5   E   s    3LAA 9 9;k(*?@@ 	9,6K),6K),6K).8K +1,?? 3 3:jn&;<< 	3(2JN%(2JN%3 3r!   c                   H     e Zd Zd fd	Zdddd fd
Zdd
Zd Zd Z xZS )r,      N   c                 2   d}t          dd|           t                                                       ddlm} || _        | j        j        j        }|| j        j        j        } || j        j	        | j        j
        ||||          | _        || _        d S )NzsUse of `PatchedLoraProjection` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r,   1.0.0r   )LoRALinearLayer)network_alphadevicedtyperank)r   super__init__models.lorar;   regular_linear_layerweightr=   r>   in_featuresout_featureslora_linear_layerr(   )
selfrC   r(   r<   r?   r>   deprecation_messager;   r=   r   s
            r   rA   zPatchedLoraProjection.__init__T   s     T)74GHHH111111$8!*18=-4:E!0%1%2'"
 "
 "
 %r!    Fdestinationprefix	keep_varsc                p    | j          | j        j        ||||dS  t                      j        ||||dS )NrK   )rG   rC   
state_dictr@   )rH   rL   rM   rN   argsr   s        r   rP   z PatchedLoraProjection.state_dicto   sW    !)74,7;v    "uww!4[[deeeer!   r'   c           	      v   | j         d S | j        j        j        j        | j        j        j        j        }}| j        j        j                                        }| j         j        j        j                                        }| j         j        j        j                                        }| j         j	        || j         j	        z  | j         j
        z  }||t          j        |d d d f         |d d d f                   d         z  z   }|rKt          j        |                                                                          rt!          d|  d          |                    ||          | j        j        _        d | _         |                                | _        |                                | _        || _        d S Nr   aThis LoRA weight seems to be broken. Encountered NaN values when trying to fuse LoRA weights for  .LoRA weights will not be fused.r=   r>   )rG   rC   rD   datar>   r=   floatupdownr<   r?   torchbmmisnananyitemr   tocpuw_upw_downr(   	rH   r(   safe_fusingr>   r=   w_origrb   rc   fused_weights	            r   
_fuse_loraz PatchedLoraProjection._fuse_loraw   s   !)F18=CTE^EeEjEqv*16<<>>%(/4::<<',38>>@@!/;$0>>AWA\\DeiT111WvdTUTUTUg.W.WXY.Z!Z[ 	5;|4488::??AA 	2OS2 2 2   1=vUZ0[0[!(- "& HHJJ	jjll$r!   c           	      >   t          | dd           t          | dd           d S | j        j        j        }|j        |j        }}| j                            |                                          }| j	                            |                                          }|                                | j
        t          j        |d d d f         |d d d f                   d         z  z
  }|                    ||          | j        j        _        d | _        d | _	        d S Nrb   rc   r=   r   rV   )getattrrC   rD   rW   r>   r=   rb   r`   rX   rc   r(   r[   r\   rH   rg   r>   r=   rb   rc   unfused_weights          r   _unfuse_loraz"PatchedLoraProjection._unfuse_lora   s   fd++7GD(TX<Y<Y<eF07<$*L,?vy||6|**0022''--//%++--59TRVXYXYXYRY]\bcgijijijcj\kClClmnCo1op0>0A0AW\0A0]0]!(-	r!   c                     | j         d| _         | j        |                     |          S |                     |          | j         |                     |          z  z   S )Nr'   )r(   rG   rC   )rH   inputs     r   forwardzPatchedLoraProjection.forward   s]    ?"!DO!),,U333((//4?TE[E[\aEbEb3bccr!   )r7   Nr8   Nr'   F)	r   
__module____qualname__rA   rP   rh   ro   rr   __classcell__r   s   @r   r,   r,   S   s        % % % % % %6 -1u f f f f f f f% % % %@   d d d d d d dr!   r,   c                        e Zd ZdZ	 	 	 	 ddedededee         deeej	        e
f                  d	eej                 f fd
Zdej        dej        fdZ xZS )r;   a  
    A linear layer that is used with LoRA.

    Parameters:
        in_features (`int`):
            Number of input features.
        out_features (`int`):
            Number of output features.
        rank (`int`, `optional`, defaults to 4):
            The rank of the LoRA layer.
        network_alpha (`float`, `optional`, defaults to `None`):
            The value of the network alpha used for stable learning and preventing underflow. This value has the same
            meaning as the `--network_alpha` option in the kohya-ss trainer script. See
            https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
        device (`torch.device`, `optional`, defaults to `None`):
            The device to use for the layer's weights.
        dtype (`torch.dtype`, `optional`, defaults to `None`):
            The dtype to use for the layer's weights.
    r8   NrE   rF   r?   r<   r=   r>   c                    t                                                       d}t          dd|           t          j        ||d||          | _        t          j        ||d||          | _        || _        || _        || _	        || _
        t          j                            | j        j        d|z             t          j                            | j        j                   d S )NzmUse of `LoRALinearLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r;   r:   F)biasr=   r>   r7   std)r@   rA   r   r   LinearrZ   rY   r<   r?   rF   rE   initnormal_rD   zeros_)	rH   rE   rF   r?   r<   r=   r>   rI   r   s	           r   rA   zLoRALinearLayer.__init__   s     	 N#W.ABBBIk4eFRWXXX	)D,U6QVWWW +	(&
	(a$h777
tw~&&&&&r!   hidden_statesreturnc                    |j         }| j        j        j         }|                     |                    |                    }|                     |          }| j        || j        | j        z  z  }|                    |          S r*   r>   rZ   rD   r`   rY   r<   r?   rH   r   
orig_dtyper>   down_hidden_statesup_hidden_statess         r   rr   zLoRALinearLayer.forward   |    "(
	 &!YY}'7'7'>'>??77#566) 2TY >>"":...r!   )r8   NNN)r   rt   ru   __doc__intr   rX   r   r[   r=   strr>   rA   Tensorrr   rv   rw   s   @r   r;   r;      s         0 )-59'+' '' ' 	'
  ' u|S012' $' ' ' ' ' '4
/U\ 
/el 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/r!   r;   c                        e Zd ZdZ	 	 	 	 	 ddededed	eeeeef         f         d
eeeeef         f         deeeeef         ef         dee	         f fdZ
dej        dej        fdZ xZS )LoRAConv2dLayera"  
    A convolutional layer that is used with LoRA.

    Parameters:
        in_features (`int`):
            Number of input features.
        out_features (`int`):
            Number of output features.
        rank (`int`, `optional`, defaults to 4):
            The rank of the LoRA layer.
        kernel_size (`int` or `tuple` of two `int`, `optional`, defaults to 1):
            The kernel size of the convolution.
        stride (`int` or `tuple` of two `int`, `optional`, defaults to 1):
            The stride of the convolution.
        padding (`int` or `tuple` of two `int` or `str`, `optional`, defaults to 0):
            The padding of the convolution.
        network_alpha (`float`, `optional`, defaults to `None`):
            The value of the network alpha used for stable learning and preventing underflow. This value has the same
            meaning as the `--network_alpha` option in the kohya-ss trainer script. See
            https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning
    r8   r7   r7   r   NrE   rF   r?   kernel_sizestridepaddingr<   c                    t                                                       d}t          dd|           t          j        |||||d          | _        t          j        ||ddd          | _        || _        || _        t          j	        
                    | j        j        d|z  	           t          j	                            | j        j                   d S )
NzmUse of `LoRAConv2dLayer` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r:   F)r   r   r   rz   r   )r   r   rz   r7   r{   )r@   rA   r   r   Conv2drZ   rY   r<   r?   r~   r   rD   r   )
rH   rE   rF   r?   r   r   r   r<   rI   r   s
            r   rA   zLoRAConv2dLayer.__init__  s     	 N#W.ABBBIk4[QWahotuuu	 )D,F6X]^^^ +	
	(a$h777
tw~&&&&&r!   r   r   c                    |j         }| j        j        j         }|                     |                    |                    }|                     |          }| j        || j        | j        z  z  }|                    |          S r*   r   r   s         r   rr   zLoRAConv2dLayer.forward  r   r!   )r8   r   r   r   N)r   rt   ru   r   r   r   r   r   r   rX   rA   r[   r   rr   rv   rw   s   @r   r   r      s        4 39.445)-' '' ' 	'
 3c3h/0' c5c?*+' sE#s(OS01'  ' ' ' ' ' '8
/U\ 
/el 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/r!   r   c                        e Zd ZdZdddee         f fdZdee         fdZdd	ed
e	fdZ
d Zddej        dedej        fdZ xZS )LoRACompatibleConvz;
    A convolutional layer that can be used with LoRA.
    N
lora_layerr   c                n    d}t          dd|            t                      j        |i | || _        d S )NzpUse of `LoRACompatibleConv` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r:   r   r@   rA   r   rH   r   rQ   kwargsrI   r   s        r   rA   zLoRACompatibleConv.__init__0  sG     Q&1DEEE$)&)))$r!   c                 :    d}t          dd|           || _        d S NznUse of `set_lora_layer()` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.set_lora_layerr:   r   r   rH   r   rI   s      r   r   z!LoRACompatibleConv.set_lora_layer7  s*     O"G-@AAA$r!   r'   Fr(   re   c                    | j         d S | j        j        j        | j        j        j        }}| j        j                                        }| j         j        j        j                                        }| j         j        j        j                                        }| j         j        || j         j        z  | j         j	        z  }t          j        |                    d          |                    d                    }|                    |j                  }|||z  z   }	|rKt          j        |	                                                                          rt%          d|  d          |	                    ||          | j        _        d | _         |                                | _        |                                | _        || _        d S )Nr7   	start_dimrT   rU   rV   )r   rD   rW   r>   r=   rX   rY   rZ   r<   r?   r[   mmflattenreshapeshaper]   r^   r_   r   r`   ra   rb   rc   _lora_scale)
rH   r(   re   r>   r=   rf   rb   rc   fusionrg   s
             r   rh   zLoRACompatibleConv._fuse_lora=  s   ?"F(.0@0Gv!''))!(-3355%,17799?(4$/77$/:NND$,,,33V^^a^5P5PQQ//f!45 	5;|4488::??AA 	2OS2 2 2   (??&?FF  HHJJ	jjll%r!   c                    t          | dd           t          | dd           d S | j        j        }|j        j        |j        j        }}| j                            |                                          | _        | j                            |                                          | _        t          j
        | j                            d          | j                            d                    }|                    |j                  }|                                | j        |z  z
  }|                    ||          | j        _        d | _        d | _        d S )Nrb   rc   rk   r7   r   rV   )rl   rD   rW   r>   r=   rb   r`   rX   rc   r[   r   r   r   r   r   )rH   rg   r>   r=   r   rn   s         r   ro   zLoRACompatibleConv._unfuse_lora_  s'   fd++7GD(TX<Y<Y<eF{'$)/1B1IvILLL//5577	knnV,,2244$)++a+88$+:M:MXY:M:Z:Z[[!355%++--1AF1JK),,F%,HH	r!   r   scaler   c           	         | j         dk    r$t          j        || j        | j                   }d}n| j        }t          j        || j        | j        | j        || j	        | j
                  }| j        |S |||                     |          z  z   S )Nzeros)mode)r   r   )padding_modeFpad _reversed_padding_repeated_twicer   conv2drD   rz   r   dilationgroupsr   )rH   r   r   r   original_outputss        r   rr   zLoRACompatibleConv.forwardq  s    ''E-1V]a]noooMGGlG84;	4;X\Xc
 
 ?"###ut}/M/M'MNNr!   rs   r'   )r   rt   ru   r   r   r   rA   r   rX   boolrh   ro   r[   r   rr   rv   rw   s   @r   r   r   +  s          GK % % %(?*C % % % % % %%/)B % % % % &  &U  &t  &  &  &  &D  $O OU\ O% O%, O O O O O O O Or!   r   c                        e Zd ZdZdddee         f fdZdee         fdZdd	ed
e	fdZ
d Zddej        dedej        f fdZ xZS )LoRACompatibleLinearz4
    A Linear layer that can be used with LoRA.
    Nr   r   c                n    d}t          dd|            t                      j        |i | || _        d S )NzrUse of `LoRACompatibleLinear` is deprecated. Please switch to PEFT backend by installing PEFT: `pip install peft`.r   r:   r   r   s        r   rA   zLoRACompatibleLinear.__init__  sG     S('3FGGG$)&)))$r!   c                 :    d}t          dd|           || _        d S r   r   r   s      r   r   z#LoRACompatibleLinear.set_lora_layer  s*     O"G-@AAA$r!   r'   Fr(   re   c           	      N   | j         d S | j        j        j        | j        j        j        }}| j        j                                        }| j         j        j        j                                        }| j         j        j        j                                        }| j         j        || j         j        z  | j         j	        z  }||t          j        |d d d f         |d d d f                   d         z  z   }|rKt          j        |                                                                          rt          d|  d          |                    ||          | j        _        d | _         |                                | _        |                                | _        || _        d S rS   )r   rD   rW   r>   r=   rX   rY   rZ   r<   r?   r[   r\   r]   r^   r_   r   r`   ra   rb   rc   r   rd   s	            r   rh   zLoRACompatibleLinear._fuse_lora  s   ?"F(.0@0Gv!''))!(-3355%,17799?(4$/77$/:NNDeiT111WvdTUTUTUg.W.WXY.Z!Z[ 	5;|4488::??AA 	2OS2 2 2   (??&?FF  HHJJ	jjll%r!   c           	      *   t          | dd           t          | dd           d S | j        j        }|j        |j        }}| j                            |                                          }| j                            |                                          }|                                | j	        t          j        |d d d f         |d d d f                   d         z  z
  }|                    ||          | j        _        d | _        d | _        d S rj   )rl   rD   rW   r>   r=   rb   r`   rX   rc   r   r[   r\   rm   s          r   ro   z!LoRACompatibleLinear._unfuse_lora  s   fd++7GD(TX<Y<Y<eF{'$*L,?vy||6|**0022''--//%++--1AEIdSWYZYZYZSZm]cdhjkjkjkdk]lDmDmnoDp1pq),,F%,HH	r!   r   r   r   c                     | j         #t                                          |          }|S t                                          |          ||                      |          z  z   }|S r*   )r   r@   rr   )rH   r   r   outr   s       r   rr   zLoRACompatibleLinear.forward  sU    ?"''//-00CJ''//-00EDOOM<Z<Z4Z[CJr!   rs   r   )r   rt   ru   r   r   r;   rA   r   rX   r   rh   ro   r[   r   rr   rv   rw   s   @r   r   r     s          GK % % %(?*C % % % % % %%/)B % % % %
& &U &t & & & &@    U\ % %,          r!   r   r   ) typingr   r   r   r[   torch.nn.functionalr   
functionalr   utilsr   r	   utils.import_utilsr
   transformersr   r   
get_loggerr   loggerr    r&   rX   r5   Moduler,   r;   r   r   r   r}   r    r!   r   <module>r      s  0 * ) ) ) ) ) ) ) ) )                 & & & & & & & & : : : : : :  HGGGGGGGG 
	H	%	%    3 3U 3 3 3 3Yd Yd Yd Yd YdEHO Yd Yd Ydx9/ 9/ 9/ 9/ 9/bi 9/ 9/ 9/x=/ =/ =/ =/ =/bi =/ =/ =/@TO TO TO TO TO TO TO TOnG G G G G29 G G G G Gr!   