o
    GiӲ                     @   s2  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlm  mZ d dlmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0 ddlm1Z1 e'2e3Z4dZ5dZ6G dd dZ7dS )    N)defaultdict)nullcontext)Path)Callable)validate_hf_hub_args   )ImageProjectionIPAdapterFaceIDImageProjection"IPAdapterFaceIDPlusImageProjectionIPAdapterFullImageProjectionIPAdapterPlusImageProjectionMultiIPAdapterImageProjection)load_model_dict_into_meta)_LOW_CPU_MEM_USAGE_DEFAULTload_state_dict)
USE_PEFT_BACKEND_get_model_fileconvert_unet_state_dict_to_peft	deprecateget_adapter_nameget_peft_kwargsis_accelerate_availableis_peft_versionis_torch_versionlogging)empty_device_cache   #_func_optionally_disable_offloading)LORA_WEIGHT_NAMELORA_WEIGHT_NAME_SAFETEXT_ENCODER_NAME	UNET_NAME)AttnProcsLayersz$pytorch_custom_diffusion_weights.binz,pytorch_custom_diffusion_weights.safetensorsc                   @   s   e Zd ZdZeZeZede	e
e	ejf B fddZdd Zdd Zed	d
 Z				dde	ejB dede	dedef
ddZdd ZefddZefddZefddZdd ZdS )UNet2DConditionLoadersMixinz:
    Load LoRA layers into a [`UNet2DCondtionModel`].
    %pretrained_model_name_or_path_or_dictc                 K   s  ddl m} |dd}|dd}|dd}|dd}|d	d}|d
d}	|dd}
|dd}|dd}|dd}|dd}|dd}|dt}d}|ratddratd|du rid}d}ddd}d}t|ts|r{|du s|dur|drzt	||pt
||||||	|
|d
}tjj|dd}W n ty } z
|s|W Y d}~nd}~ww |du rt	||pt||||||	|
|d
}t|}n|}tdd | D }tdd | D }d}d}d}|rd }td!d"| |r| j|d#}n|r| j|| j||||d$\}}}nt| d%|r8|dur8| j|d&\}}}| | | j| j| jd' |rA|  dS |rJ|  dS |rb|j  D ]}t|tj!j"r`|| qRdS dS )(a  
        Load pretrained attention processor layers into [`UNet2DConditionModel`]. Attention processor layers have to be
        defined in
        [`attention_processor.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py)
        and be a `torch.nn.Module` class. Currently supported: LoRA, Custom Diffusion. For LoRA, one must install
        `peft`: `pip install -U peft`.

        Parameters:
            pretrained_model_name_or_path_or_dict (`str` or `os.PathLike` or `dict`):
                Can be either:

                    - A string, the model id (for example `google/ddpm-celebahq-256`) of a pretrained model hosted on
                      the Hub.
                    - A path to a directory (for example `./my_model_directory`) containing the model weights saved
                      with [`ModelMixin.save_pretrained`].
                    - A [torch state
                      dict](https://pytorch.org/tutorials/beginner/saving_loading_models.html#what-is-a-state-dict).

            cache_dir (`str | os.PathLike`, *optional*):
                Path to a directory where a downloaded pretrained model configuration is cached if the standard cache
                is not used.
            force_download (`bool`, *optional*, defaults to `False`):
                Whether or not to force the (re-)download of the model weights and configuration files, overriding the
                cached versions if they exist.

            proxies (`dict[str, str]`, *optional*):
                A dictionary of proxy servers to use by protocol or endpoint, for example, `{'http': 'foo.bar:3128',
                'http://hostname': 'foo.bar:4012'}`. The proxies are used on each request.
            local_files_only (`bool`, *optional*, defaults to `False`):
                Whether to only load local model weights and configuration files or not. If set to `True`, the model
                won't be downloaded from the Hub.
            token (`str` or *bool*, *optional*):
                The token to use as HTTP bearer authorization for remote files. If `True`, the token generated from
                `diffusers-cli login` (stored in `~/.huggingface`) is used.
            revision (`str`, *optional*, defaults to `"main"`):
                The specific model version to use. It can be a branch name, a tag name, a commit id, or any identifier
                allowed by Git.
            subfolder (`str`, *optional*, defaults to `""`):
                The subfolder location of a model file within a larger model repository on the Hub or locally.
            network_alphas (`dict[str, float]`):
                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. Refer to [this
                link](https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning).
            adapter_name (`str`, *optional*, defaults to None):
                Adapter name to be used for referencing the loaded adapter model. If not specified, it will use
                `default_{i}` where i is the total number of adapters being loaded.
            weight_name (`str`, *optional*, defaults to None):
                Name of the serialized state dict file.
            low_cpu_mem_usage (`bool`, *optional*):
                Speed up model loading by only loading the pretrained LoRA weights and not initializing the random
                weights.

        Example:

        ```py
        from diffusers import AutoPipelineForText2Image
        import torch

        pipeline = AutoPipelineForText2Image.from_pretrained(
            "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
        ).to("cuda")
        pipeline.unet.load_attn_procs(
            "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
        )
        ```
        r   )*_maybe_remove_and_reapply_group_offloading	cache_dirNforce_downloadFproxieslocal_files_onlytokenrevision	subfolderweight_nameuse_safetensorsadapter_name	_pipelinenetwork_alphaslow_cpu_mem_usage<=z0.13.0zq`low_cpu_mem_usage=True` is not compatible with this `peft` version. Please update it with `pip install -U peft`.Tattn_procs_weightspytorch)	file_type	frameworkz.safetensors)	weights_namer'   r(   r)   r*   r+   r,   r-   
