
    9jn              	          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jp                  e9      Z:ejv                  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j                  d)edeCfd*ZMd+eEe&   dedeEeB   fd,ZNy).    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j2                  z  fdZdedefdZdedefdZy)r)   mappingsNr   flatten_sharded_tensorsdedup_replicated_tensorsdedup_save_to_lowest_rankenable_plan_cachingreturnc                     || _         || _        i | _        || _        |t        j                  d       | j                  j                  | _        || _	        y )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         l/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributed/checkpoint/default_planner.py__init__zDefaultSavePlanner.__init__I   sV     #5'>$)B&#/NN"
 '+nn&=&=$7!    
state_dictstorage_metais_coordinatorc                     | j                   rt        |      \  }| _        | j                  rt        |      }|| _        || _        y N)r   r0   r1   r   r@   rB   )r<   r@   rA   rB   s       r=   set_up_plannerz!DefaultSavePlanner.set_up_planner^   s@     ""(::(F%J''1*=J$,r?   c                    t        | j                  | j                        }| j                  r!t	        j
                  || j                        }|| _        | j                  rl| j                  t        j                  v rIt        |t        j                  | j                           r"t        j                  d       t        g d      S || _        | 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   _pending_local_plan)r<   rM   s     r=   create_local_planz$DefaultSavePlanner.create_local_plank   s    -doot?R?RS""&&t$--HD	$$ &&+*G*GG'+778N8NO _  511 ,0(yyr?   	all_plansc                 .    t        || j                        S rD   )r	   r3   )r<   rR   s     r=   _dedup_save_plansz$DefaultSavePlanner._dedup_save_plans   s    	4+I+IJJr?   c                 r   | j                  |      }t        |      \  }}| j                  rA|D cg c]  }|j                   }}t	        t        |       }t        j                  ||      }t        ||      }|r5dj                  |      }	t        |	      dkD  r|	d d dz   }	t        d|	       ||fS c c}w )NrG   z; i  z... (truncated)z Failed to validate global plan: )rT   r.   r   rH   dictr   rK   rL   _validate_global_planjoinlen
