
    +jO                        d dl Z d dlZd dlZd dlZ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 ddlmZ dd	lmZ d
 Z G d de j        j                  Z G d d          Z G d de          Z G d d          Z G d d          Z G d de          Z G d d          Z G d d          Z G d d          ZdS )    N)CheckpointLoaderSimple)DFloat11Modelcompress_model   )DFloat11ModelPatcher)decompress_state_dict_func_map)DFloat11FluxDiffusersModel)!convert_diffusers_to_comfyui_flux)MODEL_TO_PATTERN_DICTc                 >    d |                                  D             S )Nc                 (   i | ]\  }}t          |                    d           |                    d          |                    d          |                    d          |                    d          |                    d          f          ||S )sign_mantissaencoded_exponentlutsgapsoutput_positionssplit_positions)anyendswith).0keytensors      \/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-DFloat11-Extended/dfloat11_model_loader.py
<dictcomp>z$filter_df11_keys.<locals>.<dictcomp>   s"     |  |  |KCS#,,WfJgJgiliuiu  wI  jJ  jJ  LO  LX  LX  Y_  L`  L`  be  bn  bn  ou  bv  bv  x{  xD  xD  EW  xX  xX  Z]  Zf  Zf  gx  Zy  Zy  Jz  F{  F{  |C  |  |  |    )items)
state_dicts    r   filter_df11_keysr      s4     |  |:+;+;+=+=  |  |  |  |r   c                   H    e Zd Z G d dej        j        j                  ZdS )disable_weight_init_df11c                         e Zd Zd fd	Z xZS )disable_weight_init_df11.LinearTNc                 ~    t          t          j        j        j        |                               |||||           d S N)supercomfyopsdisable_weight_initLinear__init__)selfin_featuresout_featuresbiasdevicedtype	__class__s         r   r*   z(disable_weight_init_df11.Linear.__init__   s:    %)/6==FF{T`bfhnpuvvvFr   )TNN)__name__
__module____qualname__r*   __classcell__)r1   s   @r   r)   r"      s=        	 	 	 	 	 	 	 	 	 	r   r)   N)r2   r3   r4   r&   r'   r(   r)    r   r   r    r       sF            .5     r   r    c                   <    e Zd ZdZ	 ed             ZdZdZdZd Z	dS )DFloat11ModelLoaderAdvanced
    A custom node to load a DFloat11 diffusion model from the `diffusion_models` directory.

    DFloat11 models are >30% smaller than their float16 counterparts, yet produce bit-for-bit identical outputs.
    c           
      n    dt          j        d          fddddfdddd	d
ddfddddfddgdddfdiS )Nrequireddiffusion_modelsBOOLEANFzWhether to offload to CPU RAM)defaulttooltipINTr   i  r   z4If set to 0, all blocks will be offloaded to CPU RAM)r>   minmaxstepr?   TzWhether to lock/pin the weights to CPU RAM. Enabling this option increases RAM usage (which might cause OOM), but should increase speed
custom_opsload_state_dictzStrategy for compatibility with `dynamic_vram`, if it is enabled. `custom_ops` is better since it causes a smaller spike in RAM usage)dfloat11_model_namecpu_offloadcpu_offload_blocks
pin_memorydynamic_vram_compatibilityfolder_pathsget_filename_listclss    r   INPUT_TYPESz'DFloat11ModelLoaderAdvanced.INPUT_TYPES$   s     (4(FGY(Z(Z'\ )uIh+i+ij',!Ac[\  j`  /a  /a  'b(d  HQ  +R  +R  S0<>O/P^j  x  S@  S@  /A 
 	
r   MODELload_dfloat11_model_advancedDFloat11c           	         |sd}d}t          j        d|          }t          j                            |          }t          d |                                D                       st          d| d          t          j        	                                }t          j        
                                }	i }
