
    i                         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
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 d d	lmZ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/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZEmFZFmGZG d dlHmIZI d dlJmKZK g dZLdZMeNeOd<   dZPeeN   eOd<   e G d d             ZQe G d d             ZR G d d e      ZSd!ZTd"eNfd#ZU G d$ d%e      ZV G d& d'eV      ZW G d( d)eV      ZX G d* d+      ZYd,e@d"eZfd-Z[d.eZd/e\e@   d"e\e\e@      fd0Z]d1eYd2ej                  d3e"ej                  e%jL                  f   d4e@d5eNd6eSd"eGfd7Z`d8ed9ej                  d:ej                  d;e?d1eYd<eZd=ebd>eZd6eSd"dfd?Zc G d@ dAe      Zd G dB dCed      Ze G dD dEeF      Zf G dF dG      Zg G dH dIeE      Zh G dJ dKefeC      Ziy)L    N)ABCabstractmethod)	GeneratorIterableIteratorSequence)contextmanager)	dataclass)Enum)UnsupportedOperation)Path)AnyCallablecastFinalIOOptionalUnion)Buffer)Tensor)_get_available_device_type_get_device_module)narrow_tensor_by_index)ExtensionRegistryStreamTransformExtension)CUSTOM_METADATA_KEYDCP_VERSION_KEY
FORMAT_KEYFORMAT_VALUEHF_DCP_VERSION)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SerializationFormatz	.metadata_metadata_fnz1.0.0CURRENT_DCP_VERSIONc                   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      a/var/www/html/engine/venv/lib/python3.12/site-packages/torch/distributed/checkpoint/filesystem.py__getstate__z_StorageInfo.__getstate__S   s/    !%!4!4!6HA!-1HHHs   
22)__name__
__module____qualname____doc__str__annotations__intr>   r   r   rG        rF   r:   r:   J   s/    -KK598HSM29IrP   r:   c                       e Zd ZU eed<   y)_StoragePrefixprefixN)rH   rI   rJ   rL   rM   rO   rP   rF   rR   rR   W   s    KrP   rR   c                       e Zd ZdZdZy)r6   
torch_savesafetensorsN)rH   rI   rJ   
TORCH_SAVESAFETENSORSrO   rP   rF   r6   r6   \   s    JKrP   r6   z.distcpreturnc                  <    t        t        j                               S r@   )rL   uuiduuid4rO   rP   rF   _generate_uuidr]   d   s    tzz|rP   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objrY   Nc                      y r@   rO   rC   r`   ra   s      rF   addz_TensorLoader.addi       rP   c                      y r@   rO   rC   s    rF   start_loadingz_TensorLoader.start_loadingm   re   rP   c                      y r@   rO   rg   s    rF   valuesz_TensorLoader.valuesq   re   rP   rY   N)rH   rI   rJ   r   rN   objectrd   rh   r   tupletorchr   rj   rO   rP   rF   r_   r_   h   sk     & T     u||V';!<=  rP   r_   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_funrY   Nc                      || _         g | _        y r@   )rq   rB   )rC   rq   s     rF   __init__z_SerialCpuLoader.__init__w   s    &/1
rP   r`   ra   c                 >    | j                   j                  ||f       y r@   )rB   appendrc   s      rF   rd   z_SerialCpuLoader.add{   s    

4+&rP   c                      y r@   rO   rg   s    rF   rh   z_SerialCpuLoader.start_loading~   s    rP   c              #     K   | j                   D ]y  \  }}| j                  |      j                         }|j                         }|j	                         j                         |j                         k7  r|j                         }||f { y wr@   )rB   rq   detachcpustorager`   numelclonerC   _ra   tensors       rF   rj   z_SerialCpuLoader.values   sz     jj 	FAs%%c*113FZZ\F~~$$&&,,.8 	s   B
Brk   )rH   rI   rJ   r   rs   rN   rl   rd   rh   r   rm   rn   r   rj   rO   rP   rF   rp   rp   v   sS    2H 2 2' '& 'T '	u||V';!<= 	rP   rp   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)_OverlappingCpuLoaderNrq   streaminflight_threshholdrY   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)rq   rB   r   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   rn   cudaStreamcurrent_streamr   wait_stream)rC   rq   r   r   s       rF   rs   z_OverlappingCpuLoader.__init__   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 >rP   c                 F    | j                   t        | j                        k\  S r@   )r   lenrB   rg   s    rF   _donez_OverlappingCpuLoader._done   s    xx3tzz?**rP   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   )	r   r   r   synchronizer   popleftr{   element_sizeru   )rC   drainedvals      rF   _drainz_OverlappingCpuLoader._drain   s    $":"::KK##%!!T%=%==$$,,.C3q6<<>CF4G4G4I#IINN3 !!T%=%== rP   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   ry   T)devicenon_blocking)r   r   r   r   r   rB   r   rq   rx   r   typer   torn   untyped_storager`   r{   itemsizer|   r   ru   r   r}   s       rF   _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   r   r   rg   s    rF   _finishz_OverlappingCpuLoader._finish   s=    zzzt!!"Q&KK##%!!!rP   r`   ra   c                 l    | j                   rt        d      | j                  j                  ||f       y )Nz&cannot add items after loading started)r   RuntimeErrorrB   ru   rc   s      rF   rd   z_OverlappingCpuLoader.add   s+    <<GHH

