
    1;ji,+                         d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	  e	            rddl
Z
d Zd Zdd	ee         fd
ZddZd ZddZd Zd ZdeddfdZdS )z3
PEFT utilities: Utilities related to peft library
    N)Optional)version   )is_peft_availableis_torch_availablec           
         ddl m} d}|                                 D ]$}t          ||          rt	          |d          } n%|rddlm} d |                                 D             }|D ]W}	  || |          \  }}}	n# t          $ r Y  w xY wt	          |d          r#t          ||	|
                                           Xnddlm}
 |                                 D ]\  }}t          t          |                                                    dk    rt#          |           d}t          ||
          rt          |t$          j        j                  rrt$          j                            |j        |j        |j        du	                              |j        j                  }|j        |_        |j        |j        |_        d
}nt          ||
          rt          |t$          j        j                  rt$          j                            |j        |j        |j        |j        |j         |j!        |j"                                      |j        j                  }|j        |_        |j        |j        |_        d
}|rNt          | ||           ~t$          j#        $                                rt$          j#        %                                 | S )zd
    Recursively replace all instances of `LoraLayer` with corresponding new layers in `model`.
    r   BaseTunerLayerF
base_layer)_get_submodulesc                      g | ]\  }}d |v	|S )lora ).0key_s      T/root/voice-cloning/.venv/lib/python3.11/site-packages/diffusers/utils/peft_utils.py
<listcomp>z.recurse_remove_peft_layers.<locals>.<listcomp>.   s&    QQQFCvS?P?PC?P?P?P    )	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groupscudais_availableempty_cache)modelr
   has_base_layer_patternmoduler   key_listr   parenttargettarget_namer   namemodule_replaced
new_modules                 r   r&   r&      s    877777"--//  fn-- 	%,V\%B%B"E	  8-......QQe&9&9&;&;QQQ 	F 	FC.=oeS.I.I+!   v|,, FV-B-B-D-DEEE	F 	/.....!0022 (	- (	-LD&4))**++a//*6222#O&),, 'FEHO1T1T '"X__&'D0 -   "V])**	 
 %+M
!;*&,kJO"&FI.. ':feho3V3V '"X__&'&MNOM  "V])**  %+M
!;*&,kJO"& -tZ000:**,, -J**,,,Ls   -A>>
B
Bc                     ddl m} |dk    rdS |                                 D ]'}t          ||          r|                    |           (dS )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)r:   r-   r
   r<   s       r   scale_lora_layersrG   g   sl     877777}}--// ' 'fn-- 	'v&&&' 'r   r-   c                     ddl m} |dk    rdS |                                 D ]X}t          ||          rF||dk    r|                    |           0|&|dk    r |j        D ]}|                    |d           YdS )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	   rE   N)r   r
   r   r   unscale_layeractive_adapters	set_scale)r:   r-   r
   r<   adapter_names        r   unscale_lora_layersrM   {   s     877777}}--// 8 8fn-- 	8!fkk$$V,,,,#!$*$: 8 8L$$\377778 8r   Tc                   	
 i }i }t          |                                           d         x
	t          t          |                                                     dk    rt	          j        |                                                                           d         d         
t          t          
fd| 	                                                    }d |	                                D             }|/t          |          dk    rt          t          |                                                    dk    rt	          j        |                                                                          d         d         	t          t          	fd|	                                                    }|rd |	                                D             }nRd |	                                D             }n3t          |                                          
                                	t          d |                                D                       }t          d	 |D                       }
	||||d
}|S )Nr   r   c                     | d         k    S Nr   r   )xrs    r   <lambda>z!get_peft_kwargs.<locals>.<lambda>   s    QqTQY r   c                 L    i | ]!\  }}|                     d           d         |"S )z.lora_B.r   splitr   kvs      r   
<dictcomp>z#get_peft_kwargs.<locals>.<dictcomp>   s/    SSSda
++A.SSSr   c                     | d         k    S rP   r   )rQ   
lora_alphas    r   rS   z!get_peft_kwargs.<locals>.<lambda>   s    !A$*2D r   c                     i | ][\  }}d                      |                    d          d                             d                                         dd          |\S ).z.lora_A.r   z.alpha )joinrV   replacerW   s      r   rZ   z#get_peft_kwargs.<locals>.<dictcomp>   sk     ! ! !1 HHQWWZ00399#>>??GGRTUUWX! ! !r   c                     i | ]O\  }}d                      |                    d          d                             d           dd                   |PS )r^   z.down.r   N)r`   rV   rW   s      r   rZ   z#get_peft_kwargs.<locals>.<dictcomp>   sV     u u uW[WXZ[!''(*;*;A*>*D*DS*I*I#2#*N!O!OQR u u ur   c                 D    h | ]}|                     d           d         S )z.lorar   rU   )r   rA   s     r   	<setcomp>z"get_peft_kwargs.<locals>.<setcomp>   s)    UUUd4::g..q1UUUr   c              3      K   | ]}d |v V  	dS )lora_magnitude_vectorNr   )r   rX   s     r   	<genexpr>z"get_peft_kwargs.<locals>.<genexpr>   s(      IIA*a/IIIIIIr   )rR   r\   rank_patternalpha_patterntarget_modulesuse_dora)r$   valuesr#   setcollectionsCountermost_commondictfilteritemspopkeysany)	rank_dictnetwork_alpha_dictpeft_state_dictis_unetri   rj   rk   rl   lora_config_kwargsr\   rR   s            @@r   get_peft_kwargsr}      sk   LM)**,,--a00A

