
    g@              	           d dl Z d dlZd dlmZ d dlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ dd	lmZ  ee          Zd
 Zd ZddZddZddZddZddZddZddededefdZ	 ddedededefdZdS )     N)Path   )
get_logger   )FSDP_MODEL_NAMEOPTIMIZER_NAMESAFE_WEIGHTS_NAMEWEIGHTS_NAME)is_peft_model)save)is_torch_versionc                  ^    dt           j        vrdt           j        d<   dt           j        d<   dS )z[
    Enables RAM efficient loading of Hugging Face models for FSDP in the environment.
    ACCELERATE_USE_FSDPTrueFSDP_CPU_RAM_EFFICIENT_LOADINGNosenviron     W/var/www/html/ai-engine/env/lib/python3.11/site-packages/accelerate/utils/fsdp_utils.py!enable_fsdp_ram_efficient_loadingr      s1    
 BJ..,2
()39BJ/000r   c                  $    dt           j        d<   dS )z\
    Disables RAM efficient loading of Hugging Face models for FSDP in the environment.
    Falser   Nr   r   r   r   "disable_fsdp_ram_efficient_loadingr   (   s     4;BJ/000r   Fc                 |    |r't          |           rddlm}  || | j                  S |                                 S )Nr   )get_peft_model_state_dictadapter_name)r   peftr   active_adapter
state_dict)modeladapter_onlyr   s      r   _get_model_state_dictr%   /   sV     "e,, "222222((U=QRRRR!!!r   c                     |r(t          |           rddlm}  || || j                  S |                     |          S )Nr   )set_peft_model_state_dictr   )r   r    r'   r!   load_state_dict)r#   r"   r$   r'   s       r   _set_model_state_dictr)   8   sZ     1e,, 1222222((
I]^^^^$$Z000r   c                    dd l mc m} ddlm} ddlm} ddlm}	 t          j	        |d           | j
        |	j        k    r#|j        dk    }
|
| j        _        |
| j        _        |
                    || j
        | j        | j                  5  t#          ||          }| j
        |	j        k    r|dk    r
t$           d	nt$           d
| d	}t          j                            ||          }|j        dk    rOt,                              d|            t1          j        ||           t,                              d|            nn| j
        |	j        k    r|dk    rt$           d|j         d	nt$           d
| d|j         d	}t          j                            ||          }t,                              d|            t1          j        ||           t,                              d|            n| j
        |	j        k    rt          j                            |t$           d
|           }t          j	        |d           t,                              d|            d|i}|                    ||                    |           |                       t,                              d|            d d d            d S # 1 swxY w Y   d S )Nr   DefaultSavePlannerFullyShardedDataParallelStateDictTypeTexist_okr   r$   .bin_zSaving model to zModel saved to _rankr#   r"   storage_writerplanner)torch.distributed.checkpointdistributed
checkpoint,torch.distributed.checkpoint.default_plannerr,   2torch.distributed.fsdp.fully_sharded_data_parallelr.   r0   r   makedirsstate_dict_typeFULL_STATE_DICTnum_processesstate_dict_configoffload_to_cpu
rank0_onlyoptim_state_dict_configr%   r   pathjoinprocess_indexloggerinfotorchr   LOCAL_STATE_DICTSHARDED_STATE_DICTsave_state_dictFileSystemWriter)fsdp_pluginacceleratorr#   
output_dirmodel_indexr$   dist_cpr,   FSDPr0   is_multi_processr"   weights_nameoutput_model_fileckpt_dirs                  r   save_fsdp_modelr[   A   s}   222222222OOOOOOccccccPPPPPPK
T****"m&CCC '4q87G%43C%0			{*K,I;Kn
 
  6  6 +5|LLL
