
    Bjn              	          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j8        e9          Z:ej;        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jL        d*edeCfd+ZMd,eEe&         dedeEeB         fd-ZNdS )/    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j        z  fdZded
efdZdedefdZdS )!r)   mappingsTNFr   flatten_sharded_tensorsdedup_replicated_tensorsdedup_save_to_lowest_rankenable_plan_cachingreturnc                     || _         || _        i | _        || _        |t                              d           | j        j        | _        || _	        d S )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         o/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/torch/distributed/checkpoint/default_planner.py__init__zDefaultSavePlanner.__init__I   sa     #5'>$)B&#/NN"  
 '+n&=$7!!!    
state_dictstorage_metais_coordinatorc                     | j         rt          |          \  }| _        | j        rt          |          }|| _        || _        d S N)r   r0   r1   r   r@   rB   )r<   r@   rA   rB   s       r=   set_up_plannerz!DefaultSavePlanner.set_up_planner^   sQ     " 	G(::(F(F%J' 	>1*==J$,r?   c                 x   t          | j        | j                  }| j        rt	          j        || j                  }|| _        | j        rj| j	        t          j        v rPt          |t          j        | j	                           r+t                              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    -dot?RSS" 	I&t$-HHHD	$ 	0 &+*GGG'+78NO  H
 _    51111 ,0(yr?   	all_plansc                 ,    t          || j                  S rD   )r	   r3   )r<   rR   s     r=   _dedup_save_plansz$DefaultSavePlanner._dedup_save_plans   s    	4+IJJJr?   c                    |                      |          }t          |          \  }}| j        r8d |D             }t          t	          |           }t          j        ||          }t          ||          }|rGd                    |          }t          |          dk    r|d d         dz   }t          d|           ||fS )Nc                     g | ]	}|j         
S  rG   ).0ps     r=   
<listcomp>z:DefaultSavePlanner._create_global_plan.<locals>.<listcomp>   s     E E EA E E Er?   rG   z; i  z... (truncated)z Failed to validate global plan: )rT   r.   r   dictr   rK   rL   _validate_global_planjoinlen
ValueError)	r<   rR   deduped_plansglobal_planmetadataplanner_data_dictmerged_mappingsvalidation_errorserror_summarys	            r=   _create_global_planz&DefaultSavePlanner._create_global_plan   s     ..y99 ? N NX" 	S
 !F E E E E"8->#?@@O"*8/RRRH1+xHH 	Q II&788M=!!C'' -dsd 36G GOOOPPPH$$r?   c                    g }| j         t          j        vrY|                     |          \  }}|t          j        | j         <   |t          j        | j         <   |t          j        | j         <   |||fS t          |          sQt          g d          gt          |          z  }t          j        | j                  }t          j        | j                  }nt          t          j        | j                  |          }|t          j        | j         <   |                     |          \  }}| j         | j        v rut          t          j        | j                  |          D ]O\  }}t          ||          r%|                    t          g d                     :|                    |           P|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_plansrg   _cached_global_plan_cached_metadatar   r   r^   r#   zipr   append)r<   rR   global_plan_deltara   rb   merged_planscached_plannew_plans           r=    _create_global_plan_with_cachingz3DefaultSavePlanner._create_global_plan_with_caching   s    -/!)FFF %)$<$<Y$G$G!K ENK)$*@AFQK+D,BCCKK()?@X55 %Y// 	L "*"U!;!;!; <s9~~ M%9$:PQK"3D4JKHH 4-d.DEy L EQK)$*@A$($<$<\$J$J!K%)AAA-03D4JK[. . ; ;)K +;AA ;)00"U1K1K1KLLLL)00:::: GRK+D,BCCKK()?@ +x77r?   c                     g }| j         r|                     |          \  }}}n|                     |          \  }}|}|| _        || _        || j        fS rD   )r;   rr   rg   ra   rb   )r<   rR   rn   ra   rb   s        r=   create_global_planz%DefaultSavePlanner.create_global_plan   st     -/$ 	, 55i@@	! %)$<$<Y$G$G!K +&  $-//r?   rq   c                 t    |}|j         st          j        | j                 }n|}|t          j        | j        <   |S rD   )rJ   r   _cached_final_save_planr:   r<   rq   finished_plans      r=   _finish_plan_with_cachingz,DefaultSavePlanner._finish_plan_with_caching   s?    "* 	S'?@VWMM$MJRK/0FGr?   c                     |}| j         r@|                     |          }t          | d          r| j        t          j        | j        <   | `|| _        | j        S )NrP   )r;   ry   hasattrrP   r   rN   r:   rM   rw   s      r=   finish_planzDefaultSavePlanner.finish_plan   sg    "*$ 	- ::8DDM t233 -, -d.DE ,!	yr?   
