
    iDk              	          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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/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 ddl8m9Z9  ejt                  e;      Z<ejz                  e>d<   g dZ? G d de)      Z@ G d de&      ZA G d deA      ZB	 d-deCeDef   dedeEde%fdZFdeGe%   deGe%   fdZHdeCeDef   d eEde(fd!ZI	 d-deGe(   d"eEdeJeGe(   ef   fd#ZKde defd$ZLd%ed&edeEfd'ZMd(ej                  d)edeEfd*ZOd+eGe(   dedeEfd,ZPy).    N)bisect_rightinsort)ChainMap)AnycastOptional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)_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e   dededdfd	Z	 	 dd
edee	   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ej2                  ej6                  f   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   r3   r2   r5   r*   warning	__class____name___cached_plans_key_enable_plan_caching)selfr   r3   r4   r5   r6   s         f/var/www/html/engine/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   r2   r3   r   rB   rD   )r>   rB   rC   rD   s       r?   set_up_plannerz!DefaultSavePlanner.set_up_planner^   s@     ""(::(F%J''1*=J$,rA   c                    t        | j                  | j                        }| j                  r!t	        j
                  || j                        }|| _        | j                  r| j                  t        j                  v rIt        |t        j                  | j                           r"t        j                  d       t        g d      S |t        j                  | j                  <   | j                  S )Nplanner_datazINo change in the local plan. Skipping sending the plan to the coordinatorFusable)r/   rB   rD   r   dataclassesreplacer2   planr=   r<   r   _cached_save_planr   r*   infor   )r>   rO   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1HL--d.D.DEyyrA   	all_plansc                 .    t        || j                        S rF   )r   r5   )r>   rS   s     r?   _dedup_save_plansz$DefaultSavePlanner._dedup_save_plans   s    	4+I+IJJrA   c                    | j                  |      }t        |      \  }}| j                  rA|D cg c]  }|j                   }}t	        t        |       }t        j                  ||      }t        ||      st        d      ||fS c c}w )NrI   zFailed to validate global plan)
rU   r0   r   rJ   dictr   rM   rN   _validate_global_plan
ValueError)r>   rS   deduped_plansglobal_planmetadatapplanner_data_dictmerged_mappingss           r?   _create_global_planz&DefaultSavePlanner._create_global_plan   s     ..y9 ? NX""
 :E EA E E"8->#?@O"**8/RH$[(;=>>H$$ !Fs   Bc                    g }| j                   t        j                  vrp|t        j                  | 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.
        FrK   )r<   r   _cached_all_plansr`   _cached_global_plan_cached_metadatar    r   lenr%   zipr   append)r>   rS   global_plan_deltar[   r\   merged_planscached_plannew_plans           r?    _create_global_plan_with_cachingz3DefaultSavePlanner._create_global_plan_with_caching   s    -/!!)F)FF
 ENK))$*@*@A$($<$<Y$G!KFQK++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7rA   c                     g }| j                   r| j                  |      \  }}}n| j                  |      \  }}|}|| _        || _        || j                  fS rF   )r=   rl   r`   r[   r\   )r>   rS   rh   r[   r\   s        r?   create_global_planz%DefaultSavePlanner.create_global_plan   sl     -/$$ 55i@	! %)$<$<Y$G!K +&  $--//rA   rk   c                     |}|j                   st        j                  | j                     }|S |}|t        j                  | j                  <   |S rF   )rL   r   _cached_final_save_planr<   r>   rk   finished_plans      r?   _finish_plan_with_cachingz,DefaultSavePlanner._finish_plan_with_caching   sO    "*'??@V@VWM  %MJRK//0F0FGrA   c                 f    |}| j                   r| j                  |      }|| _        | j                  S rF   )r=   rs   rO   rq   s      r?   finish_planzDefaultSavePlanner.finish_plan   s1    "*$$ ::8DM!	yyrA   
