
    +j8                        d dl Z d dlmZ d dlmZ d dlZd dlZd dl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mZmZmZmZmZmZmZmZmZmZmZ  edd          rd d	l m!Z! nd d	l"m!Z!  e            r	d dl#m$c m%Z& dd
l'm(Z( ddl)m*Z*  e(e+          Z,	 	 	 dde-de.e/         de.de.de.de0de0dee!         de1de1fdZ2	 	 	 ddZ3dde0de1fdZ4d de0fdZ5dS )!    N)Path)Optional)
load_model   )
MODEL_NAMEOPTIMIZER_NAMERNG_STATE_NAMESAFE_MODEL_NAMESAFE_WEIGHTS_NAMESAMPLER_NAMESCALER_NAMESCHEDULER_NAMEWEIGHTS_NAMEget_pretty_nameis_cuda_availableis_hpu_availableis_mlu_availableis_musa_availableis_neuron_availableis_sdaa_availableis_torch_versionis_torch_xla_availableis_xpu_availableloadsavez>=z2.4.0)
GradScaler)
get_logger)PartialStateFT
output_dirmodel_states
optimizers
schedulersdataloadersprocess_indexstepscalersave_on_each_nodesafe_serializationc
                 
   t          |           } t          |          D ]z\  }
}|	st          nt          }|
dk    r|                    dd|
 d          }|                     |          }t          ||||	           t                              d|            {t          |          D ]{\  }
}|	                                }|
dk    r
t           dnt           d|
 d}|                     |          }t          |||d           t                              d|            |t          |          D ]{\  }
}|	                                }|
dk    r
t           dnt           d|
 d}|                     |          }t          |||d           t                              d	|            |t          |          D ]	\  }
}|
dk    r
t           dnt           d|
 d}|                     |          }d
