
    pj                       % S SK Jr  S SKrS SKJr  S SKJrJr  S SKJ	r	J
r
  S SKJr  S SKrS SKrS SKJr  S SKJr  SS	KJrJr  SS
KJr  SSKJrJrJr  \(       a  S SKJr  SSK J!r!  0 r"S\#S'   \" SS9 " S S5      5       r$\" SS9 " S S\$5      5       r% " S S\	5      r& " S S\	5      r'Sr(S r)    S%S jr*    S%S jr+S r,S r- " S  S!5      r.S" r/ " S# S$5      r0g)&    )annotationsN)defaultdict)	dataclassreplace)Enumauto)TYPE_CHECKING)logger   )LocalTensorIndexLocalTensorMetadata)ShardedWeight)%compute_local_shape_and_global_offsetget_target_tensorslice_tensor)Group)AbstractCommunicatorzdict[str, tuple[list, list]]PATH_TO_CHECKPOINT_FILEST)frozenc                      \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   SrS\S'   Srg)ReadItem/   a  
A communication operation for a Tensor between ranks.

Attributes:
    tensor_name (str): Name of the tensor.
    src_global_offset (tuple[int]): Global offset in the source tensor.
    dst_global_offset (tuple[int] | None): Global offset in the destination tensor.
    dst_rank (list[int]): Destination ranks.
    src_rank (int): Source rank.
    dst_local_offset (tuple[int]): Local offset in the destination tensor partition.
    src_local_offset (tuple[int]): Local offset in the source tensor partition.
    slice_shape (tuple[int]): Shape of the slice to transfer.
    file_name (str): The name of the file from which the source tensor is read on the source rank.
    dtype (str): Data type of the tensor.
