
    3jn              	          % S SK r S SKrS SKrS SKrS SKrS SKJrJr  S SKJ	r	  S SK
JrJ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  S S
KJrJrJrJrJrJrJ r J!r!  S SK"J#r#J$r$J%r%J&r&J'r'J(r(J)r)  S SK*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  S SK2J3r3  S SK4J5r5  SSK6J7r7  \Rp                  " \95      r:\Rv                  \<S'   / SQr= " S S\'5      r> " S S\$5      r? " S S\?5      r@ S-S\A\B\4   S\S\CS\#4S jjrDS\E\#   S\E\#   4S jrFS\A\B\4   S \CS\&4S! jrG S-S\E\&   S"\CS\H\E\&   \4   4S# jjrIS\S\4S$ jrJS%\S&\S\C4S' jrKS(\R                  S)\S\C4S* jrMS+\E\&   S\S\E\B   4S, jrNg).    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                      \ rS rSr% \\S'        SS\S\S\S-  S\S\S	S4S
 jjr  S S\S\	S-  S\S	S4S jjr
S	\4S jrS\\   S	\\   4S jrS\\   S	\\\   \4   4S jrS\\   S	\\\   \\   \4   4S jrS\\   S	\\\   \4   4S jrS\S	\4S jrS\S	\4S jrS\S	\R0                  \R4                  -  4S jrS\S	\4S jrS\S\4S jrSr g)!r)   F   mappingsNr   flatten_sharded_tensorsdedup_replicated_tensorsdedup_save_to_lowest_rankenable_plan_cachingreturnc                     Xl         X l        0 U l        X@l        Ub  [        R                  S5        U R                  R                  U l        XPl	        g )NzDefaultSavePlanner's `dedup_replicated_tensors` argument is being deprecated, and no longer has any effect. Please remove this argument from your call.)
r   r2   r1   r4   r(   warning	__class____name___cached_plans_key_enable_plan_caching)selfr   r2   r3   r4   r5   s         f/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/distributed/checkpoint/default_planner.py__init__DefaultSavePlanner.__init__I   sN     #5'>$)B&#/NN"
 '+nn&=&=$7!    