d|v rd|v sd	|v rd |
d
<   d|v r	d|vrd |
d<   d|v r'd|v r#|d                                         dk    rd |
d<   d|v r#|d                                         dk    rd |
d<   d|v rEd|v r@|d                                         dk    rmt          j        ddgd          |
d<   t          j        ddgd          |
d<   t          j        ddgd          |
d<   t          j        ddgd          |
d<   n|d                                         d k    rmt          j        d!d"gd          |
d<   t          j        d#d"gd          |
d<   t          j        ddgd          |
d<   t          j        ddgd          |
d<   n*t          d$|d                                                    t          j        j                            ||
z  d%          }|Di }
d&|v rd |
d'<   d |
d(<   t          j        j                            ||
z  d%          }|
J d)            t%          |          j        }|d*k    r8|j                            d+d,          r|j                            d-d,          rd.}t          j        j        r|d/k    rt0          |_        |                    t          j        t          j                   |                    |d%          }t          j        j        s|                    |	          }t          j        j        r0|d0k    r*|j                            tA          |          d,d,1           tC          j"        |tF          |         |j        |	||dk    r|nd |2           tI          |||	3          fS )4Nr   Tr<   c              3   @   K   | ]}|                     d           V  dS r   Nr   r   ks     r   	<genexpr>zKDFloat11ModelLoaderAdvanced.load_dfloat11_model_advanced.<locals>.<genexpr><   /      MMa1::011MMMMMMr   The model '' is not a DFloat11 model.z&double_blocks.0.img_mlp.gate_proj.biasztxt_norm.scaleztxt_norm.weightz(double_blocks.0.img_mlp.gate_proj.weightz.double_stream_modulation_img.lin.sign_mantissaz'double_stream_modulation_img.lin.weightz adaLN_modulation.1.sign_mantissaztime_embedding.sign_mantissazlayers.0.sign_mantissai   zlayers.0.mlp.linear_fc2.weightz-transformer_blocks.0.attn.norm_added_q.weight@   z&transformer_blocks.0.img_mlp.w1.weightz5encoder.lyric_encoder.layers.0.input_layernorm.weightzdecoder.layers.0.sign_mantissai  i   i   metar/   z%decoder.layers.0.mlp.gate_proj.weightz(decoder.layers.0.self_attn.q_proj.weightz6encoder.lyric_encoder.layers.0.self_attn.q_proj.weightz3encoder.lyric_encoder.layers.0.mlp.gate_proj.weighti  i &  i 
     z1Detected Ace-Step-v1.5 model, but unsure of size  z"llm_adapter.blocks.0.sign_mantissaz-llm_adapter.blocks.0.cross_attn.q_proj.weightzblocks.0.mlp.layer1.weightzUnable to detect model typeFluxSchnellyak_mlpFtxt_norm	OvisImagerD   rE   )strictassign)pattern_dictbfloat16_modelr/   rG   rH   rI   load_deviceoffload_device)%rL   get_full_path_or_raiser&   utilsload_torch_filer   keys
ValueErrormodel_managementget_torch_deviceunet_offload_devicenumeltorchempty	Exceptionsdmodel_detectionmodel_config_from_unettyper2   unet_configgetmemory_managementaimdo_enabledr    custom_operationsset_inference_dtypebfloat16	get_modeltodiffusion_modelrE   r   r   from_single_filer   r   )r+   rF   rG   rH   rI   rJ   dfloat11_model_pathr   rm   rn   missing_keysmodel_config	df11_typemodels                 r   rS   z8DFloat11ModelLoaderAdvanced.load_dfloat11_model_advanced4   s    	!"J*ABTVijj[001DEE
MM:??;L;LMMMMM 	\Z+>ZZZ[[[,==??/CCEE 3zAAGW[eGeGeiz  I  jI  jIGKLCD;zIINw  @J  OJ  OJFJLBC-;;@^bl@l@lq{  }U  rV  r\  r\  r^  r^  bk  rk  rk=AL9::jHHZ  YH  NI  NO  NO  NQ  NQ  UW  NW  NWEILABBjPPUu  zD  VD  VD:;AACCxOOHMUY[_T`ioHpHpHpDEKP;X\^bWclrKsKsKsGHY^Ydfjlpeq  {A  ZB  ZB  ZBUVV[Vacgimbnw}V~V~V~RSS<=CCEERRHMUY[_T`ioHpHpHpDEKP;X\^bWclrKsKsKsGHY^Ydfjlpeq  {A  ZB  ZB  ZBUVV[Vacgimbnw}V~V~V~RSS    !KT^_  UA  UG  UG  UI  UI  !K  !K  L  L  L x/FFzT`G`bdeeL3zAAPTLM :>L56 83JJ:XdKdfhiiL++-J+++&&/	%%,*B*F*FyRW*X*X%]i]u]y]y  {E  GL  ^M  ^M%#I"0 	F5OS_5_5_-EL*((HHH&&z266&4 	-HH^,,E"0 	l5OSd5d5d!112B:2N2NW\ej1kkk&.y9 0!#5G!5K5K11QU!	
 	
 	
 	
 !KP^___
 	
r   N)
r2   r3   r4   __doc__classmethodrP   RETURN_TYPESFUNCTIONCATEGORYrS   r6   r   r   r8   r8      sc          	
 	
 [	
 L-HH^
 ^
 ^
 ^
 ^
r   r8   c                   2    e Zd ZdZed             ZdZd ZdS )DFloat11ModelLoaderr9   c                 4    ddt          j        d          fiiS )Nr;   rF   r<   rK   rN   s    r   rP   zDFloat11ModelLoader.INPUT_TYPES   s*     %(FGY(Z(Z'\
 	
r   load_dfloat11_modelc                 6    |                      |dddd          S )NFr   TrD   )rG   rH   rI   rJ   )rS   )r+   rF   s     r   r   z'DFloat11ModelLoader.load_dfloat11_model   s7    001DTYpq  AE  dp0  q  q  	qr   N)r2   r3   r4   r   r   rP   r   r   r6   r   r   r   r      sT          
 
 [
 %Hq q q q qr   r   c                   6    e Zd Zed             ZdZdZdZd ZdS )DFloat11Decompressorc                 D    dt          j        d          fddgfg dfdiS )Nr;   r<   zFlux.2-Klein-4BzFlux.2-Klein-9B)r>   
