o
    hl,                     @   s0  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 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 edd	rPd dlm  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e'dede(de(fddZ)		d ddZ*d!de'de(fddZ+d"de'fddZ,dS )#    N)Path)List)	load_file)
GradScaler   )
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_tpu_availableis_xpu_availablesaveF)check_device)
get_logger)PartialStateT
output_dirmodel_states
optimizers
schedulersdataloadersprocess_indexscalersave_on_each_nodesafe_serializationc	                 C   s  t | } t|D ]-\}	}
|stnt}|	dkr |dd|	 d}| |}t|
|||d td|  qt|D ].\}	}|	 }
|	dkrKt
 dnt
 d|	 d}| |}t|
||dd td|  q:t|D ].\}	}|	 }
|	dkr~t dnt d|	 d}| |}t|
||dd td	|  qmt|D ]D\}	}|	dkrt dnt d|	 d}| |}d
dlm}m} t|j|r|jj}t||rt|||dd td|	 d|  q|dur|	 }
| t}t|
| td|  i }t d| d}t |d< tj |d< t |d< t r*tj |d< ntj |d< t r;t  |d< | |}t|| td|  | S )a+  
    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
        scaler (`torch.cuda.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SeedableRandomSamplerzSampler state for dataloader z
 saved in NzGradient scaler state saved in .pklrandom_statenumpy_random_seedtorch_manual_seedtorch_xpu_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samplerr   torchr	   randomgetstatenp	get_stateget_rng_stater   xpuget_rng_state_allcudar   xm)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%   r6   output_scaler_filestatesstates_nameoutput_states_file rR   N/var/www/html/ai/venv/lib/python3.10/site-packages/accelerate/checkpointing.pysave_accelerator_state3   s`   )
"
"
"




rT   c                 K   s  |dvrt d|du rd}n|dkrt j}t| } t|D ]B\}	}
|	dkr,d|	 nd}| t | d	}| rEt|t	|d
}n| t
 | d}tj||d}||	 j|fi | qtd t|D ](\}	}|	dkrxt dnt d|	 d}| |}tj||d}||	 | qktd t|D ]"\}	}|	dkrt dnt d|	 d}| |}|t| qtd t|D ]:\}	}|	dkrt dnt d|	 d}| |}ddlm}m} t|j|r|jj}t||rt||j_qtd |dur | t}|t| td zLt| t d| d}t|d  tj|d  t|d  t  rRtj!"|d  ntj#"|d  t$ ret%|d  td W dS  t&y|   td Y dS w )a  
    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
        process_index (`int`):
            The current process index in the Accelerator state
        scaler (`torch.cuda.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_model_func_kwargs (`dict`, *optional*):
            Additional arguments that can be passed to the model's `load_state_dict` method.
    )Ncpu	on_devicezaUnsupported optimizer map location passed, please choose one of `None`, `'cpu'`, or `'on_device'`NrU   rV   r   r!    z.safetensors)devicer"   map_locationz%All model weights loaded successfullyz(All optimizer states loaded successfullyz(All scheduler states loaded successfullyr   r#   z1All dataloader sampler states loaded successfullyz$GradScaler state loaded successfullyr&   r'   r(   r)   r*   r+   r,   z%All random states loaded successfullyzCould not load random states)'	TypeErrorr   rX   r   r-   r/   r
   existsr   strr   r7   loadload_state_dictr0   r1   r   r   r   r3   r$   r%   r4   r5   r6   r   r	   r8   setstater:   	set_stateset_rng_stater   r=   set_rng_state_allr?   r   r@   	Exception)	input_dirmodelsr   r   r   r   r   rZ   load_model_func_kwargsrA   modelendinginput_model_filer2   rE   rF   input_optimizer_fileoptimizer_staterH   rI   input_scheduler_filerK   rL   input_sampler_filer$   r%   r6   input_scaler_filerO   rR   rR   rS   load_accelerator_state   sr    
"

"

"




rp   indexc                 C   sD   t |d| d }tdt|  d|  t|  ||d dS )zL
    Saves the state of `obj` to `{path}/custom_checkpoint_{index}.pkl`
    custom_checkpoint_r&   zSaving the state of z to )r   N)r   r0   r1   r   r   r2   )objpathrq   r   save_locationrR   rR   rS   save_custom_state  s   rv   c                 C   sB   | d| d}t dt|  d|  | tj|dd dS )zL
    Loads the state of `obj` at `{path}/custom_checkpoint_{index}.pkl`
    z/custom_checkpoint_r&   zLoading the state of z from rU   rY   N)r0   r1   r   r_   r7   r^   )rs   rt   rq   load_locationrR   rR   rS   load_custom_state  s   rx   )NFT)NN)r   F)r   )-r8   pathlibr   typingr   numpyr:   r7   safetensors.torchr   torch.cuda.ampr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   torch_xla.core.xla_modelcore	xla_modelr@   loggingr   rB   r   __name__r0   r]   dictlistintboolrT   rp   rv   rx   rR   rR   rR   rS   <module>   sP   <

	
m
j