&-*GGG7Ba7G7Go3333P_MsMsbmMsMsMsL "Z F F(A--B/@BBCCC
:'8999A.?AABBB(M,JJJ !## #HH)BHHHH'[[+[[K<U[[[ 
 !#Z F FKK>+<>>???Jz#4555KK=*;==>>>>(M,LLLw||J?0R0R[0R0RSSHK40000KK5855666!:.J##%&77AA**,, $   
 KK4(44555A 6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6s   H)KK	Kc                    dd l mc m} ddlm} ddlm} ddlm}	 |                                 | j	        |	j
        k    r#|j        dk    }
|
| j        _        |
| j        _        |	                    || j	        | j        | j                  5  | j	        |	j
        k    rt!          |          |ur/|j        dk    r$| j        st'          d          	 d d d            d S |dk    r
t(           dnt(           d| d}t*          j                            ||          }t0                              d	|            t5          j        |          }t0                              d
|            nz| j	        |	j        k    r|dk    rt(           d|j         dnt(           d| d|j         d}t*          j                            ||          }t0                              d	|            t5          j        |          }t0                              d
|            n| j	        |	j        k    rt(           |vr*t*          j                            |t(           d|           n|}t0                              d	|            dt=          ||          i}|                    ||                     |           |                       |d         }t0                              d
|            tC          |||          }d d d            n# 1 swxY w Y   |S )Nr   )DefaultLoadPlannerr-   r/   r   zzSet the `sync_module_states` flag to `True` so that model states are synced across processes when initializing FSDP objectr4   r5   zLoading model from zModel loaded from r6   r#   r3   )r"   storage_readerr9   )"r:   r;   r<   r=   r]   r>   r.   r0   wait_for_everyoner@   rA   rB   rC   rD   rE   rF   typerI   sync_module_states
ValueErrorr   r   rG   rH   rJ   rK   rL   loadrM   rN   r%   r(   FileSystemReaderr)   )rQ   rR   r#   	input_dirrT   r$   rU   r]   rV   r0   rW   rX   input_model_filer"   rZ   load_results                   r   load_fsdp_modelrh   s   s   222222222OOOOOOccccccPPPPPP!!###"m&CCC '4q87G%43C%0			{*K,I;Kn
 
 )Z )Z &-*GGGE{{$&&;+D+I+I"5 $3   )Z )Z )Z )Z )Z )Z )Z )Z 8Ca7G7Go3333P_MsMsbmMsMsMsL!w||I|DDKK@.>@@AAA$455JKK?-=??@@@@(M,JJJ !## #HH)BHHHH'[[+[[K<U[[[ 
  "w||I|DDKK@.>@@AAA$455JKK?-=??@@@@(M,LLL &'y88 Y?(J(J[(J(JKKK 
 KK8h88999!#8\#Z#Z#Z[J##%&77AA**,, $   
 $G,JKK7X77888+E:LYYYS)Z )Z )Z )Z )Z )Z )Z )Z )Z )Z )Z )Z )Z )Z )ZT s   
AL HL  LLc                    dd l mc m} ddlm} ddlm} ddlm}	 t          j	        |d           |
                    || j
        | j        | j                  5  |                    ||          }
| j
        |	j        k    r|j        dk    r|dk    r
t            dnt            d| d}t          j                            ||          }t&                              d	|            t+          j        |
|           t&                              d
|            nt          j                            |t            d|           }t          j	        |d           t&                              d	|            |                    d|
i|                    |           |                       t&                              d
|            d d d            d S # 1 swxY w Y   d S )Nr   r+   r-   r/   Tr1   r4   r5   zSaving Optimizer state to zOptimizer state saved in 	optimizerr7   )r:   r;   r<   r=   r,   r>   r.   r0   r   r?   r@   rC   rF   optim_state_dictrA   rI   r   rG   rH   rJ   rK   rL   r   rO   rP   )rQ   rR   rj   r#   rS   optimizer_indexrU   r,   rV   r0   optim_stateoptim_state_nameoutput_optimizer_filerZ   s                 r   save_fsdp_optimizerrp      s   222222222OOOOOOccccccPPPPPPK
T****			{*K,I;Kn
 
 @ @ ++E9==&-*GGG(A--/>!/C/C~++++NIrIr]lIrIrIr ! )+ZAQ(R(R%P9NPPQQQ
;(=>>>O8MOOPPPw||J>0U0UO0U0UVVHK40000KK?X??@@@##'5&77AA**,, $   
 KK>H>>???-@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @s   E.GGGc                    dd l mc m} ddlm} ddlm}	 ddlm}
 |                                 |		                    || j	        | j
        | j                  5  | j	        |
