
    Wj!k              	          U d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZ d dlZd dlmZ d dlmZ d dlmZm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! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 ddl6m7Z7  ej8        e9          Z:ej;        e<d<   g dZ= G d de'          Z> G d de$          Z? G d de?          Z@	 d.deAeBef         dedeCde#fdZDdeEe#         deEe#         fd ZFdeAeBef         d!eCde&fd"ZG	 d.deEe&         d#eCdeHeEe&         ef         fd$ZIdedefd%ZJd&ed'edeCfd(ZKd)ejL        d*edeCfd+ZMd,eEe&         dedeCfd-ZNdS )/    N)bisect_rightinsort)ChainMap)Anycast)narrow_tensor_by_index)dedup_save_plans)FLATTEN_MAPPINGflatten_state_dict)_flatten_sharded_tensors)set_element)BytesStorageMetadataChunkStorageMetadataMetadataMetadataIndexSTATE_DICT_TYPESTORAGE_TYPESStorageMetaTensorStorageMetadata)LoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItemWriteItemType)_compare_save_plans_contains_usable_plan"_create_default_metadata_only_plan_create_read_items_create_write_items_init_state_dict_merge_delta_local_plans)find_state_dict_object)DTensor   )_versionlogger)DefaultSavePlannerDefaultLoadPlannercreate_default_local_load_plancreate_default_global_load_plancreate_default_local_save_plancreate_default_global_save_planc                      e Zd ZU eed<   	 	 	 	 	 ddedededz  ded	ed
dfdZ	 	 d dededz  ded
dfdZ	d
e
fdZdee
         d
ee
         fdZdee
         d
eee
         ef         fdZdee
         d
eee
         ee
         ef         fdZdee
         d
eee
         ef         fdZde
d
e
fdZde
d
e
fdZded
ej        ej        z  fdZded
efdZdedefdZdS )!r)   mappingsTNFr   flatten_sharded_tensorsdedup_replicated_tensorsdedup_save_to_lowest_rankenable_plan_cachingreturnc                     || _         || _        i | _        || _        |t                              d           | j        j        | _        || _	        d S )NzDefaultSavePlanner's `dedup_replicated_tensors` argument is being deprecated, and no longer has any effect. Please remove this argument from your call.)
r   r1   r0   r3   r(   warning	__class____name___cached_plans_key_enable_plan_caching)selfr   r1   r2   r3   r4   s         q/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/distributed/checkpoint/default_planner.py__init__zDefaultSavePlanner.__init__I   sa     #5'>$)B&#/NN"  
 '+n&=$7!!!    
state_dictstorage_metais_coordinatorc                     | j         rt          |          \  }| _        | j        rt          |          }|| _        || _        d S N)r   r0   r1   r   r@   rB   )r<   r@   rA   rB   s       r=   set_up_plannerz!DefaultSavePlanner.set_up_planner^   sQ     " 	G(::(F(F%J' 	>1*==J$,r?   c                    t          | j        | j                  }| j        rt	          j        || j                  }|| _        | j        rw| j	        t          j        v rPt          |t          j        | j	                           r+t                              d           t          g d          S |t          j        | j	        <   | j        S )Nplanner_datazINo change in the local plan. Skipping sending the plan to the coordinatorFusable)r-   r@   rB   r   dataclassesreplacer0   planr;   r:   r   _cached_save_planr   r(   infor   )r<   rM   s     r=   create_local_planz$DefaultSavePlanner.create_local_plank   s    -dot?RSS" 	I&t$-HHHD	$ 	M &+*GGG'+78NO  H
 _    51111HL-d.DEyr?   	all_plansc                 ,    t          || j                  S rD   )r	   r3   )r<   rQ   s     r=   _dedup_save_plansz$DefaultSavePlanner._dedup_save_plans   s    	4+IJJJr?   c                    |                      |          }t          |          \  }}| j        r8d |D             }t          t	          |           }t          j        ||          }t          ||          st          d          ||fS )Nc                     g | ]	}|j         