ValueError)
r<   rR   deduped_plansglobal_planmetadatapplanner_data_dictmerged_mappingsvalidation_errorserror_summarys
             r=   _create_global_planz&DefaultSavePlanner._create_global_plan   s     ..y9 ? NX""
 :E EA E E"8->#?@O"**8/RH1+xH II&78M=!C' -ds 36G G?OPPH$$ !Fs   B4c                    g }| j                   t        j                  vrp| j                  |      \  }}|t        j                  | j                   <   |t        j                  | j                   <   |t        j
                  | j                   <   |||fS t        |      sVt        g d      gt        |      z  }t        j                  | j                      }t        j
                  | j                      }nt        t        j                  | j                      |      }|t        j                  | j                   <   | j                  |      \  }}| j                   | j                  v rit        t        j                  | j                      |      D ]?  \  }}t        ||      r|j                  t        g d             /|j                  |       A |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_plansrc   _cached_global_plan_cached_metadatar   r   rY   r#   zipr   append)r<   rR   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 %)$<$<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)00"U1KL)00:; GRK++D,B,BCCKK(()?)?@ +x77r?   c                     g }| j                   r| j                  |      \  }}}n| j                  |      \  }}|}|| _        || _        || j                  fS rD   )r;   rn   rc   r\   r]   )r<   rR   rj   r\   r]   s        r=   create_global_planz%DefaultSavePlanner.create_global_plan   sl     -/$$ 55i@	! %)$<$<Y$G!K +&  $--//r?   rm   c                     |}|j                   st        j                  | j                     }|S |}|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   sO    "*'??@V@VWM  %MJRK//0F0FGr?   c                     |}| j                   rF| j                  |      }t        | d      r)| j                  t        j
                  | j                  <   | `|| _        | j                  S )NrP   )r;   ru   hasattrrP   r   rN   r:   rM   rs   s      r=   finish_planzDefaultSavePlanner.finish_plan   se    "*$$ ::8DM t23,, --d.D.DE ,!	yyr?   
write_itemc                 \    | j                  |j                        }| j                  ||      S rD   )lookup_objectindextransform_object)r<   ry   objects      r=   resolve_datazDefaultSavePlanner.resolve_data  s+    ##J$4$45$$Z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=   r{   z DefaultSavePlanner.lookup_object      %doou==r?   r~   c                     |j                   t        j                  k(  r,t        j                         }t        j                  ||       |}|S r   )typer   BYTE_IOioBytesIOtorchsave)r<   ry   r~   bytess       r=   r}   z#DefaultSavePlanner.transform_object  s7    ??m333JJLEJJvu%Fr?   )TTNFFNF)r9   
__module____qualname__r
   __annotations__boolr>   r   r   rE   r   rQ   listrT   tupler   rc   rn   rp   ru   rx   r   r   Tensorr   r   r   r   r   r{   r}    r?   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 r?   r)   c            	       F   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y)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   r   r1   allow_partial_loadr5   Nc                 J    || _         || _        i | _        i | _        || _        y rD   )r   r1   r   r0   r   )r<   r   r1   r   s       r=   r>   zDefaultLoadPlanner.__init__1  s+     #5'>$#% "4r?   r@   r]   rB   c                     t        |       || _        | j                  rt        |      }| j                  rt	        |      \  }| _        || _        || _        || _        y rD   )	r"   r   r1   r   r   r0   r@   r]   rB   )r<   r@   r]   rB   s       r=   rE   z!DefaultLoadPlanner.set_up_planner=  sW     	$#- ''1*=J""(::(F%J$ ,r?   c                    | j                   t        d      | j                  rt        | j                  j                               }t        | j                   j                  j                               }||z
  }|r[dt        _        t        | j                        \  }}t        |j                               }||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=   rQ   z$DefaultLoadPlanner.create_local_planP  s    ==  !<==""$ t3356LDMM==BBDEI$|3L,1)/A,,0, ~2245l*5C\2DOT] -1)-OOT]]0G0G,G
 	
r?   r\   c                     t        |      S rD   )r,   )r<   r\   s     r=   rp   z%DefaultLoadPlanner.create_global_planx  s    .{;;r?   rm   c                     |S rD   r   )r<   rm   s     r=   rx   zDefaultLoadPlanner.finish_plan{  s    r?   	read_itemvaluec                 (   | j                   rNt        | j                  | j                  |j                  j
                     t        j                  |d             y t        j                  |d      | j                  |j                  j
                  <   y )NF)weights_only)	r   r   r   r0   
dest_indexfqnr   loadr@   )r<   r   r   s      r=   
load_byteszDefaultLoadPlanner.load_bytes~  sl    ""((i22667

5u5 9>

E9DOOI00445r?   c                 \    | j                  |j                        }| j                  ||      S rD   )lookup_tensorr   transform_tensorr<   r   tensors      r=   resolve_tensorz!DefaultLoadPlanner.resolve_tensor  s+    ##I$8$89$$Y77r?   r   c                      y rD   r   r   s      r=   commit_tensorz DefaultLoadPlanner.commit_tensor  s    r?   r|   c                 .    t        | j                  |      S r   r   r   s     r=   r   z DefaultLoadPlanner.lookup_tensor  r   r?   c                 D    t        ||j                  |j                        S r   )r   dest_offsetslengthsr   s      r=   r   z#DefaultLoadPlanner.transform_tensor  s    %fi.D.DiFWFWXXr?   )TTFr   )r9   r   r   __doc__r   r   r
   r   r>   r   rE   r   rQ   r   rp   rx   r   r   r   r   r   r   r   r   r   r   r   r   r?   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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                 2    || _         t        |   |i | y rD   )r   superr>   )r<   r   argskwargsr8   s       r=   r>   z#_EmptyStateDictLoadPlanner.__init__  s    	$)&)r?   keyr]   r5   c           	      4     j                   y| j                   v ryg }|j                  j                  |      }|D ]D  }|r/|j                  dj	                  |d   t        |      g             4|j                  |       F t         fd|D              ryy)NT.c              3   :   K   | ]  }|j                   v   y wrD   )r   ).0unflattened_keyr<   s     r=   	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>  s     T$))+Ts   F)r   rH   getri   rX   strany)r<   r   r]   unflattened_keysrH   r   s   `     r=   _should_include_keyz._EmptyStateDictLoadPlanner._should_include_key  s    99$))&(,,005+ 	9O ''HH.r2C4HIJ
 !''8	9 TCSTTr?   r@   rB   c                    |rt        d      |t        d      |j                  j                         D ]  \  }}| j                  ||      st	        |t
              r5t        j                  |j                  |j                  j                        }|j                  )||j                  v rt        ||j                  |   |       |||<    t        | 9  |||       y )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      !122 !788 00668 		"DAq++Ax8!23KKall.@.@A$$0Q(:O:O5OJ(=(=a(@!D !
1		" 	z8^Dr?   rD   r   )r9   r   r   r   r>   r   r   r   r   r   rE   __classcell__)r8   s   @r=   r   r     si    *s h 4 4 %)$	E#E T/E 	E
 
