
    `if              	          U d dl Z d dlZd dlZd dlZd dl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-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eCfd-ZNdS )/    N)ChainMap)reduce)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j        ej        f         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   r2   r1   r4   r)   warning	__class____name___cached_plans_key_enable_plan_caching)selfr   r2   r3   r4   r5   s         /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/distributed/checkpoint/default_planner.py__init__zDefaultSavePlanner.__init__H   sa     #5'>$)B&#/NN"  
 '+n&=$7!!!    
state_dictstorage_metais_coordinatorc                     | j         rt          |          \  }| _        | j        rt          |          }|| _        || _        d S N)r   r1   r2   r   rA   rC   )r=   rA   rB   rC   s       r>   set_up_plannerz!DefaultSavePlanner.set_up_planner]   sQ     " 	G(::(F(F%J' 	>1*==J$,r@   c                    t          | j        | j                  }| j        rt	          j        || j                  }|| _        | j        rw| j	        t          j        v rPt          |t          j        | j	                           r+t                              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.   rA   rC   r   dataclassesreplacer1   planr<   r;   r   _cached_save_planr   r)   infor   )r=   rN   s     r>   create_local_planz$DefaultSavePlanner.create_local_planj   s    -dot?RSS" 	I&t$-HHHD	$ 	M &+*GGG'+78NO  H
 _    51111HL-d.DEyr@   	all_plansc                 ,    t          || j                  S rE   )r
   r4   )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          ||          st          d          ||fS )Nc                     g | ]	}|j         
S  rH   ).0ps     r>   
<listcomp>z:DefaultSavePlanner._create_global_plan.<locals>.<listcomp>   s     E E EA E E Er@   rH   zFailed to validate global plan)	rT   r/   r   dictr   rL   rM   _validate_global_plan
ValueError)r=   rR   deduped_plansglobal_planmetadataplanner_data_dictmerged_mappingss          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$[(;; 	?=>>>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.
        FrJ   )r;   r   _cached_all_plansrc   _cached_global_plan_cached_metadatar   r   lenr$   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
 ENK)$*@A$($<$<Y$G$G!KFQK+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 rE   )r<   ro   rc   r_   r`   )r=   rR   rk   r_   r`   s        r>   create_global_planz%DefaultSavePlanner.create_global_plan   st     -/$ 	, 55i@@	! %)$<$<Y$G$G!K +&  $-//r@   rn   c                 t    |}|j         st          j        | j                 }n|}|t          j        | j        <   |S rE   )rK   r   _cached_final_save_planr;   r=   rn   finished_plans      r>   _finish_plan_with_cachingz,DefaultSavePlanner._finish_plan_with_caching   s?    "* 	S'?@VWMM$MJRK/0FGr@   c                 Z    |}| j         r|                     |          }|| _        | j        S rE   )r<   rv   rN   rt   s      r>   finish_planzDefaultSavePlanner.finish_plan   s5    "*$ 	E ::8DDM!	yr@   
write_itemc                 b    |                      |j                  }|                     ||          S rE   )lookup_objectindextransform_object)r=   ry   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%   rA   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=   ry   r~   bytess       r>   r}   z#DefaultSavePlanner.transform_object  s9    ?m333JLLEJvu%%%Fr@   )TTNFFNF)!r:   
__module____qualname__r   __annotations__boolr   r?   r   r   rF   r   rQ   listrT   tupler   rc   ro   rq   rv   rx   r   r   r   Tensorr   r   r   r   r   r{   r}   rW   r@   r>   r*   r*   E   s         $((,37*/$)8 8 8 "&8 #+4.	8
 $(8 "8 
8 8 8 80 /3$	- -#- {+- 	-
 
- - - -8    .K4> Kd8n K K K K%h%	tH~x'	(% % % %*98h98	tH~tH~x7	898 98 98 98v0h0	tH~x'	(0 0 0 0,( x    H     9y 9U5<;S5T 9 9 9 9>= >S > > > >9 c      r@   r*   c            	       2   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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_dictr1   TFr   r2   allow_partial_loadr6   Nc                 L    || _         || _        i | _        i | _        || _        d S rE   )r   r2   r   r1   r   )r=   r   r2   r   s       r>   r?   zDefaultLoadPlanner.__init__  s1     #5'>$#% "4r@   rA   r`   rC   c                     t          |           || _        | j        rt          |          }| j        rt	          |          \  }| _        || _        || _        || _        d S rE   )	r#   r   r2   r   r   r1   rA   r`   rC   )r=   rA   r`   rC   s       r>   rF   z!DefaultLoadPlanner.set_up_planner(  sn     	$$$#- ' 	>1*==J" 	G(::(F(F%J$ ,r@   c                    | j         J | j        rt          | j                                                  }t          | j         j                                                  }||z
  }|rddt          _        t          | j                  \  }}t          |                                          }||z  r||c| _        | _	        d t          _        t          | j        | j         | j                   S )N2_3)r`   r   setrA   keysstate_dict_metadatar(   _derived_versionr   r1   r,   r   )r=   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r>   rQ   z$DefaultLoadPlanner.create_local_plan;  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@   r_   c                      t          |          S rE   )r-   )r=   r_   s     r>   rq   z%DefaultLoadPlanner.create_global_planb  s    .{;;;r@   rn   c                     |S rE   rW   )r=   rn   s     r>   rx   zDefaultLoadPlanner.finish_plane  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   r1   
dest_indexfqnr   loadrA   )r=   r   r   s      r>   
load_byteszDefaultLoadPlanner.load_bytesh  s    " 		(i267
5u555     9>
E9 9 9DOI04555r@   c                 b    |                      |j                  }|                     ||          S rE   )lookup_tensorr   transform_tensorr=   r   tensors      r>   resolve_tensorz!DefaultLoadPlanner.resolve_tensort  s.    ##I$899$$Y777r@   r   c                     d S rE   rW   r   s      r>   commit_tensorz DefaultLoadPlanner.commit_tensorx  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   )r:   r   r   __doc__r   r   r   r   r?   r   r   rF   r   rQ   r   rq   rx   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 (,$	- -#- 8$- 	-
 
- - - -&%
8 %
 %
 %
 %
N<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            	       f     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                 H    || _          t                      j        |i | d S rE   )r   superr?   )r=   r   argskwargsr9   s       r>   r?   z#_EmptyStateDictLoadPlanner.__init__  s,    	$)&)))))r@   keyr`   r6   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 rE   )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   rI   getrj   joinstrany)r=   r   r`   unflattened_keysrI   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@   FrA   rC   c                    |rJ |J |j                                         D ]\  }}|                     ||          st          |t                    r%t          j        |j        |j        j	                  }|j
        &||j
        v rt          ||j
        |         |           |||<   t                                          |||           d S )N)dtype)r   itemsr   
isinstancer   r   emptysize
propertiesr   rI   r   r   rF   )r=   rA   r`   rC   kvr9   s         r>   rF   z)_EmptyStateDictLoadPlanner.set_up_planner  s     ~### 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@   rE   r   )r:   r   r   r   r?   r   r   r   r   r   r   rF   __classcell__)r9   s   @r>   r   r     s         * * * * * *s h 4    4 (,$	E E#E 8$E 	E
 