write_itemc                 b    |                      |j                  }|                     ||          S rD   )lookup_objectindextransform_object)r<   r}   objects      r=   resolve_datazDefaultSavePlanner.resolve_data  s.    ##J$455$$Z8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      %dou===r?   r   c                     |j         t          j        k    r*t          j                    }t          j        ||           |}|S r   )typer   BYTE_IOioBytesIOtorchsave)r<   r}   r   bytess       r=   r   z#DefaultSavePlanner.transform_object  s9    ?m333JLLEJvu%%%Fr?   )TTNFFNF)r9   
__module____qualname__r
   __annotations__boolr>   r   r   rE   r   rQ   listrT   tupler   rg   rr   rt   ry   r|   r   r   Tensorr   r   r   r   r   r   r   rW   r?   r=   r)   r)   F   s}         $((,04*/$)8 8 8 "&8 #'+	8
 $(8 "8 
8 8 8 80 ,0$	- -#- "D(- 	-
 
- - - -8    8K4> Kd8n K K K K%h%	tH~x'	(% % % %2:8h:8	tH~tH~x7	8:8 :8 :8 :8x0h0	tH~x'	(0 0 0 0,( x    H     &9y 9U\BJ5N 9 9 9 9>= >S > > > >9 c      r?   r)   c            	       ,   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d
S ) 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   TFr   r1   allow_partial_loadr5   Nc                 L    || _         || _        i | _        i | _        || _        d S rD   )r   r1   r   r0   r   )r<   r   r1   r   s       r=   r>   zDefaultLoadPlanner.__init__1  s1     #5'>$#% "4r?   r@   rb   rB   c                     t          |           || _        | j        rt          |          }| j        rt	          |          \  }| _        || _        || _        || _        d S rD   )	r"   r   r1   r   r   r0   r@   rb   rB   )r<   r@   rb   rB   s       r=   rE   z!DefaultLoadPlanner.set_up_planner=  sn     	$$$#- ' 	>1*==J" 	G(::(F(F%J$ ,r?   c                    | j         t          d          | j        rt          | j                                                  }t          | j         j                                                  }||z
  }|rddt          _        t          | j	                  \  }}t          |                                          }||z  r||c| _        | _
        d t          _        t          | j        | j         | j                   S )Nzself.metadata is not None2_3)rb   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    =  !<===" 	1$ t335566LDM=BBDDEEI$|3L 
1,1)/A,0 0, ~224455l* R5C\2DOT] -1)-OT]0G,G
 
 	
r?   ra   c                      t          |          S rD   )r,   )r<   ra   s     r=   rt   z%DefaultLoadPlanner.create_global_planx  s    .{;;;r?   rq   c                     |S rD   rW   )r<   rq   s     r=   r|   zDefaultLoadPlanner.finish_plan{  s    r?   	read_itemvaluec                     | j         rAt          | j        | j        |j        j                 t          j        |d                     d S t          j        |d          | j        |j        j        <   d S )NF)weights_only)	r   r   r   r0   
dest_indexfqnr   loadr@   )r<   r   r   s      r=   
load_byteszDefaultLoadPlanner.load_bytes~  s    " 		(i267
5u555     9>
E9 9 9DOI04555r?   c                 b    |                      |j                  }|                     ||          S rD   )lookup_tensorr   transform_tensorr<   r   tensors      r=   resolve_tensorz!DefaultLoadPlanner.resolve_tensor  s.    ##I$899$$Y777r?   r   c                     d S rD   rW   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                 8    t          ||j        |j                  S r   )r   dest_offsetslengthsr   s      r=   r   z#DefaultLoadPlanner.transform_tensor  s    %fi.DiFWXXXr?   )TTFr   )r9   r   r   __doc__r   r   r
   r   r>   r   rE   r   rQ   r   rt   r|   r   r   r   r   r   r   r   r   r   r   r   rW   r?   r=   r*   r*   #  s          )((( $((,#(	