E Er?   r   r@   r]   strictr5   c           	         g }	 | j                         D ]  \  }}||j                  vr|rt        d| d      &|j                  |   }t        |t              rVt        |dd       I|j                  |j                         k7  r,t        d|j                   d|j                          d|       t        |t              r,|j                  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   rZ   r%   device_meshget_coordinater    r   )r@   r]   r   requestsr   objmds          r=   r+   r+     s    H $$& 9Sh222"%KC5PQ#RSS))#.r01VT*6388:%.rwwi~chhj\QVWZV[\ 
 c7#--/;.sB<<*3C88H/92 Hr?   rR   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.
    r   )rR   s    r=   r,   r,     s
     r?   rB   c                     g }| j                         D ]O  \  }}t        |t              r+|j                  j	                         1|t        ||      z  }A|t        ||      z  }Q 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-     sw     H$$& 
6S c7#--/;/S99
 +C55H
6 Hr?   rewrite_index_hintsc                 Z   i }g }| D ]  }g }|j                   D ]  }|j                  t        j                  k7  r#|j                  j
                  |v rt        d      |j                  t        j                  k(  r3t               ||j                  j
                  <   |j                  |       |j                  t        d      t        t        |j                  |j                  j
                  t        |j                  j                  |j                  j                  g                   }|}|rKt!        j"                  |j                  t%        |j&                              }	t!        j"                  ||	      }|j                  |       |j                  j(                  #t        d|j                  j
                   d      |j&                  j                  |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 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   ri   tensor_datar   r   
setdefaultr   r   rK   rL   rY   r   chunkr   )
rR   r   r   	new_plansrM   	new_itemsitem	tensor_mdnew_item	new_indexs
             r=   r.   r.   .  s    $&BI &E	JJ #	@DyyM///::>>R'()CDDyyM111%9%;4::>>"  &##+()GHH )MM

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

#i.>.>*?!I  +224yIH  *##))1( .**..) **     ''(8(8(>(>?G#	@H 	,,TCDM&EN x|$$r?   c                 :    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   f  s!    -j9D+TF3EArIr?   box0box1c                    t        | j                        }t        |      D ]d  }| j                  |   |j                  |   |j                  |   z   k\  r y|j                  |   | j                  |   | j                  |   z   k\  sd y y)z9Check if two boxes overlap. Tuples are (offset, lengths).FT)rY   offsetsrangesizes)r   r   ndimsis       r=   _check_box_overlapr   m  sz     E5\ <<?dll1o

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

1==	 r?   outer_box_size	inner_boxc                     t        t        |             D ]Q  }|j                  |   dk  r y|j                  |   dk  r y|j                  |   |j                  |   z   | |   kD  sQ y y)Nr   FT)r   rY   r   r   )r   r  r   s      r=   _check_box_boundsr  }  su     3~&' Q!#??1!Q)//!"44~a7HH r?   r\   c           	         g }|j                   j                         D ].  \  }t        t              rt	        j
                        dk(  r1j                  d}D ]u  }t        j
                  |      s;d| dj
                   d| }t        j                  |       |j                  |       |t        j                  |j                        z  }w t	              dkD  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 ]H  \  }}|   }t+        |
|      sd| d|
 d| }t        j                  |       |j                  |       J t-        |||	f        t        j                  j
                        }t	        |       dkD  s||k7  sd| d| d| }t        j                  |       |j                  |       1 |S )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                 "    j                   |    S rD   )r   )dr   s    r=   <lambda>z'_validate_global_plan.<locals>.<lambda>  s    %**Q- r?   )defaultr   c                 X         j                      g fdt              D        S )Nc              3   B   K   | ]  }   j                   |     y wrD   )r   )r   r  r   idxs     r=   r   z:_validate_global_plan.<locals>.<lambda>.<locals>.<genexpr>  s      BfSk))!,Bs   )r   r   )r  r   dims	sweep_dims   `r=   r  z'_validate_global_plan.<locals>.<lambda>  s-    3K''	2!BeDkB! r?   )r   Nz has overlapping chunks:  z invalid fill tensor-volume: z chunks-volume: )r   r   r   r   rY   r   r   r  r(   r7   ri   mathprodr   maxr   sortedr   r   sysmaxsizer   r   )r\   r]   errorsr   chunks_volumer   msgsorted_indicesactiver  currentstartendcutoffr   	other_idxothertensor_volumer   r  r  r   s                     @@@@r=   rW   rW     sK   F2288: 7
Ue12uzz?a 		4E$UZZ73%  ##(::,hug?  s#c"TYYu{{33M		4 v;?uzz?DE$K8OPI#c&k"N -/F% + +	2gmmI66%fuckk.BCww$* +LAy"9-E)'59 $SE)B7)1UGTs+c*+ vSz*!+& 		%**-{aM]$Bse8 /!1-B  NN3MM#o7r Mr?   )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   rV   r   r   r+   r   r,   r-   r   r.   r   r   Sizer  rW   r   r?   r=   <module>r4     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 <r?   