Ë
    (täió>  ã                   ó
  — d Z ddl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
mZ ddlmZ  ej                  e«      Z e«       rddlZd„ Zd	„ Zdd
edz  fd„Z	 dd„Zd„ Zdd„Zd„ Zd„ Zddefd„Zdeddfd„Z	 dd„Zd„ Zd„ Z y)z3
PEFT utilities: Utilities related to peft library
é    N)Úversioné   )Úlogging)Úis_peft_availableÚis_peft_versionÚis_torch_available)Úempty_device_cachec           
      óÀ  — ddl m} d}| j                  «       D ]  }t        ||«      sŒt	        |d«      } n |rlddlm} | j                  «       D ��cg c]  \  }}d|vsŒ|‘Œ }}}|D ]8  }	  || |«      \  }}	}
t	        |	d«      sŒt        ||
|	j                  «       «       Œ: | S ddlm} | j                  «       D �]  \  }}t        t        |j!                  «       «      «      dkD  rt#        |«       d}t        ||«      rºt        |t$        j&                  j(                  «      r–t$        j&                  j)                  |j*                  |j,                  |j.                  du¬	«      j1                  |j2                  j4                  «      }|j2                  |_        |j.                  �|j.                  |_        d
}nît        ||«      rât        |t$        j&                  j6                  «      r¾t$        j&                  j7                  |j8                  |j:                  |j<                  |j>                  |j@                  |jB                  |jD                  «      j1                  |j2                  j4                  «      }|j2                  |_        |j.                  �|j.                  |_        d
}|s�Œñt        | |«       ~tG        «        �Œ | S c c}}w # t        $ r Y �Œsw xY w)zd
    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                  úi/Volumes/fast/ai/experiments/MLX_z-image/.venv/lib/python3.12/site-packages/diffusers/utils/peft_utils.pyr    r    #   si  € õ 8à"ÐØ—-‘-–/ˆÜ�f˜nÕ-Ü%,¨V°\Ó%BÐ"Ùð "ñ
 Ý.à&+×&9Ñ&9Ô&;ÔQÑ&;™F˜C ¸vÈSÒ?P’CÐ&;ˆÑQÛˆCðÙ.=¸eÀSÓ.IÑ+�˜ ô �v˜|Õ,Ü˜ ¨V×-BÑ-BÓ-DÕEð ðh €LõU 	/à!×0Ñ0×2‰LˆD�&Ü”4˜Ÿ™Ó)Ó*Ó+¨aÒ/ä*¨6Ô2à#ˆOä˜& )Ô,´¸FÄEÇHÁHÇOÁOÔ1TÜ"ŸX™XŸ_™_Ø×&Ñ&Ø×'Ñ'ØŸ™¨DÐ0ð -ó ÷ ‘"�V—]‘]×)Ñ)Ó*ð	 ð
 %+§M¡M�
Ô!Ø—;‘;Ð*Ø&,§k¡k�J”Oà"&‘Ü˜F IÔ.´:¸fÄeÇhÁhÇoÁoÔ3VÜ"ŸX™XŸ_™_Ø×&Ñ&Ø×'Ñ'Ø×&Ñ&Ø—M‘MØ—N‘NØ—O‘OØ—M‘Mó÷ ‘"�V—]‘]×)Ñ)Ó*ð ð %+§M¡M�
Ô!Ø—;‘;Ð*Ø&,§k¡k�J”Oà"&�ãÜ˜˜t ZÔ0Øä"Ö$ðO 3ðP €Lùók Røô "ò Úðús   ÁK
Á K
Á-KË	KËKc                 ó‚   — ddl m} |dk(  ry| j                  «       D ]   }t        ||«      sŒ|j	                  |«       Œ" y)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   s9   € õ 8à�‚}Øà—-‘-–/ˆÜ�f˜nÕ-Ø×Ñ˜vÕ&ñ "ó    r'   c                 óØ   — ddl m} |�|dk(  ry| j                  «       D ]I  }t        ||«      sŒ|dk7  r|j	                  |«       Œ'|j
                  D ]  }|j                  |d«       Œ ŒK y)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   ~   sd   € õ 8à€~˜ 3šØà—-‘-–/ˆÜ�f˜nÕ-Ø˜Š{Ø×$Ñ$ VÕ,à$*×$:Ô$:�Là×$Ñ$ \°3Õ7ñ %;ñ "rB   c           	      óª  ‡‡— i }i }t        | j                  «       «      d   xŠŠt        t        | j                  «       «      «      dkD  r’t	        j
                  | j                  «       «      j                  «       d   d   Št        t        ˆfd„| j                  «       «      «      }|j                  «       D ��	ci c]  \  }}	|j                  d«      d   |	“Œ }}}	|��vt        |«      dkD  �rgt        t        |j                  «       «      «      dkD  �rt	        j
                  |j                  «       «      j                  «       d   d   Št        t        ˆfd„|j                  «       «      «      }|rd|j                  «       D ��	ci c]H  \  }}	dj                  |j                  d«      d   j                  d«      «      j                  dd	«      |	“ŒJ }}}	n~|j                  «       D ��	ci c];  \  }}	dj                  |j                  d
«      d   j                  d«      d d «      |	“Œ= }}}	n't        |j                  «       «      j                  «       Št        |j                  «       D �
ch c]  }
|
j                  d«      d   ’Œ c}
«      }t        d„ |D «       «      }t        d„ |D «       «      }‰‰|||||dœ}|S c c}	}w c c}	}w c c}	}w c c}
w )Nr   r   c                 ó   •— | d   ‰k7  S ©Nr   © )ÚxÚrs    €r=   Ú<lambda>z!get_peft_kwargs.<locals>.<lambda>¥   s   ø€ ¨Q¨q©T°QªYrB   z.lora_B.c                 ó   •— | d   ‰k7  S rK   rL   )rM   Ú
lora_alphas    €r=   rO   z!get_peft_kwargs.<locals>.<lambda>®   s   ø€ °!°A±$¸*Ò2DrB   Ú.z.lora_A.z.alphaÚ z.down.éÿÿÿÿz.lorac              3   ó$   K  — | ]  }d |v –— Œ
 y­w)Úlora_magnitude_vectorNrL   ©Ú.0Úks     r=   Ú	<genexpr>z"get_peft_kwargs.<locals>.<genexpr>º   s   è ø€ ÐI¹°AÐ*¨aÔ/¹ùs   ‚c              3   óJ   K  — | ]  }d |v xr |j                  d«      –— Œ y­w)Úlora_Bz.biasN)ÚendswithrW   s     r=   rZ   z"get_peft_kwargs.<locals>.<genexpr>¼   s&   è ø€ ÐSÁ?¸a�H �MÒ9 a§j¡j°Ó&9Ó9Á?ùs   ‚!#)rN   rQ   Ú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^   r_   rY   Úvr:   r`   ra   rb   Úlora_config_kwargsrQ   rN   s                  @@r=   Úget_peft_kwargsrx   ™   s¯  ù€ ð €LØ€MÜ˜)×*Ñ*Ó,Ó-¨aÑ0Ð0€Aˆ