state_dictstorage_metais_coordinatorc                     U R                   (       a  [        U5      u  ol        U R                  (       a  [        U5      nXl        X0l        g N)r   r1   r2   r   rB   rD   )r=   rB   rC   rD   s       r>   set_up_planner!DefaultSavePlanner.set_up_planner^   s:     ""(::(F%J''1*=J$,rA   c                    [        U R                  U R                  5      nU R                  (       a  [        R
                  " XR                  S9nXl        U R                  (       ao  U R                  [        R                  ;   aK  [        U[        R                  U R                     5      (       a  [        R                  S5        [        / SS9$ Xl        U R                  $ )Nplanner_datazINo change in the local plan. Skipping sending the plan to the coordinatorFusable)r-   rB   rD   r   dataclassesreplacer1   planr<   r;   r   _cached_save_planr   r(   infor   _pending_local_plan)r=   rP   s     r>   create_local_plan$DefaultSavePlanner.create_local_plank   s    -doot?R?RS""&&t--HD	$$ &&+*G*GG'+778N8NO  _  511 ,0(yyrA   	all_plansc                 ,    [        XR                  5      $ rF   )r	   r4   )r=   rV   s     r>   _dedup_save_plans$DefaultSavePlanner._dedup_save_plans   s    	+I+IJJrA   c                    U R                  U5      n[        U5      u  p4U R                  (       a@  U Vs/ s H  oUR                  PM     nn[	        [        U6 5      n[        R                  " XGS9n[        X45      nU(       a6  SR                  U5      n	[        U	5      S:  a  U	S S S-   n	[        SU	 35      eX44$ s  snf )NrJ   z; i  z... (truncated)z Failed to validate global plan: )rX   r.   r   rK   dictr   rN   rO   _validate_global_planjoinlen
ValueError)
r=   rV   deduped_plansglobal_planmetadatapplanner_data_dictmerged_mappingsvalidation_errorserror_summarys
             r>   _create_global_plan&DefaultSavePlanner._create_global_plan   s     ..y9 ? N""
 :E EA E"8->#?@O"**8RH1+H II&78M=!C' -ds 36G G?OPP$$ !Fs   B;c                    / nU R                   [        R                  ;  an  U R                  U5      u  p4U[        R                  U R                   '   U[        R                  U R                   '   U[        R
                  U R                   '   X3U4$ [        U5      (       dS  [        / SS9/[        U5      -  n[        R                  U R                      n[        R
                  U R                      nGO[        [        R                  U R                      U5      nU[        R                  U R                   '   U R                  U5      u  p4U R                   U R                  ;   al  [        [        R                  U R                      U5       HA  u  pg[        Xg5      (       a  UR                  [        / SS95        M0  UR                  U5        MC     U[        R                  U R                   '   U[        R
                  U R                   '   X#U4$ )z_
Create global plan with caching.
Returns a tuple of global_plan_delta, global_plan, metadata.
FrL   )r;   r   _cached_all_plansrh   _cached_global_plan_cached_metadatar   r   r^   r#   zipr   append)r=   rV   global_plan_deltara   rb   merged_planscached_plannew_plans           r>    _create_global_plan_with_caching3DefaultSavePlanner._create_global_plan_with_caching   s    -/!!)F)FF %)$<$<Y$G!K ENK))$*@*@AFQK++D,B,BCCKK(()?)?@X55 %Y// "*"U!; <s9~ M%99$:P:PQK"33D4J4JKH 4--d.D.DEyL EQK))$*@*@A$($<$<\$J!K%%)A)AA-033D4J4JK[.)K +;AA)00"U1KL)00:. GRK++D,B,BCCKK(()?)?@ x77rA   c                     / nU R                   (       a  U R                  U5      u  nnnOU R                  U5      u  p4UnX0l        X@l        X R                  4$ rF   )r<   rt   rh   ra   rb   )r=   rV   rp   ra   rb   s        r>   create_global_plan%DefaultSavePlanner.create_global_plan   sd     -/$$ 55i@	! %)$<$<Y$G!K +&  --//rA   rs   c                     UnUR                   (       d  [        R                  U R                     nU$ UnU[        R                  U R                  '   U$ rF   )rM   r   _cached_final_save_planr;   r=   rs   finished_plans      r>   _finish_plan_with_caching,DefaultSavePlanner._finish_plan_with_caching   sO    "*'??@V@VWM  %MJRK//0F0FGrA   c                     UnU R                   (       aK  U R                  U5      n[        U S5      (       a)  U R                  [        R
                  U R                  '   U ?X l        U R                  $ )NrS   )r<   r}   hasattrrS   r   rQ   r;   rP   r{   s      r>   finish_planDefaultSavePlanner.finish_plan   sf    "*$$ ::8DM t233,, --d.D.DE ,!	yyrA   
write_itemc                 Z    U R                  UR                  5      nU R                  X5      $ rF   )lookup_objectindextransform_object)r=   r   objects      r>   resolve_dataDefaultSavePlanner.resolve_data  s)    ##J$4$45$$Z88rA   r   c                 .    [        U R                  U5      $ zSExtension from the planner interface to make it easy to extend the default planner.r$   rB   r=   r   s     r>   r    DefaultSavePlanner.lookup_object      %doou==rA   r   c                     UR                   [        R                  :X  a-  [        R                  " 5       n[
        R                  " X#5        UnU$ r   )typer   BYTE_IOioBytesIOtorchsave)r=   r   r   bytess       r>   r   #DefaultSavePlanner.transform_object  s5    ??m333JJLEJJv%FrA   )r;   r<   rS   r4   r2   r   ra   rD   r1   rb   rP   rB   )TTNFFNF)!r:   
__module____qualname____firstlineno__r
   __annotations__boolr?   r   r   rG   r   rT   listrX   tupler   rh   rt   rw   r}   r   r   r   Tensorr   r   r   r   r   r   r   __static_attributes__ rA   r>   r)   r)   F   s    $((,04*/$)8 8 "&8 #'+	8
 $(8 "8 
80 ,0$	-#- "D(- 	-
 
-8 8K4> Kd8n K%h%	tH~x'	(%2:8h:8	tH~tH~x7	8:8x0h0	tH~x'	(0,( x H  &9y 9U\\BJJ5N 9>= >S >9 c rA   r)   c            	       f   \ rS rSr% Sr\\S'   \\S'      SS\S\S\SS	4S
 jjr	  SS\S\
S	-  S\SS	4S jjrS\4S jrS\\   S\\   4S jrS\S\4S jrS\S\R&                  SS	4S jrS\4S jrS\S\R.                  SS	4S jrS\S\R.                  4S jrS\S\R.                  4S jrSrg	) r*   i#  aS  
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_dictr1   r   r2   allow_partial_loadr6   Nc                 D    Xl         X l        0 U l        0 U l        X0l        g rF   )r   r2   r   r1   r   )r=   r   r2   r   s       r>   r?   DefaultLoadPlanner.__init__1  s%     #5'>$#% "4rA   rB   rb   rD   c                     [        U5        Xl        U R                  (       a  [        U5      nU R                  (       a  [	        U5      u  ol        Xl        X l        X0l        g rF   )	r"   r   r2   r   r   r1   rB   rb   rD   )r=   rB   rb   rD   s       r>   rG   !DefaultLoadPlanner.set_up_planner=  sM     	$#- ''1*=J""(::(F%J$ ,rA   c                 $   U R                   c  [        S5      eU R                  (       a  [        U R                  R                  5       5      n[        U R                   R                  R                  5       5      nX!-
  nU(       a]  S[        l        [        U R                  5      u  pE[        UR                  5       5      nXc-  (       a  XEsU l        U l
        S [        l        [        U R                  U R                   U R                  (       + 5      $ )Nzself.metadata is not None2_3)rb   AssertionErrorr   setrB   keysstate_dict_metadatar'   _derived_versionr   r1   r+   r   )r=   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r>   rT   $DefaultLoadPlanner.create_local_planP  s    ==  !<==""$ t3356LDMM==BBDEI$3L,1)/A,,0, ~2245*5C2DOT] -1)-OOT]]0G0G,G
 	
rA   ra   c                     [        U5      $ rF   )r,   )r=   ra   s     r>   rw   %DefaultLoadPlanner.create_global_planx  s    .{;;rA   rs   c                     U$ rF   r   )r=   rs   s     r>   r   DefaultLoadPlanner.finish_plan{  s    rA   	read_itemvaluec           	      *   U R                   (       aL  [        U R                  U R                  UR                  R
                     [        R                  " USS95        g [        R                  " USS9U R                  UR                  R
                  '   g )NF)weights_only)	r   r   r   r1   
dest_indexfqnr   loadrB   )r=   r   r   s      r>   
load_bytesDefaultLoadPlanner.load_bytes~  sl    ""((i22667

5u5 9>

E9DOOI00445rA   c                 Z    U R                  UR                  5      nU R                  X5      $ rF   )lookup_tensorr   transform_tensorr=   r   tensors      r>   resolve_tensor!DefaultLoadPlanner.resolve_tensor  s)    ##I$8$89$$Y77rA   r   c                     g rF   r   r   s      r>   commit_tensor DefaultLoadPlanner.commit_tensor  s    rA   r   c                 .    [        U R                  U5      $ r   r   r   s     r>   r    DefaultLoadPlanner.lookup_tensor  r   rA   c                 B    [        X!R                  UR                  5      $ r   )r   dest_offsetslengthsr   s      r>   r   #DefaultLoadPlanner.transform_tensor  s    %f.D.DiFWFWXXrA   )r   r2   r   rD   r1   rb   r   rB   )TTFr   )r:   r   r   r   __doc__r   r   r
   r   r?   r   rG   r   rT   r   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   r>   r*   r*   #  s6    )( $((,#(	
5 
5 "&
5 !	
5
 

5 %)$	-#- T/- 	-
 
-&&
8 &
P<d8n <h <H  
H 
RZZ 
D 
8 8x  $ >= >U\\ >Y( YELL YrA   r*   c            	       t   ^  \ rS rSrSrSU 4S jjrS\S\S\4S jr	  SS	\
S\S-  S
\SS4U 4S jjjrSrU =r$ )_EmptyStateDictLoadPlanneri  a  
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                 2   > Xl         [        TU ]  " U0 UD6  g rF   )r   superr?   )r=   r   argskwargsr9   s       r>   r?   #_EmptyStateDictLoadPlanner.__init__  s    	$)&)rA   keyrb   r6   c           	      V  ^  T R                   c  gUT R                   ;   a  g/ nUR                  R                  U5      nU HK  nU(       a0  UR                  SR	                  US   [        U5      /5      5        M:  UR                  U5        MM     [        U 4S jU 5       5      (       a  gg)NT.c              3   @   >#    U  H  oTR                   ;   v   M     g 7frF   r   ).0unflattened_keyr=   s     r>   	<genexpr>A_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>  s     TCS$))+CSs   F)r   rK   getro   r]   strany)r=   r   rb   unflattened_keysrK   r   s   `     r>   _should_include_key._EmptyStateDictLoadPlanner._should_include_key  s    99$))&(,,005+O ''HH.r2C4HIJ
 !''8  , TCSTTTrA   rB   rD   c                   > U(       a  [        S5      eUc  [        S5      eUR                  R                  5        H  u  pEU R                  XB5      (       d  M  [	        U[
        5      (       a3  [        R                  " UR                  UR                  R                  S9nUR                  b*  XBR                  ;   a  [        XR                  U   U5        M  XQU'   M     [        TU ]9  XU5        g )Nznot state_dictzmetadata is not None)dtype)r   r   itemsr   
isinstancer   r   emptysize
propertiesr   rK   r   r   rG   )r=   rB   rb   rD   kvr9   s         r>   rG   )_EmptyStateDictLoadPlanner.set_up_planner  s      !122 !788 00668DA++A88!233KKall.@.@A$$0Q:O:O5OJ(=(=a(@!D !1 9 	z^DrA   r   rF   r   )r:   r   r   r   r   r?   r   r   r   r   r   rG   r   __classcell__)r9   s   @r>   r   r     si    *s h 4 4 %)$	E#E T/E 	E
 
E ErA   r   rB   rb   strictr6   c           	      :   / n U R                  5        H  u  pEXAR                  ;  a  U(       a  [        SU S35      eM,  UR                  U   n[        U[        5      (       aX  [        USS 5      bJ  UR                  UR                  5       :w  a,  [        SUR                   SUR                  5        SU 35      e[        U[        5      (       a.  UR                  R                  5       b  U[        XFU5      -  nM  M  U[        XFU5      -  nM     [        U5      $ )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   )rB   rb   r   requestsr   objmds          r>   r+   r+     s    H $$&222"%KC5PQ#RSS))#.r011VT*6388:%.rwwi~chhj\QVWZV[\ 
 c7##--/;.s<< < *3C88H/ '2 HrA   rV   c                     U $ )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.
r   )rV   s    r>   r,   r,     s
     rA   rD   c                     / nU R                  5        HU  u  p4[        U[        5      (       a-  UR                  R	                  5       b  U[        X45      -  nME  MG  U[        X45      -  nMW     [        U5      $ )z
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   )rB   rD   r   r   r  s        r>   r-   r-     st     H$$& c7##--/;/99 < +C55H ' HrA   rewrite_index_hintsc                 b   0 n/ nU  GH  n/ nUR                    GH  nUR                  [        R                  :w  a%  UR                  R
                  U;   a  [        S5      eUR                  [        R                  :X  a3  [        5       X&R                  R
                  '   UR                  U5        M  UR                  c  [        S5      e[        [        UR                  UR                  R
                  [        UR                  R                  UR                  R                  / S95      5      nUnU(       aF  [         R"                  " UR                  [%        UR&                  5      S9n	[         R"                  " XiS9nUR                  U5        UR                  R(                  c#  [        SUR                  R
                   S35      eUR&                  R                  UR                  R(                  5        GM     UR                  [         R"                  " XES95        GM     U[+        U5      4$ )a"  
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 mdz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   ro   tensor_datar   r   
setdefaultr   r   rN   rO   r^   r  chunkr   )
rV   r  r  	new_plansrP   	new_itemsitem	tensor_mdnew_item	new_indexs
             r>   r.   r.   .  s    $&BI	JJDyyM///::>>R'()CDDyyM111%9%;::>>"  &##+()GHH )MM

-'+'7'7'B'B!%!1!1!6!6#%
	  & + 3 3

#i.>.>*?!I  +224IH  *##))1( .**..) **     ''(8(8(>(>?G H 	,,TCDM N x|$$rA   c                 8    [        U 5      n[        U/5      u  p#U$ )zTReturn the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.)r   r.   )rB   rP   _r  s       r>   _create_default_local_metadatar  f  s    -j9D+TF3EAIrA   box0box1c                    [        U R                  5      n[        U5       Hg  nU R                  U   UR                  U   UR                  U   -   :  a    gUR                  U   U R                  U   U R                  U   -   :  d  Mg    g   g)z9Check if two boxes overlap. Tuples are (offset, lengths).FT)r^   offsetsrangesizes)r  r  ndimsis       r>   _check_box_overlapr  m  su     E5\<<?dll1o

1==<<?dll1o

1==	  rA   outer_box_size	inner_boxc                     [        [        U 5      5       HT  nUR                  U   S:  a    gUR                  U   S:  a    gUR                  U   UR                  U   -   X   :  d  MT    g   g)Nr   FT)r  r^   r  r  )r  r  r  s      r>   _check_box_boundsr!  }  sn     3~&'Q!#??1!Q)//!"44~7HH ( rA   ra   c           	        ^^^^ / nUR                   R                  5        GHL  u  nm[        T[        5      (       a  M  [	        TR
                  5      S:X  a  M9  TR                  mSnT H|  n[        TR
                  U5      (       d;  SU STR
                   SU 3n[        R                  U5        UR                  U5        U[        R                  " UR                  5      -  nM~     [	        T5      S:  Ga  [	        TR
                  5      m[        [        T5      SU4S jS9m[!        [        [	        T5      5      UUU4S jS	9n/ nU H  n	TU	   n
U
R"                  T   nXR                  T   -   n[%        X[&        R(                  45      nU(       a  US
U2	 U HN  u  pTU   n[+        U
U5      (       d  M  SU SU
 SU 3n[        R                  U5        UR                  U5        MP     [-        XU	45        M     [        R                  " TR
                  5      n[	        U 5      S:  d  GM  UU:w  d  GM  SU SU SU 3n[        R                  U5        UR                  U5        GMO     U$ )zNValidate the global plan and return a list of error messages (empty if valid).r   zkey:z& has out of bounds chunk: tensor-size:z chunk: r&   c                 "   > TR                   U    $ rF   )r   )dr   s    r>   <lambda>'_validate_global_plan.<locals>.<lambda>  s    %**Q-rA   )defaultr   c                 Z   >^  TT    R                   T   /UU 4S j[        T5       5       Q7$ )Nc              3   H   >#    U  H  nTT   R                   U   v   M     g 7frF   )r  )r   r$  r  idxs     r>   r   :_validate_global_plan.<locals>.<lambda>.<locals>.<genexpr>  s      BkfSk))!,ks   ")r  r  )r*  r  dims	sweep_dims   `r>   r%  r&    s+    3K''	2!BeDkB!rA   )r   Nz has overlapping chunks:  z invalid fill tensor-volume: z chunks-volume: )r   r   r   r   r^   r   r  r!  r(   r8   ro   mathprodr  maxr  sortedr  r   sysmaxsizer  r   )ra   rb   errorsr   chunks_volumer  msgsorted_indicesactiver*  currentstartendcutoffr  	other_idxothertensor_volumer  r,  r-  r   s                     @@@@r>   r\   r\     s8   F2288:
Ue122uzz?aE$UZZ773%  ##(::,hug?  s#c"TYYu{{33M  v;?uzz?DE$K8OPI#c&k"N -/F% +	2mmI66%fckk.BCww$*LA"9-E)'599 $SE)B7)1UGTs+c* %+ vSz*! && 		%**-{aM]$Bse8 /!1-B  NN3MM#o ;r MrA   )T)OrN   r   loggingr/  r3  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'   	getLoggerr:   r(   Loggerr   __all__r)   r*   r   r[   r   r   r+   r   r,   r-   r   r.   r  r  Sizer!  r\   r   rA   r>   <module>rT     s    	   
 '     B K X >	 	 	     F ,  !**84 4Z ZztY tYn@E!3 @EH DH'S#X'*2'<@''T	H~		(^	S#X04: !%5%H~5%5% 4>8#$5%p 8 1 9M RV  JJ+?	<tH~ < <dSVi <rA   