5 
5 
5 "&
5 !	
5
 

5 
5 
5 
5 %)$	- -#- T/- 	-
 
- - - -&&
8 &
 &
 &
 &
P<d8n <h < < < <H     
H 
RZ 
D 
 
 
 
8 8 8 8 8x  $    >= >U\ > > > >Y( YEL Y Y Y Y Y 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                 H    || _          t                      j        |i | d S rD   )r   superr>   )r<   r   argskwargsr8   s       r=   r>   z#_EmptyStateDictLoadPlanner.__init__  s,    	$)&)))))r?   keyrb   r5   c           	      V     j         dS | j         v rdS g }|j                            |          }|D ]W}|r>|                    d                    |d         t          |          g                     B|                    |           Xt           fd|D                       rdS dS )NT.c              3   *   K   | ]}|j         v V  d S rD   )r   )rX   unflattened_keyr<   s     r=   	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>  s*      TT$)+TTTTTTr?   F)r   rH   getrm   r]   strany)r<   r   rb   unflattened_keysrH   r   s   `     r=   _should_include_keyz._EmptyStateDictLoadPlanner._should_include_key  s    94$)4&(,0055+ 	9 	9O 9 ''HH.r2C4H4HIJJ   
 !''8888TTTTCSTTTTT 	4ur?   Fr@   rB   c                    |rt          d          |t          d          |j                                        D ]\  }}|                     ||          st	          |t
                    r%t          j        |j        |j	        j
                  }|j        &||j        v rt          ||j        |         |           |||<   t                                          |||           d S )Nznot state_dictzmetadata is not None)dtype)r   r   itemsr   
isinstancer   r   emptysize
propertiesr   rH   r   r   rE   )r<   r@   rb   rB   kvr8   s         r=   rE   z)_EmptyStateDictLoadPlanner.set_up_planner  s      	3 !1222 !7888 06688 		" 		"DAq++Ax88 !233 BKal.@AAA$0Q(:O5O5OJ(=a(@!DDDD !
1z8^DDDDDr?   rD   r   )r9   r   r   r   r>   r   r   r   r   r   rE   __classcell__)r8   s   @r=   r   r     s         * * * * * *s h 4    4 %)$	E E#E T/E 	E
 
E E E E E E E E E Er?   r   Tr@   rb   strictr5   c           	      D   g }	 |                                  D ]\  }}||j        vr|rt          d| d          $|j        |         }t          |t                    r]t          |dd           L|j        |                                k    r/t          d|j         d|                                 d|           t          |t                    r.|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   r_   r%   device_meshget_coordinater    r   )r@   rb   r   requestsr   objmds          r=   r+   r+     sH    H $$&& 9 9Sh222 "#RC#R#R#RSSS)#.r011	VT**6388::%%\rw\\chhjj\\WZ\\  
 c7## 	9--//;.sB<<<*3C888HH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.
    rW   )rR   s    r=   r,   r,     s
     r?   rB   c                    g }|                                  D ]Z\  }}t          |t                    r-|j                                        |t          ||          z  }G|t          ||          z  }[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-     s     H$$&& 
6 
6S c7## 	6--//;/S999
 +C555HHHr?   rewrite_index_hintsc                    i }g }| D ]}g }|j         D ]}|j        t          j        k    r|j        j        |v rt          d          |j        t          j        k    r1t                      ||j        j        <   |	                    |           {|j
        t          d          t          t          |                    |j        j        t          |j
        j        |j
        j        g                               }|}|rCt!          j        |j        t%          |j                            }	t!          j        ||	          }|	                    |           |j
        j        t          d|j        j         d          |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 mdNz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   rm   tensor_datar   r   