j        k    rd }|j        dk    s| j        j        s|dk    r
t           dnt           d| d}t           j                            ||          }t&                              d|            t+          j        |          }t&                              d|            nt           |vr*t           j                            |t           d|           n|}t&                              d	|             |t/          ||
          d|                    |                    }|d         }t&                              d|            |	                    |||          }|                    |           d d d            d S # 1 swxY w Y   d S )Nr   )!load_sharded_optimizer_state_dictr-   r/   r4   r5   zLoading Optimizer state from zOptimizer state loaded from zLoading Optimizer from r3   rj   )model_state_dictoptimizer_keyr^   zOptimizer loaded from )r#   optimrk   )r:   r;   r<   &torch.distributed.checkpoint.optimizerrr   r>   r.   r0   r_   r@   rC   rF   rA   rI   rE   r   r   rG   rH   rJ   rK   rL   rc   r%   rd   optim_state_dict_to_loadr(   )rQ   rR   rj   r#   re   rl   r$   rU   rr   rV   r0   rm   optimizer_nameinput_optimizer_filerZ   flattened_osds                   r   load_fsdp_optimizerr{      s   222222222XXXXXXccccccPPPPPP!!###			{*K,I;Kn
 
 1 1 &-*GGGK(A--[5X5c-/>!/C/C~++++NIrIr]lIrIrIr  (*w||I~'N'N$R<PRRSSS#j)=>>Q;OQQRRR %&i77 Y>(M(MO(M(MNNN 
 KK<(<<===;;!6u<!X!X!X)&77AA  K
 &k2KKK;;;<<<55Eep5qq!!-00091 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s   FG//G36G3Tcheckpoint_dir	save_pathsafe_serializationc                    ddl mc m} ddlmc mc m} i }t          |          }|                    d           |                    ||                    |           |	                                d           |r
|t          z  n	|t          z  }t          |                                          dk    r|t          |          d                  }t          |||           |S )z
    Passthrough to `torch.distributed.checkpoint.format_utils.dcp_to_torch_save`

    Will save under `save_path` as either `model.safetensors` or `pytorch_model.bin`.
    r   NTr1   )r^   r9   no_distr   )r~   )r:   r;   r<   )torch.distributed.checkpoint.format_utilsformat_utilsr   mkdir_load_state_dictrd   _EmptyStateDictLoadPlannerr	   r
   lenkeyslistr   )r|   r}   r~   rU   dist_cp_format_utilsr"   s         r   )_distributed_checkpoint_to_merged_weightsr      s    322222222LLLLLLLLLLLLJYIOOTO"""))//??$??AA	 *    2Da	---UaIaI :??""Z 0 0 34
Y3EFFFFr   output_pathremove_checkpoint_dirc                    t          |           } ddlm} t          dd          st	          d          |                                 s| dz                                  }| dz                                  }d|  d	}|r|r|d
z  }|d|  d|  dz  }|dz  }n!|r|dz  }|d|  dz  }n|r|dz  }|d|  dz  }t	          |           |            }|j        r~t                              d|             t          | ||          }	t                              d|	            |r1t                              d|             t          j        |            |                                 dS )a?  
    Merge the weights from sharded FSDP model checkpoints into a single combined checkpoint. Should be used if
    `SHARDED_STATE_DICT` was used for the model. Weights will be saved to `{output_path}/model.safetensors` if
    `safe_serialization` else `pytorch_model.bin`.

    Note: this is a CPU-bound process.

    Args:
        checkpoint_dir (`str`):
            The directory containing the FSDP checkpoints (can be either the model or optimizer).
        output_path (`str`):
            The path to save the merged checkpoint.
        safe_serialization (`bool`, *optional*, defaults to `True`):
            Whether to save the merged weights with safetensors (recommended).
        remove_checkpoint_dir (`bool`, *optional*, defaults to `False`):
            Whether to remove the checkpoint directory after merging.
    r   )PartialStatez>=z2.3.0z/`merge_fsdp_weights` requires PyTorch >= 2.3.0`pytorch_model_fsdp_0optimizer_0zTried to load from z) but couldn't find a valid metadata file.zE However, potential model and optimizer checkpoint directories exist.zPlease pass in either z/pytorch_model_fsdp_0 or z/optimizer_0zinstead.z8 However, a potential model checkpoint directory exists.zPlease try passing in z/pytorch_model_fsdp_0 instead.z< However, a potential optimizer checkpoint directory exists.z/optimizer_0 instead.zMerging FSDP weights from z.Successfully merged FSDP weights and saved to z"Removing old checkpoint directory N)r   accelerate.stater   r   rb   existsis_main_processrJ   rK   r   shutilrmtreer_   )
r|   r   r~   r   r   model_path_existsoptimizer_path_existserrstater}   s
             r   merge_fsdp_weightsr     s   ( .))N------D'** LJKKK   "" +.DDLLNN!/-!? G G I I]N]]] 		R!6 		RZZCqNqqUcqqqqC:CC 	RMMCZNZZZZCC" 	RQQCQNQQQQCoo LNNE *AAABBB=nk[mnn	PYPPQQQ  	*KKM^MMNNNM.)))	r   )F)r   F)r   )T)TF) r   r   pathlibr   rL   loggingr   	constantsr   r   r	   r
   modelingr   otherr   versionsr   __name__rJ   r   r   r%   r)   r[   rh   rp   r{   strboolr   r   r   r   r   <module>r      s   
			                     W W W W W W W W W W W W # # # # # #       & & & & & & 
H		: : :; ; ;" " " "1 1 1 1/6 /6 /6 /6d8 8 8 8v@ @ @ @B$1 $1 $1 $1N c c gk    : kp4 44&)4?C4cg4 4 4 4 4 4r   