
    קgN              	          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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/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eeAe	f         dedeBde&fdZCdee&         dee&         fd ZDdeeAe	f         d!eBde)fd"ZE	 d.dee)         d#eBdeee)         ef         fd$ZFde!defd%ZGd&ed'edeBfd(ZHd)ejI        d*edeBfd+ZJd,ee)         dedeBfd-ZKdS )/    N)ChainMap)reduce)AnycastDictListOptionalTupleUnion)narrow_tensor_by_index)dedup_save_plans)FLATTEN_MAPPINGflatten_state_dict)_flatten_sharded_tensors)set_element)BytesStorageMetadataChunkStorageMetadataMetadataMetadataIndexSTATE_DICT_TYPESTORAGE_TYPESStorageMetaTensorStorageMetadata)LoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItemWriteItemType)"_create_default_metadata_only_plan_create_read_items_create_write_items_init_state_dict)find_state_dict_object)DTensor   )_versionlogger)DefaultSavePlannerDefaultLoadPlannercreate_default_local_load_plancreate_default_global_load_plancreate_default_local_save_plancreate_default_global_save_planc                      e Zd ZU eed<   	 	 	 	 ddedede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e         ef         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returnc                 z    || _         || _        i | _        || _        |t                              d           d S 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)selfr   r2   r3   r4   s        h/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/distributed/checkpoint/default_planner.py__init__zDefaultSavePlanner.__init__E   sV     #5'>$)B&#/NN"     0/    
state_dictstorage_metais_coordinatorc                     | j         rt          |          \  }| _        | j        rt          |          }|| _        || _        d S N)r   r1   r2   r   r<   r>   )r8   r<   r=   r>   s       r9   set_up_plannerz!DefaultSavePlanner.set_up_plannerW   sQ     " 	G(::(F(F%J' 	>1*==J$,r;   c                     t          | j        | j                  }| j        rt	          j        || j                  }|| _        | j        S )Nplanner_data)r.   r<   r>   r   dataclassesreplacer1   plan)r8   rG   s     r9   create_local_planz$DefaultSavePlanner.create_local_pland   sH    -dot?RSS" 	I&t$-HHHD	yr;   	all_plansc                 D   t          || j                  }t          |          \  }}| j        r8d |D             }t	          t          |           }t          j        ||          }t          ||          st          d          || _
        || _        | j
        | j        fS )Nc                     g | ]	}|j         
S  rC   ).0ps     r9   
<listcomp>z9DefaultSavePlanner.create_global_plan.<locals>.<listcomp>x   s     E E EA E E Er;   rC   zFailed to validate global plan)r   r4   r/   r   dictr   rE   rF   _validate_global_plan
ValueErrorglobal_planmetadata)r8   rI   rS   rT   planner_data_dictmerged_mappingss         r9   create_global_planz%DefaultSavePlanner.create_global_planl   s     %Y0NOO	 ?	 J JX" 	S
 !F E E E E"8->#?@@O"*8/RRRH$[(;; 	?=>>>& ..r;   new_planc                     || _         |S r@   )rG   r8   rX   s     r9   finish_planzDefaultSavePlanner.finish_plan   s    	r;   
write_itemc                 b    |                      |j                  }|                     ||          S r@   )lookup_objectindextransform_object)r8   r\   objects      r9   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<   r8   r_   s     r9   r^   z DefaultSavePlanner.lookup_object       %dou===r;   ra   c                     |j         t          j        k    r*t          j                    }t          j        ||           |}|S rd   )typer    BYTE_IOioBytesIOtorchsave)r8   r\   ra   bytess       r9   r`   z#DefaultSavePlanner.transform_object   s9    ?m333JLLEJvu%%%Fr;   )TTNFNF)__name__
__module____qualname__r   __annotations__boolr	   r:   r   r   rA   r   rH   r   r
   r   rW   r[   r   r   rm   Tensorrk   rl   rb   r   r   r^   r`   rL   r;   r9   r*   r*   B   s         $((,37*/   "& #+4.	
 $( 
   * /3$	- -#- {+- 	-
 
- - - -8    /h/	tH~x'	(/ / / /0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_loadr5   Nc                 L    || _         || _        i | _        i | _        || _        d S r@   )r   r2   rx   r1   ry   )r8   r   r2   ry   s       r9   r:   zDefaultLoadPlanner.__init__   s1     #5'>$#% "4r;   r<   rT   r>   c                     t          |           || _        | j        rt          |          }| j        rt	          |          \  }| _        || _        || _        || _        d S r@   )	r$   rx   r2   r   r   r1   r<   rT   r>   )r8   r<   rT   r>   s       r9   rA   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)rT   r   setr<   keysstate_dict_metadatar(   _derived_versionrx   r1   r,   ry   )r8   current_keys	load_keysmissing_keysold_state_dictold_mappingsold_keyss          r9   rH   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;   rS   c                      t          |          S r@   )r-   )r8   rS   s     r9   rW   z%DefaultLoadPlanner.create_global_plan   s    .{;;;r;   rX   c                     |S r@   rL   rZ   s     r9   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   rx   r1   
dest_indexfqnrm   loadr<   )r8   r   r   s      r9   
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 r@   )lookup_tensorr   transform_tensorr8   r   tensors      r9   resolve_tensorz!DefaultLoadPlanner.resolve_tensor   s.    ##I$899$$Y777r;   r   c                     d S r@   rL   r   s      r9   commit_tensorz DefaultLoadPlanner.commit_tensor  s    r;   r_   c                 ,    t          | j        |          S rd   re   rf   s     r9   r   z DefaultLoadPlanner.lookup_tensor  rg   r;   c                 8    t          ||j        |j                  S rd   )r   dest_offsetslengthsr   s      r9   r   z#DefaultLoadPlanner.transform_tensor
  s    %fi.DiFWXXXr;   )TTFrp   )rq   rr   rs   __doc__r   rt   r   ru   r:   r	   r   rA   r   rH   r   rW   r[   r   rk   rl   r   r   rm   rv   r   r   r   r   rL   r;   r9   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 r@   )r   superr:   )r8   r   argskwargs	__class__s       r9   r:   z#_EmptyStateDictLoadPlanner.__init__  s,    	$)&)))))r;   keyrT   r5   c           	      T     j         dS | j         v r	 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 r@   )r   )rM   unflattened_keyr8   s     r9   	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>3  s*      TT$)+TTTTTTr;   F)r   rD   getappendjoinstrany)r8   r   rT   unflattened_keysrD   r   s   `     r9   _should_include_keyz._EmptyStateDictLoadPlanner._should_include_key!  s    9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<   r>   c                    |rJ |J |j                                         D ]\  }}|                     ||          st          |t                    r%t          j        |j        |j        j	                  }||j
        v rt          ||j
        |         |           ||||<   t                                          |||           d S )N)dtype)r   itemsr   