strtensor_namez
tuple[int]src_global_offsettuple[int] | Nonedst_global_offsetdst_rankintsrc_rankdst_local_offsetsrc_local_offsetslice_shape	file_namedtypeNzGroup | None
comm_group )__name__
__module____qualname____firstlineno____doc____annotations__r&   __static_attributes__r'       l/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/paddle/distributed/flex_checkpoint/dcp/resharder.pyr   r   /   sL      !!((M    NJ#J#r/   r   c                  $    \ rS rSr% SrS\S'   Srg)ExtendReadItemN   Nr   global_shaper'   )r(   r)   r*   r+   r4   r-   r.   r'   r/   r0   r2   r2   N   s    &*L#*r/   r2   c                  0    \ rS rSr\" 5       r\" 5       rSrg)OperationTypeS   r'   N)r(   r)   r*   r+   r   GLOBAL_BROADCASTBROADCAST_ALLGATHERr.   r'   r/   r0   r6   r6   S   s    v&r/   r6   c                  0    \ rS rSr\" 5       r\" 5       rSrg)AllGatherTypeX   r'   N)r(   r)   r*   r+   r   WITH_PADDING
NO_PADDINGr.   r'   r/   r0   r;   r;   X   s    6LJr/   r;    __internal_padding_tensor_name__c                   0 n[         R                  R                  5       nU  H3  nUR                  R	                  5        H  u  pxX;   d  M  UU4XG'   M     M5     / n	U(       a!  [         R                  R                  XU5        OU	R                  U5        0 n
U	 H+  nUR	                  5        H  u  nu  pXz;  d   eX4X'   M     M-     U
$ N)paddledistributedget_rankstorage_metadataitemsall_gather_objectappend)metadata_listlocal_load_filesprocess_groupuse_dist	load_infocur_rankmetadatalocal_tensor_indexr$   load_info_list
load_infosranks               r0   get_load_infosrT   `   s    I!!**,H!-5-F-F-L-L-N),1	- .O " N,,}	
 	i(J#	5>__5F1 1%777.2->J* 6G $ r/   c           	        / n/ n/ n[        U R                  U R                  UR                  UR                  5       H  u  pVpx[        Xh5      n	[	        Xe-   X-   5      n
X:X  a%  UR                  S5        UR                  X-
  5        O>X:X  a%  UR                  X-
  5        UR                  S5        O[        SU	 SU SU 35      eUR                  X-
  5        US   S:  a  M   SUS    SU
 SU	 35       e   X#U4$ )	Nr   zInvalid begin_offset:z, cur_offset:z, storage_offset:zInvalid length:z, end_offset:z, begin_offset:)ziplocal_shapeglobal_offsetmaxminrH   
ValueError)cur_chunk_metadatastorage_local_tensor_metadatacur_offsetsstorage_offsetslengthscur_len
cur_offsetstorage_lenstorage_offsetbegin_offset
end_offsets              r0   compute_overlaprh   y   s,    KOG<?&&((%11%33	=8[ :6-~/KL
%q!""<#@A+|89""1%'~]:,N_`n_op  	z01r{a 	
gbk]-
|?S_R`a	
'=, 00r/   c                    [        U R                  U R                  UR                  UR                  5       H  u  p#pEX5U-   :  d
  X2-   U::  d  M    g   g)NTF)rW   rX   rY   )r]   r^   rb   rc   rd   re   s         r0   not_overlaprj      s]     =@&&((%11%33	=8[ K78$7= r/   c                   0 nU  HH  nUR                   R                  5       nU H%  u  pEUR                  US5      [        U5      -   X'   M'     MJ     UR                  5        VVs0 s H  u  pFUS /U-  _M     nnn[        R                  US5      nU  HF  nUR                   R                  5       nU H#  u  pEX   n	[        U5      nXWU   XU-   & X-   X'   M%     MH     U$ s  snnf Nr   )state_dict_metadatarF   getlendictfromkeys)
rI   countsmdrF   klstnresultoffsetos
             r0   !build_storage_state_dict_metadatarz      s    F&&,,.FA

1a(3s83FI  
 )/7a$!mF7]]61%F&&,,.FA	ACA#&1Iaa% FI	   M 8s   $Cc                   0 n[        U 5      n/ nS nUR                  5        GH  u  pS n
[        U	[        R                  5      (       a  U	R                  5       (       ag  [        U	R                  5      S:  a+  [        U	R                  U	R                  U	R                  5      OSu  nn[        U	R                  5      nUb  Uc  M  OT[        U	R                  5      n[        U	R                  5      S:  a"  [        S/[        U	R                  5      -  5      OSnUn[        U	R                  5      R                  S5      S   nUn
O[        U	[        5      (       a  [        U	R                   5      S:  a  U	R"                  U	R$                  4OSu  p[        U	R&                  R                  5      R                  S5      S   n[        U[        5      (       a  US   OUn
O[)        S[+        U	5       35      e[-        XX5      nUU
    H  n[/        X5      (       a  M  [1        X5      u  nnn[3        U
[        UR$                  5      [        UR"                  5      S9nUU   u  nnUR5                  [7        U
[        UR$                  5      U[        R8                  R;                  5       4U[        U5      [        U5      [        U5      UUR                  S9
5        M     GM     / n/ nU(       a!  [        R8                  R=                  UXb5        OUR5                  U5        U H  nU H  nUR5                  U5        M     M     U$ )	Nr   )r'   r'   r'   .r   z&Only support paddle.Tensor., val type:)rX   )
r   r   r   r   r    r!   r"   r#   r$   r%   )rz   rF   
isinstancerB   Tensoris_distro   shaper   process_mesh
placementstupler   r%   splitr   r4   rX   rY   local_tensorr\   typer   rj   rh   r   rH   r   rC   rD   rG   )rI   
state_dictrK   rL   rR   storage_state_dict_metadata
read_itemsr4   
tensor_keyvalr   rX   rY   r%   r]   r^   r_   r`   ra   storage_local_tensor_indexr    r$   global_read_itemstmprF   items                             r0   get_read_itemsr      s    #%"C# JL%++-
c6==)){{}} 399~) :		(( "!  %SYY/&-*? +@ $CII.36syy>A3EE1#CII./2   +		N((-a0E$K]++ s''(1, #"3"34 'K
 ((../55c:1=E!+J!>!>
1J  8cD  1
 .I.
) -MM4C"51K' *:3AAB!"?"K"KL*&
 #--G"HHi +&+5CC' '4$0099;=%%*;%7%*?%; %g'7==.
_ .\ 
C,,S*L

:D$$T*   r/   c                  <    \ rS rSr   S S	S jjrS rS rS rSrg)
StateDictResharderi$  Nc                X    Xl         X l        X0l        X@l        XPl        X`l        Xpl        g rA   )target_state_dictsource_state_dictrI   communicatorrK   offloadrL   )selfr   r   rI   r   rK   r   rL   s           r0   __init__StateDictResharder.__init__%  s,     "3!2*(* r/   c                   U R                   (       a  U R                  R                  5        H  u  pUR                  5        VVs0 s HO  u  p4U[        U[        R
                  5      (       a(  [        R                  " U[        R                  " 5       S9OU_MQ     snnU R                  U'   M     [        U R                  R                  5       5      n[        U R                  UU R                  U R                  5      n[        U R                  U R                   U R                  U R                  U5      nU R                   R                  5        VVs0 s H)  u  p4U[        U["        5      (       a  UR$                  OU_M+     nnn['        S U 5       5      n	['        S U 5       5      n
U	(       a  U
(       a   S5       eX4$ s  snnf s  snnf )Nplacec              3  B   #    U  H  n[        U[        5      v   M     g 7frA   r}   r   .0rt   s     r0   	<genexpr>0StateDictResharder.preprocess.<locals>.<genexpr>S  s      
*EQJq%  *E   c              3  L   #    U  H  n[        U[        5      (       + v   M     g 7frA   r   r   s     r0   r   r   V  s!       
.I
1e$$$.I   "$=target_state_dict contains a mix of tuple and non-tuple keys.)r   r   rF   r}   npndarrayrB   	to_tensorCPUPlacelistkeysrT   rI   rK   rL   r   r   r   r   any)r   r$   r   rt   vrJ   rR   r   processed_target_state_dicthas_tuple_keyhas_non_tuple_keys              r0   
preprocessStateDictResharder.preprocess7  s   <<)-)?)?)E)E)G%	
 !+ 0 0 2	5 !3 !!RZZ00 ''1BC !3	5&&y1 *H   6 6 ; ; =>#MM	

 $""MM

 ..446'
6 A}!=!=q~~1D6 	$ '
  
*E
 
    
.I 
 
 "&7 	
K	
8 +66E5*'
s   AG0Gc                   U H  nU R                   UR                     UR                     n[        XCR                  UR
                  5      R                  5       n[        X#5      n[        XcR                  UR
                  5      nUR                  UR                  :w  a  UR                  UR                  5      n[        R                  " XW5        M     g rA   )r   r$   r   r   r"   r#   
contiguousr   r!   r   torB   assign)r   r   r   	read_item
src_tensorsrc_chunk_tensor
dst_tensordst_chunk_tensors           r0   local_reshard StateDictResharder.local_reshard^  s    #I//	0C0CD%%J  ,66	8M8M jl  ++J  ,66	8M8M   %%)9)?)??#3#6#67G7M7M#N MM*= $r/   c                   [         R                  R                  5       nU R                  5       u  p#[        R
                  " S[        U5       S35        U(       d  U$ UU R                  S.nU R                  US.nU R                  (       a   U R                  R                  X5U5        U ?U$ U R                  X25        U ?U$ )Nz/ReadItem generation completed, with a total of r|   )rS   rK   )r   r   )rB   rC   rD   r   r
   inforo   rK   r   rL   r   communicater   )r   rN   r   r   contextstates         r0   reshardStateDictResharder.reshardp  s    %%..026//2C/#=c*o=NaP	
 .. !//
 "&!7!7!<

 ==))*WE "** zG"**r/   )r   rI   r   rK   r   r   rL   )NFT)r   r   )	r(   r)   r*   r+   r   r   r   r   r.   r'   r/   r0   r   r   $  s,     !
 +!$%7N>$+r/   r   c                   U R                   UR                   :X  d   S5       e[        U R                   5      n/ / pC/ / pe[        U5       H  nU R                  U   nXR                  U   -   n	UR                  U   n
XR                  U   -   n[        X5      n[        X5      nX::  a    g UR                  X-
  5        UR                  X-
  5        UR                  X-
  5        UR                  X-
  5        M     [        R                  " U R                  [        [        U5      5      X4S9n[        R                  " UR                  [        [        U5      5      UUS9n[        R                  " X5        g )NzGlobal shapes must be the same)axesstartsends)r4   ro   rangerY   rX   rZ   r[   rH   rB   slicer   r   r   )srcdstndimr   r   
dst_startsdst_endsi	src_beginsrc_end	dst_begindst_endoverlap_beginoverlap_end	src_slice	dst_slices                   r0   assign_sharded_weightr     sP   s/// (/ s DrDr4[%%a(	ooa00%%a(	ooa00I1'+'m/0K+,-34/0  tE$K0I %+	I MM)'r/   c                  p    \ rS rSr  S SS jjrS rS rS rS r SS jr	S	 r
S
 rS rS rS rS rSrg)ThreeDCommGroupStateResharderi  c	           	        Xl         X l        [        U5      S:X  d   S5       eUS   U l        X@l        XPl        U R                  S4U R
                  S44 H0  u  pU	R                  S:  a  M   SU
 SU	R                   SU	 S	35       e   X`l        U R                  (       + =(       d    U R                  R                  S:H  U l        Xpl	        Xl
        S
U l        U R                  5         g )Nr   zOnly support one metadata now!r   
horizontalverticalzThe number of ranks in the z@ communication group must be greater than 1, but actually it is z). Please check this communication group: !T)r   r   ro   rO   h_groupv_groupnranksp_groupusing_2d_comm_groupmemory_growth_thresholdr   using_tuple_keyr   )r   r   r   rI   r   r   r   r   r   groupnames              r0   r   &ThreeDCommGroupStateResharder.__init__  s     "3!2=!Q&H(HH&%a(\\<(\\:&
KE <<!# -dV 4&&+ll^3\]b\ccdf#	
 (,$4 $
LL1$ 	  (?$#r/   c                   U R                   (       Ga+  U R                  R                  5        H  u  pUR                  5        VVs0 s HO  u  p4U[        U[        R
                  5      (       a(  [        R                  " U[        R                  " 5       S9OU_MQ     snnU R                  U'   M     U R                  R                  5        Hp  u  pUR                  5        HW  u  pVUR                  [        R                  :X  a"  UR                  5       R                  5       X%'   ME  UR                  5       X%'   MY     Mr     [        U R                  R                  5       5      U l        [!        S U R"                   5       5      n[!        S U R"                   5       5      nU(       a  U(       a   S5       e[%        S U R"                  R                  5        5       5      (       d   S5       eXpl        [)        [        5      U l        U R"                  R                  5        HW  u  pU R&                  (       a#  U R*                  U	S      R-                  U
5        M9  U R*                  U	   R-                  U
5        MY     [        R.                  R1                  5       U l        U R5                  5         U R7                  5         U R9                  5         U R;                  5         g s  snnf )Nr   c              3  B   #    U  H  n[        U[        5      v   M     g 7frA   r   r   s     r0   r   ;ThreeDCommGroupStateResharder.preprocess.<locals>.<genexpr>  s      
*@QJq%  *@r   c              3  L   #    U  H  n[        U[        5      (       + v   M     g 7frA   r   r   s     r0   r   r     s!       
.D
1e$$$.Dr   r   c              3  F   #    U  H  u  p[        U[        5      v   M     g 7frA   )r}   r   )r   _r   s      r0   r   r     s#      
6 q-((6s   !z/All sharded weights must be ShardedWeight type.r   )r   r   rF   r}   r   r   rB   r   r   r%   float32cuda
pin_memoryr   r   rJ   r   r   allr   r   grouped_target_state_dictrH   rC   rD   rN   _build_cross_section_topologyr   schedule_read_itemsaggregate_global_read_items)r   r$   r   rt   r   r   tensorr   r   keysharded_weights              r0   r   (ThreeDCommGroupStateResharder.preprocess  sn   <<<)-)?)?)E)E)G%	
 !+ 0 0 2	5 !3 !!RZZ00 ''1BC !3	5&&y1 *H *.)?)?)E)E)G%	+5+;+;+='K||v~~528++-2J2J2L
