
    9i              
       \   S SK r S SKrS SKJrJrJr  S SKrS SKJr  S SKJ	r	  S SK
Jr  \	" 5       rSSS.S	SSS
S.S	S
S.S.rSrSqS'S jrS\4S jrS\R&                  S\\\\ R,                  4   S\\\\ R,                  4   SS4S jrS\\\\ R,                  4   SS4S jrS\SS4S jrS\R&                  S\\\\ R,                  4   S\S\\\R6                  4   4S jrS\R&                  S\\\\ R,                  4   S\S\\\R6                  4   4S jrS\\\R6                  4   S\\\\ R,                  4   SS4S jrS\R6                  S \R6                  S\4S! jrS\\\\ R,                  4   S"\S\\\R6                  4   4S# jr S$\R6                  S\S%\S\\R6                     4S& jr!g)(    N)DictListUnion)nn)
get_logger)	is_mastermoe   )version
world_sizev1i  )r   r   tensor_model_parallel_sizeseed)r   r   )zgpt-moeplugzmglm-text-summarizationzmp_rank_XX_model_states.ptFc                 b   SSK Jn  SSKJn  U c
  Uc   S5       eU c  U" U5      n UR                  n U R                  U5        U" U 5        Sqg! [
         aV     UR                  R                  nO&! [
         a    UR                  R                  n Of = fU[        ;   a	  [        U   O0 n  N{f = f)ak  Initialize megatron_util environment for megatron_based model.

If argument `megatron_cfg` is not specified, then the megatorn_cfg will be load
from configuration.json file in the model_dir.

Args:
    megatron_cfg (Dict, optional): Megatron Config will be send to megatron_util.
    model_dir (str, optional): The model path for configuration. Defaults to None.
r   )read_config)initialize_megatronNzEcfg and model_dir cannot both be None when initializing megatron_utilT)modelscope.utils.hubr   megatron_utilr   megatronAttributeErrormodeltypepipeline_DEFAULT_CFG_WITH_MODEL_TYPEupdate_IS_MEGATRON_INITIALIZED)megatron_cfg	model_dirkwargsr   r   cfg
model_types          _/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/utils/megatron_utils.pyinit_megatron_utilr$   $   s     11$): POP;)$		F<<L %#  	F/ YY^^
! / \\..
/ !== 8
CCE 	Fs5   A 
B.A0/B.0 BB.BB.-B.returnc                      [         $ N)r        r#   is_megatron_initializedr*   E   s    ##r)   r   checkpoint_dir
target_dirc                    S[         4S jn[        R                  R                  [        R                  R	                  US5      5      (       a   [        R                  R	                  US5      n[        [        R                  " U5      5      n[        [        R                  " S5      5      n[        U5        [        U5        U" SU SU 35        XE:  a7  [        R                  " USS9  [        XXT-  5      n[        Xb5        U" S	5        gXE:  a7  [        R                  " USS9  [        XXE-  5      n[        Xb5        U" S
5        g[        R                   " X5        U" S5        g)a  Split or Merge checkpoint for megatron_based model.

Args:
    model (nn.Module): Any megatron_based model.
    checkpoint_dir (Union[str, bytes, os.PathLike]): The save path of origin checkpoint.
    target_dir (Union[str, bytes, os.PathLike]): The target path of new checkpoint.
informationc                 N    [        5       (       a  [        R                  U 5        g g r'   )r   loggerinfo)r.   s    r#   
log_master/convert_megatron_checkpoint.<locals>.log_masterT   s    ;;KK$ r)   r   
WORLD_SIZEzorigin_num_partitions: z, target_num_partitions: T)exist_okzSplit checkpoints succeeded.zMerge checkpoints succeeded.zCopy checkpoints succeeded.N)strospathexistsjoinlenlistdirintgetenv_check_origin_dir_check_target_num_partitionsmakedirs_split_checkpoint_save_converted_checkpoint_merge_checkpointshutilcopytree)r   r+   r,   r2   origin_num_partitionstarget_num_partitions
state_dicts          r#   convert_megatron_checkpointrJ   I   s'   % % 
ww~~bggll>7;<<ng>

> :;		, 78n% !67
!"7!88QRgQhi 4
J.&!:<
 	#::12		6
J.&!:<
 	#::12301r)   
origin_dirc                     [         R                  " U 5      n[        U5      [        U5      S-
  -  S:X  d   S5       e[        [        U5      5       H+  n[        R                  SUS 5      nX1;   a  M"   SU S35       e   g )N   r   z)The number of files must be a power of 2!XX02dzCan not find z file!)r7   r<   r;   range_CHECKPOINT_FORMATreplace)rK   	filenamesicheckpoint_names       r#   r?   r?   w   s    

:&Iy>I ! N"MN !3y>",44TaWF+ 	4O,F3	4+ #r)   num_partitionsc                 (    X S-
  -  S:X  d   S5       eg )NrM   r   z5The number of target partitions must be a power of 2!r(   )rV   s    r#   r@   r@      s$    a/0A5 @?@5r)   c                    [        [        R                  " S5      5      nX2-  n[        X5      n0 nU R	                  5        HF  u  px[        XU   5      n	U	S:X  a  XW   Xg'   M!  [        XW   X)5      n
XU-     R                  5       Xg'   MH     U$ )NRANK)r=   r7   r>   _load_by_ranknamed_parameters_get_diff_dim_split_tensorclone)r   r+   rV   target_rankorigin_rankrI   target_state_dictname	parameterdimpartitions_lists              r#   rB   rB      s     bii'(K/K~;J 113I$'78"9&0&6#'
(8.N"14B3C #DDIEG 	 4 r)   c                    [        [        R                  " S5      5      n[        U5       Vs/ s H
  oCU-  U-   PM     nnU Vs/ s H  n[	        X5      PM     nn0 nU R                  5        H`  u  p[        XS   U   5      n
U
S:X  a  US   U   Xx'   M(  [        R                  " U Vs/ s H  oU   PM	     snU
S9R                  5       Xx'   Mb     U$ s  snf s  snf s  snf )NrY   r   rZ   re   )
r=   r7   r>   rP   r[   r\   r]   torchcatr_   )r   r+   rV   r`   rT   origin_rank_liststate_dict_listrb   rc   rd   re   rI   s               r#   rD   rD      s     bii'(K272G2GQn$q(2G   3C2BQn(2B    113Iq'9$'?@"9&5a&8&>#"'))0?@*@#UW 	 4 ! As   CC)C
rI   c                     [        [        R                  " S5      5      n[        R	                  SUS 5      n[
        R                  " U [        R                  R                  X5      5        g )NrY   rN   rO   )	r=   r7   r>   rQ   rR   ri   saver8   r:   )rI   r,   r`   target_names       r#   rC   rC      sI     bii'(K$,,Tk#5FHK	JJz277<<
@Ar)   tensor1tensor2c                     [        [        U R                  UR                  5      5       H  u  nu  p4X4:w  d  M  Us  $    g)NrZ   )	enumeratezipshape)rp   rq   rT   s1s2s        r#   r]   r]      s6     W]]GMM!BC8B8H D r)   rankc                     [         R                  SUS 5      n[        R                  " [        R
                  R                  X5      S SS9nSU;   a  US   $ U$ )NrN   rO   c                     U $ r'   r(   )storagelocs     r#   <lambda>_load_by_rank.<locals>.<lambda>   s    'r)   T)map_locationweights_onlymodule)rQ   rR   ri   loadr7   r8   r:   )r+   rx   rU   rI   s       r#   r[   r[      sU    (00$sEO
^51J $,z#9:hIzIr)   tensorpartition_dimc                     SSK Jn  UR                  R                  U R	                  U5      U5      n[
        R                  " XUS9nU$ )Nr   )mpurh   )r   r   utilsdividesizeri   split)r   rV   r   r   per_partition_sizerf   s         r#   r^   r^      sA    !))M"N4kk7Or)   )NN)"r7   rE   typingr   r   r   ri   r   modelscope.utils.loggerr   modelscope.utils.torch_utilsr   r0   r   rQ   r   r$   boolr*   Moduler6   bytesPathLikerJ   r?   r=   r@   TensorrB   rD   rC   r]   r[   r^   r(   r)   r#   <module>r      sc   	  $ $   . 2	 
 &'	    " 2   $B$ $+2yy+2*/UBKK0G*H+2#ubkk12+27;+2\4%UBKK(?"@ 4T 4@ @ @
RYY c5>@kk?J 9K &).233D.E&RYY c5>@kk?J 9K &).233D.E.Bell*+B#ubkk12B7;B5<< %,, 3 J%UBKK(?"@ JJ $S%,,%6 7J%,,  !$)-ell);r)   