
    `i@              	          U d dl Z d dl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 d dl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 dd
lmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$ dgZ%e&e'         e(d<   dedede)fdZ*de&e         de)fdZ+de&e         de&e         de&e         fdZ,dej-        defdZ.dedefdZ/dededefdZ0de'dede fdZ1de'dedede fdZ2de'dej-        de fdZ3de'd efd!Z4d" Z5d# Z6de'd$ed%e&e         de&e         fd&Z7d'edefd(Z8de'd)ede&e          fd*Z9dedefd+Z:dej-        de&e         fd,Z;de'd-ed.ede&e         fd/Z<d'e=e'ef         defd0Z>d1ed2ed3ed4efd5Z?dS )6    N)AnyCallablecast)_get_device_module)ShardMetadata)ShardedTensor)DTensor)%compute_local_shape_and_global_offset   )BytesStorageMetadataChunkStorageMetadataMetadataIndexSTATE_DICT_TYPESTORAGE_TYPESTensorPropertiesTensorStorageMetadata)LoadItemTypeReadItemSavePlanTensorWriteData	WriteItemWriteItemType)"_check_shard_metadata_pair_overlap+_shards_get_overlap_region_wrt_saved_tensor create_read_items_for_chunk_list__all__plan
other_planreturnc                 J   | j         |j         k    rdS t          | j                  t          |j                  k    rdS t          | j        |j                  D ]\  }}|j        |j        k    r dS |j        }|j        }|j        |j        k    s |j        |j        k    s|j        |j        k    r dS |j        }|j        }|r|r|s|r dS |rU|rS|j	        |j	        k    r dS |j
        }|j
        }	|r|	r|s|	r dS |r%|	r#|j        |	j        k    s|j        |	j        k    r dS dS )a  
    Compare the two Save plans and return True if they are equal.

    Args:
        plan (SavePlan): First SavePlan to compare.
        other_plan (SavePlan): Second SavePlan to compare.

    Returns:
       True if the two plans are equal, False otherwise.
    FT)usablelenitemsziptypeindexfqnoffsettensor_datasizechunkoffsetssizes)
r   r   	plan_itemother_plan_itemplan_metadata_indexother_plan_metadata_indexr)   other_tensor_datar+   other_chunks
             /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/torch/distributed/checkpoint/planner_helpers.py_compare_save_plansr5   '   s    {j'''u 4:#j.////u '*$*j6F&G&G )! )!"	?>_11155'o$3$9!  #'@'DDD")-F-MMM"(,E,KKK55  ++7 	 1 		 1	 55 	!, 	!#4#999uu  %E+1K k 5 [ uu  ! !M[%888{k&777 554    delta_plansc                 4    t          d | D                       S )z
    Check if any delta plan is usable, indicating the plan has changed.

    Args:
        delta_plans (List[SavePlan]): A list of delta plans to check.
    Returns:
        True if any delta plan is usable, False otherwise.
    c              3   (   K   | ]}|o|j         V  d S N)r!   ).0
delta_plans     r4   	<genexpr>z(_contains_usable_plan.<locals>.<genexpr>q   s*      NNJz/j/NNNNNNr6   )any)r7   s    r4   _contains_usable_planr?   h   s!     NN+NNNNNNr6   cached_plansc                     g }t          | |          D ]9\  }}|r|j        s|                    |           $|                    |           :|S )ac  
    Merge a list of delta plans into a single plan.

    Args:
        cached_plans (List[SavePlan]): A list of cached plans.
        delta_plans (List[SavePlan]): A list of delta plans to merge. It can contain empty plans

    Returns:
        A single merged plan. If a delta plan is not usable, use the cached plan. Otherwise, use the delta plan.
    )r$   r!   append)r@   r7   merged_planscached_planr<   s        r4   _merge_delta_local_plansrE   t   sm     L#&|[#A#A , ,Z 	,j/ 	,,,,,
++++r6   tensorc           	          t          t          j        dgt          |                                           z            |                                           S )Nr   r,   r-   )r   torchSizer"   r*   )rF   s    r4   _create_chunk_from_tensorrK      sG    
A3V[[]]!3!3344FKKMM   r6   shard_mdc                     t          t          j        | j                  t          j        | j                            S NrH   )r   rI   rJ   shard_offsetsshard_sizes)rL   s    r4   _chunk_for_shardrQ      s9    
8122j-..   r6   sharded_tensorc                     |                                  j        }t          |j        |j        |j        |j        |j                  }t          t          |          ||                                  j
                  S )N)dtypelayoutrequires_gradmemory_format
pin_memoryr+   
propertiesr*   )metadatatensor_propertiesr   rT   rU   rV   rW   rX   r   rQ   r*   )rR   rL   shard_propertiesrZ   s       r4   _sharded_tensor_metadatar^      s     &..00B!$&&4&4#.  J x(($$&&+   r6   r'   c                    t          |j        |j        |j                  \  }}t	          j        |          t	          j        |          }}t          t          | |          t          j	        t          t          ||          t          j        |                                          |                                                    S )NrH   rY   r&   r%   r)   )r
   shapedevice_mesh
placementsrI   rJ   r   r   r   SHARDr   r   r   create_from_tensorto_localr*   )r'   rF   r-   r,   s       r4   _create_write_items_for_dtensorrg      s    :f(&*; NE7 Z&&
7(;(;7EC)) #&   (:6??;L;LMM
 
 
   r6   c                     t          j        |j                  }t          t	          | |          t
          j        t          ||                    S )Nr`   )rI   rJ   rO   r   r   r   rd   r^   )r'   rR   rL   r,   s       r4   _create_write_item_for_shardri      sM     j/00GC)) ,^XFF   r6   c                 n   t          j        dgt          |                                          z            }t	          t          | |          t          j        t          t          ||                                          t          j        |          |                                                    S )Nr   rH   rY   r`   )rI   rJ   r"   r*   r   r   r   TENSORr   r   r   re   )r'   rF   r,   s      r4   _create_write_item_for_tensorrl      s    j!s6;;==11122GC))!#&wfkkmmLLL':6BB
 
 
   r6   bytesc                 R    t          t          |           t          j                  S )N)r&   r%   )r   r   r   BYTE_IO)r'   rm   s     r4   _create_write_item_for_bytesiorp      s*    C  "   r6   c           
          t          t          j        | t          j        |f          |t          j        |f          t          j        |f                    S N)r%   