dlm}m} t!          |j        |          r7|                                }t!          ||          rt          |||d           t'          |dd          rL|
dk    rdnd|
 d}|                     |          }|	                                }t)          j        ||           t                              d|
 d|            |`|	                                }|                     t*                    }t)          j        ||           t                              d|            i }t,           d| d}||d<   t/          j                    |d<   t2          j                                        |d<   t)          j                    |d<   t9                      r!t(          j                                        |d<   t?                      r"t(          j                                         |d<   n_tC                      r"t(          j"                                        |d<   n/tG                      r!t(          j$                                        |d<   tK                      r!t(          j&                                        |d<   tO                      r!t(          j(                                        |d<   tS                      r!t(          j*                                        |d<   tW                      rtY          j                    |d<   |                     |          } t)          j        ||            t                              d |             | S )!aw  
    Saves the current states of the models, optimizers, scaler, and RNG generators to a given directory.

    <Tip>

    If `safe_serialization` is `True`, models will be saved with `safetensors` while the rest are saved using native
    `pickle`.

    </Tip>

    Args:
        output_dir (`str` or `os.PathLike`):
            The name of the folder to save all relevant weights and states.
        model_states (`List[torch.nn.Module]`):
            A list of model states
        optimizers (`List[torch.optim.Optimizer]`):
            A list of optimizer instances
        schedulers (`List[torch.optim.lr_scheduler._LRScheduler]`):
            A list of learning rate schedulers
        dataloaders (`List[torch.utils.data.DataLoader]`):
            A list of dataloader instances to save their sampler states
        process_index (`int`):
            The current process index in the Accelerator state
        step (`int`):
            The current step in the internal step tracker
        scaler (`torch.amp.GradScaler`, *optional*):
            An optional gradient scaler instance to save;
        save_on_each_node (`bool`, *optional*):
            Whether to save on every node, or only the main node.
        safe_serialization (`bool`, *optional*, defaults to `True`):
            Whether to save the model using `safetensors` or the traditional PyTorch way (that uses `pickle`).
    r   ._)r'   r(   zModel weights saved in .binFzOptimizer state saved in zScheduler state saved in r   IterableDatasetShardSeedableRandomSampleruse_stateful_dataloaderdl_state_dict.bindl_state_dict_zSampler state for dataloader z
 saved in NzGradient scaler state saved in .pklr%   random_statenumpy_random_seedtorch_manual_seedtorch_xpu_manual_seedtorch_mlu_manual_seedtorch_sdaa_manual_seedtorch_musa_manual_seedtorch_hpu_manual_seedtorch_neuron_manual_seedtorch_cuda_manual_seedxm_seedzRandom states saved in )-r   	enumerater   r   replacejoinpathr   loggerinfo
state_dictr   r   r   data_loaderr.   r/   
isinstancedatasetget_samplergetattrtorchr   r	   randomgetstatenp	get_stateget_rng_stater   xpuget_rng_state_allr   mlur   sdaar   musar   hpur   neuronr   cudar   xm)!r   r    r!   r"   r#   r$   r%   r&   r'   r(   istateweights_nameoutput_model_fileoptoptimizer_nameoutput_optimizer_file	schedulerscheduler_nameoutput_scheduler_file
dataloadersampler_nameoutput_sampler_filer.   r/   samplerdataloader_state_dict_name!output_dataloader_state_dict_filerD   output_scaler_filestatesstates_nameoutput_states_files!                                    [/home/wildlama/comfy/ComfyUI/.venv/lib/python3.11/site-packages/accelerate/checkpointing.pysave_accelerator_statern   ?   s   X j!!Jl++ C C5+=T||CTq55'//XXXX>>L&//==U%9J_qrrrrA.?AABBBBJ'' I I3  45FFN0000>@[@[TU@[@[@[ * 3 3N C CU)=NchiiiiG0EGGHHHH!*-- I I9$$&&45FFN0000>@[@[TU@[@[@[ * 3 3N C CU)=NchiiiiG0EGGHHHH";// X X:01Q,,,,,|<U<Ua<U<U<U(11,??LLLLLLLLj(*>?? 	r ,,..G'#899 rW1EVkpqqqq:8%@@ 	F@AQ)<)<Ld]^LdLdLd&0:0C0CD^0_0_-#..00JJz#DEEEVAVVATVVWWWW !!##'00==
5,---J6HJJKKKF#99m999KF6N#_..F>"$)"5"5"7"7F"'"5"7"7F H*/)*E*E*G*G&' J*/)*E*E*G*G&''			 J+0:+G+G+I+I'((			 J+0:+G+G+I+I'( H*/)*E*E*G*G&' N-2\-K-K-M-M)* J+0:+G+G+I+I'( /,..y#,,[99	Jv)***
KK>*<>>???    c	                 .   t                      }
|dvrt          d          |d}n|dk    rt                      j        }|i }t	          |           } t          |          D ]\  }}|dk    rd| nd}|                     t           | d	          }|                                rt          ||fd
t          |          i|	 c|                     t           | d          }t          ||          } |j        |fi |	 t                              d           t          |          D ]a\  }}|dk    r
t            dnt            d| d}|                     |          }t          |fd|i|}||                             |           bt                              d           t          |          D ]Y\  }}|dk    r
t"           dnt"           d| d}|                     |          }t          |fi |}|                    |           Zt                              d           t          |          D ]\  }}|dk    r
t$           dnt$           d| d}|                     |          }ddlm}m} t-          |j        |          rF|                                }t-          ||          r"|                    t          |                    }t5          |dd          rY|dk    rdnd| d}|                     |          }|                                r"t          |fi |}|                    |           t                              d           |X|                     t6                    } t          |           }!|                    |!           t                              d           	 t          |                     t8           d| d                    }"d|"v r|"d         |
d<   t;          j        |"d                    t>          j                             |"d                    tC          j"        |"d                    tG                      r%tB          j$        %                    |"d                    tM                      r&tB          j'        %                    |"d                    ntQ                      r&tB          j)        %                    |"d                     ntU                      r&tB          j+        %                    |"d!                    ntY                      r&tB          j-        %                    |"d"                    nYt]                      r&tB          j/        %                    |"d#                    n%tB          j0        %                    |"d$                    tc                      rte          j"        |"d%                    t                              d&           n*# tf          $ r t                              d'           Y nw xY w|
S )(aO  
    Loads states of the models, optimizers, scaler, and RNG generators from a given directory.

    Args:
        input_dir (`str` or `os.PathLike`):
            The name of the folder to load all relevant weights and states.
        models (`List[torch.nn.Module]`):
            A list of model instances
        optimizers (`List[torch.optim.Optimizer]`):
            A list of optimizer instances
        schedulers (`List[torch.optim.lr_scheduler._LRScheduler]`):
            A list of learning rate schedulers
        dataloaders (`List[torch.utils.data.DataLoader]`):
            A list of dataloader instances used in your program
        process_index (`int`):
            The current process index in the Accelerator state
        scaler (`torch.amp.GradScaler`, *optional*):
            An optional *GradScaler* instance to load
        map_location (`str`, *optional*):
            What device to load the optimizer state onto. Should be one of either "cpu" or "on_device".
        load_kwargs (`dict`, *optional*):
            Additional arguments that can be passed to the `load` function.
        load_model_func_kwargs (`dict`, *optional*):
            Additional arguments that can be passed to the model's `load_state_dict` method.

    Returns:
        `dict`: Contains the `Accelerator` attributes to override while loading the state.
    )Ncpu	on_devicezaUnsupported optimizer map location passed, please choose one of `None`, `'cpu'`, or `'on_device'`Nrq   rr   r   r+    z.safetensorsdevicer,   )map_locationz%All model weights loaded successfullyru   z(All optimizer states loaded successfullyz(All scheduler states loaded successfullyr   r-   r0   Fr1   r2   z1All dataloader sampler states loaded successfullyz$GradScaler state loaded successfullyr3   r%   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   z%All random states loaded successfullyzCould not load random states)4dict	TypeErrorr   rt   r   r?   rA   r
   existsr   strr   r   load_state_dictrB   rC   r   r   r   rE   r.   r/   rF   rG   rH   set_samplerrI   r   r	   rK   setstaterM   	set_staterJ   set_rng_stater   rP   set_rng_state_allr   rR   r   rS   r   rT   r   rU   r   rV   rW   r   rX   	Exception)#	input_dirmodelsr!   r"   r#   r$   r&   ru   load_kwargsload_model_func_kwargsoverride_attributesrY   modelendinginput_model_filerD   r]   r^   input_optimizer_fileoptimizer_stater`   ra   input_scheduler_filescheduler_staterc   rd   input_sampler_filer.   r/   rf   rg    input_dataloader_state_dict_fileinput_scaler_filescaler_staterj   s#                                      rm   load_accelerator_stater      s   R &&555o
 
 	
 		$	$#~~,YIf%% 	H 	H5EEQr$--.V&.V.V.VWW""$$ 	Hu.ccs<7H7HcLbcccc  )11Z2M2M2M2MNN.\JJJJ!E!*GG0FGGGG
