
    Vhf-                         d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZ ej                  j                  Z G d dej                        Zy)    )AnyN)ChunkStorageMetadataMetadataIndexTensorPropertiesTensorStorageMetadata)TensorWriteData	WriteItemWriteItemTypec                      e Zd ZU dZddgZeej                     ed<   e	ed<   e
deej                     deeedf      dd fd       Zed&d
       Ze
d        Ze
d        Ze
d        Ze
d        Ze
d        Ze
d        Ze
d        Zedej0                  j2                  fd       Zedefd       ZdefdZd'dedd fdZdeej                     fdZdeej>                     fdZ deej>                     fdZ!edee"   fd       Z#de	fdZ$de%de&dee'   fdZ(dee"   fdZ)d e*dej                  fd!Z+defd"Z,d# Z-de%fd$Z.de%fd%Z/y	)(LocalShardsWrapperz
    A wrapper class to hold local shards of a DTensor.
    This class is used largely for checkpointing purposes and implicity subtypes
    the _Checkpointable protocol.
    _local_shards_storage_metalocal_shardslocal_offsets.returnc           	         t              dkD  sJ t              t        |      k(  sJ t        fddd  D              sJ t        d   j                               }t              dkD  r(dd  D ]   }|dxx   |j                         d   z  cc<   " t	        j
                  d         }t        j                  |      }t        |      D cg c]3  \  }}t        t        j                  |      |j                               5 }}}t        j                  j                  | t        j                  |            }	|	_        t        |||      |	_        |	S c c}}w )Nr   c              3   V   K   | ]   }|j                   d    j                   k(   " yw)r   N)device).0tensorr   s     X/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributed/tensor/_shards_wrapper.py	<genexpr>z-LocalShardsWrapper.__new__.<locals>.<genexpr>.   s)      
8>FMM\!_333
s   &)   offsetssizes)
propertiessizechunks)lenalllistr   r   create_from_tensortorchSizezipr   Tensor_make_wrapper_subclassr   r   r   )
clsr   r   cat_tensor_shapeshardwrapper_propertieswrapper_shapeoffsetchunks_metars
    `        r   __new__zLocalShardsWrapper.__new__(   si    < 1$$$< C$6666 
BNqrBR
 
 	
 

  Q 4 4 67|q %ab) 7 #uzz|A6#7 .@@aQ

#34 "%\=!A

 v	 !

6*jjl
 
 LL//JJ'(
 '/)
 '
s   8ENc                    |xs i }t         j                  j                  j                  j                  | j
                  t         j                  j                  j                  j                  | j                  t        j                  j                  | j                  t        j                  j                  | j                  t        j                  j                  | j                  t        j                  j                  | j                   t        j"                  j                  | j$                  i}||v r ||   ||      S t'        | d      )N) is not supported for LocalShardsWrapper!)r$   ops_c10d_functionalall_gather_into_tensordefaulthandle_all_gather_into_tensorwait_tensorhandle_wait_tensoraten_to_copyhandle_to_copyviewhandle_viewequalhandle_equaldetachhandle_detachclonehandle_cloneNotImplementedError)r)   functypesargskwargs
dispatchers         r   __torch_dispatch__z%LocalShardsWrapper.__torch_dispatch__P   s     2 II&&==EEsGhGhII&&22::C<R<RMM!!3#5#5IIsJJ 0 0KK!2!2JJ 0 0

 :#:d#f  &&AB     c                 \   | d   j                         d   d   }t        j                  | d   j                         D cg c]  }|j	                  d       c}d      j	                  d|      }t        j
                  j                  j                  j                  |g| dd  i |S c c}w )Nr   r   )dim)	local_sizesr$   catr   r>   r4   r5   r6   r7   )rI   rJ   rP   t
cat_tensors        r   r8   z0LocalShardsWrapper.handle_all_gather_into_tensori   s     1g!!#A&q)YY!%a!5!5!78AQVVBZ8a

$r3- 	 yy))@@HH
ab
%+
 	
 9s   B)c                 Z    t         j                  j                  j                  | d         S Nr   )r$   r4   r5   r9   )rI   rJ   s     r   r:   z%LocalShardsWrapper.handle_wait_tensoru   s#     yy))55d1g>>rM   c           	          | d   j                         D cg c](  }t        j                  j                  |g| dd  i |* }}t	        || d   j                               S c c}w Nr   r   )r   r;   r<   r7   r   r   rI   rJ   r+   res_shards_lists       r   r=   z!LocalShardsWrapper.handle_to_copy{   sn     a--/
 MM!!%=$qr(=f=
 
 "/473H3H3JKK	
s   -A"c                     | d   j                         D cg c]&  }t        j                  j                  || d   fi |( }}t	        || d   j                               S c c}w rX   )r   r;   r>   r7   r   r   rY   s       r   r?   zLocalShardsWrapper.handle_view   si     a--/
 IIeT!W77
 
 "/473H3H3JKK	
s   +A c                 6   | d   | d   }}t        |j                               t        |j                               k7  ryt        d t        |j                         |j                               D              sy|j	                         |j	                         k(  syy)z|
        LocalShardsWrapper equal impl also checks for equality of storage metadata
        and the order of shards
        r   r   Fc              3   b   K   | ]'  \  }}t         j                  j                  ||       ) y wN)r;   r@   r7   )r   xys      r   r   z2LocalShardsWrapper.handle_equal.<locals>.<genexpr>   s*      
)-ADJJq!$
s   -/T)r    r   r!   r&   storage_metadata)rI   rJ   abs       r   rA   zLocalShardsWrapper.handle_equal   s     AwQ1q~~ C(8$99 
14Q^^5Eq~~GW1X
 
 !!#q'9'9';;rM   c                     | d   }|j                         D cg c]!  }t        j                  j                  |      # }}||_        d|j
                  j                  _        |S c c}w )Nr   F)r   r;   rB   r7   r   r   r   requires_grad)rI   rJ   self_lsr+   deatched_local_shardss        r   rC   z LocalShardsWrapper.handle_detach   sh     q'4;4H4H4J!
+0DKK&!
 !
 !69>((6!
s   &A$c                    | d   }|j                  dd       }|r!|t        j                  k7  rt        | d      |j                  D cg c]  }|j                  |       }}t        ||j                               S c c}w )Nr   memory_formatr3   )ri   )getr$   preserve_formatrF   r   rD   r   r   )rI   rJ   rf   desired_memory_formatr+   cloned_local_shardss         r   rE   zLocalShardsWrapper.handle_clone   s     q' &

?D A %:e>S>S%S%())RS 
 !..
 KK&;K<
 
 ""5w7L7L7NOO	
s   	A>c                 4    | j                   d   j                  S rV   )r   r   selfs    r   r   zLocalShardsWrapper.device   s    !!!$+++rM   c                 4    | j                   d   j                  S rV   )r   is_metaro   s    r   rr   zLocalShardsWrapper.is_meta   s    !!!$,,,rM   c                 B    | j                   j                  j                  S r^   )r   r   
pin_memoryro   s    r   	is_pinnedzLocalShardsWrapper.is_pinned   s    !!,,777rM   re   c                     || j                   j                  _        | j                  D cg c]  }|j	                  |       c} | S c c}w r^   )r   r   re   r   requires_grad_)rp   re   r+   s      r   rw   z!LocalShardsWrapper.requires_grad_   s@    6C%%3:>:L:LM		m	,M 	Ns   Ac                     | j                   S )z
        Returns a list of :class:`torch.Tensor' corresponding to the
        local shards for this rank. Returns an empty list if the current rank
        does not host any shards for this Tensor.
        )r   ro   s    r   r   zLocalShardsWrapper.local_shards   s     !!!rM   c                 h    | j                   j                  D cg c]  }|j                   c}S c c}w )z
        Returns a list of :class:`torch.Size' corresponding to the
        local sizes for the shards on this rank. Returns an empty list if the current rank
        does not host any shards for this Tensor.
        )r   r   r   rp   chunks     r   rQ   zLocalShardsWrapper.local_sizes   s(     *.););)B)BCCCC   /c                 h    | j                   j                  D cg c]  }|j                   c}S c c}w )z
        Returns a list of :class:`torch.Size' corresponding to the
        local offsets for the shards on this rank. Returns an empty list if the current rank
        does not host any shards for this Tensor.
        )r   r   r   rz   s     r   r   z LocalShardsWrapper.local_offsets   s(     ,0+=+=+D+DE%EEEr|   c                 .    | j                   j                  S )z
        Returns a :class:`List[ChunkStorageMetadata]` object corresponding to the
        metadata for each tensor shard
        r   r   ro   s    r   local_chunkszLocalShardsWrapper.local_chunks   s     !!(((rM   c                     | j                   S )z
        Returns a :class:`TensorStorageMetadata` object corresponding to the
        metadata for the local tensor on current rank
        )r   ro   s    r   ra   z#LocalShardsWrapper.storage_metadata   s    
 !!!rM   fqnobjectc                 r   t        | j                         | j                        D cg c]  \  }}t        t	        ||j
                        t        j                  t        t        |j
                  |j                        | j                  j                  |j                                      c}}S c c}}w )z}
        For compatibility with DCP, we support creation of WriteItems
        such that they can be saved properly.
        r   )r{   r   r   )indextypetensor_data)r&   r   r   r	   r   r   r
   SHARDr   r   r   r   r   r   )rp   r   r   r   r   s        r   __create_write_items__z)LocalShardsWrapper.__create_write_items__   s    ( #&d&7&7&94;L;L"M
  #C8"((+. &$ll  $11<<
 	
 
s   BB3c                 .    | j                   j                  S )z~
        For compatibility with DCP, we support creation of chunk lists
        such that they can be saved properly.
        r   ro   s    r   __create_chunk_list__z(LocalShardsWrapper.__create_chunk_list__  s    
 !!(((rM   r   c                    |j                   ut        | j                        |j                   kD  rS| j                  j                  |j                      j
                  |j                  k(  r| j                  |j                      S |j                  Ot        | j                  | j                  j                        D ]"  \  }}|j
                  |j                  k(  s |c S  t        d|j                   d|j                   d      )z
        For compatibility with DCP, we support finding shard based on index
        Return a 'torch.Tensor' shard based on 'MetadataIndex'.
        zCould not find shard at 'z' for FQN: '')
r   r    r   r   r   r   r.   r&   
ValueErrorr   )rp   r   r+   r{   s       r   __get_tensor_shard__z'LocalShardsWrapper.__get_tensor_shard__  s     ;;"D&&'%++5&&--ekk:BBellR))%++66<<# #D$6$68J8J8Q8Q R !u==ELL0 L! '~\%))AN
 	
rM   c                 |    d}| j                         D ]&  }||j                         |j                         z  z  }( |S rV   )r   nelementelement_size)rp   object_sizer+   s      r   _get_tensor_size_bytesz)LocalShardsWrapper._get_tensor_size_bytes,  sF    &&( 	CE5>>+e.@.@.BBBK	CrM   c                     t        |       S r^   )idro   s    r   __hash__zLocalShardsWrapper.__hash__3  s    $xrM   c                 :    d| j                    d| j                   S NzLocalShardsWrapper: r   r   ro   s    r   __repr__zLocalShardsWrapper.__repr__8  #    $T%7%7$8$:L:L9MNNrM   c                 :    d| j                    d| j                   S r   r   ro   s    r   __str__zLocalShardsWrapper.__str__;  r   rM   ) N)T)0__name__
__module____qualname____doc__	__slots__r"   r$   r'   __annotations__r   staticmethodtupleintr1   classmethodrL   r8   r:   r=   r?   rA   rC   rE   property_Cr   boolrr   ru   rw   r   r%   rQ   r   r   r   ra   strr   r	   r   r   r   r   r   r   r   r   r   rM   r   r   r      sU    !/2I%%(($-$>B5c?>S$	$ $N  , 
 
 ? ? L L L L      P P , , , - - -84 8D <P 
"d5<<0 "DT%**- DFtEJJ/ F )d#78 ) )""7 "

 #
	i
.)t,@'A )
- 
ELL 
, 
O# OO OrM   r   )typingr   r$   %torch.distributed.checkpoint.metadatar   r   r   r   $torch.distributed.checkpoint.plannerr   r	   r
   r4   r;   r'   r   r   rM   r   <module>r      sG        
IINN 
_O _OrM   