
    IЦiP              	          % S SK r S SK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
JrJrJrJrJr  S SKrS SKJr  S SKJr  S SKJr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/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\	4   S\S\BS\&4S jjrCS\\&   S\\&   4S jrDS\\A\	4   S \BS\)4S! jrE S-S\\)   S"\BS\\\)   \4   4S# jjrFS\!S\4S$ jrGS%\S&\S\B4S' jrHS(\R                  S)\S\B4S* jrJS+\\)   S\S\B4S, jrKg).    N)ChainMap)reduce)AnycastDictListOptionalTupleUnion)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)"_create_default_metadata_only_plan_create_read_items_create_write_items_init_state_dict)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4
S	 jjr  SS
\	S\\
   S\SS4S jjrS\4S jrS\\   S\\\   \4   4S jrS\S\4S jrS\S\\R,                  \R0                  4   4S jrS\S\4S jrS\S\4S jrSrg)r*   B   mappingsNr   flatten_sharded_tensorsdedup_replicated_tensorsdedup_save_to_lowest_rankreturnc                 h    Xl         X l        0 U l        X@l        Ub  [        R                  S5        g g )NzDefaultSavePlanner's `dedup_replicated_tensors` argument is being deprecated, and no longer has any effect. Please remove this argument from your call.)r   r3   r2   r5   r)   warning)selfr   r3   r4   r5   s        k/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/torch/distributed/checkpoint/default_planner.py__init__DefaultSavePlanner.__init__E   s9     #5'>$)B&#/NN" 0    
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   r2   r3   r   r>   r@   )r9   r>   r?   r@   s       r:   set_up_planner!DefaultSavePlanner.set_up_plannerW   s:     ""(::(F%J''1*=J$,r=   c                     [        U R                  U R                  5      nU R                  (       a  [        R
                  " XR                  S9nXl        U R                  $ )Nplanner_data)r.   r>   r@   r   dataclassesreplacer2   plan)r9   rJ   s     r:   create_local_plan$DefaultSavePlanner.create_local_pland   sD    -doot?R?RS""&&t--HD	yyr=   	all_plansc                 p   [        XR                  5      n[        U5      u  p#U R                  (       a@  U Vs/ s H  oDR                  PM     nn[        [        U6 5      n[        R                  " X6S9n[        X#5      (       d  [        S5      eX l        X0l        U R                  U R                  4$ s  snf )NrF   zFailed to validate global plan)r   r5   r/   r   rG   dictr   rH   rI   _validate_global_plan
ValueErrorglobal_planmetadata)r9   rM   rR   rS   pplanner_data_dictmerged_mappingss          r:   create_global_plan%DefaultSavePlanner.create_global_planl   s     %Y0N0NO	 ?	 J""
 :E EA E"8->#?@O"**8RH$[;;=>>& .. !Fs   B3new_planc                     Xl         U$ rB   )rJ   r9   rY   s     r:   finish_planDefaultSavePlanner.finish_plan   s    	r=   
write_itemc                 Z    U R                  UR                  5      nU R                  X5      $ rB   )lookup_objectindextransform_object)r9   r^   objects      r:   resolve_dataDefaultSavePlanner.resolve_data   s)    ##J$4$45$$Z88r=   ra   c                 .    [        U R                  U5      $ zSExtension from the planner interface to make it easy to extend the default planner.r%   r>   r9   ra   s     r:   r`    DefaultSavePlanner.lookup_object       %doou==r=   rc   c                     UR                   [        R                  :X  a-  [        R                  " 5       n[
        R                  " X#5        UnU$ rg   )typer    BYTE_IOioBytesIOtorchsave)r9   r^   rc   bytess       r:   rb   #DefaultSavePlanner.transform_object   s5    ??m333JJLEJJv%Fr=   )	r5   r3   r   rR   r@   r2   rS   rJ   r>   )TTNFNF)__name__
__module____qualname____firstlineno__r   __annotations__boolr	   r;   r   r   rC   r   rK   r   r
   r   rW   r\   r   r   rq   Tensorro   rp   rd   r   r   r`   rb   __static_attributes__ r=   r:   r*   r*   B   s    $((,37*/  "& #+4.	
 $( 
* /3$	-#- {+- 	-
 
-8 /h/	tH~x'	(/0H  9y 9U5<<;S5T 9>= >S >9 c r=   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	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\R0                  SS	4S jrS\S\R0                  4S jrS\S\R0                  4S jrSrg	) r+      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_dictr2   r   r3   allow_partial_loadr6   Nc                 D    Xl         X l        0 U l        0 U l        X0l        g rB   )r   r3   r   r2   r   )r9   r   r3   r   s       r:   r;   DefaultLoadPlanner.__init__   s%     #5'>$#% "4r=   r>   rS   r@   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 rB   )	r$   r   r3   r   r   r2   r>   rS   r@   )r9   r>   rS   r@   s       r:   rC   !DefaultLoadPlanner.set_up_planner   sM     	$#- ''1*=J""(::(F%J$ ,r=   c                    U R                   c   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      $ )N2_3)rS   r   setr>   keysstate_dict_metadatar(   _derived_versionr   r2   r,   r   )r9   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r:   rK   $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
 	
r=   rR   c                     [        U5      $ rB   )r-   )r9   rR   s     r:   rW   %DefaultLoadPlanner.create_global_plan   s    .{;;r=   rY   c                     U$ rB   r~   r[   s     r:   r\   DefaultLoadPlanner.finish_plan   s    r=   	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   r2   
dest_indexfqnrq   loadr>   )r9   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5r=   c                 Z    U R                  UR                  5      nU R                  X5      $ rB   )lookup_tensorr   transform_tensorr9   r   tensors      r:   resolve_tensor!DefaultLoadPlanner.resolve_tensor   s)    ##I$8$89$$Y77r=   r   c                     g rB   r~   r   s      r:   commit_tensor DefaultLoadPlanner.commit_tensor  s    r=   ra   c                 .    [        U R                  U5      $ rg   rh   ri   s     r:   r    DefaultLoadPlanner.lookup_tensor  rk   r=   c                 B    [        X!R                  UR                  5      $ rg   )r   dest_offsetslengthsr   s      r:   r   #DefaultLoadPlanner.transform_tensor
  s    %f.D.DiFWFWXXr=   )r   r3   r   r@   r2   rS   r   r>   )TTFru   )rv   rw   rx   ry   __doc__r   rz   r   r{   r;   r	   r   rC   r   rK   r   rW   r\   r   ro   rp   r   r   rq   r|   r   r   r   r   r}   r~   r=   r:   r+   r+      s7    )( $((,#(	
5 
5 "&
5 !	
5
 

5 (,$	-#- 8$- 	-
 
-&%
8 %
N<d8n <h <H  
H 
RZZ 
D 
8 8x  $ >= >U\\ >Y( YELL Yr=   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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 rB   )r   superr;   )r9   r   argskwargs	__class__s       r:   r;   #_EmptyStateDictLoadPlanner.__init__  s    	$)&)r=   keyrS   r6   c           	      V  ^  T R                   c  gUT R                   ;   a   / 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rB   r   ).0unflattened_keyr9   s     r:   	<genexpr>A_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>3  s     TCS$))+CSs   F)r   rG   getappendjoinstrany)r9   r   rS   unflattened_keysrG   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r=   r>   r@   c                   > U(       a   eUc   eUR                   R                  5        H  u  pEU R                  XB5      (       d  M  [        U[        5      (       a3  [
        R                  " UR                  UR                  R                  S9nXBR                  ;   a  [        XR                  U   U5        M  XQU'   M     [        TU ]5  XU5        g )N)dtype)r   itemsr   
isinstancer   rq   emptysize
propertiesr   rG   r   r   rC   )r9   r>   rS   r@   kvr   s         r:   rC   )_EmptyStateDictLoadPlanner.set_up_planner8  s     ~### 00668DA++A88!233KKall.@.@A)))J(=(=a(@!D !1 9 	z^Dr=   r   rB   ru   )rv   rw   rx   ry   r   r;   r   r   r{   r   r   r	   rC   r}   __classcell__)r   s   @r:   r   r     sj    *s h 4 4 (,$	E#E 8$E 	E
 
E Er=   r   r>   rS   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   rQ   r&   device_meshget_coordinater"   r   )r>   rS   r   requestsr   objmds          r:   r,   r,   P  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r=   rM   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~   )rM   s    r:   r-   r-   z  s
     r=   r@   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   )r>   r@   r   r   r   s        r:   r.   r.     st     H$$& c7##--/;/99 < +C55H ' Hr=   rewrite_index_hintsc                 6   0 n/ nU  GH  n/ nUR                    GH  nUR                  [        R                  :X  d  UR                  R
                  U;  d   eUR                  [        R                  :X  a3  [        5       X&R                  R
                  '   UR                  U5        M  UR                  c   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.
)r   r   chunks)ra   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )r   )r   rm   r    SHARDra   r   rn   r   r   tensor_datar   r   
setdefaultr   r   rH   rI   lenr   chunkr   )
rM   r   r   	new_plansrJ   	new_itemsitem	tensor_mdnew_item	new_indexs
             r:   r/   r/     s    $&BI	JJD99 3 33zz~~R///yyM111%9%;::>>"  &''333 )MM

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

#i.>.>*?!I  +224IH  * $$**6**..) *6
   ''(8(8(>(>?E F 	,,TCDK L x|$$r=   c                 8    [        U 5      n[        U/5      u  p#U$ )zTReturn the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.)r!   r/   )r>   rJ   _r   s       r:   _create_default_local_metadatar     s    -j9D+TF3EAIr=   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     su     E5\<<?dll1o

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

1==	  r=   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 ( r=   rR   c           	         SnUR                   R                  5        GHJ  u  p4[        U[        5      (       a  M  [	        UR
                  5      S:X  a  M8  Sn[        UR                  5       H  u  pg[        UR
                  U5      (       d$  [        R                  SUUR
                  U5        SnU[        [        R                  UR                  S5      -  nUR                  US-   S   H.  n[        Xx5      (       d  M  [        R                  SX7U5        SnM0     M     [        [        R                  UR
                  S5      n	XY:w  d  GM0  [        R                  SUU	U5        SnGMM     U$ )NTr   z~
                        key:%s has out of bounds chunk:
                        tensor-size:%s chunk: %s
                    Fr'   z$key:%s has overlapping chunks: %s %szq
                    key:%s invalid fill tensor-volume:
                    %s chunks-volume: %s
                )r   r   r   r   r   r   	enumerater   r   r)   r8   r   operatormulr   r   )
rR   rS   all_goodr   r   chunks_volume	chunk_idxchunk0chunk1tensor_volumes
             r:   rP   rP     s>   H2288:
e122uzz?a!*5<<!8I$UZZ88 JJ !VHLL&,,BBM  ,,y1}7%f55NN>V  %H 8! "90 x||UZZ;)NN  HS ;V Or=   )T)LrH   ro   loggingr  collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   rq   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$   "torch.distributed.checkpoint.utilsr%   torch.distributed.tensorr&    r(   	getLoggerrv   r)   Loggerrz   __all__r*   r+   r   r   r{   r,   r-   r.   r/   r   r   Sizer   rP   r~   r=   r:   <module>r     s    	      @ @ @  B K X >	 	 	    F ,  !**84 4T TnsY sYl>E!3 >ED DH'S#X'*2'<@''T	H~		(^	S#X04: !%4%H~4%4% 4>8#$4%n 8 1 9M RV  JJ+?	-tH~ - -d -r=   