ä
Œ3ˆy×ÑÓ!Ó"Ó# aÒ'ä×Ñ 	× 0Ñ 0Ó 2Ó3×?Ñ?ÓAÀ!ÑDÀQÑGˆô œFÓ#6¸	¿¹Ó8IÓJÓKˆØ>J×>PÑ>PÔ>RÔSÑ>R±d°a¸˜Ÿ™ 
Ó+¨AÑ.°Ñ1Ð>RˆÑSàÑ%¬#Ð.@Ó*AÀAÓ*EÜŒsÐ%×,Ñ,Ó.Ó/Ó0°1Ó4ä$×,Ñ,Ð-?×-FÑ-FÓ-HÓI×UÑUÓWÐXYÑZÐ[\Ñ]ˆJô !¤Ó(DÐFX×F^ÑF^ÓF`Ó!aÓbˆMÙð !.× 3Ñ 3Ô 5ô!á 5™˜˜1ð —H‘H˜QŸW™W ZÓ0°Ñ3×9Ñ9¸#Ó>Ó?×GÑGÈÐRTÓUÐWXÑXØ 5ð ò !ð
 `m×_rÑ_rÔ_tÔ uÑ_tÑW[ÐWXÐZ[ §¡¨!¯'©'°(Ó*;¸AÑ*>×*DÑ*DÀSÓ*IÈ#È2Ð*NÓ!OÐQRÑ!RÐ_t�Ò uäÐ/×6Ñ6Ó8Ó9×=Ñ=Ó?ˆJä¸o×>RÑ>RÔ>TÓUÑ>T°d˜4Ÿ:™: gÓ.¨qÓ1Ð>TÑUÓV€NÜÑI¹ÓIÓI€HäÑSÁ?ÓSÓS€Ið Ø Ø$Ø&Ø(ØØñÐð ÐùóE Tùó!ùó
 !vùò Vs   Â:J>ÆAKÇ*A K
É,Kc                 ó†   — ddl m} | j                  «       D ](  }t        ||«      sŒdt	        |j
                  «      › �c S  y)Nr   r   Údefault_Ú	default_0)r   r   r   r   r   rN   )r1   r   r3   s      r=   Úget_adapter_namer|   Ë   s9   € Ý7à—-‘-–/ˆÜ�f˜nÕ-Øœc &§(¡(›m˜_Ð-Ò-ð "ð rB   c                 ó¢   — ddl m} | j                  «       D ]6  }t        ||«      sŒt	        |d«      r|j                  |¬«       Œ/| |_        Œ8 y )Nr   r   Úenable_adapters)Úenabled)r   r   r   r   r   r~   Údisable_adapters)r1   r   r   r3   s       r=   Úset_adapter_layersr�   Ô   sE   € Ý7à—-‘-–/ˆÜ�f˜nÕ-ä�vÐ0Ô1Ø×&Ñ&¨wÐ&Õ7à.5¨+�Õ'ñ "rB   c                 óV  — ddl m} | j                  «       D ]7  }t        ||«      sŒt	        |d«      r|j                  |«       Œ.t        d«      ‚ t        | dd«      rLt	        | d«      r?| j                  j                  |d «       t        | j                  «      dk(  r
| `d | _        y y y y )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…   rn   r   r„   )r1   rG   r   r3   s       r=   Údelete_adapter_layersrˆ   à   s§   € Ý7à—-‘-–/ˆÜ�f˜nÕ-Ü�vÐ/Ô0Ø×%Ñ% lÕ3ä Øzóð ð "ô ˆuÐ.°Ô6¼7À5È-Ô;XØ×Ñ×Ñ˜l¨DÔ1ô ˆu× Ñ Ó! QÒ&ØÐ!Ø+/ˆEÕ(ð 'ð	 <YÐ6rB   c           	      ó  — ddl m} d„ }| j                  «       D ]d  \  }}t        ||«      sŒt	        |d«      r|j                  |«       n||_        t        ||«      D ]  \  }}|j                  | |||«      «       Œ  Œf y )Nr   r   c                 óÖ   — t        | t        «      s| S | j                  «       D ]  \  }}||v sŒ|c S  |j                  d«      }|d   › d|d   › d|d   › �}| j	                  |d«      }|S )NrR   r   r   z.attentions.é   r?   )r   rh   rj   rk   Úget)Úweight_for_adapterÚmodule_nameÚ
layer_nameÚweight_Úpartsr4   Úblock_weights          r=   Úget_module_weightz<set_weights_and_activate_adapters.<locals>.get_module_weightù   s„   € ÜÐ,¬dÔ3à%Ð%à#5×#;Ñ#;Ö#=ÑˆJ˜Ø˜[Ò(Ø’ð $>ð ×!Ñ! #Ó&ˆà�q‘�
˜!˜E !™H˜: \°%¸±(°Ð<ˆØ)×-Ñ-¨c°3Ó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™   ö   s   € Ý7òð   %×2Ñ2Ö4Ñˆ�VÜ�f˜nÕ-ä�v˜}Ô-Ø×"Ñ" =Õ1à(5�Ô%ô ),¨M¸7Ö(CÑ$�˜fØ× Ñ  Ñ/@ÀÈÓ/UÕVñ )Dñ  5rB   Úkwargs_namec                 ó   ‡ — ˆ fd„}|S )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                 óF   •‡ — t        j                  ‰ «      ˆ ˆfd„«       }|S )Nc                 óH  •— ddl m} d}|j                  ‰«      }|�G|j                  «       }||‰<   |j	                  dd«      }|s|dk7  rt
        j                  d‰› d�«       |rt        | |«       	  ‰| g|¢­i |¤Ž}||rt        | |«       S S # |rt        | |«       w w xY w)Nr   )ÚUSE_PEFT_BACKENDr?   ÚscalezPassing `scale` via `z1` when not using the PEFT backend is ineffective.)	rS   rž   rŒ   Úcopyrn   ÚloggerÚwarningrA   rH   )	ÚselfÚargsÚkwargsrž   Ú