fp8_e4m3fnfp8_e4m3fn_fastfp8_e5m2)rF   decompress_recipeweight_dtyperK   rN   s    r   rP   z DFloat11Decompressor.INPUT_TYPES   sE     (4(FGY(Z(Z'\'8:K&L%N!Y!Y!Y [ 
 	
r   rQ   decompress_dfloat11_modelrT   c                    t          j        d|          }t          j                            |          }t          d |                                D                       st          d| d          t          |         |          }i }|dk    rt          j
        |d<   n0|dk    rt          j
        |d<   d|d	<   n|d
k    rt          j        |d<   t          j                            ||          }|fS )Nr<   c              3   @   K   | ]}|                     d           V  dS rW   rX   rY   s     r   r[   zADFloat11Decompressor.decompress_dfloat11_model.<locals>.<genexpr>   s/      RRa1::011RRRRRRr   r]   r^   r   r0   r   Tfp8_optimizationsr   )model_options)rL   ro   r&   rp   rq   r   rr   rs   r   rx   float8_e4m3fnfloat8_e5m2r{   load_diffusion_model_state_dict)	r+   rF   r   r   r   df11_state_dictreconstructed_state_dictr   model_patchers	            r   r   z.DFloat11Decompressor.decompress_dfloat11_model   s   *ABTVijj+556IJJRR?;O;O;Q;QRRRRR 	\Z+>ZZZ[[[#ABS#TUd#e#e <''%*%8M'""...%*%8M'"15M-..Z''%*%6M'"@@AYiv@wwr   N)	r2   r3   r4   r   rP   r   r   r   r   r6   r   r   r   r      sM        
 
 [
 L*HH         r   r   c                   6    e Zd Zed             ZdZdZdZd ZdS )DFloat11LoadingPatchc                 2    ddddifg dfdddd	d
d
ddfdiS )Nr;   rR   r?   z$The model to display information for)v1zv1.5v2FLOATg      ?g        g      $@g{Gz?z9The multiplier to scale ComfyUI's memory usage estimation)r>   rA   rB   rC   roundr?   )r   load_versionmemory_usage_factor_scaler6   rN   s    r   rP   z DFloat11LoadingPatch.INPUT_TYPES   s^     ")I7]+^!_!5!5!5 7.53s[_hlw{  ID  8E  8E  .F 
 	
r   rQ   patch_loading_methodsrT   c                     |                                 }|                    |           |j        j        xj        |z  c_        |j        j        j        |j        _        |fS r$   )cloner   r   r   memory_usage_factor)r+   r   r   r   new_model_patchers        r   r   z*DFloat11LoadingPatch.patch_loading_methods   sa    )//11//===,@@D]]@@6G6M6Z6n3!##r   N)	r2   r3   r4   r   rP   r   r   r   r   r6   r   r   r   r      sM        
 
 [
 L&HH	$ 	$ 	$ 	$ 	$r   r   c                   6    e Zd Zed             ZdZdZdZd ZdS )CheckpointLoaderWithDFloat11c                 h    dt          j        d          ddift          j        d          ddifdiS )Nr;   checkpointsr?   +The name of the checkpoint (model) to load.r<   z#The diffusion model in DF11 format.)	ckpt_namerF   rK   )ss    r   rP   z(CheckpointLoaderWithDFloat11.INPUT_TYPES   se     *<]KKi  ZG  NH  I(4(FGY(Z(Z]f  iN  ]O  (P 
 	