user_agentcpu)devicec                 s       | ]}d |v V  qdS )custom_diffusionN .0kr?   r?   J/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/loaders/unet.py	<genexpr>       z>UNet2DConditionLoadersMixin.load_attn_procs.<locals>.<genexpr>c                 s   s"    | ]}d |v p| dV  qdS )loraz.alphaN)endswithr@   r?   r?   rC   rD      s     zUsing the `load_attn_procs()` method has been deprecated and will be removed in a future version. Please use `load_lora_adapter()`.load_attn_procs0.40.0)
state_dict)rJ   unet_identifier_keyr2   r0   r1   r3   zQ does not seem to be in the correct format expected by Custom Diffusion training.r1   dtyper<   )#hooks.group_offloadingr&   popr   r   
ValueError
isinstancedictrG   r   r    safetensorstorch	load_fileIOErrorr   r   anykeysallr   _process_custom_diffusion_process_lora	unet_name_optionally_disable_offloadingset_attn_processortorN   r<   enable_model_cpu_offloadenable_sequential_cpu_offload
componentsvaluesnnModule)selfr%   kwargsr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   allow_pickler:   
model_filerJ   eis_custom_diffusionis_lorais_model_cpu_offloadis_sequential_cpu_offloadis_group_offloaddeprecation_messageattn_processors	componentr?   r?   rC   rH   D   s   D

		
z+UNet2DConditionLoadersMixin.load_attn_procsc                 C   s@  ddl m} i }tt}| D ]L\}}t|dkri ||< qd|v r=d|dd d d|ddd  }}nd|dd d d|ddd  }}||| |< q| D ]<\}}	t|	dkrv|ddd d d	||< qa|	d
 jd }
|	d
 jd }d|	v rdnd}|d|||