S  rG   ).0ps     r=   
<listcomp>z:DefaultSavePlanner._create_global_plan.<locals>.<listcomp>   s     E E EA E E Er?   rG   zFailed to validate global plan)	rS   r.   r   dictr   rK   rL   _validate_global_plan
ValueError)r<   rQ   deduped_plansglobal_planmetadataplanner_data_dictmerged_mappingss          r=   _create_global_planz&DefaultSavePlanner._create_global_plan   s     ..y99 ? N NX" 	S
 !F E E E E"8->#?@@O"*8/RRRH$[(;; 	?=>>>H$$r?   c                    g }| j         t          j        vrY|t          j        | j         <   |                     |          \  }}|t          j        | j         <   |t          j        | j         <   |||fS t          |          sQt          g d          gt          |          z  }t          j        | j                  }t          j        | j                  }nt          t          j        | j                  |          }|t          j        | j         <   |                     |          \  }}| j         | j        v rut          t          j        | j                  |          D ]O\  }}t          ||          r%|                    t          g d                     :|                    |           P|t          j        | j         <   |t          j        | j         <   |||fS )zw
        Create global plan with caching.
        Returns a tuple of global_plan_delta, global_plan, metadata.
        FrI   )r:   r   _cached_all_plansrb   _cached_global_plan_cached_metadatar   r   lenr#   zipr   append)r<   rQ   global_plan_deltar^   r_   merged_planscached_plannew_plans           r=    _create_global_plan_with_cachingz3DefaultSavePlanner._create_global_plan_with_caching   s    -/!)FFF
 ENK)$*@A$($<$<Y$G$G!KFQK+D,BCCKK()?@X55 %Y// 	L "*"U!;!;!; <s9~~ M%9$:PQK"3D4JKHH 4-d.DEy L EQK)$*@A$($<$<\$J$J!K%)AAA-03D4JK[. . ; ;)K +;AA ;)00"U1K1K1KLLLL)00:::: GRK+D,BCCKK()?@ +x77r?   c                     g }| j         r|                     |          \  }}}n|                     |          \  }}|}|| _        || _        || j        fS rD   )r;   rn   rb   r^   r_   )r<   rQ   rj   r^   r_   s        r=   create_global_planz%DefaultSavePlanner.create_global_plan   st     -/$ 	, 55i@@	! %)$<$<Y$G$G!K +&  $-//r?   rm   c                 t    |}|j         st          j        | j                 }n|}|t          j        | j        <   |S rD   )rJ   r   _cached_final_save_planr:   r<   rm   finished_plans      r=   _finish_plan_with_cachingz,DefaultSavePlanner._finish_plan_with_caching   s?    "* 	S'?@VWMM$MJRK/0FGr?   c                 Z    |}| j         r|                     |          }|| _        | j        S rD   )r;   ru   rM   rs   s      r=   finish_planzDefaultSavePlanner.finish_plan   s5    "*$ 	E ::8DDM!	yr?   
write_itemc                 b    |                      |j                  }|                     ||          S rD   )lookup_objectindextransform_object)r<   rx   objects      r=   resolve_datazDefaultSavePlanner.resolve_data   s.    ##J$455$$Z888r?   r{   c                 ,    t          | j        |          S zSExtension from the planner interface to make it easy to extend the default planner.r$   r@   r<   r{   s     r=   rz   z DefaultSavePlanner.lookup_object      %dou===r?   r}   c                     |j         t          j        k    r*t          j                    }t          j        ||           |}|S r   )typer   BYTE_IOioBytesIOtorchsave)r<   rx   r}   bytess       r=   r|   z#DefaultSavePlanner.transform_object  s9    ?m333JLLEJvu%%%Fr?   )TTNFFNF)r9   
__module____qualname__r
   __annotations__boolr>   r   r   rE   r   rP   listrS   tupler   rb   rn   rp   ru   rw   r   r   Tensorr   r   r~   r   r   rz   r|   rV   r?   r=   r)   r)   F   s}         $((,04*/$)8 8 8 "&8 #'+	8
 $(8 "8 
8 8 8 80 ,0$	- -#- "D(- 	-
 
- - - -8    .K4> Kd8n K K K K%h%	tH~x'	(% % % %*98h98	tH~tH~x7	898 98 98 98v0h0	tH~x'	(0 0 0 0,( x    H     9y 9U\BJ5N 9 9 9 9>= >S > > > >9 c      r?   r)   c            	       ,   e Zd ZU dZeed<   eed<   	 	 	 ddededed	d
fdZ	 	 ddede	d
z  ded	d
fdZ
d	efdZdee         d	ee         fdZded	efdZdedej        d	d
fdZdefdZdedej        d	d
fdZded	ej        fdZdedej        fdZd
S ) r*   ak  
    DefaultLoadPlanner that adds multiple features on top of LoadPlanner.

    In particular it adds the following:

    flatten_state_dict: Handle state_dict with nested dicts
    flatten_sharded_tensors: For FSDP in 2D parallel mode
    allow_partial_load: If False, will raise a runtime error if a key is present in state_dict, but not in the checkpoint.
    original_state_dictr0   TFr   r1   allow_partial_loadr5   Nc                 L    || _         || _        i | _        i | _        || _        d S rD   )r   r1   r   r0   r   )r<   r   r1   r   s       r=   r>   zDefaultLoadPlanner.__init__  s1     #5'>$#% "4r?   r@   r_   rB   c                     t          |           || _        | j        rt          |          }| j        rt	          |          \  }| _        || _        || _        || _        d S rD   )	r"   r   r1   r   r   r0   r@   r_   rB   )r<   r@   r_   rB   s       r=   rE   z!DefaultLoadPlanner.set_up_planner)  sn     	$$$#- ' 	>1*==J" 	G(::(F(F%J$ ,r?   c                    | j         t          d          | j        rt          | j                                                  }t          | j         j                                                  }||z
  }|rddt          _        t          | j	                  \  }}t          |                                          }||z  r||c| _        | _
        d t          _        t          | j        | j         | j                   S )Nzself.metadata is not None2_3)r_   AssertionErrorr   setr@   keysstate_dict_metadatar'   _derived_versionr   r0   r+   r   )r<   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r=   rP   z$DefaultLoadPlanner.create_local_plan<  s    =  !<===" 	1$ t335566LDM=BBDDEEI$|3L 