KK7888 J'' 7 7345FFN0000>@[@[TU@[@[@[(11.AA3^^,^R]^^1%%o6666
KK:;;; "*-- 3 3945FFN0000>@[@[TU@[@[@[(11.AA3CC{CC!!/2222
KK:;;;";// 7 7:01Q,,,,,|<U<Ua<U<U<U&//==LLLLLLLLj(*>?? 	K ,,..G'#899 K$006H1I1IJJ:8%@@ 	7@AQ)<)<Ld]^LdLdLd&/8/A/AB\/]/],/6688 7!"BRRkRR
**:666
KKCDDD %..{;;-..|,,,:;;;4i((N)P)P])P)P)PQQRRV*0.'~.///
	F#67888F#67888 	II''/F(GHHH 	KI''/F(GHHHH   		KJ((0H)IJJJJ   	KJ((0H)IJJJJ 	KI''/F(GHHHH "" 	KL**62L+MNNNNJ((0H)IJJJ!## 	0VI.///;<<<< 4 4 42333334 s   7H3W+ +$XXindexc                     t          |          d| dz  }t                              dt          |            d|            t	          |                                 ||           dS )zL
    Saves the state of `obj` to `{path}/custom_checkpoint_{index}.pkl`
    custom_checkpoint_r3   zSaving the state of z to )r'   N)r   rB   rC   r   r   rD   )objpathr   r'   save_locations        rm   save_custom_stater   C  sq    
 JJ!Ae!A!A!AAM
KKPs';';PPPPQQQ		=<MNNNNNNro   c                     | d| d}t                               dt          |            d|            |                     t	          |dd                     dS )	z
    Loads the state of `obj` at `{path}/custom_checkpoint_{index}.pkl`. Will always set `weights_only=False` when
    loading the state.
    z/custom_checkpoint_r3   zLoading the state of z from rq   F)ru   weights_onlyN)rB   rC   r   rz   r   )r   r   r   load_locations       rm   load_custom_stater   M  sn    
 ;;;;;M
KKS(<(<SSMSSTTT]USSSTTTTTro   )NFT)NNN)r   F)r   )6rK   pathlibr   typingr   numpyrM   rJ   safetensors.torchr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	torch.ampr   torch.cuda.amptorch_xla.core.xla_modelcore	xla_modelrX   loggingr   rZ   r   __name__rB   ry   listrv   intboolrn   r   r   r    ro   rm   <module>r      s                     ( ( ( ( ( (                                             2 D'"" *$$$$$$$)))))) *)))))))))             
H		 $(##u uut*u u 	u
 u u u Z u u u u u u~ I I I IXO O OD O O O OU U U U U U U Uro   