
    Vh                        U d dl Z d dlZd dlZd dlZd dlZ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mZmZ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 d d	lm Z  d dl!Z!d d
l!m"Z" d dl#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z* d dl+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZA g dZBdZCeDeEd<   e G d d             ZFe G d d             ZGdZHdeDfdZI G d de      ZJ G d  d!eJ      ZK G d" d#eJ      ZL G d$ d%      ZMd&e6deNfd'ZOd(eNd)ePe6   dePePe6      fd*ZQ	 dFd+eMd,ej                  d-eej                  e!jD                  f   d.e6d/eDd0eTde=fd1ZUd2ed3ej                  d4ej                  d5e5d+eMd6eNd7eTd8eNd0eTddfd9ZW G d: d;e      ZX G d< d=eX      ZY G d> d?e<      ZZ G d@ dA      Z[ G dB dCe;      Z\ G dD dEeZe9      Z]y)G    N)ABCabstractmethod)	GeneratorIterableIteratorSequence)contextmanager)	dataclass)UnsupportedOperation)Path)AnyCallablecastIOOptionalUnion)Buffer)Tensor)_get_available_device_type_get_device_module)narrow_tensor_by_index)ExtensionRegistryStreamTransformExtension)MetadataSTATE_DICT_TYPEStorageMeta)LoadItemTypeLoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItemWriteItemType)BlockingAsyncStager)StorageReaderStorageWriterWriteResult)_create_file_view)Future)FileSystemWriterFileSystemReader
FileSystemFileSystemBase	.metadata_metadata_fnc                   P    e Zd ZU dZeed<   eed<   eed<   dZee	e      ed<   d Z
y)_StorageInfoz#This is the per entry storage info.relative_pathoffsetlengthNtransform_descriptorsc                 p    | j                   j                         D ci c]  \  }}|	|| c}}S c c}}w N)__dict__items)selfkvs      W/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributed/checkpoint/filesystem.py__getstate__z_StorageInfo.__getstate__B   s/    !%!4!4!6HA!-1HHHs   
22)__name__
__module____qualname____doc__str__annotations__intr6   r   r   r?        r>   r2   r2   9   s/    -KK598HSM29IrH   r2   c                       e Zd ZU eed<   y)_StoragePrefixprefixN)r@   rA   rB   rD   rE   rG   rH   r>   rJ   rJ   F   s    KrH   rJ   z.distcpreturnc                  <    t        t        j                               S r8   )rD   uuiduuid4rG   rH   r>   _generate_uuidrP   N   s    tzz|rH   c                   v    e Zd Zedededdfd       Zedd       Zedee	e
j                  ef      fd       Zy)	_TensorLoadersizeobjrL   Nc                      y r8   rG   r;   rS   rT   s      r>   addz_TensorLoader.addS       rH   c                      y r8   rG   r;   s    r>   start_loadingz_TensorLoader.start_loadingW   rX   rH   c                      y r8   rG   rZ   s    r>   valuesz_TensorLoader.values[   rX   rH   rL   N)r@   rA   rB   r   rF   objectrW   r[   r   tupletorchr   r]   rG   rH   r>   rR   rR   R   sk     & T     u||V';!<=  rH   rR   c                   h    e Zd ZdeddfdZdededdfdZd
dZde	e
ej                  ef      fd	Zy)_SerialCpuLoaderresolve_funrL   Nc                      || _         g | _        y r8   )rd   r:   )r;   rd   s     r>   __init__z_SerialCpuLoader.__init__a   s    &/1
rH   rS   rT   c                 >    | j                   j                  ||f       y r8   )r:   appendrV   s      r>   rW   z_SerialCpuLoader.adde   s    

4+&rH   c                      y r8   rG   rZ   s    r>   r[   z_SerialCpuLoader.start_loadingh       rH   c              #     K   | j                   D ]y  \  }}| j                  |      j                         }|j                         }|j	                         j                         |j                         k7  r|j                         }||f { y wr8   )r:   rd   detachcpustoragerS   numelcloner;   _rT   tensors       r>   r]   z_SerialCpuLoader.valuesk   sz     jj 	FAs%%c*113FZZ\F~~$$&&,,.8 	s   B
Br^   )r@   rA   rB   r   rf   rF   r_   rW   r[   r   r`   ra   r   r]   rG   rH   r>   rc   rc   `   sS    2H 2 2' '& 'T '	u||V';!<= 	rH   rc   c            	          e Zd Z	 	 ddedeej                     deddfdZe	de
fd       Zdeeej                  ef      fdZdd	Zdeeej                  ef      fd
ZdededdfdZddZdeeej                  ef      fdZy)_OverlappingCpuLoaderNrd   streaminflight_threshholdrL   c                 8   || _         g | _        || _        d| _        t	        j
                         | _        d| _        d| _        |r|j                  n	t               | _	        t        | j                        | _        t        t        j                  j                   |xs | j                  j#                               | _        | j$                  | j                  j#                         k7  r4| j$                  j'                  | j                  j#                                y y )Nr   F)rd   r:   rw   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   ra   cudaStreamcurrent_streamrv   wait_stream)r;   rd   rv   rw   s       r>   rf   z_OverlappingCpuLoader.__init__x   s     '/1