1,1)/A,0 0, ~224455l* R5C\2DOT] -1)-OT]0G,G
 
 	
r?   r^   c                      t          |          S rD   )r,   )r<   r^   s     r=   rp   z%DefaultLoadPlanner.create_global_pland  s    .{;;;r?   rm   c                     |S rD   rV   )r<   rm   s     r=   rw   zDefaultLoadPlanner.finish_plang  s    r?   	read_itemvaluec                     | j         rAt          | j        | j        |j        j                 t          j        |d                     d S t          j        |d          | j        |j        j        <   d S )NF)weights_only)	r   r   r   r0   
dest_indexfqnr   loadr@   )r<   r   r   s      r=   
load_byteszDefaultLoadPlanner.load_bytesj  s    " 		(i267
5u555     9>
E9 9 9DOI04555r?   c                 b    |                      |j                  }|                     ||          S rD   )lookup_tensorr   transform_tensorr<   r   tensors      r=   resolve_tensorz!DefaultLoadPlanner.resolve_tensorv  s.    ##I$899$$Y777r?   r   c                     d S rD   rV   r   s      r=   commit_tensorz DefaultLoadPlanner.commit_tensorz  s    r?   r{   c                 ,    t          | j        |          S r   r   r   s     r=   r   z DefaultLoadPlanner.lookup_tensor}  r   r?   c                 8    t          ||j        |j                  S r   )r   dest_offsetslengthsr   s      r=   r   z#DefaultLoadPlanner.transform_tensor  s    %fi.DiFWXXXr?   )TTFr   )r9   r   r   __doc__r   r   r
   r   r>   r   rE   r   rP   r   rp   rw   r   r   r   r   r   r   r   r   r   r   r   rV   r?   r=   r*   r*     s          )((( $((,#(	
5 
5 
5 "&
5 !	
5
 

5 
5 
5 
5 %)$	- -#- T/- 	-
 
- - - -&&
8 &
 &
 &
 &
P<d8n <h < < < <H     
H 
RZ 
D 
 
 
 
8 8 8 8 8x  $    >= >U\ > > > >Y( YEL Y Y Y Y Y Yr?   r*   c            	       `     e Zd ZdZd fd	ZdededefdZ	 	 dd	e	dedz  d
eddf fdZ
 xZS )_EmptyStateDictLoadPlannera  
    Extension of DefaultLoadPlanner, which rebuilds state_dict from the saved metadata.
    Useful for loading in state_dict without first initializing a model, such as
    when converting a DCP checkpoint into a Torch save file.

    . N.B. `state_dict` must be an empty dictionary when used with this LoadPlanner

    .. warning::
        Because the entire state dict is initialized, It's recommended to only utilize
        this LoadPlanner on a single rank or process to avoid OOM.

    Nc                 H    || _          t                      j        |i | d S rD   )r   superr>   )r<   r   argskwargsr8   s       r=   r>   z#_EmptyStateDictLoadPlanner.__init__  s,    	$)&)))))r?   keyr_   r5   c           	      V     j         dS | j         v rdS g }|j                            |          }|D ]W}|r>|                    d                    |d         t          |          g                     B|                    |           Xt           fd|D                       rdS dS )NT.c              3   *   K   | ]}|j         v V  d S rD   )r   )rW   unflattened_keyr<   s     r=   	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>  s*      TT$)+TTTTTTr?   F)r   rH   getri   joinstrany)r<   r   r_   unflattened_keysrH   r   s   `     r=   _should_include_keyz._EmptyStateDictLoadPlanner._should_include_key  s    94$)4&(,0055+ 	9 	9O 9 ''HH.r2C4H4HIJJ   
 !''8888TTTTCSTTTTT 	4ur?   Fr@   rB   c                    |rt          d          |t          d          |j                                        D ]\  }}|                     ||          st	          |t
                    r%t          j        |j        |j	        j
                  }|j        &||j        v rt          ||j        |         |           |||<   t                                          |||           d S )Nznot state_dictzmetadata is not None)dtype)r   r   itemsr   