d	||< || 	|	 qa|S )Nr   )CustomDiffusionAttnProcessorr   to_out.F)train_kvtrain_q_outhidden_sizecross_attention_dimzto_k_custom_diffusion.weightr   zto_q_custom_diffusion.weightT)
models.attention_processorrt   r   rS   itemslenjoinsplitshaper   )rg   rJ   rt   rr   custom_diffusion_grouped_dictkeyvalueattn_processor_keysub_key
value_dictr|   r{   rz   r?   r?   rC   r[     s4   
42
z5UNet2DConditionLoadersMixin._process_custom_diffusionc                    s  t stdddlm}m}m}	 t| }
fdd|
D fdd| D }|d urFfdd| D fd	d| D }d
}d
}d
}t	|dkrT|n|}t	|dkrS t
| di v rmtd  dt|}|d uryt|}i }| D ]\}}d|v r|jd ||< qt|||dd}d|v r|d rtddrtdn
tddr|d d|v r|d rtddrtdn
tddr|d |d(i |} d u rt|  | |\}}}i }tddr||d< ||| fd i| |	| | fi |}d}|d urKt
|dd }|r+ fd d|D }|r+d!d"| d#}t
|d$d }|rK fd%d|D }|rK|d&d"| d'7 }|rSt| |||fS ))Nz)PEFT backend is required for this method.r   )
LoraConfiginject_adapter_in_modelset_peft_model_state_dictc                       g | ]	}|  r|qS r?   
startswithr@   rK   r?   rC   
<listcomp>4      z=UNet2DConditionLoadersMixin._process_lora.<locals>.<listcomp>c                    s,   i | ]\}}|v r|   d d|qS rv    replacerA   rB   v)rK   	unet_keysr?   rC   
<dictcomp>5      &z=UNet2DConditionLoadersMixin._process_lora.<locals>.<dictcomp>c                    r   r?   r   r@   r   r?   rC   r   :  r   c                    s,   i | ]\}}| v r|  d d|qS r   r   r   )
alpha_keysrK   r?   rC   r   ;  r   Fpeft_configzAdapter name z? already in use in the Unet - please select a new adapter name.lora_Br   T)is_unetuse_dora<z0.9.0zeYou need `peft` 0.9.0 at least to use DoRA-enabled LoRAs. Please upgrade your installation of `peft`.	lora_biasr4   z0.13.2zcYou need `peft` 0.14.0 at least to use `bias` in LoRAs. Please upgrade your installation of `peft`.>=z0.13.1r3   r0   r   unexpected_keysc                        g | ]}d |v r |v r|qS lora_r?   r@   r0   r?   rC   r          zSLoading adapter weights from state_dict led to unexpected keys found in the model: z, z. missing_keysc                    r   r   r?   r@   r   r?   rC   r     r   zJLoading adapter weights from state_dict led to missing keys in the model: rv   r?   )r   rQ   peftr   r   r   listrY   r~   r   getattrr   r   r   r   rP   r   r^   r   loggerwarning)rg   rJ   rK   r2   r0   r1   r3   r   r   r   rY   unet_state_dictrn   ro   rp   state_dict_to_be_usedrankr   vallora_config_kwargslora_configpeft_kwargsincompatible_keyswarn_msgr   lora_unexpected_keysr   lora_missing_keysr?   )r0   r   rK   r   rC   r\   #  s   












z)UNet2DConditionLoadersMixin._process_lorac                 C   s
   t |dS )NrL   r   )clsr1   r?   r?   rC   r^     s   