#6 0;0A0A0C"(F.H.J 	 00@0@AJJvL););)J)J)L
 ;;$,,;;==KK##D$6$6$E$E$GH >rH   c                 F    | j                   t        | j                        k\  S r8   )r}   lenr:   rZ   s    r>   _donez_OverlappingCpuLoader._done   s    xx3tzz?**rH   c                    g }| j                   | j                  k\  r| j                  j                          | j                   | j                  k\  r| j                  j                         }| xj                   |d   j                         |d   j                         z  z  c_         |j                  |       | j                   | j                  k\  r|S Nr   )	ry   rw   rv   synchronizer|   popleftro   element_sizerh   )r;   drainedvals      r>   _drainz_OverlappingCpuLoader._drain   s    $":"::KK##%!!T%=%==$$,,.C3q6<<>CF4G4G4I#IINN3 !!T%=%== rH   c                    | j                   j                  | j                        5  | j                  s| j                  | j                  k  rm| j
                  | j                     \  }}| xj                  dz  c_        | j                  |      j                         }|j                  j                  | j                  k(  r|j                  dd      }nn|j                  t        j                  d      k(  rL|j                         j                         |j!                         |j"                  z  k7  r|j%                         }| j&                  j)                  ||f       | xj                  |j!                         |j+                         z  z  c_        | j                  s| j                  | j                  k  rmd d d        y # 1 sw Y   y xY w)N   rm   T)devicenon_blocking)r   rv   r   ry   rw   r:   r}   rd   rl   r   typer   tora   untyped_storagerS   ro   itemsizerp   r|   rh   r   rq   s       r>   _refillz_OverlappingCpuLoader._refill   sc   &&t{{3 	NjjT%8%84;S;S%SDHH-3A))#.557==%%)9)99#YYe$YGF]]ell5&99..0557!<<>FOO;< "("")) ##v||~8K8K8M'MM#) jjT%8%84;S;S%S	N 	N 	Ns   FGGc                     | j                   sJ t        | j                        dkD  r| j                  j	                          | j                  S r   )r   r   r|   rv   r   rZ   s    r>   _finishz_OverlappingCpuLoader._finish   s=    zzzt!!"Q&KK##%!!!rH   rS   rT   c                 l    | j                   rt        d      | j                  j                  ||f       y )Nz&cannot add items after loading started)r~   RuntimeErrorr:   rh   rV   s      r>   rW   z_OverlappingCpuLoader.add   s+    <<GHH