dest_indexdest_offsetsstorage_indexstorage_offsetslengths)r   r   ro   rI   rJ   rs   dest_offsetru   storage_offsetlengths        r4   _create_read_item_for_byteior|      sU     !Z//#
N#455
F9%%   r6   c           
          t          t          j        | t          j        |          |t          j        |          t          j        |                    S rr   )r   r   rk   rI   rJ   rs   rt   ru   rv   rw   s        r4   _create_read_item_for_tensorr      sN      Z--#
?33
7##   r6   checkpoint_mdlocal_chunksc                    g }t          |          D ]\  }}t          |j                  D ]\  }}t          ||          sg }g }	g }
t          ||          D ]F\  }}}}|                    |           |	                    |           |
                    |           G|                    t          t          | |j        |          |	t          | |j        |          ||
                     Č|S )aW  
    Create a list of ``ReadItem`` based on the checkpoint and local chunks.

    This applies the resharding algorithm and computes the reads needed
    to satisfy ``local_chunks`` with a checkpoint described by ``checkpoint_md``.

    Args:
        fqn (str) : The state_dict FQN to pass to ``ReadItem``.
        checkpoint_md (TensorStorageMetadata): metadata for a given tensor
            from a checkpoint.
        local_chunks (List[ChunkStorageMetadata]): Local chunks that needs to be
            loaded.

    Returns:
        A list of ``ReadItem`` that will satisfy all input chunks.
    )saved_shardcurrent_shardr~   )	enumeratechunksr   r   rB   r   r   r,   )r'   r   r   