3y!!""##a''	 0 0 2 233??AA!DQG F#6#6#6#6	8I8IJJKKSSl>P>P>R>RSSS%#.@*A*AA*E*Es%,,..//00144$,-?-F-F-H-HIIUUWWXYZ[\]J !(D(D(D(DFXF^F^F`F`!a!abbM v! ! - 3 3 5 5! ! !
 !v u_l_r_r_t_t u u u/668899==??J UUo>R>R>T>TUUUVVNIIIIIIIH  $&(  r   c                     ddl m} |                                 D ]+}t          ||          rdt	          |j                   c S ,dS )Nr   r	   default_	default_0)r   r
   r   r   r#   rR   )r:   r
   r<   s      r   get_adapter_namer      sc    777777--// . .fn-- 	.-c&(mm-----	.;r   c                     ddl m} |                                 D ]A}t          ||          r/t	          |d          r|                    |           9| |_        Bd S )Nr   r	   enable_adapters)enabled)r   r
   r   r   r   r   disable_adapters)r:   r   r
   r<   s       r   set_adapter_layersr      s    777777--// 6 6fn-- 	6v011 6&&w&7777.5+'6 6r   c                    ddl m} |                                 D ]G}t          ||          r5t	          |d          r|                    |           8t          d          Ht          | dd          rNt	          | d          r@| j        	                    |d            t          | j                  dk    r| `d | _        d S d S d S d S )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   ru   r#   r   )r:   rL   r
   r<   s       r   delete_adapter_layersr      s
   777777--//  fn-- 	v/00 %%l3333 z  		 u.66 075-;X;X 0lD111 u !!Q&&!+/E(((0 0 0 0 '&r   c           	         ddl m} d }t          ||          D ]|\  }}|                                 D ]b\  }}t	          ||          rMt          |d          r|                    |           n||_        |                    | |||                     c}| 	                                D ]?}t	          ||          r-t          |d          r|                    |           8||_        @d S )Nr   r	   c                    t          | t                    s| S |                                 D ]\  }}||v r|c S |                    d          }|d          d|d          d|d          }|                     |d          }|S )Nr^   r   r   z.attentions.   rE   )r   rr   rt   rV   get)weight_for_adaptermodule_name
layer_nameweight_partsr   block_weights          r   get_module_weightz<set_weights_and_activate_adapters.<locals>.get_module_weight   s    ,d33 	&%%#5#;#;#=#= 	 	J[(( ) !!#&&q<<E!H<<%(<<)--c377r   set_adapter)
r   r
   zipr   r   r   r   active_adapterrK   r   )	r:   adapter_namesweightsr
   r   rL   r-   r   r<   s	            r   !set_weights_and_activate_adaptersr      s=   777777  " !$M7 ; ; W Wf#(#6#6#8#8 	W 	WK&.11 W6=11 9&&|4444,8F)  /@/@/U/UVVV	W --// 6 6fn-- 	6v}-- 6""=1111(5%6 6r   min_versionreturnc                     t                      st          d          t          j        t          j                            d                    t          j        |           k    }|st          d|            dS )z
    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     s      ][\\\!(y/A/I/I&/Q/Q!R!RU\UbcnUoUo!o% 
# # #
 
 	

 
r   )N)T)__doc__ro   r   typingr   	packagingr   import_utilsr   r   r'   r&   rG   floatrM   r}   r   r   r   r   strr   r   r   r   <module>r      sJ                        ? ? ? ? ? ? ? ?  LLLE E EP' ' '(8 8x 8 8 8 86* * * *Z  	6 	6 	6 	60 0 0,%6 %6 %6P
C 
D 
 
 
 
 
 
r   