isinstancer   r   emptysize
propertiesr   rH   r   r   rE   )r<   r@   r_   rB   kvr8   s         r=   rE   z)_EmptyStateDictLoadPlanner.set_up_planner  s      	3 !1222 !7888 06688 		" 		"DAq++Ax88 !233 BKal.@AAA$0Q(:O5O5OJ(=a(@!DDDD !
1z8^DDDDDr?   rD   r   )r9   r   r   r   r>   r   r   r   r   r   rE   __classcell__)r8   s   @r=   r   r     s         * * * * * *s h 4    4 %)$	E E#E T/E 	E
 
E E E E E E E E E Er?   r   Tr@   r_   strictr5   c           	      D   g }	 |                                  D ]\  }}||j        vr|rt          d| d          $|j        |         }t          |t                    r]t          |dd           L|j        |                                k    r/t          d|j         d|                                 d|           t          |t                    r.|j	        
                                |t          |||          z  }|t          |||          z  }t          |          S )Nz&Missing key in checkpoint state_dict: r   r   zSize mismatch between saved z and current: z for )r   r   RuntimeErrorr   r   getattrr   r\   r%   device_meshget_coordinater    r   )r@   r_   r   requestsr   objmds          r=   r+   r+     sH    H $$&& 9 9Sh222 "#RC#R#R#RSSS)#.r011	VT**6388::%%\rw\\chhjj\\WZ\\  
 c7## 	9--//;.sB<<<*3C888HHHr?   rQ   c                     | S )z
    Create global load plan used by DefaultLoadPlanner.

    The default load behavior involved no global coordination and this function
    currently doesn't change the local plans.
    rV   )rQ   s    r=   r,   r,     s
     r?   rB   c                    g }|                                  D ]Z\  }}t          |t                    r-|j                                        |t          ||          z  }G|t          ||          z  }[t          |          S )a  
    Create the ``SavePlan`` used by DefaultSavePlanner.

    On non-coordinator ranks, this function ignores tensors and non-tensor objects,
    only producing writes for ShardedTensor objects.

    On the coordinator rank, produce writes for all values.
    )r   r   r%   r   r   r!   r   )r@   rB   r   r   r   s        r=   r-   r-     s     H$$&& 
6 
6S c7## 	6--//;/S999
 +C555HHHr?   rewrite_index_hintsc                    i }g }| D ]}g }|j         D ]}|j        t          j        k    r|j        j        |v rt          d          |j        t          j        k    r1t                      ||j        j        <   |	                    |           {|j
        t          d          t          t          |                    |j        j        t          |j
        j        |j
        j        g                               }|}|rCt!          j        |j        t%          |j                            }	t!          j        ||	          }|	                    |           |j
        j        t          d|j        j         d          |j        	                    |j
        j                   |	                    t!          j        ||                     |t+          |          fS )	a6  
    Create the global plan and metadata used by DefaultSavePlanner.

    Metadata is produced by concatenating the metadata of all ``WriteItem`` from the supplied plans.

    The only global planning change is to update index hints in all ``MetadataIndex`` objects if
    ``rewrite_index_hints`` is True.
    zitem.index.fqn not in mdNzitem.tensor_data is not None)r   r   chunks)r{   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )r   )r   r   r   SHARDr{   r   r   r   r   ri   tensor_datar   r   
setdefaultr   r   rK   rL   rg   r   chunkr   )
rQ   r   r   	new_plansrM   	new_itemsitem	tensor_mdnew_item	new_indexs
             r=   r.   r.     s     $&BI &E &E	J #	@ #	@DyM///:>R''()CDDDyM111%9%;%;4:>"  &&&&#+()GHHH )MM
-'+'7'B!%!1!6#%   
 
	  & J + 3