read_itemsidxshardstorage_idx
storage_mdrv   rt   rw   _dimoffset_for_saved_tensoroffset_for_current_tensorr{   s                  r4   r   r      sD   * J--  
U'01E'F'F 	 	#K5eZHH  OLG =&e  
' 
' ')  &&'>???##$=>>>v&&&&,,S%-EE!-"/Z5G"U"U$3#     '	8 r6   
state_dictc                 .   g }|                                  D ]\  t          t                    r$|                    t	                               >t          t
                    r:|                    fd                                j        D                        t          t          j
                  r$|                    t                               |                    t                               t          |          S )Nc              3   :   K   | ]}t          |          V  d S r:   )ri   )r;   rL   r'   objs     r4   r=   z5_create_default_metadata_only_plan.<locals>.<genexpr>8  sC         -S#x@@     r6   )r#   
isinstancer	   rB   rg   r   extendr[   shards_metadatarI   Tensorrl   rp   r   )r   requestsr'   r   s     @@r4   "_create_default_metadata_only_planr   2  s&   H$$&& F FSc7## 
	FOO;CEEFFFF]++ 	FOO      # >       U\** 	FOO9#sCCDDDDOO:3DDEEEEHr6   objectc                 6    t          d          r                               S t          t                    r! fd                                D             S t          t
          j                  rt                     gS t                     gS )N__create_write_items__c                 <    g | ]}t          |j                  S  )ri   r[   )r;   r   r'   r   s     r4   
<listcomp>z'_create_write_items.<locals>.<listcomp>H  s7     
 
 
 )fenEE
 
 