setdefaultr   r   rK   rL   r^   r   chunkr   )
rR   r   r   	new_plansrM   	new_itemsitem	tensor_mdnew_item	new_indexs
             r=   r.   r.   .  s     $&BI &E &E	J #	@ #	@DyM///:>R''()CDDDyM111%9%;%;4:>"  &&&&#+()GHHH )MM
-'+'7'B!%!1!6#%   
 
	  & J + 3
#i.>*?*?! ! !I  +24yIIIH  ***#)1( **.* * *     ''(8(>????,TCCCDDDDx||$$r?   c                 J    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99D+TF33EArIr?   box0box1c                    t          | j                  }t          |          D ]\}| j        |         |j        |         |j        |         z   k    r dS |j        |         | j        |         | j        |         z   k    r dS ]dS )z9Check if two boxes overlap. Tuples are (offset, lengths).FT)r^   offsetsrangesizes)r   r   ndimsis       r=   _check_box_overlapr  m  s     E5\\  <?dl1o
1===55<?dl1o
1===55 > 4r?   outer_box_size	inner_boxc                     t          t          |                     D ]R}|j        |         dk     r dS |j        |         dk     r dS |j        |         |j        |         z   | |         k    r dS SdS )Nr   FT)r   r^   r   r   )r  r  r   s      r=   _check_box_boundsr  }  s     3~&&''  Q!##55?1!!55Q)/!"44~a7HHH55 I 4r?   ra   c           	         g }|j                                         D ]T\  }t          t                    rt	          j                  dk    r5j        d}D ]r}t          j        |          s?d| dj         d| }t          	                    |           |
                    |           |t          j        |j                  z  }st	                    dk    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 ]W\  }}|         }t+          |
|          r:d| d|
 d| }t          	                    |           |
                    |           Xt-          |||	f           t          j        j                  }t	          |           dk    r@||k    r:d| d| d| }t          	                    |           |
                    |           V|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                 h               j                  g fdt                    D             R S )Nc              3   >   K   | ]}         j         |         V  d S rD   )r   )rX   r  r   idxs     r=   r   z:_validate_global_plan.<locals>.<lambda>.<locals>.<genexpr>  s/      BBfSk)!,BBBBBBr?   )r   r   )r  r   dims	sweep_dims   `r=   r	  z'_validate_global_plan.<locals>.<lambda>  sD    3K'	2!BBBBBeDkkBBB! ! r?   )r   Nz has overlapping chunks:  z invalid fill tensor-volume: z chunks-volume: )r   r   r   r   r^   r   r   r  r(   r7   rm   mathprodr   maxr   sortedr   r   sysmaxsizer  r   )ra   rb   errorsr   chunks_volumer   msgsorted_indicesactiver  currentstartendcutoffr   	other_idxothertensor_volumer   r  r  r   s                     @@@@r=   r\   r\     s   F288:: 7 7
Ue122 	uz??a 		4 		4E$UZ77 #?3 ? ?#(:? ?7<? ?  s###c"""TYu{333MMv;;??uz??DE$KK8O8O8O8OPPPI#c&kk""       N -/F% + + +	2gmI66%fuck.BCC (ww$* + +LAy"9-E)'599 +TSTT7TTUTTs+++c***vSz**** 	%*--{aM]$B$BBs B B B B2?B B  NN3MM#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   r[   r   r   r+   r   r,   r-   r   r.   r   r  Sizer  r\   rW   r?   r=   <module>r6     s        				   



 ' ' ' ' ' ' ' '                      B B B B B B K K K K K K        X W W W W W > > > > > >	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                                   F E E E E E , , , , , ,       +*844 4 4 4  Z Z Z Z Z Z Z ZztY tY tY tY tY tY tY tYn@E @E @E @E @E!3 @E @E @EH DH' 'S#X'*2'<@'' ' ' 'T	H~		(^	 	 	 	S#X04   : !%5% 5%H~5%5% 4>8#$5% 5% 5% 5%p 8    1 9M RV     J+?	   <tH~ < <dSVi < < < < < <r?   