r   load_checkpoint_with_df11rT   z;Loads a diffusion model checkpoint, along with a DF11 unet.c                    t          j        d|          }t          j                            |ddt          j        d                    }|^}}}}t          j        d|          }	t          j                            |	          }
t          d |
	                                D                       st          d| d          t          j                                        }t          j                                        }t          |j                  j        }t#          |j        ||	          }~t%          j        |	t(          |         |j        j        |
           |||fS )Nr   T
embeddings)
output_vaeoutput_clipembedding_directoryr<   c              3   @   K   | ]}|                     d           V  dS rW   rX   rY   s     r   r[   zICheckpointLoaderWithDFloat11.load_checkpoint_with_df11.<locals>.<genexpr>   r\   r   r]   r^   rl   rj   rk   r/   )rL   ro   r&   r{   load_checkpoint_guess_configget_folder_pathsrp   rq   r   rr   rs   rt   ru   rv   r~   r   r2   r   r   r   r   r   )r+   r   rF   	ckpt_pathoutr   clipvae_r   r   rm   rn   r   df11_model_patchers                  r   r   z6CheckpointLoaderWithDFloat11.load_checkpoint_with_df11   sy    7yQQ	h33I$\`  wC  wT  Ua  wb  wb3  c  c'*$tS1*ABTVijj[001DEE
MM:??;L;LMMMMM 	\Z+>ZZZ[[[,==??/CCEE,--6	1#)
 
 
 &.y9-3C!		
 	
 	
 	
 #D#..r   N)	r2   r3   r4   r   rP   r   r   DESCRIPTIONr   r6   r   r   r   r      sM        
 
 [
 +HHOK/ / / / /r   r   c                   :    e Zd ZdZed             ZdZdZdZd Z	dS )DFloat11DiffusersModelLoaderz
    A custom node to load a diffusers-native DFloat11 diffusion model from the `diffusion_models` directory.

    DFloat11 models are >30% smaller than their float16 counterparts, yet produce bit-for-bit identical outputs.
    c                 :    dt          j        d          fdgfdiS )Nr;   r<   Flux)rF   
model_typerK   rN   s    r   rP   z(DFloat11DiffusersModelLoader.INPUT_TYPES"  s4     (4(FGY(Z(Z'\ &yl 
 	
r   rQ   r   rT   c                 @   t          j        d|          }t          j                            |          }t          d |                                D                       st          d| d          t          j        	                                }t          j        
                                }i dddg dd	d
dddddddddg dddddddddddddd d!dd"d#d$d#i}d%|v |d!<   t          j                            |          }|                    t          j        t          j                   |                    |d&          }	|	                    |          }	t%          j        |t(          |         |	j        |'           t-          |	||(          fS ))Nr<   c              3   @   K   | ]}|                     d           V  dS rW   rX   rY   s     r   r[   zCDFloat11DiffusersModelLoader.load_dfloat11_model.<locals>.<genexpr>5  r\   r   r]   r^   image_modelfluxaxes_dim)   8   r   	num_heads   	mlp_ratiog      @thetai'  out_channelsr   qkv_biasTtxt_ids_dimsin_channelshidden_sizei   context_in_dimrb   
patch_size   
vec_in_dimi   depth   depth_single_blocks&   guidance_embedre   Frf   z1time_text_embed.guidance_embedder.linear_1.weightrc   r   rl   )rL   ro   r&   rp   rq   r   rr   rs   rt   ru   rv   supported_modelsr   r   rx   r   r   r   r	   r   r   r   r   )
r+   rF   r   r   r   rm   rn   r   r   r   s
             r   r   z0DFloat11DiffusersModelLoader.load_dfloat11_model/  s7   *ABTVijj [001DEE
MM:??;L;LMMMMM 	\Z+>ZZZ[[[,==??/CCEE
6

 
 	

 U
 B
 
 B
 2
 4
 d
 !
 #
 R
 "2
  d!
" u#
$ %
 
* )\_i(i$%-22;??((HHH&&z266(("3.z: 0!		
 	
 	
 	
 !KP^___
 	
r   N)
r2   r3   r4   r   r   rP   r   r   r   r   r6   r   r   r   r     sY          
 
 [
 L$HH1
 1
 1
 1
 1
r   r   c                   :    e Zd ZdZed             ZdZdZdZd Z	dS )DFloat11ModelCompressorz
    A custom node to compress a DFloat11 diffusion model from the `diffusion_models` directory.

    DFloat11 models are >30% smaller than their float16 counterparts, yet produce bit-for-bit identical outputs.
    c                 t    dt          j        d          ft          t          j                              fdiS )Nr;   r<   )bfloat16_model_namer   rL   rM   listr   rr   rN   s    r   rP   z#DFloat11ModelCompressor.INPUT_TYPESi  sE     (4(FGY(Z(Z'\#$9$>$@$@AAC 
 	
r   STRINGload_bfloat16_modelrT   c                 .   t          j        d|          }t          j                            |dt
          j        i          }t          j        	                    |          d          d}t          |j        j        t          |         |ddd           |fS )Nr<   r0   r   -DF11Tr   i  r   rj   	save_pathsave_single_filecheck_correctnessblock_range)rL   ro   r&   r{   load_diffusion_modelrx   r   ospathsplitextr   r   r   r   )r+   r   r   bfloat16_model_pathr   r   s         r   r   z+DFloat11ModelCompressor.load_bfloat16_modelv  s    *ABTVijj--.AGenC]^^w''(;<<Q?FFF	+-.z: "#!	
 	
 	
 	
 |r   N)
r2   r3   r4   r   r   rP   r   r   r   r   r6   r   r   r   r   b  sY          
 
 [
 L$HH    r   r   c                   :    e Zd ZdZed             ZdZdZdZd Z	dS )DFloat11CheckpointCompressorz
    A custom node to compress a DFloat11 diffusion model (unet only) from the `checkpoints` directory.

    DFloat11 models are >30% smaller than their float16 counterparts, yet produce bit-for-bit identical outputs.
    c                 z    dt          j        d          ddift          t          j                              fdiS )Nr;   r   r?   r   )r   r   r   rN   s    r   rP   z(DFloat11CheckpointCompressor.INPUT_TYPES  sW     *<]KKi  ZG  NH  I#$9$>$@$@AAC 
 	
r   r   load_bfloat16_checkpointrT   c                    t          j        d|          }t          j                            |d          \  }}t          j                            |          }t          j                            ||          }t          j                            ||          }t          j	        
                                }	t          j	                                        }
t          j                            |||          }|                    ||           t          |j                  }t          j	                            |||          }t          j	                            ||          }|                    |||          }|                    ||           t          j                            ||	|
          }|j        j        }t0          j                            |          d          d	}t7          |t8          |         |ddd
           |fS )Nr   T)return_metadata)metadata)model_paramssupported_dtypesr   ra   rl   r   r   r   r   )rL   ro   r&   rp   rq   r|   unet_prefix_from_state_dictcalculate_parametersr   rt   ru   rv   r}   r   r   supported_inference_dtypes
unet_dtypeunet_inital_load_devicer   load_model_weightsr   ModelPatcherr   r   r  r  r  r   r   )r+   r   r   r   r   r  diffusion_model_prefix
parametersr   rm   rn   r   unet_weight_dtyper  inital_load_devicer   r   r   r   s                      r   r
  z5DFloat11CheckpointCompressor.load_bfloat16_checkpoint  s    7yQQ	${::9VZ:[[
H!&!6!R!RS]!^!^[55jBXYY
{//
<RSS,==??/CCEE,CCJPfqyCzz((|DDD !HII+66Jar  BN6  O  O
"3KKJXbcc&&z3IRd&ee  -CDDD+88Khv8ww'-=w''	2215<<<	!.z:!" 	
 	
 	
 	
 |r   N)
r2   r3   r4   r   r   rP   r   r   r   r
  r6   r   r   r  r    sY          
 
 [
 L)HH& & & & &r   r  )r&   rL   rx   r  nodesr   dfloat11r   r   dfloat11_customr   dfloat11_decompressr   dfloat11_diffusersr	   convert_fixed_tensorsr
   rj   r   r   r'   r(   r    r8   r   r   r   r   r   r   r  r6   r   r   <module>r!     s^         				 ( ( ( ( ( ( 2 2 2 2 2 2 2 2 1 1 1 1 1 1 ? ? ? ? ? ? : : : : : : D D D D D D / / / / / /| | |    uy<   {
 {
 {
 {
 {
 {
 {
 {
zq q q q q5 q q q*#  #  #  #  #  #  #  # N$ $ $ $ $ $ $ $6,/ ,/ ,/ ,/ ,/#9 ,/ ,/ ,/`E
 E
 E
 E
 E
 E
 E
 E
N# # # # # # # #L: : : : : : : : : :r   