
    
3j0                     h   S SK Jr  S SKrS SKrS SKrSSKJr  SSKJrJ	r	  SSKJ
r  / SQSS	S
S.S.r\R                  \R                  \R                  1r\R                  \R                  \R"                  1r\R                  \R                  \R                  \R"                  1r " S S5      r\/rg)    )PathN   )log)	Operation	Precision)
output_dir)zembedding_manager.embedder.lora_te_text_modelzcontrol_model.z3cond_stage_model.transformer.text_model.embeddings.z0cond_stage_model.transformer.text_model.encoder.z9cond_stage_model.transformer.text_model.final_layer_norm.)z(cond_stage_model.transformer.embeddings.z%cond_stage_model.transformer.encoder.z.cond_stage_model.transformer.final_layer_norm.)known_junk_prefixnai_keysc                      \ rS rSr\S 5       rSrSrSrSr	S\
R                  S\4S	 jrS
\\\
R                  4   S-  4S jrS\\\
R                  4   4S jrS
\\\
R                  4   S-  4S jrS rS\\\\\
R                  4   4   4S jrSSSS.S\S\S\S\S\S\S\S\S\S\S\S\\\
R                  4   S-  S
\\\
R                  4   S-  S\\\
R                  4   S-  4S  jjrSrg)!MTB_ModelPruner   c                    SSSS.SSS04SSS	04SSS
04SSS
04SSS04[         R                  " 5       S[         R                  R                  04[        R                  " 5       S[        R
                  R                  04[         R                  " 5       S[         R                  R                  04[        R                  " 5       S[        R
                  R                  04[         R                  " 5       S[         R                  R                  04[        R                  " 5       S[        R
                  R                  04S.S.$ )N)MODEL)CLIP)VAEunetclipvaeBOOLEANdefaultFSTRINGzcheckpoints/ComfyUIT)disabled
remove_emaema_onlyr   )save_separatelysave_folderfix_clipremove_junkema_modeprecision_unetoperation_unetprecision_clipoperation_clipprecision_vaeoperation_vae)optionalrequired)r   list_membersFULLvaluer   CONVERT)clss    B/home/wildlama/comfy/ComfyUI/custom_nodes/comfy_mtb/nodes/prune.pyINPUT_TYPESMTB_ModelPruner.INPUT_TYPES   sL    #! %.	5/A#B (96K*LM&D(9: )It+<=:-
 **,	 4 45#
 **,	 1 1 7 78#
 **,	 4 45#
 **,	 1 1 7 78#
 **,	 4 45"
 **,	 1 1 7 78";!(
 (	
    T z	mtb/pruneprunetensor	precisionc                    [         R                  " U5      n[        R                  " SU 35        U=[         R                  :X  aZ    UR
                  [        ;   a  UR                  [        R                  5      $ [        R                  " SUR
                   S35        U$ =[         R                  :X  aK    UR
                  [        ;   a  UR                  5       $ [        R                  " SUR
                   S35        U$ =[         R                  :X  aK    UR
                  [        ;   a  UR!                  5       $ [        R                  " SUR
                   S35        U$ =[         R"                  :X  a    U$ =[         R$                  :X  a    U$   g )NzConverting to zCannot convert z to fp8z to f16z to bf16)r   from_strr   debugFP8dtypedtypes_to_fp8totorchfloat8_e4m3fnerrorFP16dtypes_to_fp16halfBF16dtypes_to_bf16bfloat16r+   FP32)selfr5   r6   s      r/   convert_precision!MTB_ModelPruner.convert_precisionP   s   &&y1			N9+./<<=0!99U%8%899		OFLL>AB<<>1!;;=(		OFLL>AB<<>1!??,,		OFLL>BC0 #1)..0 1r2   r   Nc                 8    U(       a  [        S U 5       5      4$ g)Nc              3   B   #    U  H  oR                  S 5      v   M     g7f)conditioner.embeddersN
startswith.0ks     r/   	<genexpr>0MTB_ModelPruner.is_sdxl_model.<locals>.<genexpr>h   s     Lt!%<==t   Fany)rH   r   s     r/   is_sdxl_modelMTB_ModelPruner.is_sdxl_modelf   s    LtLLNNr2   r   c                 &    [        S U 5       5      $ )Nc              3   B   #    U  H  oR                  S 5      v   M     g7f)	model_emaNrN   rP   s     r/   rS   *MTB_ModelPruner.has_ema.<locals>.<genexpr>l   s     ;d<<,,drU   rV   )rH   r   s     r/   has_emaMTB_ModelPruner.has_emak   s    ;d;;;r2   c                    U R                  U5      (       a  [        R                  " S5        g Uc  g SnX!;   a  [        R                  " [        [        S5      5      /5      R                  [        R                  5      nX   R                  [        R                  5      nUR                  U5      n[        S5       Vs/ s H  oeS   U   (       d  M  UPM     nn[        U5      S:w  a  X1U'   [        R                  " SU 35        U$ [        R                  " S5         U$ [        R                  " S5        [        R                  " [        [        S5      5      /5      R                  [        R                  5      X'   U$ s  snf )Nz[fix clip] SDXL not supportedz?cond_stage_model.transformer.text_model.embeddings.position_idsM   r   z[Converter] Fixed broken clip
z6[Converter] Clip in this model is fine, skip fixing...z7[Converter] Missing position id in model, try fixing...)rX   r   warnr>   Tensorlistranger=   int64neleninfo)rH   r   position_id_keycorrectnowbrokenis          r/   r   MTB_ModelPruner.fix_clipn   s:   d##HH45< N 	 "llDrO#4588EG'**5;;7CZZ_F!&r;AQilaF;6{a(/_%:6(CD  L 	 HHNO$)LL$uRy/1B$C$F$F%D!  <s   >FFc                    UR                  5       nUR                  R                  XCR                  5       S 5      nUR                  5        VVs0 s H  u  pgUR	                  S5      (       d  M  Xg_M!     nnnUR                  5        VVs0 s H5  u  pgUR	                  S5      (       d  UR	                  S5      (       d  M3  Xg_M7     nnnUR                  5        VVs0 s H  u  pgUR	                  S5      (       d  M  Xg_M!     nnnUR                  5        VVs0 s H  u  pgXa;  d  M  Xc;  d  M  Xb;  d  M  Xg_M     nnnXX84$ s  snnf s  snnf s  snnf s  snnf )Nzmodel.diffusion_modelcond_stage_modelrM   first_stage_model)get_sdmodelstate_dict_for_savingitemsrO   )	rH   r   r   r   clip_sd
state_dictrR   vothers	            r/   	get_dictsMTB_ModelPruner.get_dicts   sa   ++-ZZ55ZZ\4

 #((*
*||34 AD* 	 
 #((*
*||.//||34 AD* 	 
 #((*
*||/0 AD* 	 
 #((*
*} !" 23- AD* 	 
 C''/




s<   E.E
2E EE<EE'E.E5Etensorsc           	         / nU HU  nU HL  n[         S    H<  nUR                  U5      (       d  M  UR                  SR                  X4/5      5        M>     MN     MW     U H  n[        R
                  " SU 35        X	 M      U$ )Nr
   .zRemoving junk data: )
PRUNE_DATArO   appendjoinr   ri   )rH   r}   need_deletelayerkeyjkrR   s          r/   do_remove_junkMTB_ModelPruner.do_remove_junk   s    !#E$%89B~~b))#**388UL+AB :   AHH+A3/0
  r2   r   r   r   r   r    r!   r"   r$   r&   r#   r%   r'   r   c          
        ^ ^"^#^$ [         R                  " U	5      [         R                  " U
5      [         R                  " U5      S.m#[        R                  " U5      [        R                  " U5      [        R                  " U5      S.m$T R                  XU5      u  pp[	        U5      nUR
                  nUR                  5       (       d  [        U-  R
                  nUR                  5       (       dI  UR
                  R                  5       (       a  UR                  5         O[        SUR
                   S35      eUR                  nU SU 3nUS:w  a  USU 3-  nU(       a  US-  n[        S T#R                  5        5       5      (       aD  [        S T$R                  5        5       5      (       a  [        R                  S	:  a  [!        S
5      eT R#                  U5      (       d  XU4 H  nU(       d  M  [$        S   n['        UR)                  5       5       Hu  nU Hl  n[+        U[,        5      (       d  M  UR/                  U5      (       d  M2  UR1                  UUU   5      nUU   UU'   UU	 [2        R4                  " SU 35          Ms     Mw     M     U(       a  T R7                  U5      n0 0 0 S.m"S[,        S[,        S[        R8                  4U"U#U$U 4S jjn[2        R4                  " S5        [;        / SQXU/SS9 GH  u  nnU(       d  M  U=S:X  aB    [<        R<                  " UR?                  5       5       H  u  nnSU;  d  M  U" UUU5        M     O=S:X  a    T RA                  U5      (       d  [2        RB                  " S5          g [<        R<                  " U5       H^  nSn SUSS  R1                  SS5      -   nUU;   a  U" UUUU   5        M3  UR/                  S5      (       a  US;   d  MQ  U" UUUU   5        M`     O?=S:X  a     [<        R<                  " UR?                  5       5       H  u  nnU" UUU5        M     U(       d  GMP  U(       a  T RG                  T"5      m"T"R?                  5        VVVVs0 s H$  u  nnUR?                  5         H	  u  nnUU_M     M&     nnnnnUU SU S3-  RI                  5       n [J        R                  RM                  UU 5        0 0 0 S.m"GM     U(       a  gU(       a  T RG                  T"5      m"T"R?                  5        VVVVs0 s H$  u  nnUR?                  5         H	  u  nnUU_M     M&     nnnnn [J        R                  RM                  UUU S3-  RI                  5       5        g! [D         a     GNf = fs  snnnnf s  snnnnf ! [D         a   n![2        RN                  " U!5         S n!A!gS n!A!ff = f) Nr   zFolder z does not exist-r   z	-clip-fixc              3   F   #    U  H  o[         R                  :H  v   M     g 7fN)r   r-   )rQ   os     r/   rS   (MTB_ModelPruner.prune.<locals>.<genexpr>   s     C0B1Y&&&0B   !c              3   F   #    U  H  o[         R                  :H  v   M     g 7fr   )r   r:   )rQ   ps     r/   rS   r      s     C0B1&0Br   z2.1.0z5PyTorch 2.1.0 or newer is required for fp8 conversionr   z$[Converter] Fixed novelai error key partwktc                   > [        U[        R                  5      (       d  [        R                  " S5        g [        R                  " STU     35        TU    [
        R                  :X  a  TR                  UTU    5      TU    U'   g TU    [
        R                  :X  a	  UTU    U'   g TU    [
        R                  :X  a  g g )Nz Not a torch tensor, skipping keyz
Operation )

isinstancer>   rc   r   r9   r   r-   rI   COPYDELETE)r   r   r   ok	operationr6   rH   s      r/   _hf"MTB_ModelPruner.prune.<locals>._hf  s    a..		<=II
9T?"345)"3"33#55y 4 4INN2 44I$4$44 5r2   z[Converter] Converting model...)r   r   r   rz   F)strictr   z
model_ema.r   zNo EMA to extract___   r    )zmodel_ema.num_updateszmodel_ema.decayz.safetensorsr3   )(r   r8   r   r{   r   parentis_absolutecomfy_out_direxistsmkdirFileNotFoundErrornamerW   valuesr>   __version__NotImplementedErrorrX   r   rd   keysr   strrO   replacer   ri   r   rc   ziptqdmrv   r^   rb   	Exceptionr   as_posixsafetensors	save_filer@   )%rH   r   r   r   r    r!   r"   r$   r&   r#   r%   r'   r   r   r   _otherout_dirfolderr   	save_namer   r   rR   rnew_keyr   	part_namery   ema_k_subdictflat_ok	save_pather   r   r6   s%   `                                 @@@r/   r4   MTB_ModelPruner.prune   s?   & &&~6&&~6%%m4
	 &&~6&&~6%%m4
	 #'..S"AC{#""$$#k199F}}}}##%%'fmm_O<  ||fAn-.	z!1XJ'I$I C	0@0@0BCCCC	0@0@0BCCC!!G+%G  !!$''D)4)*5H!$))+.!)A)!S11all1oo*+))Ax{*C04QW$(G #&J1#$N!" !& "* / * }}T* 2
	c 	s 	u|| 	 	 	23", 
OIt
 t%$(IIdjjl$;DAq+14 #Iq! 4 %< $#||D11HH%89"!%4A$)E%(4qu}}S"7M(M  %} #Iq$u+ >%&\\,%?%?1 I D !$Iq$q' : "1 $$(IIdjjl$;DAq	1a0 %< #?"!004 +-((**4JAw$+MMODAq 1$3 *4   I;a	{,!GGhj   %%//C " "!>B[ 
f $$R(B $&88:
#-ZQ'--/$!QAqD/A: 	 
	''&i[#==GGI c $- % $%"*
  	IIaLL	s6   *V=+V&+V%
4V- 
VV-
W7WW)__name__
__module____qualname____firstlineno__classmethodr0   OUTPUT_NODERETURN_TYPESCATEGORYFUNCTIONr>   rc   r   rI   dictr   rX   r^   r   r{   r   boolr4   __static_attributes__r3   r2   r/   r   r      s   )
 )
V KLHH  ,$sELL'8"9D"@ 
<Dell!23 <T#u||"34t; B(>d3S%,,5F0G+G&H 8 04/3.2!i i 	i
 i i i "i "i !i i i i 3$%,i 3$%,i  #u||#$t+!i ir2   r   )pathlibr   safetensors.torchr   r>   r   r   utilsr   r   r   r   r   float32float64rF   rB   float16rE   r<   r   	__nodes__r3   r2   r/   <module>r      s         ( / 5j1c:u
 --?-->u~~u}}MG GT
 	r2   