
    
3j>                     $   S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
Jr  SSKJr  \R                  " \5      r\" 5       (       a  SSKrS rS	 rSS
\S-  4S jjr SS jrS rSS jrS rS rSS\4S jjrS\SS4S jr SS jrS rS r g)z3
PEFT utilities: Utilities related to peft library
    N)version   )logging)is_peft_availableis_peft_versionis_torch_available)empty_device_cachec           
         SSK Jn  SnU R                  5        H!  n[        X15      (       d  M  [	        US5      n  O   U(       av  SSKJn  U R                  5        VVs/ s H  u  pVSU;  d  M  UPM     nnnU H<  n U" X5      u  pn
[	        U	S5      (       d  M"  [        XU	R                  5       5        M>     U $ SSKJn  U R                  5        GH  u  p[        [        UR!                  5       5      5      S:  a  [#        U5        Sn[        X;5      (       a  [        U[$        R&                  R(                  5      (       a  [$        R&                  R)                  UR*                  UR,                  UR.                  SLS	9R1                  UR2                  R4                  5      nUR2                  Ul        UR.                  b  UR.                  Ul        S
nO[        X;5      (       a  [        U[$        R&                  R6                  5      (       a  [$        R&                  R7                  UR8                  UR:                  UR<                  UR>                  UR@                  URB                  URD                  5      R1                  UR2                  R4                  5      nUR2                  Ul        UR.                  b  UR.                  Ul        S
nU(       d  GM  [        XW5        A[G        5         GM"     U $ s  snnf ! [         a     GM  f = f)z\
Recursively replace all instances of `LoraLayer` with corresponding new layers in `model`.
r   BaseTunerLayerF
base_layer)_get_submoduleslora)	LoraLayerN)biasT)$peft.tuners.tuners_utilsr   modules
isinstancehasattr
peft.utilsr   named_modulesAttributeErrorsetattrget_base_layerpeft.tuners.lorar   named_childrenlenlistchildrenrecurse_remove_peft_layerstorchnnLinearin_featuresout_featuresr   toweightdeviceConv2din_channelsout_channelskernel_sizestridepaddingdilationgroupsr	   )modelr   has_base_layer_patternmoduler   key_key_listparenttargettarget_namer   namemodule_replaced
new_modules                  T/home/wildlama/miniconda3/lib/python3.13/site-packages/diffusers/utils/peft_utils.pyr    r    #   sk    8"--/f--%,V\%B" "
 .&+&9&9&;Q&;FCvS?PC&;QC.=e.I+ v|,,V-B-B-DE h LU 	/!002LD4)*+a/*62#O&,,FEHHOO1T1T"XX__&&''D0 -  "V]]))*	 
 %+MM
!;;*&,kkJO"&F..:fehhoo3V3V"XX__&&''&&MMNNOOMM "V]]))*  %+MM
!;;*&,kkJO"&Z0"$O 3P Lk R " s   K7.K7=K==
LLc                     SSK Jn  US:X  a  gU R                  5        H&  n[        X25      (       d  M  UR	                  U5        M(     g)z
Adjust the weightage given to the LoRA layers of the model.

Args:
    model (`torch.nn.Module`):
        The model to scale.
    weight (`float`):
        The weight to be given to the LoRA layers.
r   r         ?N)r   r   r   r   scale_layer)r1   r'   r   r3   s       r=   scale_lora_layersrA   j   s:     8}--/f--v& "    r'   c                     SSK Jn  Ub  US:X  a  gU R                  5        HS  n[        X25      (       d  M  US:w  a  UR	                  U5        M.  UR
                   H  nUR                  US5        M     MU     g)a  
Removes the previously passed weight given to the LoRA layers of the model.

Args:
    model (`torch.nn.Module`):
        The model to scale.
    weight (`float`, *optional*):
        The weight to be given to the LoRA layers. If no scale is passed the scale of the lora layer will be
        re-initialized to the correct value. If 0.0 is passed, we will re-initialize the scale with the correct
        value.
r   r   Nr?   )r   r   r   r   unscale_layeractive_adapters	set_scale)r1   r'   r   r3   adapter_names        r=   unscale_lora_layersrH   ~   se     8~3--/f--{$$V,$*$:$:L$$\37 %; "rB   c           	        ^^ 0 n0 n[        U R                  5       5      S   =mm[        [        U R                  5       5      5      S:  a  [        R
                  " U R                  5       5      R                  5       S   S   m[        [        U4S jU R                  5       5      5      nUR                  5        VV	s0 s H  u  pUR                  S5      S   U	_M     nnn	UGb  [        U5      S:  Gas  [        [        UR                  5       5      5      S:  Ga%  [        R
                  " UR                  5       5      R                  5       S   S   m[        [        U4S jUR                  5       5      5      nU(       af  UR                  5        VV	s0 s HH  u  pSR                  UR                  S5      S   R                  S5      5      R                  SS	5      U	_MJ     nnn	OUR                  5        VV	s0 s H;  u  pSR                  UR                  S
5      S   R                  S5      S S 5      U	_M=     nnn	O'[        UR                  5       5      R                  5       m[        UR                  5        V
s1 s H  oR                  S5      S   iM     sn
5      n[        S U 5       5      n[        S U 5       5      nTTUUUUUS.nU$ s  sn	nf s  sn	nf s  sn	nf s  sn
f )Nr   r   c                    > U S   T:g  $ Nr    )xrs    r=   <lambda>!get_peft_kwargs.<locals>.<lambda>   s    QqTQYrB   z.lora_B.c                    > U S   T:g  $ rK   rL   )rM   
lora_alphas    r=   rO   rP      s    !A$*2DrB   .z.lora_A.z.alpha z.down.z.lorac              3   ,   #    U  H
  nS U;   v   M     g7f)lora_magnitude_vectorNrL   .0ks     r=   	<genexpr>"get_peft_kwargs.<locals>.<genexpr>   s     IA*a/s   c              3   \   #    U  H"  nS U;   =(       a    UR                  S5      v   M$     g7f)lora_Bz.biasN)endswithrX   s     r=   r[   r\      s%     S?aHM9ajj&99?s   *,)rN   rR   rank_patternalpha_patterntarget_modulesuse_dora	lora_bias)r   valuesr   setcollectionsCountermost_commondictfilteritemssplitjoinreplacepopkeysany)	rank_dictnetwork_alpha_dictpeft_state_dictis_unetmodel_state_dictrG   r`   ra   rZ   vr:   rb   rc   rd   lora_config_kwargsrR   rN   s                  @@r=   get_peft_kwargsrz      s    LM)**,-a00A

3y!"#a'	 0 0 23??A!DQG F#6	8IJK>J>P>P>RS>Rda
+A.1>RS%#.@*AA*Es%,,./014$,,-?-F-F-HIUUWXYZ[\]J !(DFXF^F^F`!abM !. 3 3 5! 5 HHQWWZ0399#>?GGRTUWXX 5  !
 `m_r_r_t u_tW[WX!''(*;A*>*D*DS*I#2*N!OQR!R_t u/6689==?Jo>R>R>TU>Td::g.q1>TUVNIIIHS?SSI  $&( E T!
 !v Vs   =!KAK;AK?K%c                     SSK Jn  U R                  5        H-  n[        X!5      (       d  M  S[	        UR
                  5       3s  $    g)Nr   r   default_	default_0)r   r   r   r   r   rN   )r1   r   r3   s      r=   get_adapter_namer~      s:    7--/f--c&((m_-- " rB   c                     SSK Jn  U R                  5        HC  n[        X25      (       d  M  [	        US5      (       a  UR                  US9  M7  U(       + Ul        ME     g )Nr   r   enable_adapters)enabled)r   r   r   r   r   r   disable_adapters)r1   r   r   r3   s       r=   set_adapter_layersr      sI    7--/f--v011&&w&7.5+' "rB   c                    SSK Jn  U R                  5        HB  n[        X25      (       d  M  [	        US5      (       a  UR                  U5        M9  [        S5      e   [        U SS5      (       aR  [	        U S5      (       a@  U R                  R                  US 5        [        U R                  5      S:X  a
  U ?S U l        g g g g )Nr   r   delete_adapterzdThe version of PEFT you are using is not compatible, please use a version that is greater than 0.6.1_hf_peft_config_loadedFpeft_config)r   r   r   r   r   r   
ValueErrorgetattrr   rp   r   r   )r1   rG   r   r3   s       r=   delete_adapter_layersr      s    7--/f--v/00%%l3 z  " u.6675-;X;XlD1 u  !Q&!+/E( '	 <Y6rB   c           	         SSK Jn  S nU R                  5        Hk  u  pV[        Xc5      (       d  M  [	        US5      (       a  UR                  U5        OXl        [        X5       H  u  pxUR                  Xt" X5      5        M     Mm     g )Nr   r   c                     [        U [        5      (       d  U $ U R                  5        H  u  p#X!;   d  M  Us  $    UR                  S5      nUS    SUS    SUS    3nU R	                  US5      nU$ )NrS   r   r   z.attentions.   r?   )r   rj   rl   rm   get)weight_for_adaptermodule_name
layer_nameweight_partsr4   block_weights          r=   get_module_weight<set_weights_and_activate_adapters.<locals>.get_module_weight   s    ,d33%%#5#;#;#=J( $> !!#&q
!E!H:\%(<)--c37rB   set_adapter)	r   r   r   r   r   r   active_adapterziprF   )	r1   adapter_namesweightsr   r   r   r3   rG   r'   s	            r=   !set_weights_and_activate_adaptersr      sy    7   %224f--v}--""=1(5% ),M(C$  /@/UV )D  5rB   kwargs_namec                    ^  U 4S jnU$ )a  
Decorator to automatically handle LoRA layer scaling/unscaling in forward methods.

This decorator extracts the `lora_scale` from the specified kwargs parameter, applies scaling before the forward
pass, and ensures unscaling happens after, even if an exception occurs.

Args:
    kwargs_name (`str`, defaults to `"joint_attention_kwargs"`):
        The name of the keyword argument that contains the LoRA scale. Common values include
        "joint_attention_kwargs", "attention_kwargs", "cross_attention_kwargs", etc.
c                 J   >^  [         R                  " T 5      U U4S j5       nU$ )Nc                 l  > SSK Jn  SnUR                  T5      nUbL  UR                  5       nXRT'   UR	                  SS5      nU(       d  US:w  a  [
        R                  ST S35        U(       a  [        X5         T" U /UQ70 UD6nUU(       a  [        X5        $ $ ! U(       a  [        X5        f f = f)Nr   )USE_PEFT_BACKENDr?   scalezPassing `scale` via `z1` when not using the PEFT backend is ineffective.)	rT   r   r   copyrp   loggerwarningrA   rH   )	selfargskwargsr   
lora_scaleattention_kwargsresult
forward_fnr   s	          r=   wrapper4apply_lora_scale.<locals>.decorator.<locals>.wrapper$  s    *J%zz+6+#3#8#8#: &6{#-11'3?
'J#,=NN/}<mn
  !$3:#D:4:6: $'9 $#'9 $s   =B B3)	functoolswraps)r   r   r   s   ` r=   	decorator#apply_lora_scale.<locals>.decorator#  s%    		$	: 
%	:: rB   rL   )r   r   s   ` r=   apply_lora_scaler     s    B rB   min_versionreturnc                     [        5       (       d  [        S5      e[        R                  " [        R
                  R                  S5      5      [        R                  " U 5      :  nU(       d  [        SU  35      eg)zx
Checks if the version of PEFT is compatible.

Args:
    version (`str`):
        The version of PEFT to check against.
z@PEFT is not installed. Please install it with `pip install peft`peftz_The version of PEFT you are using is not compatible, please use a version that is greater than N)r   r   r   parse	importlibmetadata)r   is_peft_version_compatibles     r=   check_peft_versionr   G  so     [\\!(y/A/A/I/I&/Q!RU\UbUbcnUo!o% M#
 	
 &rB   c           	      J   SSK Jn  Ub  UnO[        UUU UUUS9n[        U5        SU;   a&  US   (       a  [	        SS5      (       a  [        S5      eSU;   a&  US   (       a  [	        S	S
5      (       a  [        S5      e U" S0 UD6$ ! [         a  n	[        S5      U	eS n	A	ff = f)Nr   )
LoraConfig)rt   ru   rv   rw   rG   rc   <z0.9.0z,DoRA requires PEFT >= 0.9.0. Please upgrade.rd   z<=z0.13.2z2lora_bias requires PEFT >= 0.14.0. Please upgrade.z-`LoraConfig` class could not be instantiated.rL   )r   r   rz   %_maybe_raise_error_for_ambiguous_keysr   r   	TypeError)

state_dictnetwork_alphasr   rank_pattern_dictrv   rw   rG   r   ry   es
             r=   _create_lora_configr   [  s      %,-&-%
 **<= '',>z,J3((KLL((-?-L4**QRRP/.// PGHaOPs   ?B 
B"BB"c                 V   U S   R                  5       nU S   n[        UR                  5       5       Hj  nU Vs/ s H  oDU:X  d  M
  UPM     nnU Vs/ s H  oCU;   d  M
  XC:w  d  M  UPM     nnU(       d  ME  U(       d  MN  [        SS5      (       d  Ma  [	        S5      e   g s  snf s  snf )Nr`   rb   r   z0.14.1zzThere are ambiguous keys present in this LoRA. To load it, please update your `peft` installation - `pip install -U peft`.)r   r   rq   r   r   )configr`   rb   r4   modexact_matchessubstring_matchess          r=   r   r   }  s    .)..0L,-NL%%'( )7E*E,:XNSSjSSZSNX=..sH--  Q  ) FXs   	B!B!	B&B&&B&c                    SnU b  [        U SS 5      nU(       a=  U Vs/ s H  nSU;   d  M  X;   d  M  UPM     nnU(       a  SSR                  U5       S3n[        U SS 5      nU(       a@  U Vs/ s H  nSU;   d  M  X;   d  M  UPM     nnU(       a  USSR                  U5       S	3-  nU(       a  [        R                  U5        g g s  snf s  snf )
NrT   unexpected_keyslora_zSLoading adapter weights from state_dict led to unexpected keys found in the model: z, z. missing_keyszJLoading adapter weights from state_dict led to missing keys in the model: rS   )r   rn   r   r   )incompatible_keysrG   warn_msgr   rZ   lora_unexpected_keysr   lora_missing_keyss           r=   _maybe_warn_for_unhandled_keysr     s    H$!"35FM/>#e!'Q,AS_SdA #e#		"678<  0.$G,8 _LqGqL\M^L _ 		"345Q8
 x  # $f !`s!   
C	C	C	/
C=CC)N)TNN)T)joint_attention_kwargs)!__doc__rg   r   r   	packagingr   rT   r   import_utilsr   r   r   torch_utilsr	   
get_logger__name__r   r!   r    rA   floatrH   rz   r~   r   r   r   strr   r   r   r   r   rL   rB   r=   <module>r      s         P P + 
		H	%DN'(8ut| 88 gk/d	60,W@.# .b
C 
D 
* ptPD(!rB   