o
    ॵij                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d d	lmZ G d
d deZejejdG dd deZdS )    N)Hooks)EpochBasedTrainer)HOOKS)BestCkptSaverHookCheckpointHookCheckpointProcessor)LoadCheckpointHook)Hook)save_configuration)is_swift_availablec                   @   s>   e Zd ZdZdZedd Zdd Zdd Z			
dddZ	d	S )SwiftCheckpointProcessormodel_swiftc           
      C   s.  |  | j}G dd d}dD ]$}|d| dur"|d| |d| dur3|d| q|||}t|d	rst sEtd
ddlm} t	||rf|t
j }	|j|	|dd|ddd n|j||dd |j|d | jdur| jj||j|d | jdur| jj||j|d |  dS )z[Copy useful files to target output folder and dumps the target configuration.json.
        c                   @   s$   e Zd Zdd Zdd Zdd ZdS )zGSwiftCheckpointProcessor.copy_files_and_dump_config.<locals>.SaveConfigc                 S   s   || _ || _d S N)
output_dirconfig)selfr   r    r   ^/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/hooks/swift/swift_hook.py__init__   s   
zPSwiftCheckpointProcessor.copy_files_and_dump_config.<locals>.SaveConfig.__init__c                 S   s
   || _ d S r   )r   )r   _output_dir_configr   r   r   __call__!   s   
zPSwiftCheckpointProcessor.copy_files_and_dump_config.<locals>.SaveConfig.__call__c                 S   s   t | j| j d S r   )r
   r   r   r   r   r   r   save_config$   s   zSSwiftCheckpointProcessor.copy_files_and_dump_config.<locals>.SaveConfig.save_configN)__name__
__module____qualname__r   r   r   r   r   r   r   
SaveConfig   s    r   )push_to_hubhub_repo_id	hub_tokenprivate_hubztrain.checkpoint.period.Nztrain.checkpoint.periodztrain.checkpoint.best.ztrain.checkpoint.bestsave_pretrainedz@Please install swift by `pip install ms-swift` to use SwiftHook.r   )
SwiftModelz#train.checkpoint.safe_serializationFztrain.checkpoint.adapter_namedefault)save_directorysafe_serializationadapter_namec                  _      d S r   r   )argskwargsr   r   r   <lambda>D   s    zESwiftCheckpointProcessor.copy_files_and_dump_config.<locals>.<lambda>)save_functionr   save_config_function)r.   )unwrap_moduler   safe_getpophasattrr   
ValueErrorswiftr$   
isinstancer   SWIFT_SAVE_SUFFIXr#   r   train_preprocessoreval_preprocessorr   )
trainerr   r   bin_filer   r   pop_keysave_config_fnr$   _swift_output_dirr   r   r   copy_files_and_dump_config   sd   





z3SwiftCheckpointProcessor.copy_files_and_dump_configc                 C   s&   t j|rt| t|| d S r   )ospathexistsshutilrmtreecopytree)r   
source_dirr   r   r   r   link_dirT   s   
z!SwiftCheckpointProcessor.link_dirc                 C   s   | | d S r   )r#   )r   r   filenamer   r   r   save_swift_model_stateY   s   z/SwiftCheckpointProcessor.save_swift_model_stateNTc                 C   sv   | |j}| |\}}|tj }	|tj }
| ||||| | || | ||| | ||	 | 	|	|
 d S r   )
r/   r   _get_state_file_namer   r6   save_trainer_statesave_model_statelinkrH   rF   )r   r9   checkpoint_path_prefixr   metasave_optimizersr   _model_file_train_state_file_swift_save_dirr=   r   r   r   save_checkpoints\   s   

z)SwiftCheckpointProcessor.save_checkpoints)NT)
r   r   r   _BIN_FILE_DIRr6   staticmethodr>   rF   rH   rS   r   r   r   r   r      s    
>r   )module_namec                   @   s&   e Zd ZdZdd ZdefddZdS )	SwiftHookr   c                 C   r)   r   r   r   r   r   r   r   t   s   zSwiftHook.__init__r9   c                 C   s   t  }|t}t|dkrt|d jt s|d | |t}t|dkr7t|d jt s7|d | |t}t|dkrSt|d jt sU|d | d S d S d S )Nr   )	r   get_hookr   lenr5   	processorset_processorr   r   )r   r9   rZ   	ckpt_hookbest_ckpt_hookload_ckpt_hookr   r   r   register_processorw   s"   




zSwiftHook.register_processorN)r   r   r   rT   r   r   r_   r   r   r   r   rW   o   s    rW   )r?   rB   modelscope.metainfor   modelscope.trainersr   !modelscope.trainers.hooks.builderr   4modelscope.trainers.hooks.checkpoint.checkpoint_hookr   r   r   9modelscope.trainers.hooks.checkpoint.load_checkpoint_hookr   modelscope.trainers.hooks.hookr	   modelscope.utils.checkpointr
   modelscope.utils.import_utilsr   r   register_modulerW   r   r   r   r   <module>   s    _