/28++-
/	 ,> *H !%T%;%;%@%@%B C 
*.*@*@
 
    
.2.D.D 
 
 "&7 	
K	
8  
..446
 
 
 	= =	= 

  -)4T):&#'#9#9#?#?#AC##..s1v6==nM..s3::>J	 $B **335**,  "((*Y5s   AKc                   U R                   nU R                  n/ n[        R                  R	                  XAU5        / n[        R                  R	                  XTU5        U VVs/ s H  of  H  owPM     M     nnnU$ s  snnf rA   )r   r   rB   rC   rG   )	r   r   r   r   
h_obj_list
v_obj_listsublistxgathered_infos	            r0   all_gather_cross_section_fn9ThreeDCommGroupStateResharder.all_gather_cross_section_fn  sr    ,,,,
,,ZwG
,,ZWM*4F*wgg*F Gs   "A;c                J   / n/ U l         [        R                  R                  XR                  U R
                  5        [        R                  R                  U R                   XR                  5        U R                  (       d7  / n[        R                  R                  X R                  U R                  5        OU R                  /n[        U5       VVs0 s H  u  p4XC_M	     snnU l
        X l        U R                  U R                     U l        [        U R                   6  Vs/ s H  n[        U5      PM     snU l        [        U R                  5       VVVs0 s H  u  p6U  H  nXC_M     M     snnnU l        [        U R                   5       VVVs0 s H  u  p7U  H  oDU_M     M     snnnU l        U R                   U R                     U l        U R
                  R&                  U l        U R                  R&                  U l        g s  snnf s  snf s  snnnf s  snnnf rA   )topologyrB   rC   rG   rN   r   r   r   r   	enumerateparallel_indexp_rankscur_parallel_indexrW   setvertical_rankshorizontal_indexvertical_indexcur_horizontal_indexr   h_group_sizev_group_size)r   h_ranksr
  r   rS   colranksrows           r0   r   ;ThreeDCommGroupStateResharder._build_cross_section_topology  s   ,,]]DLL	
 	,,MM7LL	
 ''G00 }}oG6?6HI6H71tw6HI"&"5"5dmm"D363FG3FCs3x3FG &d&9&9:!
: G :!
 #,DMM":
":st!GsD":
 %)$9$9$--$H! LL// LL//! J H!


s   H$HHHc                   [        [        5      nU H9  nUR                  UR                  UR                  4nX$   R                  U5        M;     / nUR                  5        H!  u  pF[        US S9nUR                  U5        M#     U$ )Nc                    U R                   $ rA   r    r  s    r0   <lambda>@ThreeDCommGroupStateResharder.dedup_read_items.<locals>.<lambda>=  s    

r/   r   )r   r   r   r   r#   rH   rF   r[   )r   r   r   r   r   rw   rF   min_items           r0   dedup_read_items.ThreeDCommGroupStateResharder.dedup_read_items6  s}    D!%D##T%;%;T=M=MNCJd# & ++-JC5&:;HMM(# ( r/   Nc                X   [         R                  R                  5       nU R                  R                  nU R                  R
                  n0 nUR                  5        H`  u  pgUR                  nX8   n	[        U	5      S:w  d   SU SU 35       eU	S   R                  n
X4nU
UR                  UR                  4nXU'   Mb     / nU R                  R                  5        H  u  pUR                  5        H  u  nnUUU4   u  n
nn[        UR                  5      R                  S5      S   n[!        UR"                  5      [!        U5      :X  d&   SU SU SU S[!        UR"                  5       35       eUU[!        U5      [!        U5      S	[        U5      -  S	[        U5      -  [!        U5      [!        U
5      UUS S S
.nUR%                  ['        S0 UD65        M     GM     U R)                  U5      nU VVs/ s H  nU  H  nUPM     M     nnnU R+                  U5      U l        g s  snnf )Nr   z'No metadata found for tensor with name z	 in file r|   r   zShape mismatch in  tensor name z, expected shape z
, but got r   )r   r    r   r   r"   r!   r#   r4   r$   r%   r   r&   r'   )rB   rC   rD   rO   rm   rE   rF   r   ro   r4   rX   rY   r   r   r%   r   r   r   rH   r2   r  r   r   )r   all_gather_argscurrent_rankrm   rE   shard_infosrP   r$   r   local_tensor_metadatar4   r   
shard_infolocal_read_plan	read_filer   r   r   rX   rY   r%   common_attrsgathered_plans_per_rankplanr   global_read_plan_per_sections                             r0   r   ,ThreeDCommGroupStateResharder.get_read_itemsA  sy    ))224"mm??==99-=-C-C-E)+66J$7$C!,-2 9*YykZ2 13@@L)C".."00J
  * .F %)%;%;%A%A%C!I'1'7'7'9#V;F ),<8k= FLL)//4Q7V\\*eK.@@ 5k])I;Vghsgtt~  @E  FL  FR  FR  @S  T  U@ $/ ,).})=).})=(,s;/?(?(,s;/?(?#(#5$),$7!*" $"&   &&~'E'EF- (: &D2 #'"B"B#

 5(
4TDD4 	% (
 //0LM	(
s   6H&c                   U R                   n/ n[        [        5      nU R                   H  nUR                  nUR
                  n[        R                  R                  [        [        U5      5      nU[        R                  " U5      -  [        U5      -  nXR                  :  a  UR                  U5        M  Xe4n	X9   R                  U5        M     [        UR!                  5       S S9n
[#        U
5      nS nUR!                  5        H  u  p[        XS9X<'   M     / n[        UR!                  5       5       GHK  u  u  pen[        U5      U R$                  :  a  M$  [        U5      U R$                  :  d  M?  S /[        U5      -  nSn['        5       n[)        U5       H]  u  nnUU;   a  M  UR*                  nU R,                  U   nUU   b  M1  UUU'   UR/                  U5        US-  nU[        U5      :X  d  M]    O   [1        S U 5       5      (       aO  UR                  U[2        R4                  45        [)        U5       VVs/ s H  u  nnUU;  d  M  UPM     nnnXXe4'   OGM/  [        U5      U R$                  :  a  GM  GMN     [        U5      S:w  Ga  S /[        U5      -  nS n[        [&        5      nSnUR!                  5        H
  u  u  penUn  O   UR!                  5        Hy  u  u  penUU:w  a  M  [)        U5       HZ  u  nnUR*                  nU R,                  U   nUU   b  M)  UUU'   UXe4   R/                  U5        US-  nU[        U5      :X  d  MY    Mw     M{     / n[        UR!                  5       5       HV  u  p[)        U5       VVs/ s H  u  nnUUU	   ;  d  M  UPM     nnn[        U5      S:X  a  UR                  U	5        MR  UX9'   MX     U H  n	X9	 M     [)        U5       H=  u  nnUb  M  [7        UU   5      n[8        USSSSSSS	US S
.n[;        SSS 0UD6nUUU'   M?     UR                  U[2        R<                  45        [        U5      S:w  a  GM  X l        Xl         g s  snnf s  snnf )Nc                "    U S   S   U S   S   4$ )Nr   r   r'   r  s    r0   r  CThreeDCommGroupStateResharder.schedule_read_items.<locals>.<lambda>  s    !Q!Qr/   r  c           
         U R                   U R                  U R                  U R                  U R                  U R
                  b  U R
                  OSU R                  U R                  U R                  U R                  4
$ )Nr'   )
r   r    r   r   r!   r   r"   r#   r$   r%   )r   s    r0   r  r2    sp    !!''&&**6 ''&&!!OO)
r/   r   r   c              3  (   #    U  H  oS Lv   M
     g 7frA   r'   )r   r   s     r0   r   DThreeDCommGroupStateResharder.schedule_read_items.<locals>.<genexpr>  s     C.B}.Bs   r#  )r   padding_vfile)r   r    r   r   r"   r!   r#   r4   r$   r%   r&   r   r'   )!r  r   r   r   r%   r#   rB   coresize_of_dtypegetattrmathprodro   r   rH   sortedrF   rp   r  r  r  r    r  addr   r;   r>   r[   INTERNAL_PADDING_TENSOR_NAMEr2   r=   global_broadcast_read_itemsbatch_read_items)r   r  r?  bucket_read_itemsr   	cur_dtype	cur_shapeelement_sizememory_growthr   bucket_read_items_torder_rulesrt   r   r@  rF   cur_batch_read_itemscntused_indicesr   r    h_indexcur_batch_dtypeneed_removeremaining_itemsr+  padding_read_items                              r0   r   1ThreeDCommGroupStateResharder.schedule_read_items}  s   ,,&(#'-OOD

I((I!;;44WVY5OPLtyy33c.6II  ;;;+2248 ,!&--d3 $ %##%
 !!45
 &++-DA#)!#=  . -12C2I2I2K-L)"YE5zD---e* 1 11(,vN0C'C$"u(/GAtL( #}}H"33H=G+G4<8<,W5$((+q#n"55!  0 C.BCCC$++-}/G/GH
 (1'7'7GAtL0 '7  
 AFy&<=9 e* 1 111	 .MD #$)$(6C,?#? "O&s+LC1B1H1H1J-&"+ 2K 2C1H1H1J-&/(/GAt#}}H"33H=G+G4<8<,W5$i%;<@@Cq#n"55!  0 2K K"#4#:#:#<=
 $-U#3##34S 11 #3   #
 '1,&&s+-<%* > #%* # %%9:4<">!#45H'C$,-1-1,0,0'+(,%4!0&*$L )7 )!%))5)% /@(+) ;* ##%}'A'ABw #$)~ ,G( 0SD#s   Q2Q2Q8(Q8c                   U R                   (       a4  U R                  U l        U R                   Vs/ s H  o/PM     snU l        g / n/ n[
        R                  " UU R                  U R                  5        [
        R                  " UU R                  U R                  5        U VVs/ s H  nU  H  nUPM     M     snnU l        / U l        [        U Vs/ s H  n[        U5      PM     sn5      n[        U5       Hm  n/ nU HG  n	[        U	5      S:w  a"  UR                  U	R                  S5      5        M4  UR                  / S 45        MI     U R                  R                  U5        Mo     g s  snf s  snnf s  snf rl   )r   r?  &aggregated_global_broadcast_read_itemsr@  aggregated_batch_read_itemsdistrG   r   rZ   ro   r   rH   pop)
r   batch_itemsrR  rS  r  r   	max_tasksr   task_batchesr@  s
             r0   r   9ThreeDCommGroupStateResharder.aggregate_global_read_items  st   ##00 7 261F1F01F+1F0D, 13.&(#2,,LL	

 	'!!LL	
 B7
A  A7
3
 ,.()DE)DgS\)DE
	 y!AL$? '(A- ''(8(<(<Q(?@ ''T
3	 %@
 ,,33LA "50"7
 Fs   E/'E4E:c                   Uu  p#[        U5      S:X  a  / $ X R                     nU R                  UR                  :X  a  UR                  [
        :X  a+  [        R                  " UR                  UR                  5      O%U R                  UR                     UR                     n[        UR                  [        R                  5      (       d  UR                  5       nO)[        R                  " UR                  UR                  S9n[        R                   R#                  XTR                  U R$                  S9  / nU[&        R(                  :X  GaX  [+        S U 5       5      n[,        R.                  " UR0                  5      U:X  a  UR3                  U/5      nO]UR5                  5       n[        R6                  " U/UR                  S9n	[        R2                  " US/5      U	SU& UR9                  5         U	n[        R                   R;                  XeU R<                  S9  / n
[?        U5       Hv  u  pX+   n[,        R.                  " UR                  5      nUSU RA                  5       R3                  UR                  5      nU
RC                  U5        UR9                  5         Mx     U
nO([        R                   R;                  XeU R<                  S9  UR9                  5         U$ )z:Performs V-Broadcast + H-AllGather for one batch of items.r   r%   r   r   c              3  b   #    U  H%  n[         R                  " UR                  5      v   M'     g 7frA   )r:  r;  r#   )r   r   s     r0   r   XThreeDCommGroupStateResharder._process_one_batch_broadcast_in_section.<locals>.<genexpr>P  s"     OJDDIId&6&677Js   -/rV   N)r   )"ro   r  rN   r    r   r>  rB   emptyr#   r%   r   r$   r}   r   	CUDAPlacer   rC   	broadcastr   r;   r=   rZ   r:  r;  r   reshapenumelzeros_clear
all_gatherr   r  clonerH   )r   rV  r   allgather_typer   buffertensor_list	max_numelrc  padded_bufferunpadded_tensor_listidxpadded_tensorunpadded_tensors                 r0   '_process_one_batch_broadcast_in_sectionEThreeDCommGroupStateResharder._process_one_batch_broadcast_in_section8  sd   %0"
z?aI889	==I... ((,HH Y22IOOD++I,?,?@))  fllF,<,<==\\)"7"7yOF$$**$,, 	% 	
 ]777OJOOIyy&)3!  &i[ M(.vt(Dfu%&))4<< *  $& &/&<"&O			)"7"78!&5)//199):O:OP   %++O<$$& '= /K))4<< * 
 	r/   c           	         X R                      u  p4[        5       n[        U5       H,  u  pgUR                  [        :X  d  M  UR                  U5        M.     [        USS9 H  nX	 M     / n[        U5       HP  u  nu  p4U R                  U   n	U H3  nUR                  [        :w  d  M  [        XyS9n
UR                  U
5        M5     MR     Sn[        U5       GH  u  pgU R                  (       d  UR                  U R                  :X  a
  X   nUS-  nO)[        R                  " UR                  UR                   S9n[        R"                  R%                  XR                  U R&                  S9  O	X   nUS-  n[)        UR                  UUR                  UR*                  UR,                  S9nU R.                  UR                      H  nUR0                  R3                  5       (       d;  [        R4                  " UR0                  5      nUR7                  UR0                  5        UR0                  nUR0                  R8                  nUR8                  U:w  a  UR;                  U5      nXl        [=        UUS	9  M     UR?                  5         AGM     g )
NT)reverser  r   r   r[  r\  r   r   rX   r4   rY   r   r   ) r  r  r  r   r>  r=  r<  r
  r   rH   r   r    rN   rB   r_  r#   r%   rC   ra  r   r   r4   r   r   r   _is_initialized
zeros_like_share_buffer_tor   r   r   re  )r   rj  rX  r@  rh  need_remove_indicesrn  r   filtered_read_itemsr    replcaed_read_itemrI  ri  received_sharded_weighttarget_sharded_weightr   	tgt_places                    r0   "broadcast_cross_p_group_and_assign@ThreeDCommGroupStateResharder.broadcast_cross_p_group_and_assignt  s[   +78O8O+P(!e'(89NC$$(DD#'', : -t<C  = !7@7N3C3"||C(H-	((,HH)0)N&'../AB . 8O '(;<NC++%%6(-F1HC#\\!--Y__F "",, 2 2$,, -  %)q&3))#%11&33'99'# *.)G)G%%*% -99IIKK#..-::F ++,A,N,NO4AA
1>>DD	##y0!+y!9J7A4%/-#*, MMO'a =r/   c           	     @   U R                   n[        U5      n[        USS9 GHx  u  p4US-  S:X  d  X2:X  a)  [        R                  " SU SU SUR
                   35        U R                  UR                  :X  a`  U R                  UR                     UR
                     n[        UR                  [        R                  5      (       d  UR                  5       nO)[        R                  " UR                   UR"                  S9n[        R$                  R'                  XTR                  S S	9  [)        UR
                  UUR                   UR*                  UR,                  S
9nU R.                  UR
                      H  n[1        UUS9  M     UR3                  5         AGM{     g )Nr   start
   r   zBroadcasting item /z: r[  r\  ru  rv  )rR  ro   r  r
   r   r   rN   r    r   r$   r}   r   rB   r`  r   r_  r#   r%   rC   ra  r   r4   r   r   r   re  )r   r?  total_itemsrn  r   ri  r}  r~  s           r0   'broadcast_cross_global_group_and_assignEThreeDCommGroupStateResharder.broadcast_cross_global_group_and_assign  s   77 	$ 56'(C1MNCRx1} 2(Q{m2i>S>S=TU }}	 2 22//	0C0CD)) "&,,0@0@AA#[[]F)) ((..d )  '4))#%11&33'99'# *.)G)G%%*% &/-* MMO'I Nr/   c           
     ,   [        U R                  5      n[        R                  " S5        [	        U R                  SS9 Hi  u  p#U R                  X0R                     5      nU R                  XC5        US-  S:X  d  X!:X  d  MC  [        R                  " SU SU SUS	-  U-   S
35        Mk     [        R                  " S5        [        R                  " S5        U R                  5         [        R                  " S5        [        R                  " S5        g )NzL[ThreeDCommGroupStateResharder] Begin resharding using batch broadcasting...r   r  r  r   zResharding batches: r  z (d   z%)zJ[ThreeDCommGroupStateResharder] End resharding using batch broadcasting...zM[ThreeDCommGroupStateResharder] Begin resharding using global broadcasting...zK[ThreeDCommGroupStateResharder] End resharding using global broadcasting...z4[ThreeDCommGroupStateResharder] Resharding finished.)	ro   rS  r
   r   r  rq  r  r  r  )r   totalrn  rX  rj  s        r0   r   %ThreeDCommGroupStateResharder.reshard  s    D445Z	
 "+,,A"
C FF445K 33KNRx1}*3%qr#)u:L9MRP"
 	X	
 	[	
 	446Y	
 	JKr/   )rS  rR  r@  r  r  rN   r?  r   r   r  r  rJ   r   rO   r   r   r
  r	  r   r   r   r  r   r   r   r  r  r  )l        F)r   r   rA   )r(   r)   r*   r+   r   r   r  r   r   r   r   r   rq  r  r  r   r.   r'   r/   r0   r   r     sc     (3  "% D/+b"0J	 :NxQ1f&BP:xC(J)(VLr/   r   )r]   r   r^   r   )1
__future__r   r:  collectionsr   dataclassesr   r   enumr   r   typingr	   numpyr   rB   paddle.distributedrC   rT  'paddle.distributed.fleet.utils.log_utilr
   rO   r   r   r   r   utilsr   r   r   paddle.distributed.collectiver   reshard_commr   r   r-   r   r2   r6   r;   r>  rT   rh   rj   rz   r   r   r   r   r'   r/   r0   <module>r     s
   #  # *      ! : ;  329; 6 ; $$ $ $< $+X + +!D !
D 
  B 21+1#61@+#6$*aHf+ f+R (FN	L N	Lr/   