lora_scaleÚattention_kwargsÚresultÚ
forward_fnrš   s	          €€r=   Úwrapperz4apply_lora_scale.<locals>.decorator.<locals>.wrapper$  sÁ   ø€ å*àˆJØ%Ÿz™z¨+Ó6ÐàÐ+Ø#3×#8Ñ#8Ó#:Ð Ø&6��{Ñ#Ø-×1Ñ1°'¸3Ó?�
á'¨J¸#Ò,=Ü—N‘NØ/°¨}Ð<mÐnôñ
  Ü! $¨
Ô3ð:á# DÐ:¨4Ò:°6Ñ:�Øñ $Ü'¨¨jÕ9ð $øÑ#Ü'¨¨jÕ9ð $ús   Á3B ÂB!)Ú	functoolsÚwraps)r©   rª   rš   s   ` €r=   Ú	decoratorz#apply_lora_scale.<locals>.decorator#  s%   ù€ Ü	�‰˜Ó	$ô	:ó 
%ð	:ð: ˆrB   rL   )rš   r­   s   ` r=   Úapply_lora_scaler®     s   ø€ ôðB ÐrB   Úmin_versionÚreturnc                 óÞ   — t        «       st        d«      ‚t        j                  t        j
                  j                  d«      «      t        j                  | «      kD  }|st        d| › �«      ‚y)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·   G  sl   € ô ÔÜÐ[Ó\Ð\ä!(§¡¬y×/AÑ/A×/IÑ/IÈ&Ó/QÓ!RÔU\×UbÑUbÐcnÓUoÑ!oÐá%ÜðØ �Mð#ó
ð 	
ð &rB   c                 ó  — ddl m} |�|}nt        ||| |||¬«      }t        |«       d|v r|d   rt	        dd«      rt        d«      ‚d|v r|d   rt	        d	d
«      rt        d«      ‚	  |di |¤ŽS # t        $ r}	t        d«      |	‚d }	~	ww xY w)Nr   )Ú
LoraConfig)rr   rs   rt   ru   rG   ra   Ú<z0.9.0z,DoRA requires PEFT >= 0.9.0. Please upgrade.rb   z<=z0.13.2z2lora_bias requires PEFT >= 0.14.0. Please upgrade.z-`LoraConfig` class could not be instantiated.rL   )r²   r¹   rx   Ú%_maybe_raise_error_for_ambiguous_keysr   r†   Ú	TypeError)
Ú
state_dictÚnetwork_alphasrµ   Úrank_pattern_dictrt   ru   rG   r¹   rw   Úes
             r=   Ú_create_lora_configrÁ   [  sÀ   € õ  àÐØ%Ñä,ØØ-Ø&ØØ-Ø%ô
Ðô *Ð*<Ô=ð Ð'Ñ'Ð,>¸zÒ,JÜ˜3 Ô(ÜÐKÓLÐLàÐ(Ñ(Ð-?ÀÒ-LÜ˜4 Ô*ÜÐQÓRÐRðPÙÑ/Ð.Ñ/Ð/øÜò PÜÐGÓHÈaÐOûðPús   Á)A1 Á1	BÁ:BÂBc                 ó  — | d   j                  «       }| d   }t        |j                  «       «      D ]N  }|D �cg c]
  }||k(  sŒ	|‘Œ }}|D �cg c]  }||v sŒ||k7  sŒ|‘Œ }}|sŒ5|sŒ8t        dd«      sŒEt	        d«      ‚ y c c}w c c}w )Nr^   r`   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   ro   r   r†   )Úconfigr^   r`   r4   ÚmodÚexact_matchesÚsubstring_matchess          r=   r»   r»   }  s¢   € Ø˜.Ñ)×.Ñ.Ó0€LØÐ,Ñ-€Nä�L×%Ñ%Ó'Ö(ˆñ )7ÓE© ¸#À»*š¨ˆÐEÙ,:ÓX©N S¸cÀSºjÈSÐTWËZšS¨NÐÐXâÒ.Ü˜s HÕ-Ü ð Qóð ñ )ùò FùÚXs   ¹
BÁBÁ	B	ÁB	ÁB	c                 óR  — d}| ��t        | dd «      }|r0|D �cg c]  }d|v sŒ||v sŒ|‘Œ }}|rddj                  |«      › d�}t        | dd «      }|r3|D �cg c]  }d|v sŒ||v sŒ|‘Œ }}|r|ddj                  |«      › d	�z  }|rt        j                  |«       y y c c}w c c}w )
NrS   Ú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: rR   )r‡   rl   r¡   r¢   )Úincompatible_keysrG   Úwarn_msgrÈ   rY   Úlora_unexpected_keysrÊ   Úlora_missing_keyss           r=   Ú_maybe_warn_for_unhandled_keysrÏ   ‘  sê   € Ø€HØÐ$ä!Ð"3Ð5FÈÓMˆÙÙ/>Ó#e©¨!À'ÈQÂ,ÐS_ÐcdÒSd¢A¨Ð Ð#eÙ#ðØŸ	™	Ð"6Ó7Ð8¸ð<ð ô Ð0°.À$ÓGˆÙÙ,8Ó _©L q¸GÀqºLÈ\Ð]^ÒM^¢¨LÐÐ _Ù ØðØŸ	™	Ð"3Ó4Ð5°Qð8ñ�ñ
 Ü�‰�xÕ ð ùò# $fùò !`s!   ˜	B¢B§BÁ	B$Á!B$Á&B$)N)TNN)T)Újoint_attention_kwargs)!Ú__doc__re   r«   r´   Ú	packagingr   rS   r   Úimport_utilsr   r   r   Útorch_utilsr	   Ú
get_loggerÚ__name__r¡   r!   r    rA   ÚfloatrH   rx   r|   r�   rˆ   r™   Ústrr®   r·   rÁ   r»   rÏ   rL   rB   r=   Ú<module>rÙ      s¸   ðñó Û Û å å ß PÑ PÝ +ð 
ˆ×	Ñ	˜HÓ	%€áÔÛòDòN'ñ(8 u¨t¡|ó 8ð8 gkó/òdó	6ò0ò,Wñ@. #ó .ðb
 Cð 
¨Dó 
ð* ptóPòDó(!rB   