z:UNet2DConditionLoadersMixin._optionally_disable_offloadingTNsave_directoryis_main_processr.   save_functionsafe_serializationc                    s`  ddl m mm tj|rtd| d dS t	 fdd| j
 D }|rZ|  }|du rY|rYdd	 | D }	t|	d
krPtd|	   dd	 | D }nd}
tdd|
 tshtdd
dlm} || }|du r|r}dd }ntj}tj|dd |du r|r|rtnt}n|rtnt}t|| }||| td|  dS )az  
        Save attention processor layers to a directory so that it can be reloaded with the
        [`~loaders.UNet2DConditionLoadersMixin.load_attn_procs`] method.

        Arguments:
            save_directory (`str` or `os.PathLike`):
                Directory to save an attention processor to (will be created if it doesn't exist).
            is_main_process (`bool`, *optional*, defaults to `True`):
                Whether the process calling this is the main process or not. Useful during distributed training and you
                need to call this function on all processes. In this case, set `is_main_process=True` only on the main
                process to avoid race conditions.
            save_function (`Callable`):
                The function to use to save the state dictionary. Useful during distributed training when you need to
                replace `torch.save` with another method. Can be configured with the environment variable
                `DIFFUSERS_SAVE_MODE`.
            safe_serialization (`bool`, *optional*, defaults to `True`):
                Whether to save the model using `safetensors` or with `pickle`.

        Example:

        ```py
        import torch
        from diffusers import DiffusionPipeline

        pipeline = DiffusionPipeline.from_pretrained(
            "CompVis/stable-diffusion-v1-4",
            torch_dtype=torch.float16,
        ).to("cuda")
        pipeline.unet.load_attn_procs("path-to-save-model", weight_name="pytorch_custom_diffusion_weights.bin")
        pipeline.unet.save_attn_procs("path-to-save-model", weight_name="pytorch_custom_diffusion_weights.bin")
        ```
        r   rt   CustomDiffusionAttnProcessor2_0$CustomDiffusionXFormersAttnProcessorzProvided path (z#) should be a directory, not a fileNc                 3   s$    | ]\}}t | fV  qd S )NrR   )rA   _xr   r?   rC   rD     s    
z>UNet2DConditionLoadersMixin.save_attn_procs.<locals>.<genexpr>c                 S   s"   i | ]\}}t |tjs||qS r?   rR   rU   Tensorr   r?   r?   rC   r        " z?UNet2DConditionLoadersMixin.save_attn_procs.<locals>.<dictcomp>r   zfSafetensors does not support saving dicts with non-tensor values. The following keys will be ignored: c                 S   s"   i | ]\}}t |tjr||qS r?   r   r   r?   r?   rC   r     r   zUsing the `save_attn_procs()` method has been deprecated and will be removed in a future version. Please use `save_lora_adapter()`.save_attn_procsrI   zOPEFT backend is required for saving LoRAs using the `save_attn_procs()` method.)get_peft_model_state_dictc                 S   s   t jj| |ddidS )Nformatpt)metadata)rT   rU   	save_file)weightsfilenamer?   r?   rC   r     s   zBUNet2DConditionLoadersMixin.save_attn_procs.<locals>.save_functionT)exist_okzModel weights saved in )r}   rt   r   r   ospathisfiler   errorrX   rr   r~    _get_custom_diffusion_state_dictr   r   rY   r   r   rQ   
peft.utilsr   rU   savemakedirs!CUSTOM_DIFFUSION_WEIGHT_NAME_SAFEr    CUSTOM_DIFFUSION_WEIGHT_NAMEr   r   as_posixinfo)rg   r   r   r.   r   r   rh   rl   rJ   empty_state_dictrq   r   	save_pathr?   r   rC   r     sJ   )

z+UNet2DConditionLoadersMixin.save_attn_procsc                    sl   ddl m mm t fdd| j D }| }| j D ]\}}t| dkr3i ||< q#|S )Nr   r   c                    s&   i | ]\}}t | fr||qS r?   r   )rA   yr   r   r?   rC   r     s    zPUNet2DConditionLoadersMixin._get_custom_diffusion_state_dict.<locals>.<dictcomp>r   )	r}   rt   r   r   r#   rr   r~   rJ   r   )rg   model_to_saverJ   nameattnr?   r   rC   r     s   z<UNet2DConditionLoadersMixin._get_custom_diffusion_state_dictc                 C   s  |rt  rddlm} nd}td |du r tdds tdi }d }|r(|nt}d	|v rod
}|d	 jd }|d	 jd d
 }	|  t	|	||d}W d    n1 sUw   Y  |
 D ]\}
}|
dd}|||< q^nLd|v r|d jd }|d jd }	|  t|	|d}W d    n1 sw   Y  |
 D ]\}
}|
dd}|dd}|dd}|||< qn d|v r|d jd }|d jd }|d jd }|d jd }|d jd d }|  t|||||d}W d    n1 sw   Y  |
 D ]\}
}|
dd}|d d!}|d"d#}|d$d%}|d&d'}|d(d)}|d*d+}|d,d-}|d.d/}|d0d1}|d2d3}|d4d5}|d6d7}|d8d9}|d:d;}|d<d=}|d>d?}|d@dA}|dBdC}|dDdE}|dFdG}|dHdI}dJ|v r|||dKdL< qdM|v r|||dNdO< qdP|v r|jdQddR}|d ||dPdS< |d ||dPdT< qdU|v r|||dUdV< qd|kr||dW< qdX|kr||dY< qdZ|kr||d[< qd\|kr	||d]< q|||< qnd^|v rr|d jd }|d jd }|| }d^}|| jd }	|dZ jd |	 }|  t|	|||d_}W d    n	1 sQw   Y  |
 D ]\}
}|
dd}|dd}|||< qZnI|d` jd }|da jd }|db jd }|d` jdQ }tdcdd |D }|r|de jd d n|df jd d }|  t|||||dg}W d    n	1 sw   Y  |
 D ]\}
}|
d dh}|didj}|dkdl}|dmdn}|dodp}|dqdr}|dsdt}|dudv}|dwdx}dP|v r7|dy}dz|dQ< dy|}|jdQddR}|d ||dPdS< |d ||dPdT< qd{|v rP|dy}dz|dQ< dy|}|||< qdU|v rm|dy}dz|dQ< dy|}|||dUdV< q|d|d}}|d~d}|dd}|dd}|dd}|dd}|dd}|dd}|dd}|dd}|dd}|dd}|||< q|s|j|dd |S d| ji}t|||| jd t  |S )Nr   init_empty_weightsF,  Cannot initialize model with low cpu memory usage because `accelerate` was not found in the environment. Defaulting to `low_cpu_mem_usage=False`. It is strongly recommended to install `accelerate` for faster and less memory-intense model loading. You can do so with: 
```
pip install accelerate
```
.Tr   1.9.0~Low memory initialization requires torch >= 1.9.0. Please either update your PyTorch version or set `low_cpu_mem_usage=False`.proj.weight   )r|   image_embed_dimnum_image_text_embedsprojimage_embedsproj.3.weightzproj.0.weight)r|   r   zproj.0zff.net.0.projzproj.2zff.net.2zproj.3norm"perceiver_resampler.proj_in.weightr   z#perceiver_resampler.proj_out.weightz*perceiver_resampler.layers.0.0.to_q.weight@   )
embed_dimsoutput_dimshidden_dimsheadsid_embeddings_dimzperceiver_resampler.r   z0.tozattn.toz0.1.0.z0.ff.0.z0.1.1.weightz0.ff.1.net.0.proj.weightz0.1.3.weightz0.ff.1.net.2.weightz1.1.0.z1.ff.0.z1.1.1.weightz1.ff.1.net.0.proj.weightz1.1.3.weightz1.ff.1.net.2.weightz2.1.0.z2.ff.0.z2.1.1.weightz2.ff.1.net.0.proj.weightz2.1.3.weightz2.ff.1.net.2.weightz3.1.0.z3.ff.0.z3.1.1.weightz3.ff.1.net.0.proj.weightz3.1.3.weightz3.ff.1.net.2.weightz
layers.0.0zlayers.0.ln0z
layers.0.1zlayers.0.ln1z
layers.1.0zlayers.1.ln0z
layers.1.1zlayers.1.ln1z
layers.2.0zlayers.2.ln0z
layers.2.1zlayers.2.ln1z
layers.3.0zlayers.3.ln0z
layers.3.1zlayers.3.ln1norm1z0.norm10norm2z0.norm21to_kvr   )dimto_kto_vru   zto_out.0zproj.net.0.proj.weightzproj.0.biaszproj.net.0.proj.biaszproj.2.weightzproj.net.2.weightzproj.2.biaszproj.net.2.biasnorm.weight)r|   r   mult
num_tokenslatentszproj_in.weightzproj_out.weightc                 s   r=   )r   Nr?   r@   r?   r?   rC   rD     rE   zZUNet2DConditionLoadersMixin._convert_ip_adapter_image_proj_to_diffusers.<locals>.<genexpr>zlayers.0.attn.to_q.weightzlayers.0.0.to_q.weight)r   r   r   r   num_queriesz2.toz	0.0.norm1z0.ln0z	0.0.norm2z0.ln1z	1.0.norm1z1.ln0z	1.0.norm2z1.ln1z	2.0.norm1z2.ln0z	2.0.norm2z2.ln1z	3.0.norm1z3.ln0z	3.0.norm2z3.ln1rv   r   to_qz0.1.0z0.ff.0z0.1.1z0.ff.1.net.0.projz0.1.3z0.ff.1.net.2z1.1.0z1.ff.0z1.1.1z1.ff.1.net.0.projz1.1.3z1.ff.1.net.2z2.1.0z2.ff.0z2.1.1z2.ff.1.net.0.projz2.1.3z2.ff.1.net.2z3.1.0z3.ff.0z3.1.1z3.ff.1.net.0.projz3.1.3z3.ff.1.net.2)strict
device_maprN   )r   
accelerater   r   r   r   NotImplementedErrorr   r   r   r~   r   r   r
   chunkr	   rX   r   r   r   r   r<   r   rN   r   )rg   rJ   r3   r   updated_state_dictimage_projectioninit_contextr   clip_embeddings_dimr|   r   r   diffusers_namer   r   r   r   r   v_chunkid_embeddings_dim_inid_embeddings_dim_out
multiplier
norm_layerr  attn_key_presentpartsr  r?   r?   rC   +_convert_ip_adapter_image_proj_to_diffusers  st  


	








-	









zGUNet2DConditionLoadersMixin._convert_ip_adapter_image_proj_to_diffusersc              	   C   s  ddl m}m}m} |rt rddlm} nd}td |du r*t	dd	s*t
d
i }d}|r2|nt}	| j D ].}
|
drCd n| jj}|
drS| jjd }n+|
drkt|
td }tt| jj| }n|
dr~t|
td }| jj| }|d u sd|
v r| j|
 j}| ||
< q9dt| j|
 jv r|}n	ttdr|n|}g }|D ]>}d|d v r|dg7 }qd|d v r|dg7 }qd|d v r|dg7 }qd|d v r|dg7 }q||d d jd g7 }q|	  |||d|d||
< W d    n	1 sw   Y  i }t|D ])\}}|d | d!|d" | d# i |d$| d!|d" | d% i q|sD||
 | n tt |! j"}tt |! j#}d&|i}t$||
 |||d' |d7 }q9t%  |S )(Nr   )IPAdapterAttnProcessorIPAdapterAttnProcessor2_0IPAdapterXFormersAttnProcessorr   r   Fr   Tr   r   r   r   zattn1.processor	mid_blockr   	up_blocksz
up_blocks.down_blockszdown_blocks.motion_modulesXFormersscaled_dot_product_attentionr   
image_projr   r   i  r   r   r  g      ?)r{   r|   scaler  zto_k_ip.z.weight
ip_adapterz.to_k_ip.weightzto_v_ip.z.to_v_ip.weightr   r  )&r}   r  r  r  r   r	  r   r   r   r   r
  r   rr   rY   rG   configr|   r   block_out_channelsintr   r   reversed	__class__strhasattrFr   	enumerateupdater   nextiterrd   r<   rN   r   r   )rg   state_dictsr3   r  r  r  r   
attn_procskey_idr  r   r|   r{   block_idattn_processor_classr   rJ   r   ir<   rN   r  r?   r?   rC   %_convert_ip_adapter_attn_to_diffusers  s   


$(
zAUNet2DConditionLoadersMixin._convert_ip_adapter_attn_to_diffusersc                 C   s   t |ts|g}| jd ur| jjdkrt| ds| j| _d | _| j||d}| | g }|D ]}| j	|d |d}|
| q/t|| _d| j_| j| j| jd d S )N	text_projtext_encoder_hid_proj)r3   r"  ip_image_projrM   )rR   r   encoder_hid_projr%  encoder_hid_dim_typer+  r9  r7  r_   r  appendr   r`   rN   r<   )rg   r1  r3   r2  image_projection_layersrJ   image_projection_layerr?   r?   rC   _load_ip_adapter_weights\  s&   



