
    ȅi!k              	          % 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\C4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/james-whalen/.local/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                  (       a  U R                  [        R                  ;   aK  [        U[        R                  U R                     5      (       a  [        R                  S5        [        / SS9$ U[        R                  U R                  '   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   )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1HL--d.D.DEyyrA   	all_plansc                 ,    [        XR                  5      $ rF   )r	   r4   )r=   rU   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      (       d  [        S5      eX44$ s  snf )NrJ   zFailed to validate global plan)
rW   r.   r   rK   dictr   rN   rO   _validate_global_plan
ValueError)r=   rU   deduped_plansglobal_planmetadatapplanner_data_dictmerged_mappingss           r>   _create_global_plan&DefaultSavePlanner._create_global_plan   s     ..y9 ? N""
 :E EA E"8->#?@O"**8RH$[;;=>>$$ !Fs   Bc                    / nU R                   [        R                  ;  an  U[        R                  U R                   '   U R                  U5      u  p4U[        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_plansrc   _cached_global_plan_cached_metadatar   r   lenr#   zipr   append)r=   rU   global_plan_deltar^   r_   merged_planscached_plannew_plans           r>    _create_global_plan_with_caching3DefaultSavePlanner._create_global_plan_with_caching   s    -/!!)F)FF
 ENK))$*@*@A$($<$<Y$G!KFQK++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<   rp   rc   r^   r_   )r=   rU   rl   r^   r_   s        r>   create_global_plan%DefaultSavePlanner.create_global_plan   sd     -/$$ 55i@	! %)$<$<Y$G!K +&  --//rA   ro   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=   ro   finished_plans      r>   _finish_plan_with_caching,DefaultSavePlanner._finish_plan_with_caching   sO    "*'??@V@VWM  %MJRK//0F0FGrA   c                 n    UnU R                   (       a  U R                  U5      nX l        U R                  $ rF   )r<   ry   rP   rw   s      r>   finish_planDefaultSavePlanner.finish_plan   s/    "*$$ ::8DM!	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<   r4   r2   r   r^   rD   r1   r_   rP   rB   )TTNFFNF)!r:   
__module____qualname____firstlineno__r
   __annotations__boolr?   r   r   rG   r   rS   listrW   tupler   rc   rp   rs   ry   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 .K4> Kd8n K%h%	tH~x'	(%*98h98	tH~tH~x7	898v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__  s%     #5'>$#% "4rA   rB   r_   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   r_   rD   )r=   rB   r_   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)r_   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>   rS   $DefaultLoadPlanner.create_local_plan<  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   r^   c                     [        U5      $ rF   )r,   )r=   r^   s     r>   rs   %DefaultLoadPlanner.create_global_pland  s    .{;;rA   ro   c                     U$ rF   r   )r=   ro   s     r>   r|   DefaultLoadPlanner.finish_plang  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_bytesj  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_tensorv  s)    ##I$8$89$$Y77rA   r   c                     g rF   r   r   s      r>   commit_tensor DefaultLoadPlanner.commit_tensorz  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   r_   r   rB   )TTFr   )r:   r   r   r   __doc__r   r   r
   r   r?   r   rG   r   rS   r   rs   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   keyr_   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   getrk   joinstrany)r=   r   r_   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   r_   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   r_   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   r_   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   rU   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   )rU   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   rk   tensor_datar   r   
setdefaultr   r   rN   rO   ri   r  chunkr   )
rU   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  R  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)ri   offsetsrangesizes)r  r  ndimsis       r>   _check_box_overlapr  Y  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  ri   r  r  )r  r  r  s      r>   _check_box_boundsr  i  sn     3~&'Q!#??1!Q)//!"44~7HH ( rA   r^   c           	      Z  ^^^^ SnUR                   R                  5        GH  u  nm[        T[        5      (       a  M  [	        TR
                  5      S:X  a  M9  TR                  mSnT He  n[        TR
                  U5      (       d$  [        R                  SUTR
                  U5        SnU[        R                  " UR                  5      -  nMg     [	        T5      S:  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[#        Xz[$        R&                  45      nU(       a  US U2	 U H6  u  pTU   n[)        X5      (       d  M  [        R                  S
UU	U5        SnM8     [+        X{U45        M     [        R                  " TR
                  5      n[	        U 5      S:  d  GM  UU:w  d  GM  [        R                  SUUU5        SnGM     U$ )NTr   z~
                        key:%s has out of bounds chunk:
                        tensor-size:%s chunk: %s
                    Fr&   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   z$key:%s has overlapping chunks: %s %szq
                    key:%s invalid fill tensor-volume:
                    %s chunks-volume: %s
                )r   r   r   r   ri   r   r  r  r(   r8   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288:
Ue122uzz?aE$UZZ77 JJ !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)'99B#!	 $) %+ vSz*) &. 		%**-{aM]$BNN  HG ;J OrA   )T)OrN   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'   	getLoggerr:   r(   Loggerr   __all__r)   r*   r   rZ   r   r   r+   r   r,   r-   r   r.   r  r  Sizer  r[   r   rA   r>   <module>rN     s    	   
 '     B K X >	 	 	     F ,  !**84 4F FR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+?	GtH~ G Gd GrA   