r6   )	hasattrr   r   r   local_shardsrI   r   rl   rp   )r'   r   s   ``r4   _create_write_itemsr   C  s    v/00 =,,S&999	FM	*	* =
 
 
 
 
,,..
 
 
 	
 
FEL	)	) =-c6::;;.sF;;<<r6   c                     t          | j        | j        | j                  \  }}t	          j        |          t	          j        |          }}t          ||          S rN   )r
   ra   rb   rc   rI   rJ   r   )rF   r-   r,   s      r4   _create_chunk_from_dtensorr   R  s`    :f(&*; NE7 Z&&
7(;(;7E   r6   c                 L   t          | d          r|                                 }n~t          | t                    rd |                                 D             }nJt          | t
          j                  rt          |           g}nt          dt          |                      |S )N__create_chunk_list__c                 6    g | ]}t          |j                  S r   )rQ   r[   )r;   r   s     r4   r   z&_create_chunk_list.<locals>.<listcomp>b  s0     
 
 
16U^,,
 
 
r6   zMUnsupported Type, expecting one of [Tensor, DTensor, ShardedTensor] ,but got )
r   r   r   r   r   rI   r   rK   
ValueErrorr%   )rF   r   s     r4   _create_chunk_listr   ]  s    v.// 
3355	FM	*	* 


 
:@:M:M:O:O
 
 
 
FEL	)	) 
1&99:'V' '
 
 	

 r6   mdr   c                 @   t          |t                    s[	 t          |          }n9# t          $ r,}t          d|  ddt	          |           z             |d }~ww xY wt          | ||          S t          t          |           dt          |           dd          gS )Nz Invalid checkpoint metadata for z, z(expected BytesStorageMetadata but found r   rx   )r   r   r   r   r%   r   r|   r   )r'   r   r   r   exs        r4   _create_read_itemsr   p  s    b.// 
	-c22LL 	 	 	:3:::GT"XXGGH  	 0RFFF )(--+C00   
 	
s   ' 
A'AAc                 v    dt           fd}dt          fd}dt          j        fd}t	          | |||           dS )zP
    Initializes meta tensor if the meta tensor is DTensor or torch.Tensor.
    valuec                    t          | dd           }|t          j        d          k    rt          j                                        j        }t          t          j        t          |          	                                          }t          j
        |                                 |          }t          j        || j        | j        |                                 |                                           }|S | S )Ndevicemetar   )rb   rc   ra   stride)getattrrI   r   distdistributed_c10d_get_pg_default_devicer%   r   r   current_device
empty_likerf   r	   
from_localrb   rc   r*   r   )r   r   device_typenew_local_tensordtensors        r4   dtensor_funcz&_init_state_dict.<locals>.dtensor_func  s    $//U\&))))/FFHHMK0==LLNN F  %/0@0@PPP ( !- +jjll||~~  G NLr6   c                     t          | dd           }|t          j        d          k    r t          dt	          |            d          | S )Nr   r   zFound unsupported type z for meta device loading.)r   rI   r   RuntimeErrorr%   )r   r   s     r4   sharded_tensor_funcz-_init_state_dict.<locals>.sharded_tensor_func  sU    $//U\&))))P$u++PPP   Lr6   c                 @   t          | dd           }|t          j        d          k    rtt          j                                        j        }t          t          j        t          |          	                                          }t          j
        | |          }|S | S )Nr   r   r   )r   rI   r   r   r   r   r%   r   r   r   r   )r   r   r   rF   s       r4   tensor_funcz%_init_state_dict.<locals>.tensor_func  s    $//U\&))))/FFHHMK0==LLNN F %eF;;;FMLr6   N)r	   r   rI   r   _iterate_state_dict)r   r   r   r   s       r4   _init_state_dictr     s    
G    *3    
5< 
 
 
 
 	    r6   iter_objectr   r   r   c                 t   t          | t                    r |           S t          | t                    r |           S t          | t          j                  r |           S t          | t
          t          t          t          t          j
        f          s| | S t          | t                    r1|                                 D ]\  }}t          |          | |<   | S t          | t          t          f          r6fd| D             }t          | t                    rt          |          }|S dS )a$  
    Iterate through the state dict, applying the given functions to each tensor type
    and update the state dict in place.

    Args:
        iter_object (Any): the target state_dict.
        sharded_tensor_func (Callable): the function to apply to ShardedTensor
        dtensor_func (Callable): the function to apply to DTensor
        tensor_func (Callable): the function to apply to Tensor

    # TODO: let state_dict_util._iterate_state_dict() to support in place option
    so we don't need to have two versions of _iterate_state_dict.
    Nc                 4    g | ]}t          |          S r   )r   )r;   vr   r   r   s     r4   r   z'_iterate_state_dict.<locals>.<listcomp>  s8     
 
 
  <1DkRR
 
 
r6   )r   r	   r   rI   r   intfloatstrrm   ioBytesIOdictr#   r   listtuple)r   r   r   r   keyr   rets    ```   r4   r   r     sk   ( +w'' |K(((	K	/	/ "";///	K	.	. {;''';eS% DEE	K	&	& %++-- 	 	JC2|%8+   K 	K$	/	/ 
 
 
 
 
 
 
 
 
 k5)) 	**C
 r6   )@r   typingr   r   r   rI   torch.distributeddistributedr   torch._utilsr   !torch.distributed._shard.metadatar   'torch.distributed._shard.sharded_tensorr   torch.distributed.tensorr	   torch.distributed.tensor._utilsr
   r[   r   r   r   r   r   r   r   plannerr   r   r   r   r   r   
reshardingr   r   r   r   r   __annotations__boolr5   r?   rE   r   rK   rQ   r^   rg   ri   rl   rp   r|   r   r   r   r   r   r   r   r   r   r   r   r6   r4   <module>r      s   					 & & & & & & & & & &              + + + + + + ; ; ; ; ; ; A A A A A A , , , , , , Q Q Q Q Q Q                                        99c 9 9 9>h >H > > > > >B	OtH~ 	O$ 	O 	O 	O 	Ox.h 
(^   2el 7K    } 1E    !-:   ( g )    (	+7D   
s 
EL 
Y 
 
 
 
 C    
 
 

 
 
4	4(4 +,4 
(^	4 4 4 4n? x    "=S =# =$y/ = = = =w 3G    u| 5I0J    &
C 
] 
 
h 
 
 
 
.4c3h 4C 4 4 4 4n,,, ", 	, , , , , ,r6   