#i.>*?*?! ! !I  +24yIIIH  ***#)1( **.* * *     ''(8(>????,TCCCDDDDx||$$r?   c                 J    t          |           }t          |g          \  }}|S )zTReturn the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.)r   r.   )r@   rM   _r   s       r=   _create_default_local_metadatar   R  s'    -j99D+TF33EArIr?   box0box1c                    t          | j                  }t          |          D ]\}| j        |         |j        |         |j        |         z   k    r dS |j        |         | j        |         | j        |         z   k    r dS ]dS )z9Check if two boxes overlap. Tuples are (offset, lengths).FT)rg   offsetsrangesizes)r   r   ndimsis       r=   _check_box_overlapr   Y  s     E5\\  <?dl1o
1===55<?dl1o
1===55 > 4r?   outer_box_size	inner_boxc                     t          t          |                     D ]R}|j        |         dk     r dS |j        |         dk     r dS |j        |         |j        |         z   | |         k    r dS SdS )Nr   FT)r   rg   r   r   )r   r   r   s      r=   _check_box_boundsr  i  s     3~&&''  Q!##55?1!!55Q)/!"44~a7HHH55 I 4r?   r^   c           	      N   d}|j                                         D ]\  }t          t                    rt	          j                  dk    r5j        d}D ]W}t          j        |          s$t          	                    d|j        |           d}|t          j        |j                  z  }Xt	                    dk    rt	          j                  t          t                    dfd          t          t          t	                              fd	          }g }|D ]}|         }	|	j                 }
|
|	j                 z   }t#          ||
t$          j        f          }|r|d |= |D ]<\  }}|         }t)          |	|          rt          	                    d
||	|           d}=t+          |||f           t          j        j                  }t	          |           dk    r%||k    rt          	                    d|||           d}|S )NTr   z~
                        key:%s has out of bounds chunk:
                        tensor-size:%s chunk: %s
                    Fr&   c                     j         |          S rD   )r   )dr   s    r=   <lambda>z'_validate_global_plan.<locals>.<lambda>  s    %*Q- r?   )defaultr   c                 h               j                  g fdt                    D             R S )Nc              3   >   K   | ]}         j         |         V  d S rD   )r   )rW   r  r   idxs     r=   r   z:_validate_global_plan.<locals>.<lambda>.<locals>.<genexpr>  s/      BBfSk)!,BBBBBBr?   )r   r   )r	  r   dims	sweep_dims   `r=   r  z'_validate_global_plan.<locals>.<lambda>  sD    3K'	2!BBBBBeDkkBBB! ! r?   )r   z$key:%s has overlapping chunks: %s %szq
                    key:%s invalid fill tensor-volume:
                    %s chunks-volume: %s
                )r   r   r   r   rg   r   r   r  r(   r7   mathprodr   maxr   sortedr   r   sysmaxsizer   r   )r^   r_   all_goodr   chunks_volumer   sorted_indicesactiver	  currentstartendcutoffr   	other_idxothertensor_volumer   r
  r  r   s                    @@@@r=   r[   r[   w  s   H288:: C C
Ue122 	uz??a 	4 	4E$UZ77 
! J   !TYu{333MMv;;??uz??DE$KK8O8O8O8OPPPI#c&kk""       N -/F% + + +	2gmI66%fuck.BCC (ww$* 	) 	)LAy"9-E)'599 )B#!	   $)vSz**** 	%*--{aM]$B$BNN    HOr?   )T)OrK   r   loggingr  r  bisectr   r   collectionsr   typingr   r   r   torch.distributed._shard._utilsr   .torch.distributed.checkpoint._dedup_save_plansr	   )torch.distributed.checkpoint._nested_dictr
   r   2torch.distributed.checkpoint._sharded_tensor_utilsr   &torch.distributed.checkpoint._traverser   %torch.distributed.checkpoint.metadatar   r   r   r   r   r   r   r   $torch.distributed.checkpoint.plannerr   r   r   r   r   r   r   ,torch.distributed.checkpoint.planner_helpersr   r   r   r    r!   r"   r#   "torch.distributed.checkpoint.utilsr$   torch.distributed.tensorr%    r'   	getLoggerr9   r(   Loggerr   __all__r)   r*   r   rZ   r   r   r+   r   r,   r-   r   r.   r   r   Sizer  r[   rV   r?   r=   <module>r0     s        				   



 ' ' ' ' ' ' ' '                      B B B B B B K K K K K K        X W W W W W > > > > > >	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                                   F E E E E E , , , , , ,       +*844 4 4 4  F F F F F F F FRtY tY tY tY tY tY tY tYn@E @E @E @E @E!3 @E @E @EH DH' 'S#X'*2'<@'' ' ' 'T	H~		(^	 	 	 	S#X04   : !%5% 5%H~5%5% 4>8#$5% 5% 5% 5%p 8    1 9M RV     J+?	   GtH~ G Gd G G G G G Gr?   