z4UNet2DConditionLoadersMixin._load_ip_adapter_weightsc                 C   s  i }t | j D ]\}}t |D ]\}}| d|d v r||vr&i ||< || d| d|d | d i || d| d|d | d i || d| d|d | d i || d| d|d | d i || d| d|d | d i || d| d|d | d i || d| d	|d | d	 i || d| d
|d | d
 i qq	|S )Nz.to_k_lora.down.weightr$  zunet.z.to_q_lora.down.weightz.to_v_lora.down.weightz.to_out_lora.down.weightz.to_k_lora.up.weightz.to_q_lora.up.weightz.to_v_lora.up.weightz.to_out_lora.up.weight)r-  rr   rY   r.  )rg   r1  
lora_dictsr3  r   r6  rJ   r?   r?   rC   _load_ip_adapter_loras|  s`   0z2UNet2DConditionLoadersMixin._load_ip_adapter_loras)TNNT)__name__
__module____qualname____doc__r!   text_encoder_namer"   r]   r   r*  rS   rU   r   rH   r[   r\   classmethodr^   r   PathLikeboolr   r   r   r   r  r7  r@  rB  r?   r?   r?   rC   r$   <   s@     ="u

f \b r$   )8r   collectionsr   
contextlibr   pathlibr   typingr   rT   rU   torch.nn.functionalre   
functionalr,  huggingface_hub.utilsr   models.embeddingsr   r	   r
   r   r   r   models.model_loading_utilsr   models.modeling_utilsr   r   utilsr   r   r   r   r   r   r   r   r   r   utils.torch_utilsr   	lora_baser   lora_pipeliner   r    r!   r"   r#   
get_loggerrC  r   r   r   r$   r?   r?   r?   rC   <module>   s*    0