4+&rP   c                     | j                   ry d| _         | j                  j                  t        j                  d             | j                          y )NTr   key)r   rB   sortoperator
itemgetterr   rg   s    rF   rh   z#_OverlappingCpuLoader.start_loading   s9    <<

H//23rP   c              #      K   | j                          | j                  s7| j                         }| j                          |E d {    | j                  s7| j	                         E d {    y 7 *7 wr@   )rh   r   r   r   r   )rC   r   s     rF   rj   z_OverlappingCpuLoader.values   sY     **kkmGLLN **
 <<>!! !s*   AA3A/A3A3)A1*A31A3)Ni@B rk   )rH   rI   rJ   r   r   rn   r   rN   rs   propertyboolr   listrm   r   rl   r   r   r   r   rd   rh   r   rj   rO   rP   rF   r   r      s     *.#,	II &I !	I
 
I. +t + +U5<<#789 N0"%f(<"=> "' '& 'T '
"u||V';!<= "rP   r   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
extensionsrY   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.
        NrO   )r   )rC   r   s     rF   rs   z!_StorageWriterTransforms.__init__   s     !+ 2"
rP   
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 r@   )r   )rC   r   s     rF   rs   zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__  s	    rP   rY   c                      yNTrO   rg   s    rF   	writeablezO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable  s    rP   bc                 8    | j                   j                  |      S r@   )r   write)rC   r   s     rF   r   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write
  s    xx~~a((rP   c                 X    | j                          | j                  j                          y r@   )flushr   rg   s    rF   closezK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close  s    

 rP   N)rH   rI   rJ   ioIOBasers   r   r   r   rN   r   r   rO   rP   rF   NoCloseWriterr     s6    BII 4 )v )# )!rP   r   )	r   r   r   r   bytesr   transform_toreversedget_descriptor)rC   r   r   r   r   exs         rF   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r@   )rH   rI   rJ   rK   r   r   r   rs   r*   r   r   rm   r   r   r   rL   r   rO   rP   rF   r   r      sh     JN	C"8,D#EF	C		CY#Y13Y	r%y$s)#	$YrP   r   itemc                     d}| j                   J | j                   j                  D ]  }||z  }	 | j                   j                  j                  }|t        j
                  j                  |      z  S Nr   )tensor_datar`   
propertiesdtypern   _utils_element_size)r   r`   sr   s       rF   
_item_sizer     sp    D'''"" 	 ''--E%,,,,U333rP   binsrB   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   	enumerateru   minr   r   )
r   rB   wibytes_wtensor_wr~   bucketsbucket_sizesir   s
             rF   _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
transformsr   datar   storage_keyserialization_formatc           
      "   |j                         }| j                  ||      \  }}|j                  t        j                  k(  r<t        |t        j                        sJ |j                  |j                                nit        |t        j                        sJ |j                  t        j                  d      k(  sJ |t        j                  k(  rt        j                  ||       |j!                          |t        j                  k(  st        |t        j                        r|j                         |z
  }	n!|j#                         |j%                         z  }	t'        |      dk(  rd n|}
t)        |j*                  |	t-        |||	|
            S )Nry   r   )r>   )indexsize_in_bytesstorage_data)tellr   r   r+   r   
isinstancer   BytesIOr   	getbufferrn   r   r   r6   rW   saver   r{   r   r   r/   r   r:   )r   r   r   r   r   r   r<   r   r>   r=   info_transform_descriptorss              rF   _write_itemr   =  sS    [[]F,6,L,LF-)\( -///$

+++4>>+,$---{{ell51111#6#A#AAJJt\*2===bjjB ' 1 1 33
 )*a/5J  !"<	
	 	rP   create_stream
file_queueresult_queueplannerr   	use_fsyncthread_countc	                 P   	 	 |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 }i }|j%                         D ]  \  }}|j&                  sJ |j!                  t#        |||||
|             |||j(                  j*                  <   d|j,                  j.                  j0                  i||j(                  j*                  <    |t2        j4                  k(  rUddlm} |j;                   ||t<        t?        j@                  |      tB        tE        tF              tH        tJ        i             |r$	 tM        jN                  |jQ                                |jY                          d d d        |j[                  |       c c}w c c}w # tR        tT        f$ r tM        jV                          Y Zw xY w# 1 sw Y   OxY w# t\        j^                  $ r Y y w xY w)Nr   r   )r   wbsaved_offsets)r   )metadata)0
get_nowaitrn   _C_get_privateuse1_backend_namegetattrr   is_availabler   resolve_datarp   r   r+   r   rd   r   rh   ru   r   rj   is_cpur   fqnr   chunkoffsetsr6   rX   safetensors.torchr   r   r   jsondumpsr   rL   r    r   r   osfsyncfilenoAttributeErrorr   syncr   putqueueEmpty)r   r   r   r   r   r   r   r   r   	file_namer   write_itemscustom_backend_namecustom_device_modloaderr   r   r   r   write_resultsr   r   tensor_dictmetadata_dictr   r   s                             rF   _write_files_from_queuer  o  s   [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$/ 46") J"//
;D!((#&" &'0	 ! "*0--/ &FJ!==(=!((#&""&'0	 9?K
 0 0 4 45')?)?)E)E)M)M;M*"2"2"6"67" (+>+J+JJ6LL' 3TZZ5N /^1D *L&	 "1 i4j ]+q 6 V
 Uj +,@A "	"e4 4l ;; ss   B/L 1"KK8L "K3K7L D=L#K%L5%L #L =L?L  LLL L%$L%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)r5   pathmoderY   Nc                      y r@   rO   )rC   r!  r"  s      rF   r   zFileSystemBase.create_stream  s     ,/rP   suffixc                      y r@   rO   rC   r!  r$  s      rF   concat_pathzFileSystemBase.concat_path  s     #&rP   new_pathc                      y r@   rO   rC   r!  r(  s      rF   renamezFileSystemBase.rename  s     rP   c                      y r@   rO   rC   r!  s     rF   	init_pathzFileSystemBase.init_path  s    SVrP   c                      y r@   rO   r-  s     rF   mkdirzFileSystemBase.mkdir  s    <?rP   checkpoint_idc                      y r@   rO   clsr1  s     rF   validate_checkpoint_idz%FileSystemBase.validate_checkpoint_id  s    UXrP   c                      y r@   rO   r-  s     rF   existszFileSystemBase.exists  s    =@rP   c                      y r@   rO   r-  s     rF   rm_filezFileSystemBase.rm_file  s    >ArP   )rH   rI   rJ   r	   r   r   rL   r  PathLiker   r   r   r   r'  r+  r.  r0  classmethodr   r5  r7  r9  rO   rP   rF   r5   r5     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 ArP   r5   c            
       J   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deeej                  f   dee   fdZy)r4   r!  r"  rY   Nc              #      K   t        |t              st        |      }|j                  |      5 }t        t        j
                  |       d d d        y # 1 sw Y   y xY wwr@   )r   r   openr   r   r   )rC   r!  r"  r   s       rF   r   zFileSystem.create_stream  sM      $%:DYYt_ 	*ryy&))	* 	* 	*s   -A!A	A!AA!r$  c                 B    t        |t              st        |      }||z  S r@   r   r   r&  s      rF   r'  zFileSystem.concat_path  s!     $%:Df}rP   c                 <    t        |t              st        |      }|S r@   r@  r-  s     rF   r.  zFileSystem.init_path  s    $%:DrP   r(  c                 x    t        |t              st        |      }|j                  t        t        |             y r@   )r   r   r+  r   r*  s      rF   r+  zFileSystem.rename  s*     $%:DDx()rP   c                 `    t        |t              st        |      }|j                  dd       y )NT)parentsexist_ok)r   r   r0  r-  s     rF   r0  zFileSystem.mkdir  s%    $%:D

4$
/rP   r1  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   rL   rD  r7  r  accessW_OK)r4  r1  ps      rF   r5  z!FileSystem.validate_checkpoint_id  s_    mT*C&&m$,, 	AxxzbiiA8	 rP   c                 X    t        |t              st        |      }|j                         S r@   )r   r   r7  r-  s     rF   r7  zFileSystem.exists+  s!    $%:D{{}rP   c                 Z    t        |t              st        |      }|j                          y r@   )r   r   unlinkr-  s     rF   r9  zFileSystem.rm_file0  s    $%:DrP   c                     t        |t              st        |      }|j                         D cg c]  }t        |       c}S c c}w r@   )r   r   iterdirrL   )rC   r!  rI  s      rF   lszFileSystem.ls5  s3    $%:D $/1A///s   A)rH   rI   rJ   r	   r   rL   r  r:  r   r   r   r   r'  r.  r+  r0  r;  r   r5  r7  r9  r   rO  rO   rP   rF   r4   r4     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  
0uS"++-. 049 0rP   r4   c                   >    e Zd ZdZddddddej
                  f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eddf fdZd'deeej                  df   ddfdZde
dededdfdZde
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edej:                  deee      fdZded eee      ddfd!Z dee!   fd"Z"d'd#ee   dej                  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 )(_FileSystemWriteraa  
    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.

    Tr   逖 Nr!  single_file_per_rank
sync_filesr   per_thread_copy_ahead	overwrite_extensionsr   argskwargsrY   c	                 .   t         |           t               | _        | j                  j	                  |      | _        || _        || _        || _        || _	        t               | _        || _        t        |      | _        || _        d| _        d| _        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.
        NT)superrs   r4   fsr.  r!  rS  rT  r   rU  r]   save_idrV  r   r   r   rankuse_collectives)rC   r!  rS  rT  r   rU  rV  rW  r   rX  rY  	__class__s              rF   rs   z_FileSystemWriter.__init__I  s    6 	,GG%%d+	$8!$(%:"%'"2;?$8!#'	%)rP   r1  c                 f    |r | j                   j                  |      | _        t               | _        y r@   )r\  r.  r!  r]   r]  rC   r1  s     rF   resetz_FileSystemWriter.resetr  s%    ))-8DI%'rP   is_coordinatorc                 `    |j                  dd       | _        |j                  dd      | _        y Nr^  r_  T)getr^  r_  )rC   rd  rX  rY  s       rF   set_up_storage_writerz'_FileSystemWriter.set_up_storage_writerw  s*     JJvt,	%zz*;TBrP   c                     | j                   r| j                  d       }n| j                  d      }| j                  j                  |      S )N)r^  r   )r_  _get_metadata_pathr\  r7  )rC   metadata_paths     rF   _metadata_existsz"_FileSystemWriter._metadata_exists}  sF     333>M !333;Mww~~m,,rP   planc                    | j                   j                  | j                         | j                         rV| j                  r1t        j                  d| j                   d| j                  d       nt        d| j                  d      | j                  :| j                  s.t        j                  |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=.__r~   r   )r\  r0  r!  rl  rV  warningswarnr   r^  r_  dataclassesreplacerR   rC   rm  s     rF   prepare_local_planz$_FileSystemWriter.prepare_local_plan  s    dii   "~~9$))DhY]YgYgXi jk k #%SDNNCTTU#VWW99 )=)=&&>Btyyk2C#DD rP   plansc                     t        |      D cg c]7  \  }}|j                  $t        j                  |t	        d| d            n|9 }}}|S c c}}w )Nrp  r~   rq  )r   r   rt  ru  rR   )rC   rx  r   rm  	new_planss        rF   prepare_global_planz%_FileSystemWriter.prepare_global_plan  si    
 %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   )rS   DEFAULT_SUFFIX)r  
file_countstorage_plans    rF   gen_filez._FileSystemWriter.write_data.<locals>.gen_file  s,    '../
|N;KLI!OJrP   )r   r  QueuerS  r   r   rB   r\  r'  r!  r  _write_data)rC   rm  r   r  r   bucketr  r!  r   r  r  s            @@rF   
write_dataz_FileSystemWriter.write_data  s    
 (,'8'8
	 #(++-
$$1$2C2CTZZP :$J	ww**499i@i89:
 

 :$J	ww**499i@i$89:
 44rP   r   c                    t        j                         }g }t        d| j                        D ]  }t	        j
                  t        | j                  j                  |||| j                  | j                  | j                  | j                  | j                  f	      }|j                          |j                  |        t        | j                  j                  |||| j                  | j                  | j                  | j                  | j                  	       |D ]  }|j                           g }	 	 ||j!                         z  }# t         j"                  $ r  t%               }|j'                  |       |cY S w xY w)Nr   )targetrX  )	r   r   r   r   r   r   r   r   r   )r  r  r   r   	threadingThreadr  r\  r   r   rU  rT  r   startru   joinr  r  r1   
set_result)	rC   r   r   r   threadsr~   tresfuts	            rF   r  z_FileSystemWriter._write_data  sS   
 %*KKMq$++, 	A  .GG)) OO..OO%%--
A GGINN1!	$ 	 ''//!% $ : :oo**!%!:!:
	
  	AFFH	 	|..00 {{ 	-3XCNN3J	s   1E 0E98E9r  resultsc                 8   t        j                  |t              }i }|D ]6  }|j                  |D ci c]  }|j                  |j
                   c}       8 ||_        | j                         |_        | j                  s"| j                  d| j                   t         dnt         d}t        t        | j                  j                  | j                  |            }| j                  j                  |d      5 }t!        j"                  ||       | j$                  r$	 t'        j(                  |j+                                d d d        | j                  s(| j                  | j3                  | j                        }	n| j3                         }	| j                  j5                  |	      r| j                  j7                  |	       | j                  j9                  ||	       y c c}w # t,        t.        f$ r t'        j0                          Y w xY w# 1 sw Y   xY w)N)versionrp  z.tmpr   )rt  ru  r8   updater   r   storage_metar_  r^  r7   r   r   r\  r'  r!  r   pickledumprT  r  r  r  r  r   r  rj  r7  r9  r+  )
rC   r  r  
storage_mdwr_listwrtmp_filenametmp_pathmetadata_filerk  s
             rF   finishz_FileSystemWriter.finish  s   &&x9LM
 	MG7KRrxx8KL	M * $ 1 1 3 ''DII,A L>. >& 	
 dgg11$))\JKWW""8T2 	mKK-0HH]1134		 ##		(= 33DII>M 335M77>>-(GGOOM*x/7 L '(<= GGI	 	s/   G"
<#H #G''#H
HHHHc                 D    t        | j                  | j                        S )N)r1  r]  )r#   r1  r]  rg   s    rF   r  z_FileSystemWriter.storage_meta  s    ););T\\RRrP   r^  c                     |t          n
d| t          }t        t        | j                  j	                  | j
                  |            S Nrp  r7   r   r   r\  r'  r!  rC   r^  filenames      rF   rj  z$_FileSystemWriter._get_metadata_path  <    (,l^Btf\N:SD$''--diiBCCrP   c                     | j                   S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r!  rg   s    rF   r1  z_FileSystemWriter.checkpoint_id      
 yyrP   c                 ,    t         j                  |      S r@   r4   r5  r3  s     rF   r5  z(_FileSystemWriter.validate_checkpoint_id"      00??rP   r@   ))rH   rI   rJ   rK   r6   rW   r   rL   r  r:  r   rN   r   r   r   r   rs   rc  rh  rl  r(   rw  r   r{  r)   r1   r/   r  r  r  r  r!   r  r#   r  rj  r   r1  r;  r5  __classcell__r`  s   @rF   rQ  rQ  ;  sE     &*%/DH4G4R4R'*C$%'* #'* 	'*
 '*  #'* '* h'?@A'* 2'* '* '* 
'*R(5bkk4)?#@ (D (
C"C+.C:=C	C	-$ 	-x H &h DN 55 5 
[!	"	5800 KK0 
[!	"	0d 0x  0$tK7H2I  0d  0DSh{3 SDx} D D uS"++%56   @5bkk9I3J @t @ @rP   rQ  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_registryrY   c                 6    |t               | _        y || _        y r@   )r   r  )rC   r  s     rF   rs   z!_StorageReaderTransforms.__init__.  s!    #5#= 	CU 	rP   	read_itemr>   r   c                     | j                   j                  |      }|}|D ]$  }t        |t              s|j	                  |      }& |S r@   )r  from_descriptor_listr   r   transform_from)rC   r  r>   r   r   r  r   s          rF   transform_load_streamz._StorageReaderTransforms.transform_load_stream3  sT     ,,AABWX
# 	CB"67!#!2!2>!B	C rP   r@   )rH   rI   rJ   rK   r   r   rs   r'   r   rL   r   r   r  rO   rP   rF   r  r  '  sX    
84E+F 
RV 

  (} uI	
 
ErP   r  c            
           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dee   dej                  fdZdededefdZdede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 )r3   Nr!  _extension_registryrY   c                     t         |           t               | _        | j                  j	                  |      | _        i | _        t               | _        t        |      | _
        d | _        d| _        y r   )r[  rs   r4   r\  r.  r!  r   r]   load_idr  r   r^  r_  )rC   r!  r  r`  s      rF   rs   zFileSystemReader.__init__B  s]    
 	,GG%%d+	,.%'23FG	#rP   sinfoc                 n    t        t        t           t        ||j                  |j
                              S r@   )r   r   r   r0   r<   r=   )rC   filer  s      rF   _slice_filezFileSystemReader._slice_fileP  s%    BuI0u||U\\RSSrP   r1  c                 t    i | _         |r | j                  j                  |      | _        t	               | _        y r@   )r   r\  r.  r!  r]   r  rb  s     rF   rc  zFileSystemReader.resetS  s-    ))-8DI%'rP   rm  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rbrO   r   ry   T)map_locationweights_onlyzreq z mismatch sizes z vs )%rB   r   storage_indexr;   
setdefaultru   r\  r'  r!  r   r  r   r  r>   r   r$   r   r   r   readseek
load_bytesseekabler   r   rn   loadr   storage_offsetslengthsresolve_tensorrx   r`   copy_commit_tensorr1   r  )rC   rm  r   per_filer  item_mdr!  r;   reqsr(  r   req
file_slicer  
read_bytesr  r   target_tensorr  s                      rF   	read_datazFileSystemReader.read_dataY  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	r^  c                     |t          n
d| t          }t        t        | j                  j	                  | j
                  |            S r  r  r  s      rF   rj  z#FileSystemReader._get_metadata_path  r  rP   rX  rY  c                 F   |j                  dd       }| j                  |      }| 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  r  )
rg  rj  r\  r   r  r  r  r#   r  r  )rC   rX  rY  r^  r!  r  r  s          rF   read_metadatazFileSystemReader.read_metadata  s    zz&$'&&t,WW""4. 	2-{{=1H	2 8^T2:$/MH!(,%	2 	2s    BB r  rd  c                     |j                   | _         |j                  dd       | _        |j                  dd      | _        | j                   J y rf  )r   rg  r^  r_  )rC   r  rd  rX  rY  s        rF   set_up_storage_readerz&FileSystemReader.set_up_storage_reader  sJ     %11JJvt,	%zz*;TB  ,,,rP   c                     |S r@   rO   rv  s     rF   rw  z#FileSystemReader.prepare_local_plan  s    rP   rx  c                     |S r@   rO   )rC   rx  s     rF   r{  z$FileSystemReader.prepare_global_plan  s    rP   c                     | j                   S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        r  rg   s    rF   r1  zFileSystemReader.checkpoint_id  r  rP   c                 ,    t         j                  |      S r@   r  r3  s     rF   r5  z'FileSystemReader.validate_checkpoint_id  r  rP   r@   )"rH   rI   rJ   r   rL   r  r:  r   r   rs   r:   r   r   r  rc  r%   r&   r1   r  rN   rj  r   r!   r  r   r  rw  r   r{  r   r1  r;  r5  r  r  s   @rF   r3   r3   A  s    <@$C$%$ &&78$ 
	$T| T5	 T(5bkk4)?#@ (D (9h 9 9 9vDx} D D

3 
# 
( 
- -26-?B-NQ-	-x H h DN  uS"++%56   @5bkk9I3J @t @ @rP   r3   c                        e Zd ZdZdddddddej
                  fdeeej                  f   de
d	e
d
edede
de
deee      deddfdZdedef fdZ xZS )r2   a  
    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 global `.metadata` file with the serialized metadata if rank coordination is enabled.
    a rank local `__{rank}.metadata` file with the serialized metadata if rank coordination is NOT enabled.

    Tr   rR  FNr!  rS  rT  r   rU  cache_staged_state_dictrV  rW  r   rY   c
                 n    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 reused 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!  rS  rT  r   rU  rV  rW  r   )r  N)rQ  rs   r,   )
rC   r!  rS  rT  r   rU  r  rV  rW  r   s
             rF   rs   zFileSystemWriter.__init__  sH    : 	""!5!%"7#!5 	# 
	
 	$$$;	
rP   
state_dictc                 0    d| _         t        | 	  |      S )zOverride of AsyncStager.stager   )rU  r[  stage)rC   r  r`  s     rF   r  zFileSystemWriter.stage  s     &'"w}Z((rP   )rH   rI   rJ   rK   r6   rW   r   rL   r  r:  r   rN   r   r   r   rs   r"   r  r  r  s   @rF   r2   r2     s    " &*%/(-DH4G4R4R+
C$%+
 #+
 	+

 +
  #+
 "&+
 +
 h'?@A+
 2+
 
+
Z) )O ) )rP   r2   )jr   rt  r   r  r   r  r  r  r  r[   rr  abcr   r   collections.abcr   r   r   r   
contextlibr	   r
   enumr   r   pathlibr   typingr   r   r   r   r   r   r   typing_extensionsr   rn   r   torch._utilsr   r   torch.distributed._shard._utilsr   'torch.distributed.checkpoint._extensionr   r   &torch.distributed.checkpoint._hf_utilsr   r   r   r   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.utilsr0   torch.futuresr1   __all__r7   rL   rM   r8   r:   rR   r6   r~  r]   r_   rp   r   r   rN   r   r   r   r   r   r   r  r   r  r5   r4   rQ  r  r3   r2   rO   rP   rF   <module>r     s     	   	      # C C % !  #  B B B %   G B  Y X	 	 	 E 
 A    c ") U3Z ) 	I 	I 	I    $  
  C } .W"M W"t0Y 0Yf4Y 43 4# d9o $tIBW 0/(/II/ 

ELL(
)/ 	/
 / ./ /dfff ++f 	f
 )f f f f .f 
fRBS BD>0 >0Bi@ i@X 4{@} {@|A)(*= A)rP   