4+&rH   c                     | j                   ry d| _         | j                  j                  t        j                  d             | j                          y )NTr   key)r~   r:   sortoperator
itemgetterr   rZ   s    r>   r[   z#_OverlappingCpuLoader.start_loading   s9    <<

H//23rH   c              #      K   | j                          | j                  s7| j                         }| j                          |E d {    | j                  s7| j	                         E d {    y 7 *7 wr8   )r[   r   r   r   r   )r;   r   s     r>   r]   z_OverlappingCpuLoader.values   sY     **kkmGLLN **
 <<>!! !s*   AA3A/A3A3)A1*A31A3)Ni@B r^   )r@   rA   rB   r   r   ra   r   rF   rf   propertyboolr   listr`   r   r_   r   r   r   r   rW   r[   r   r]   rG   rH   r>   ru   ru   w   s     *.#,	II &I !	I
 
I. +t + +U5<<#789 N0"%f(<"=> "' '& 'T '
"u||V';!<= "rH   ru   c            	       n    e Zd ZdZ	 d	deee      ddfdZdede	j                  deee   ee   f   fdZy)
_StorageWriterTransforms
    This is experimental, and will likely move elsewhere in the
    future.  It lives here to minimize changes while we are still
    learning and gathering feedback.
    N
extensionsrL   c                 &    |d| _         y|| _         y)a  
        If the extensions arg is None, this means the implementation
        should provide whatever defaults it chooses.  An empty
        sequence indicates no extensions should be used.  At this
        time, the default extensions sequence is empty.
        NrG   )r   )r;   r   s     r>   rf   z!_StorageWriterTransforms.__init__   s     !+ 2"
rH   
write_item
raw_streamc                 "    G d dt         j                        }t        t        t            ||            }| j
                  D ]  }|j                  |      } |t        | j
                        D cg c]  }|j                          c}fS c c}w )Nc                   N    e Zd Zdej                  fdZdefdZdede	fdZ
d Zy)	E_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriterrawc                     || _         y r8   )r   )r;   r   s     r>   rf   zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__   s	    rH   rL   c                      y)NTrG   rZ   s    r>   	writeablezO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable   s    rH   bc                 8    | j                   j                  |      S r8   )r   write)r;   r   s     r>   r   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write   s    xx~~a((rH   c                 X    | j                          | j                  j                          y r8   )flushr   rZ   s    r>   closezK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close   s    

 rH   N)r@   rA   rB   ioIOBaserf   r   r   r   rF   r   r   rG   rH   r>   NoCloseWriterr      s6    BII 4 )v )# )!rH   r   )	r   r   r   r   bytesr   transform_toreversedget_descriptor)r;   r   r   r   r   exs         r>   transform_save_streamz._StorageWriterTransforms.transform_save_stream   sw    	!BII 	! BuI}Z'@A// 	9B??<8L	9 Xdoo=VWrr002WXXWs   1Br8   )r@   rA   rB   rC   r   r   r   rf   r#   r   r   r`   r   r   r   rD   r   rG   rH   r>   r   r      sh     JN	C"8,D#EF	C		CY#Y13Y	r%y$s)#	$YrH   r   itemc                     d}| j                   J | j                   j                  D ]  }||z  }	 | j                   j                  j                  }|t        j
                  j                  |      z  S Nr   )tensor_datarS   