write_itemc                 \    | j                  |j                        }| j                  ||      S rF   )lookup_objectindextransform_object)r>   rv   objects      r?   resolve_datazDefaultSavePlanner.resolve_data   s+    ##J$4$45$$Z88rA   ry   c                 .    t        | j                  |      S zSExtension from the planner interface to make it easy to extend the default planner.r&   rB   r>   ry   s     r?   rx   z DefaultSavePlanner.lookup_object      %doou==rA   r{   c                     |j                   t        j                  k(  r,t        j                         }t        j                  ||       |}|S r~   )typer   BYTE_IOioBytesIOtorchsave)r>   rv   r{   bytess       r?   rz   z#DefaultSavePlanner.transform_object  s7    ??m333JJLEJJvu%FrA   )TTNFFNF)!r;   
__module____qualname__r   __annotations__boolr   r@   r   r   rG   r   rR   listrU   tupler   r`   rl   rn   rs   ru   r   r	   r   Tensorr   r   r|   r   r   rx   rz    rA   r?   r+   r+   F   s    $((,37*/$)8 8 "&8 #+4.	8
 $(8 "8 
80 /3$	-#- {+- 	-
 
-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 9U5<<;S5T 9>= >S >9 c rA   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	e
   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_dictr2   r   r3   allow_partial_loadr7   Nc                 J    || _         || _        i | _        i | _        || _        y rF   )r   r3   r   r2   r   )r>   r   r3   r   s       r?   r@   zDefaultLoadPlanner.__init__  s+     #5'>$#% "4rA   rB   r\   rD   c                     t        |       || _        | j                  rt        |      }| j                  rt	        |      \  }| _        || _        || _        || _        y rF   )	r$   r   r3   r   r   r2   rB   r\   rD   )r>   rB   r\   rD   s       r?   rG   z!DefaultLoadPlanner.set_up_planner)  sW     	$#- ''1*=J""(::(F%J$ ,rA   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   setrB   keysstate_dict_metadatar)   _derived_versionr   r2   r-   r   )r>   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r?   rR   z$DefaultLoadPlanner.create_local_plan<  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
 	
rA   r[   c                     t        |      S rF   )r.   )r>   r[   s     r?   rn   z%DefaultLoadPlanner.create_global_pland  s    .{;;rA   rk   c                     |S rF   r   )r>   rk   s     r?   ru   zDefaultLoadPlanner.finish_plang  s    rA   	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   r2   
dest_indexfqnr   loadrB   )r>   r   r   s      r?   
load_byteszDefaultLoadPlanner.load_bytesj  sl    ""((i22667

5u5 9>

E9DOOI00445rA   c                 \    | j                  |j                        }| j                  ||      S rF   )lookup_tensorr   transform_tensorr>   r   tensors      r?   resolve_tensorz!DefaultLoadPlanner.resolve_tensorv  s+    ##I$8$89$$Y77rA   r   c                      y rF   r   r   s      r?   commit_tensorz DefaultLoadPlanner.commit_tensorz  s    rA   ry   c                 .    t        | j                  |      S r~   r   r   s     r?   r   z DefaultLoadPlanner.lookup_tensor}  r   rA   c                 D    t        ||j                  |j                        S r~   )r
   dest_offsetslengthsr   s      r?   r   z#DefaultLoadPlanner.transform_tensor  s    %fi.D.DiFWFWXXrA   )TTFr   )r;   r   r   __doc__r   r   r   r   r@   r   r   rG   r   rR   r   rn   ru   r   r   r   r   r   r   r   r   r   r   r   r   rA   r?   r,   r,     s7    )( $((,#(	
5 
5 "&
5 !	
5
 

5 (,$	-#- 8$- 	-
 
-&&
8 &
P<d8n <h <H  
H 
RZZ 
D 
8 8x  $ >= >U\\ >Y( YELL YrA   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
e   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 rF   )r   superr@   )r>   r   argskwargsr:   s       r?   r@   z#_EmptyStateDictLoadPlanner.__init__  s    	$)&)rA   keyr\   r7   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rF   )r   ).0unflattened_keyr>   s     r?   	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>  s     T$))+Ts   F)r   rJ   getrg   joinstrany)r>   r   r\   unflattened_keysrJ   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rA   rB   rD   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   rJ   r   r   rG   )r>   rB   r\   rD   kvr:   s         r?   rG   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^DrA   rF   r   )r;   r   r   r   r@   r   r   r   r   r   r   rG   __classcell__)r:   s   @r?   r   r     sj    *s h 4 4 (,$	E#E 8$E 	E
 
E ErA   r   rB   r\   strictr7   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   rY   r'   device_meshget_coordinater"   r   )rB   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rA   rS   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   )rS   s    r?   r.   r.     s
     rA   rD   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   )rB   rD   r   r   r   s        r?   r/   r/     sw     H$$& 
6S c7#--/;/S99
 +C55H
6 HrA   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)ry   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )r   )r   r   r   SHARDry   r   r   r   r   rg   tensor_datar   r   
setdefaultr   r   rM   rN   re   r   chunkr   )
rS   r   r   	new_plansrO   	new_itemsitem	tensor_mdnew_item	new_indexs
             r?   r0   r0     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|$$rA   c                 :    t        |       }t        |g      \  }}|S )zTReturn the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.)r!   r0   )rB   rO   _r   s       r?   _create_default_local_metadatar   R  s!    -j9D+TF3EArIrA   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)re   offsetsrangesizes)r   r   ndimsis       r?   _check_box_overlapr   Y  sz     E5\ <<?dll1o

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

1==	 rA   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   re   r   r   )r   r   r   s      r?   _check_box_boundsr  i  su     3~&' Q!#??1!Q)//!"44~a7HH rA   r[   c           	         d}|j                   j                         D ]  \  }t        t              rt	        j
                        dk(  r1j                  d}D ]^  }t        j
                  |      s$t        j                  d|j
                  |       d}|t        j                  |j                        z  }` t	              dkD  rt	        j
                        t        t              dfd      t        t        t	                    fd	      }g }|D ]  }|   }	|	j                      }
|
|	j                     z   }t#        ||
t$        j&                  f      }|r|d |= |D ]1  \  }}|   }t)        |	|      st        j                  d
||	|       d}3 t+        |||f        t        j                  j
                        }t	        |       dkD  s||k7  st        j                  d|||       d} |S )NTr   z~
                        key:%s has out of bounds chunk:
                        tensor-size:%s chunk: %s
                    Fr(   c                 "    j                   |    S rF   )r   )dr   s    r?   <lambda>z'_validate_global_plan.<locals>.<lambda>  s    %**Q- rA   )defaultr   c                 X         j                      g fdt              D        S )Nc              3   B   K   | ]  }   j                   |     y wrF   )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! rA   )r   z$key:%s has overlapping chunks: %s %szq
                    key:%s invalid fill tensor-volume:
                    %s chunks-volume: %s
                )r   r   r   r   re   r   r   r  r*   r9   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?   rX   rX   w  s   H2288: C
Ue12uzz?a 	4E$UZZ7 JJ !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B#!	 $)	) vSz*)+. 		%**-{aM]$BNN  HGCJ OrA   )T)QrM   r   loggingr  r  bisectr   r   collectionsr   typingr   r   r   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   rW   r   r   r-   r   r.   r/   r   r0   r   r   Sizer  rX   r   rA   r?   <module>r0     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   