isinstancer   rm   emptysize
propertiesr   rD   r   r   rA   )r8   r<   rT   r>   kvr   s         r9   rA   z)_EmptyStateDictLoadPlanner.set_up_planner8  s     ### 06688 		" 		"DAq++Ax88 !233 BKal.@AAAH)))J(=a(@!DDDD !
1z8^DDDDDr;   r@   rp   )rq   rr   rs   r   r:   r   r   ru   r   r   r	   rA   __classcell__)r   s   @r9   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   Tr<   rT   strictr5   c                 `   g }	 |                                  D ]\  }}||j        vr|rt          d| d          $|j        |         }t          |t                    r.|j                                        |t          |||          z  }t|t          |||          z  }t          |          S )Nz&Missing key in checkpoint state_dict: r   )	r   r   RuntimeErrorr   r&   device_meshget_coordinater"   r   )r<   rT   r   requestsr   objmds          r9   r,   r,   P  s     H $$&& 9 9Sh222 "#RC#R#R#RSSS)#. c7## 	9--//;.sB<<<*3C888HHHr;   rI   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.
    rL   )rI   s    r9   r-   r-   r  s
     r;   r>   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<   r>   r   r   r   s        r9   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   ri   r    SHARDr_   r   rj   r   r   tensor_datar   r   
setdefaultr   r   rE   rF   lenr   chunkr   )
rI   r   r   	new_plansrG   	new_itemsitem	tensor_mdnew_item	new_indexs
             r9   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  *** $*66*.   766
  ''(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<   rG   _r   s       r9   _create_default_local_metadatar     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       r9   _check_box_overlapr     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      r9   _check_box_boundsr     s     3~&&''  Q!##55?1!!55Q)/!"44~a7HHH55 I 4r;   rS   c           	         d}|j                                         D ]6\  }}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          }	||	k    rt          
                    d||	|           d}8|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   r   r   	enumerater   r   r)   r7   r   operatormulr   r   )
rS   rT   all_goodr   r   chunks_volume	chunk_idxchunk0chunk1tensor_volumes
             r9   rQ   rQ     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;;M))NN    HOr;   )T)LrE   rk   loggingr   collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   rm   torch.distributed._shard._utilsr   .torch.distributed.checkpoint._dedup_save_plansr   )torch.distributed.checkpoint._nested_dictr   r   2torch.distributed.checkpoint._sharded_tensor_utilsr   &torch.distributed.checkpoint._traverser   %torch.distributed.checkpoint.metadatar   r   r   r   r   r   r   r   $torch.distributed.checkpoint.plannerr   r   r   r   r   r   r    ,torch.distributed.checkpoint.planner_helpersr!   r"   r#   r$   "torch.distributed.checkpoint.utilsr%   torch.distributed.tensorr&    r(   	getLoggerrq   r)   Loggerrt   __all__r*   r+   r   r   ru   r,   r-   r.   r/   r   r   Sizer   rQ   rL   r;   r9   <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  T T T T T T T Tn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<@   D	H~		(^	 	 	 	S#X04   : !%4% 4%H~4%4% 4>8#$4% 4% 4% 4%n 8    1 9M RV     J+?	   -tH~ - -d - - - - - -r;   