propertiesdtypera   _utils_element_size)r   rS   sr   s       r>   
_item_sizer     sp    D'''"" 	 ''--E%,,,,U333rH   binsr:   c                    | dk(  r|gS |D cg c]"  }|j                   t        j                  k(  s!|$ }}|D cg c]"  }|j                   t        j                  k7  s!|$ }}t        |       D cg c]  }g  }}t        |       D cg c]  }d }}|j	                  t
        d       t        |      D ]  \  }}||| z     j                  |        |D ]X  }t        t        |      t        j                  d            d   }	||	   j                  |       ||	xx   t        |      z  cc<   Z |S c c}w c c}w c c}w c c}w )Nr   r   T)r   reverser   )r   r$   BYTE_IOranger   r   	enumeraterh   minr   r   )
r   r:   wibytes_wtensor_wrr   bucketsbucket_sizesir}   s
             r>   _split_by_size_and_typer     s3   qyw!FbRWW0E0E%ErFGF"Grbgg1F1F&FGHG27+%>Qb%>G%>$T{+!A+L+MMj$M/7# %2D  $%  ,)L)x/B/B1/EFqIBSZ^+	, N# GG%>+s!   "D3D3"D8D80	D=	E
transformsrv   datar   storage_keysafe_tensorsc           
         |j                         }| j                  ||      \  }}|j                  t        j                  k(  r<t        |t        j                        sJ |j                  |j                                nXt        |t        j                        sJ |j                  t        j                  d      k(  sJ |st        j                  ||       |j                          |rt        |t        j                        r|j                         |z
  }	n!|j                         |j!                         z  }	t#        |      dk(  rd n|}
t%        |j&                  |	t)        |||	|
            S )Nrm   r   )r6   )indexsize_in_bytesstorage_data)tellr   r   r$   r   
isinstancer   BytesIOr   	getbufferra   r   r   saver   ro   r   r   r(   r   r2   )r   rv   r   r   r   r   r4   r   r6   r5   info_transform_descriptorss              r>   _write_itemr   '  s5    [[]F,6,L,LF-)\( -///$

+++4>>+,$---{{ell51111JJt\*:dBJJ7' 1 1 33
 )*a/5J  !"<	
	 	rH   create_stream
file_queueresult_queueplannerrw   	use_fsyncthread_countc	                 H   	 	 |j                         \  }	}
}t        j                  j                         }t	        t        |d       }|dk(  rMt        j
                  j                         s|r-|j                         r|dkD  rt        |j                  |      }nt        |j                        }|D cg c]"  }|j                  t        j                  k7  s!|$ }}|D ]  }|j                  t        |      |        |j                          |D cg c]"  }|j                  t        j                  k(  s!|$ }}g } | |	d      5 }|D ]2  }|j                  |      }|j!                  t#        |||||
|             4 i }|j%                         D ]K  \  }}|j&                  sJ |j!                  t#        |||||
|             |||j(                  j*                  <   M |rddlm} |j1                   ||             |r$	 t3        j4                  |j7                                |j?                          d d d        |jA                  |       Ic c}w c c}w # t8        t:        f$ r t3        j<                          Y Zw xY w# 1 sw Y   OxY w# tB        jD                  $ r Y y w xY w)Nr   r   )rw   wb)r   )#
get_nowaitra   _C_get_privateuse1_backend_namegetattrr   is_availableru   resolve_datarc   r   r$   r   rW   r   r[   rh   r   r]   is_cpur   fqnsafetensors.torchr   r   osfsyncfilenoAttributeErrorr   syncr   putqueueEmpty)r   r   r   r   r   rw   r   r   r   	file_namer   write_itemscustom_backend_namecustom_device_modloaderr   r   r   r   write_resultsrv   r   tensor_dictrs   r   s                            r>   _write_files_from_queuer  W  s   N2<2G2G2I/I{K #((("H"H"J '/BD I !JJ++-).?.L.L.N'!+.(((;
 *(( &1UrBGG}?T?T4TUHU& ?


:j1:>?  "$/Tb277m>S>S3SrTGTMy$/ '6") J"//
;D!((#&" &'(	 !*0--/ ?&FJ!==(=!((#&""&'(	 9?K
 0 0 4 45?  6LLk!23"1 O'P ]+W 6 V
 UP +,@A "	"K' 'R ;; ss   B/J 1"II8J "I3I7J B9I?>#I!I?1%J #I<9I?;I<<I??JJ J! J!c                   f   e Zd Zeedeeej                  f   dede	e
j                  ddf   fd              Zedeeej                  f   dedeeej                  f   fd       Zedeeej                  f   deeej                  f   ddfd	       Zedeeej                  f   deeej                  f   fd
       Zedeeej                  f   ddfd       Zeedeeej                  f   defd              Zedeeej                  f   defd       Zedeeej                  f   ddfd       Zy)r.   pathmoderL   Nc                      y r8   rG   )r;   r  r  s      r>   r   zFileSystemBase.create_stream  s     ,/rH   suffixc                      y r8   rG   r;   r  r  s      r>   concat_pathzFileSystemBase.concat_path  s     #&rH   new_pathc                      y r8   rG   r;   r  r  s      r>   renamezFileSystemBase.rename  s     rH   c                      y r8   rG   r;   r  s     r>   	init_pathzFileSystemBase.init_path  s    SVrH   c                      y r8   rG   r  s     r>   mkdirzFileSystemBase.mkdir  s    <?rH   checkpoint_idc                      y r8   rG   clsr  s     r>   validate_checkpoint_idz%FileSystemBase.validate_checkpoint_id  s    UXrH   c                      y r8   rG   r  s     r>   existszFileSystemBase.exists  s    =@rH   c                      y r8   rG   r  s     r>   rm_filezFileSystemBase.rm_file  s    >ArH   )r@   rA   rB   r	   r   r   rD   r   PathLiker   r   r   r   r  r  r  r  classmethodr   r!  r#  r%  rG   rH   r>   r.   r.     s   /#r{{*+/36/	299dD(	)/  / &#r{{*+&58&	sBKK	 & & #r{{*+7<S"++=M7N	  VeC$45V%R[[@P:QV V?%R[[ 01?d? ?X5bkk9I3JXtX  X@5bkk!12@t@ @AE#r{{"23AA ArH   r.   c            
          e Zd Zedeeej                  f   dedee	j                  ddf   fd       Zdeeej                  f   dedeeej                  f   fdZdeeej                  f   deeej                  f   fdZdeeej                  f   d	eeej                  f   ddfd
Zdeeej                  f   ddfdZedeeej                  f   defd       Zdeeej                  f   defdZdeeej                  f   ddfdZy)r-   r  r  rL   Nc              #      K   t        |t              st        |      }|j                  |      5 }t        t        j
                  |       d d d        y # 1 sw Y   y xY wwr8   )r   r   openr   r   r   )r;   r  r  rv   s       r>   r   zFileSystem.create_stream  sM      $%:DYYt_ 	*ryy&))	* 	* 	*s   -A!A	A!AA!r  c                 B    t        |t              st        |      }||z  S r8   r   r   r  s      r>   r  zFileSystem.concat_path  s!     $%:Df}rH   c                 <    t        |t              st        |      }|S r8   r,  r  s     r>   r  zFileSystem.init_path  s    $%:DrH   r  c                 x    t        |t              st        |      }|j                  t        t        |             y r8   )r   r   r  r   r  s      r>   r  zFileSystem.rename  s*     $%:DDx()rH   c                 `    t        |t              st        |      }|j                  dd       y )NT)parentsexist_ok)r   r   r  r  s     r>   r  zFileSystem.mkdir  s%    $%:D

4$
/rH   r  c                     t        |t              rydt        |      v ryt        |      j                  D ]B  }|j	                         st        j                  t        |      t
        j                        sB y y)NTz://F)r   r   rD   r0  r#  r   accessW_OK)r   r  ps      r>   r!  z!FileSystem.validate_checkpoint_id  s_    mT*C&&m$,, 	AxxzbiiA8	 rH   c                 X    t        |t              st        |      }|j                         S r8   )r   r   r#  r  s     r>   r#  zFileSystem.exists  s!    $%:D{{}rH   c                 Z    t        |t              st        |      }|j                          y r8   )r   r   unlinkr  s     r>   r%  zFileSystem.rm_file  s    $%:DrH   )r@   rA   rB   r	   r   rD   r   r&  r   r   r   r   r  r  r  r  r'  r   r!  r#  r%  rG   rH   r>   r-   r-     s~   *#r{{*+*36*	299dD(	)* *#r{{*+58	sBKK	 eC$45 %R[[@P:Q 
*#r{{*+*7<S"++=M7N*	*0%R[[ 01 0d 0
 5bkk9I3J t  5bkk!12 t 
E#r{{"23  rH   r-   c                        e Zd ZdZ	 	 	 	 	 	 d"deeej                  f   dedede	de	ded	e
ee      d
ededdf fdZd#deeej                  df   ddfdZdeddfdZdedefdZdee   dee   fdZdededeee      fdZ	 d$dedej4                  dedeee      fdZdedeee      ddfdZde
e   fdZe deeej                  f   fd       Z!e deeej                  f   fd        Z"e#deeej                  f   defd!       Z$ xZ%S )%_FileSystemWritera  
    Basic implementation of StorageWriter using file IO.

    This implementation makes the following assumptions and simplifications:

    * The checkpoint path is an empty or non-existing directory.
    * File creation is atomic

    The checkpoint consist of one file per write request plus
    a `.metadata` file with the serialized metadata.

    Nr  single_file_per_rank
sync_filesr   per_thread_copy_ahead	overwrite_extensionsargskwargsrL   c                    t         
|           t               | _        | j                  j	                  |      | _        || _        || _        || _        || _	        t               | _        || _        t        |      | _        y)a=  
        Initialize the writer pointing to `path`.

        Args:
            path: directory where the checkpoint will be written to.
            single_file_per_rank: Produce one file per rank instead of one file per tensor/blob. Default to True.
            sync_files : force files to be synced to permanent storage. Default to True.
            thread_count: Number of IO threads to use to write. Default to 1.
            per_thread_copy_ahead: How many bytes to copy from the GPU ahead of saving then. Default 10Mb.
            overwrite: Whether to allow overwriting existing checkpoints. Defaults to True.
            _extensions: Extensions to apply to output streams (EXPERIMENTAL)

        N. B. If sync_files is disabled, there's no guarantee that the checkpoint will be consistent in the case of a failure.
        N)superrf   r-   fsr  r  r<  r=  r   r>  rP   save_idr?  r   r   )r;   r  r<  r=  r   r>  r?  r@  rA  rB  	__class__s             r>   rf   z_FileSystemWriter.__init__  sk    4 	,GG%%d+	$8!$(%:"%'"2;?rH   r  c                 f    |r | j                   j                  |      | _        t               | _        y r8   )rE  r  r  rP   rF  r;   r  s     r>   resetz_FileSystemWriter.resetD  s%    ))-8DI%'rH   is_coordinatorc                      y r8   rG   )r;   rK  s     r>   set_up_storage_writerz'_FileSystemWriter.set_up_storage_writerI  rj   rH   planc                 H   | j                   j                  | j                         | j                   j                  | j                        rW| j
                  r2t        j                  d| j                   d| j
                  d       |S t        d| j
                  d      |S )Nz#Detected an existing checkpoint in z#, overwriting since self.overwrite=z. Past version 2.5 of PyTorch, `overwrite` will default to False. Set this variable to True to maintain this functionality or False to raise when an existing checkpoint is found.z-Checkpoint already exists and self.overwrite=.)	rE  r  r  r#  metadata_pathr?  warningswarnr   r;   rN  s     r>   prepare_local_planz$_FileSystemWriter.prepare_local_planL  s    dii 77>>$,,-~~9$:L:L9MMqbfbpbpar sk k  #%SDNNCTTU#VWWrH   plansc                     t        |      D cg c])  \  }}t        j                  |t        d| d            + }}}|S c c}}w )N__rr   r   )r   dataclassesreplacerJ   )r;   rV  r   rN  	new_planss        r>   prepare_global_planz%_FileSystemWriter.prepare_global_planZ  sQ     %U+
4 >Bqc)3LM
	 
 	
s   .Ar   c                   	
 |j                   
d		
fd}t        j                         }| j                  rgt	        | j
                  |j                        D ]C  } |       }| j                  j                  | j                  |      }|j                  |||f       E nS|j                  D ]D  } |       }| j                  j                  | j                  |      }|j                  |||gf       F | j                  ||      S )Nr   c                  >    j                     t         } dz  | S r   )rK   DEFAULT_SUFFIX)r  
file_countstorage_plans    r>   gen_filez._FileSystemWriter.write_data.<locals>.gen_filei  s,    '../
|N;KLI!OJrH   )r   r  Queuer<  r   r   r:   rE  r  r  r  _write_data)r;   rN  r   rc  r   bucketr  r  r   ra  rb  s            @@r>   
write_dataz_FileSystemWriter.write_dataa  s    
 (,'8'8
	 #(++-
$$1$2C2CTZZP :$J	ww**499i@i89:
 

 :$J	ww**499i@i$89:
 44rH   r   r   c                    t        j                         }g }t        d| j                        D ]  }t	        j
                  t        | j                  j                  |||| j                  | j                  | j                  | j                  |f	      }|j                          |j                  |        t        | j                  j                  |||| j                  | j                  | j                  | j                  |	       |D ]  }|j                           g }	 	 ||j                         z  }# t         j                   $ r  t#               }	|	j%                  |       |	cY S w xY w)Nr   )targetrA  )	r   r   r   r   r   rw   r   r   r   )r  rd  r   r   	threadingThreadr  rE  r   r   r>  r=  startrh   joinr   r  r*   
set_result)
r;   r   r   r   r   threadsrr   tresfuts
             r>   re  z_FileSystemWriter._write_data}  sG    %*KKMq$++, 	A  .GG)) OO..OO%% 
A GGINN1!	$ 	 ''//!% $ : :oo**%
	
  	AFFH	 	|..00 {{ 	-3XCNN3J	s   D2 20E%$E%metadataresultsc                 V   i }|D ]6  }|j                  |D ci c]  }|j                  |j                   c}       8 ||_        | j                         |_        t	        t
        | j                  j                  | j                  t         d            }| j                  j                  |d      5 }t        j                  ||       | j                  r$	 t        j                  |j!                                d d d        | j                  j)                  | j*                        r%| j                  j-                  | j*                         | j                  j/                  || j*                         y c c}w # t"        t$        f$ r t        j&                          Y w xY w# 1 sw Y   xY w)Nz.tmpr   )updater   r   storage_metar   r   rE  r  r  r0   r   pickledumpr=  r   r   r   r   r   r   r#  rQ  r%  r  )r;   rs  rt  
storage_mdwr_listwrtmp_pathmetadata_files           r>   finishz_FileSystemWriter.finish  sE   
 	MG7KRrxx8KL	M * $ 1 1 3dgg11$))~T=RSTWW""8T2 	mKK-0HH]1134		 77>>$,,-GGOOD../x!3!34% L '(<= GGI	 	s/   E1
1#F#E66#FFFFF(c                 D    t        | j                  | j                        S )N)r  rF  )r   r  rF  rZ   s    r>   rw  z_FileSystemWriter.storage_meta  s    ););T\\RRrH   c                 r    t        t        | j                  j                  | j                  t
                    S r8   )r   r   rE  r  r  r0   rZ   s    r>   rQ  z_FileSystemWriter.metadata_path  s$    D$''--diiFGGrH   c                     | j                   S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r  rZ   s    r>   r  z_FileSystemWriter.checkpoint_id      
 yyrH   c                 ,    t         j                  |      S r8   r-   r!  r  s     r>   r!  z(_FileSystemWriter.validate_checkpoint_id      00??rH   )TTr   逖 TNr8   F)&r@   rA   rB   rC   r   rD   r   r&  r   rF   r   r   r   r   rf   rJ  rM  r!   rU  r   r]  r"   r*   r(   rg  r  rd  re  r   r  r   rw  r   rQ  r  r'  r!  __classcell__rG  s   @r>   r:  r:    s7     &*%/DH#@C$%#@ ##@ 	#@
 #@  ##@ #@ h'?@A#@ #@ #@ 
#@J(5bkk4)?#@ (D (
D T x H h DN 55 5 
[!	"	5@ #	11 KK1 	1
 
[!	"1f5x 5$tK7H2I 5d 5.Sh{3 S HuS"++%56 H H uS"++%56   @5bkk9I3J @t @ @rH   r:  c            	       R    e Zd ZdZd
dee   ddfdZdedee	   de
e   de
e   fd	Zy)_StorageReaderTransformsr   Nextension_registryrL   c                 6    |t               | _        y || _        y r8   )r   r  )r;   r  s     r>   rf   z!_StorageReaderTransforms.__init__  s!    #5#= 	CU 	rH   	read_itemr6   r   c                     | j                   j                  |      }|}|D ]$  }t        |t              s|j	                  |      }& |S r8   )r  from_descriptor_listr   r   transform_from)r;   r  r6   r   r   r  r   s          r>   transform_load_streamz._StorageReaderTransforms.transform_load_stream  sT     ,,AABWX
# 	CB"67!#!2!2>!B	C rH   r8   )r@   rA   rB   rC   r   r   rf   r    r   rD   r   r   r  rG   rH   r>   r  r    sX    
84E+F 
RV 

  (} uI	
 
ErH   r  c                   n    e Zd Z	 ddeeej                  f   dee   ddf fdZ	de
dee   fdZddeeej                  df   ddfd	Zd
ededed   fdZdefdZdededdfdZd
edefdZdee   dee   fdZedeeej                  f   fd       Zedeeej                  f   defd       Z xZS )r,   Nr  _extension_registryrL   c                     t         |           t               | _        | j                  j	                  |      | _        i | _        t               | _        t        |      | _
        y r8   )rD  rf   r-   rE  r  r  r   rP   load_idr  r   )r;   r  r  rG  s      r>   rf   zFileSystemReader.__init__  sN    
 	,GG%%d+	,.%'23FGrH   sinfoc                 n    t        t        t           t        ||j                  |j
                              S r8   )r   r   r   r)   r4   r5   )r;   filer  s      r>   _slice_filezFileSystemReader._slice_file  s%    BuI0u||U\\RSSrH   r  c                 t    i | _         |r | j                  j                  |      | _        t	               | _        y r8   )r   rE  r  r  rP   r  rI  s     r>   rJ  zFileSystemReader.reset  s-    ))-8DI%'rH   rN  r   c                    i }|j                   D ]H  }| j                  |j                     }|j                  }|j	                  |g       j                  |       J |j                         D ]>  \  }}| j                  j                  | j                  |      }	| j                  j                  |	d      5 }
|D ]  }| j                  |j                     }| j                  |
|      }| j                  j                  ||j                  xs d|      }|j                  t        j                   k(  rHt#        j$                  |j'                  d            }|j)                  d       |j+                  ||       |j-                         r|}n5t#        j$                  |j'                  d            }|j)                  d       t/        t0        t3        j4                  |dd            }t7        ||j8                  |j:                        }|j=                  |      j?                         }|jA                         |jA                         k(  s6J d|j                   d	|jA                          d
|jA                                 |jC                  |       |jE                  ||        	 d d d        A tG               }|jI                  d        |S # 1 sw Y   ixY w)NrbrG   r   rm   T)map_locationweights_onlyzreq z mismatch sizes z vs )%r:   r   storage_indexr3   
setdefaultrh   rE  r  r  r   r  r   r  r6   r   r   r   r   r   readseek
load_bytesseekabler   r   ra   loadr   storage_offsetslengthsresolve_tensorrl   rS   copy_commit_tensorr*   rn  )r;   rN  r   per_filer  item_mdr  r3   reqsr  rv   req
file_slicer  
read_bytesr  rs   target_tensorrr  s                      r>   	read_datazFileSystemReader.read_data
  s   .0 	<I$($5$5i6M6M$NG((Db)00;	<
 $,>>#3 -	BM4ww**499mDH&&x6 +B& )BC"//0A0ABG!%!1!1&'!BJ%)__%J%J  55;"&N xx<#7#77%'ZZ0C0CB0G%H
"***3
;)224'5H (*zz.2E2Eb2I'JH$MM!,!%"!JJ (-2-1" "8"C$7$7" )0(>(>s(C(J(J(L,113v{{}D "3#4#4"55EmFXFXFZE[[_`f`k`k`m_noD &++F3--c=AS)B+B +B-	B^ ht
_+B +Bs   3G-K		K	c                 L   | j                   j                  | j                  d      }| j                   j                  |d      5 }t	        j
                  |      }d d d        t        dd       t               |_        | j                  |j                  _	        |S # 1 sw Y   BxY w)Nr/   r  rw  )
rE  r  r  r   rx  r  r   r   rw  r  )r;   r  r~  rs  s       r>   read_metadatazFileSystemReader.read_metadataF  s    ww""499k:WW""4. 	2-{{=1H	2 8^T2:$/MH!(,%	2 	2s   BB#rs  rK  c                 B    |j                   | _         | j                   J y r8   rY  )r;   rs  rK  s      r>   set_up_storage_readerz&FileSystemReader.set_up_storage_readerQ  s"    $11  ,,,rH   c                     |S r8   rG   rT  s     r>   rU  z#FileSystemReader.prepare_local_planU  s    rH   rV  c                     |S r8   rG   )r;   rV  s     r>   r]  z$FileSystemReader.prepare_global_planX  s    rH   c                     | j                   S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        r  rZ   s    r>   r  zFileSystemReader.checkpoint_id[  r  rH   c                 ,    t         j                  |      S r8   r  r  s     r>   r!  z'FileSystemReader.validate_checkpoint_idb  r  rH   r8   )r@   rA   rB   r   rD   r   r&  r   r   rf   r2   r   r   r  rJ  r   r   r*   r  r   r  r   r  rU  r   r]  r   r  r'  r!  r  r  s   @r>   r,   r,     sP    <@
HC$%
H &&78
H 
	
HT| T5	 T(5bkk4)?#@ (D (9h 9 9 9x	x 	-h - -QU -x H h DN  uS"++%56   @5bkk9I3J @t @ @rH   r,   c                        e Zd ZdZ	 	 	 	 	 	 	 ddeeej                  f   dedede	de	ded	ed
e
ee      ddfdZdedef fdZ xZS )r+   r;  Nr  r<  r=  r   r>  cache_staged_state_dictr?  r@  rL   c	           
      l    t         j                  | |||||||       t        j                  | |       y)a  
        Initialize the writer pointing to `path`.

        Args:
            path: directory where the checkpoint will be written to.
            single_file_per_rank: Produce one file per rank instead of one file per tensor/blob. Default to True.
            sync_files : force files to be synced to permanent storage. Default to True.
            thread_count: Number of IO threads to use to write. Default to 1.
            per_thread_copy_ahead: How many bytes to copy from the GPU ahead of saving then. Default 10Mb.
            cache_staged_state_dict: Whether to cache the staged state_dict. This option decreases staging latency
                at the cost of increases memory usage. Additionally, if this parameter is set to True, it's the expectation
                that the stager is maintained and re-used for multiple dcp.async_save calls. Default to False.
            overwrite: Whether to allow overwriting existing checkpoints. Defaults to True.
            _extensions: Extensions to apply to output streams (EXPERIMENTAL)

        N. B. If sync_files is disabled, there's no guarantee that the checkpoint will be consistent in the case of a failure.
        )r  r<  r=  r   r>  r?  r@  )r  N)r:  rf   r%   )	r;   r  r<  r=  r   r>  r  r?  r@  s	            r>   rf   zFileSystemWriter.__init__u  sE    8 	""!5!%"7# 	# 		
 	$$$;	
rH   
state_dictc                 0    d| _         t        | 	  |      S )zOverride of AsyncStager.stager   )r>  rD  stage)r;   r  rG  s     r>   r  zFileSystemWriter.stage  s     &'"w}Z((rH   )TTr   r  FTN)r@   rA   rB   rC   r   rD   r   r&  r   rF   r   r   r   rf   r   r  r  r  s   @r>   r+   r+   g  s      &*%/(-DH)
C$%)
 #)
 	)

 )
  #)
 "&)
 )
 h'?@A)
 
)
V) )O ) )rH   r+   r  )^rz   rZ  r   r   r   rx  r  rj  rN   rR  abcr   r   collections.abcr   r   r   r   
contextlibr	   r
   r   pathlibr   typingr   r   r   r   r   r   typing_extensionsr   ra   r   torch._utilsr   r   torch.distributed._shard._utilsr   'torch.distributed.checkpoint._extensionr   r   %torch.distributed.checkpoint.metadatar   r   r   $torch.distributed.checkpoint.plannerr   r   r   r    r!   r"   r#   r$   $torch.distributed.checkpoint.stagingr%   $torch.distributed.checkpoint.storager&   r'   r(   "torch.distributed.checkpoint.utilsr)   torch.futuresr*   __all__r0   rD   rE   r2   rJ   r`  rP   rR   rc   ru   r   rF   r   r   r   r   r   r   r   rd  r  r.   r-   r:  r  r,   r+   rG   rH   r>   <module>r     s     	  	      # C C % ! #  ; ; %   G B Y X	 	 	 E 
 A   Sc  	I 	I 	I     C } .W"M W"t0Y 0Yf4Y 43 4# d9o $tIBW < -(-II- 

ELL(
)- 	-
 - - -`YYY ++Y 	Y
 )Y Y Y Y Y 
YxBS BD9 9xF@ F@R 4p@} p@f>)(*= >)rH   