
    gL2                     R   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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e(de(dede)de)fdZ*	 	 ddZ+dde(de)fdZ,dde(fdZ-dS )    N)Path)List)
load_model)
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_mlu_availableis_torch_xla_availableis_xpu_availablesave)
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!t(          j!                                        |d<   tE                      rtG          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_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   mlu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_filer9   output_scaler_filestatesstates_nameoutput_states_files!                                    T/var/www/html/ai-engine/env/lib/python3.11/site-packages/accelerate/checkpointing.pysave_accelerator_stater_   4   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&''+0:+G+G+I+I'( /,..y#,,[99	Jv)***
KK>*<>>???    c                 
   t                      }	|dvrt          d          |d}n|dk    rt                      j        }t	          |           } t          |          D ]\  }
}|
dk    rd|
 nd}|                     t           | d	          }|                                rt          ||fd
t          |          i| c|                     t           | d          }t          j        ||          } |j        |fi | t                              d           t          |          D ]h\  }
}|
dk    r
t"           dnt"           d|
 d}|                     |          }t          j        ||          }||
                             |           it                              d           t          |          D ]^\  }
}|
dk    r
t$           dnt$           d|
 d}|                     |          }|                    t          j        |                     _t                              d           t          |          D ]\  }
}|
dk    r
t&           dnt&           d|
 d}|                     |          }ddlm}m} t/          |j        |          rK|                                }t/          ||          r'|                    t          j        |                    }t7          |dd          r`|
dk    rdnd|
 d}|                     |          }|                                r)t          j        |          }|                    |           t                              d           |[|                     t8                    }|                    t          j        |                     t                              d           	 t          j        |                     t:           d| d                    }d|v r|d         |	d<   t=          j        |d                    t@          j        !                    |d                    t          j"        |d                    tG                      r%t          j$        %                    |d                    tM                      r&t          j'        %                    |d                    n%t          j(        %                    |d                    tS                      rtU          j"        |d                     t                              d!           n*# tV          $ r t                              d"           Y nw xY w|	S )#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.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.

    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'`Nrb   rc   r   r$    z.safetensorsdevicer%   map_locationz%All model weights loaded successfullyz(All optimizer states loaded successfullyz(All scheduler states loaded successfullyr   r&   r)   Fr*   r+   z1All dataloader sampler states loaded successfullyz$GradScaler state loaded successfullyr,   r   r-   r.   r/   r0   r1   r2   r3   z%All random states loaded successfullyzCould not load random states),dict	TypeErrorr   re   r   r4   r6   r   existsr   strr   r?   loadload_state_dictr7   r8   r	   r   r   r:   r'   r(   r;   r<   r=   set_samplerr>   r   r
   r@   setstaterB   	set_stateset_rng_stater   rE   set_rng_state_allr   rG   rH   r   rI   	Exception) 	input_dirmodelsr   r   r   r   r   rg   load_model_func_kwargsoverride_attributesrJ   modelendinginput_model_filer9   rN   rO   input_optimizer_fileoptimizer_staterQ   rR   input_scheduler_filerT   rU   input_sampler_filer'   r(   rW   rX    input_dataloader_state_dict_fileinput_scaler_filer[   s                                    r^   load_accelerator_stater      s   H &&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$4<PPPJ!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*%9UUU1%%o6666
KK:;;; "*-- D D945FFN0000>@[@[TU@[@[@[(11.AA!!%*-A"B"BCCCC
KK:;;;";// 7 7:01Q,,,,,|<U<Ua<U<U<U&//==LLLLLLLLj(*>?? 	Q ,,..G'#899 Q$00<N1O1OPP:8%@@ 	7@AQ)<)<Ld]^LdLdLd&/8/A/AB\/]/],/6688 7"Z(HII
**:666
KKCDDD %..{;;uz*;<<===:;;;4I.../V/V=/V/V/VWWXX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J((0H)IJJJ!## 	0VI.///;<<<< 4 4 42333334 s   E(T< <$U#"U#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_r,   zSaving the state of z to )r    N)r   r7   r8   r   r   r9   )objpathr   r    save_locations        r^   save_custom_stater     sq    
 JJ!Ae!A!A!AAM
KKPs';';PPPPQQQ		=<MNNNNNNr`   c                     | d| d}t                               dt          |            d|            |                     t	          j        |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 rb   rf   N)r7   r8   r   rm   r?   rl   )r   r   r   load_locations       r^   load_custom_stater   (  sn     ;;;;;M
KKS(<(<SSMSSTTT
=uEEEFFFFFr`   )NFT)NN)r   F)r   ).r@   pathlibr   typingr   numpyrB   r?   safetensors.torchr   torch.cuda.ampr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   torch_xla.core.xla_modelcore	xla_modelrI   loggingr   rK   r   __name__r7   rk   rh   listintboolr_   r   r   r    r`   r^   <module>r      s                     ( ( ( ( ( ( % % % % % %                               $  *)))))))))             
H		 ##m mmt*m m 	m
 m m m m m m m m mn w w w wtO O OD O O O OG G G G G G G Gr`   