E E E E E E E E E Er@   r   TrA   r`   strictr6   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   )rA   r`   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@   rC   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   )rA   rC   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 ]r}|j        t          j        k    s|j        j        |vsJ |j        t          j        k    r1t                      ||j        j        <   |                    |           n|j	        J t          t          |                    |j        j        t          |j	        j        |j	        j        g                               }|}|rCt          j        |j        t#          |j                            }	t          j        ||	          }|                    |           |j	        j        J d|j        j         d            |j                            |j	        j                   t|                    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.
    N)r   r   chunks)r|   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )r   )r   r   r   SHARDr|   r   r   r   rj   tensor_datar   r   
setdefaultr   r   rL   rM   rh   r   chunkr   )
rR   r   r   	new_plansrN   	new_itemsitem	tensor_mdnew_item	new_indexs
             r>   r/   r/     s    $&BI #E #E	J  	@  	@D9 333z~R////yM111%9%;%;4:>"  &&&&'333 )MM
-'+'7'B!%!1!6#%   
 
	  & J + 3
#i.>*?*?! ! !I  +24yIIIH  ***'-99 <*.< < <999  ''(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/   )rA   rN   _r   s       r>   _create_default_local_metadatar   K  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)rh   offsetsrangesizes)r   r   ndimsis       r>   _check_box_overlapr   R  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   rh   r   r   )r   r   r   s      r>   _check_box_boundsr  b  s     3~&&''  Q!##55?1!!55Q)/!"44~a7HHH55 I 4r@   r_   c           	         d}|j                                         D ]I\  }}t          |t                    rt	          |j                  dk    r5d}t          |j                  D ]\  }}t          |j        |          s$t          
                    d||j        |           d}|t          t          j        |j        d          z  }|j        |dz   d          D ]1}t          ||          rt          
                    d|||           d}2t          t          j        |j        d          }	t	          |           dk    r%||	k    rt          
                    d||	|           d}K|S )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   rh   r   	enumerater   r  r)   r8   r   operatormulr   r   )
r_   r`   all_goodr   r   chunks_volume	chunk_idxchunk0chunk1tensor_volumes
             r>   r\   r\   p  s   H288:: ) )
Ue122 	uz??a!*5<!8!8 	% 	%Iv$UZ88 
! J   !VHL&,BBBM  ,y1}7 % %%ff55 %NN>VV    %H% x|UZ;;{aM]$B$BNN    HOr@   )T)OrL   r   loggingr  collectionsr   	functoolsr   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   r[   r   r   r,   r   r-   r.   r   r/   r   r   Sizer  r\   rW   r@   r>   <module>r     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  F F F F F F F FRsY sY sY sY sY sY sY sYl>E >E >E >E >E!3 >E >E >ED DH' 'S#X'*2'<@'' ' ' 'T	H~		(^	 	 	 	S#X04   : !%2% 2%H~2%2% 4>8#$2% 2% 2% 2%j 8    1 9M RV     J+?	   -tH~ - -d - - - - - -r@   