
    biU                         d dl mZ ddlmZm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
       r	  ej                  e      Z G d d	      Zy
)    )nullcontext   )ImageProjectionMultiIPAdapterImageProjection)load_model_dict_into_meta)_LOW_CPU_MEM_USAGE_DEFAULT)is_accelerate_availableis_torch_versionlogging)empty_device_cachec                   .    e Zd ZdZefdZefdZefdZy)FluxTransformer2DLoadersMixinz8
    Load layers into a [`FluxTransformer2DModel`].
    c                 v   |r(t               rddlm} nd}t        j	                  d       |du rt        dd      st        d      i }d }|rnt        }d	|v rd
}|d	   j                  d   dk(  rd}|d	   j                  d   }|d	   j                  d   |z  }	 |       5  t        |	||      }d d d        |j                         D ]  \  }
}|
j                  dd      }|||<    |s|j                  |d       |S d| j                  i}t        |||| j                         t!                |S # 1 sw Y   xY w)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
```
.T>=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         )cross_attention_dimimage_embed_dimnum_image_text_embedsprojimage_embeds)strict 
device_mapdtype)r	   
accelerater   loggerwarningr
   NotImplementedErrorr   shaper   itemsreplaceload_state_dictdevicer   r$   r   )self
state_dictlow_cpu_mem_usager   updated_state_dictimage_projectioninit_contextr   clip_embeddings_dimr   keyvaluediffusers_namer#   s                 ]/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/diffusers/loaders/transformer_flux.py+_convert_ip_adapter_image_proj_to_diffuserszIFluxTransformer2DLoadersMixin._convert_ip_adapter_image_proj_to_diffusers%   s   &(9 %*!2 $-=dG-L%. 
  ->)KJ&$%!-(..q1U:(*%",]";"A"A""E",]";"A"A!"DH]"] #2(;$7*?$  )..0 ;
U!$V^!D5:">2; !,,-?,M  	 dkk*J%&68JWaimisist % s   D//D8c           
      b   ddl m} |r(t               rddlm} nd}t
        j                  d       |du rt        dd	      st        d
      i }d}|rnt        }| j                  j                         D ]  }|j                  d      r$| j                  |   j                  }	 |	       ||<   9| j                  j                  }
| j                   }|}	g }|D ],  }d|d   v sd}|d   d   j"                  d   dk(  rd}||gz  }.  |       5   |	||
d|| j$                  | j&                        ||<   d d d        i }t)        |      D ]  \  }}|j+                  d| d|d   | d   i       |j+                  d| d|d   | d   i       |j+                  d| d|d   | d   i       |j+                  d| d|d   | d   i        |s||   j-                  |       n,d| j&                  i}| j$                  }t/        ||   |||       |dz  } t1                |S # 1 sw Y   xY w)Nr   )FluxIPAdapterAttnProcessorr   r   Fr   Tr   r   r   single_transformer_blocksr   
image_projr   r   r   g      ?)hidden_sizer   scale
num_tokensr$   r-   zto_k_ip.z.weight
ip_adapterz.to_k_ip.weightzto_v_ip.z.to_v_ip.weightz.biasz.to_k_ip.biasz.to_v_ip.biasr!   r"      )$models.transformers.transformer_fluxr;   r	   r%   r   r&   r'   r
   r(   r   attn_processorskeys
startswith	__class__configjoint_attention_dim	inner_dimr)   r$   r-   	enumerateupdater,   r   r   )r.   state_dictsr0   r;   r   
attn_procskey_idr3   nameattn_processor_classr   r>   r   r/   num_image_text_embed
value_dictir#   r$   s                      r8   %_convert_ip_adapter_attn_to_diffuserszCFluxTransformer2DLoadersMixin._convert_ip_adapter_attn_to_diffusersY   s   U&(9 %*!2 $-=dG-L%.  
->)K((--/ )	D:;'+';';D'A'K'K$#7#9
4 &*kk&E&E#"nn'A$(*%"- HJ$
<(@@/0,%l3MBHHKuT350-2F1GG-H "^ ';$/,?!#8"jj#{{(Jt$  
%.{%; qMAz%%!G'<j>VZ`YaapWq>r&st%%!G'<j>VZ`YaapWq>r&st%%!E':J|<TX^W__lUm<n&op%%!E':J|<TX^W__lUm<n&op	q )t$44Z@"$dkk!2J JJE-j.>
Waino!S)	V 	9 s   &H%%H.	c                 "   t        |t              s|g}d | _        | j                  ||      }| j	                  |       g }|D ])  }| j                  |d   |      }|j                  |       + t        |      | _        d| j                  _	        y )N)r0   r=   ip_image_proj)

isinstancelistencoder_hid_projrU   set_attn_processorr9   appendr   rH   encoder_hid_dim_type)r.   rM   r0   rN   image_projection_layersr/   image_projection_layers          r8   _load_ip_adapter_weightsz6FluxTransformer2DLoadersMixin._load_ip_adapter_weights   s    +t,&-K $??_p?q

+"$% 	CJ%)%U%U<(<M &V &" $**+AB		C !>>U V+:(    N)__name__
__module____qualname____doc__r   r9   rU   r`    ra   r8   r   r       s.     Ys 2 h Tn GR Ga ;ra   r   N)
contextlibr   models.embeddingsr   r   models.model_loading_utilsr   models.modeling_utilsr   utilsr	   r
   r   utils.torch_utilsr   
get_loggerrb   r&   r   rf   ra   r8   <module>rn      sJ    # C > F F 2 			H	%S; S;ra   