
    9j                        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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  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/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZDmEZE d dlFmGZG d dlHmIZI g dZJdZKeLeMd<   dZNeeL   eMd<   e G d d             ZOe G d d             ZP G d d e      ZQd!ZRd"eLfd#ZS G d$ d%e      ZT G d& d'eT      ZU G d( d)eT      ZV G d* d+      ZWd,e>d"eXfd-ZYd.eXd/eZe>   d"eZeZe>      fd0Z[d1eWd2ej                  d3ej                  e#jH                  z  d4e>d5eLd6eQd"eEfd7Z^d8ed9ej                  d:ej                  d;e=d1eWd<eXd=e`d>eXd6eQd"dfd?Za G d@ dAe      Zb G dB dCeb      Zc G dD dEeD      Zd G dF dG      Ze G dH dIeC      Zf G dJ dKedeA      Zgy)L    N)ABCabstractmethod)Callable	GeneratorIterableIteratorSequence)contextmanager)	dataclass)Enum)UnsupportedOperation)Path)AnycastFinalIO)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   dz  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      g/media/conek/DATA/Code/OCR/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	   rE        rD   r8   r8   J   s/    -KK268C=4/6IrN   r8   c                       e Zd ZU eed<   y)_StoragePrefixprefixN)rF   rG   rH   rJ   rK   rM   rN   rD   rP   rP   W   s    KrN   rP   c                       e Zd ZdZdZy)r4   
torch_savesafetensorsN)rF   rG   rH   
TORCH_SAVESAFETENSORSrM   rN   rD   r4   r4   \   s    JKrN   r4   z.distcpreturnc                  <    t        t        j                               S r>   )rJ   uuiduuid4rM   rN   rD   _generate_uuidr[   d   s    tzz|rN   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objrW   Nc                      y r>   rM   rA   r^   r_   s      rD   addz_TensorLoader.addi       rN   c                      y r>   rM   rA   s    rD   start_loadingz_TensorLoader.start_loadingm   rc   rN   c                      y r>   rM   re   s    rD   valuesz_TensorLoader.valuesq   rc   rN   rW   N)rF   rG   rH   r   rL   objectrb   rf   r   tupletorchr   rh   rM   rN   rD   r]   r]   h   sk     & T     u||V';!<=  rN   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_funrW   Nc                      || _         g | _        y r>   )ro   r@   )rA   ro   s     rD   __init__z_SerialCpuLoader.__init__w   s    &/1
rN   r^   r_   c                 >    | j                   j                  ||f       y r>   )r@   appendra   s      rD   rb   z_SerialCpuLoader.add{   s    

4+&rN   c                      y r>   rM   re   s    rD   rf   z_SerialCpuLoader.start_loading~   s    rN   c              #     K   | j                   D ]u  \  }}| j                  |      j                         }|j                         }|j	                         j                         |j                  k7  r|j                         }||f w y wr>   )r@   ro   detachcpuuntyped_storager^   nbytesclonerA   _r_   tensors       rD   rh   z_SerialCpuLoader.values   sz     jj 		FAs%%c*113FZZ\F%%',,.&--? 		s   BBri   )rF   rG   rH   r   rq   rL   rj   rb   rf   r   rk   rl   r   rh   rM   rN   rD   rn   rn   v   sS    2H 2 2' '& 'T '
u||V';!<= 
rN   rn   c            	          e Zd Z	 	 ddedej
                  dz  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)_OverlappingCpuLoaderNro   streaminflight_threshholdrW   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)ro   r@   r   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   rl   cudaStreamcurrent_streamr   wait_stream)rA   ro   r   r   s       rD   rq   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 >rN   c                 F    | j                   t        | j                        k\  S r>   )r   lenr@   re   s    rD   _donez_OverlappingCpuLoader._done   s    xx3tzz?**rN   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   popleftnumelelement_sizers   )rA   drainedvals      rD   _drainz_OverlappingCpuLoader._drain   s    $":"::KK##%!!T%=%==$$,,.C3q6<<>CF4G4G4I#IINN3 !!T%=%== rN   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   rw   T)devicenon_blocking)r   r   r   r   r   r@   r   ro   rv   r   typer   torl   rx   r^   r   itemsizerz   r   rs   r   r{   s       rD   _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t        d      t        | j                        dkD  r| j                  j                          | j                  S )Nz._finish called before all items were processedr   )r   AssertionErrorr   r   r   r   re   s    rD   _finishz_OverlappingCpuLoader._finish   sD    zz !QRRt!!"Q&KK##%!!!rN   r^   r_   c                 l    | j                   rt        d      | j                  j                  ||f       y )Nz&cannot add items after loading started)r   RuntimeErrorr@   rs   ra   s      rD   rb   z_OverlappingCpuLoader.add   s+    <<GHH

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

H//23rN   c              #      K   | j                          | j                  s7| j                         }| j                          |E d {    | j                  s7| j	                         E d {    y 7 *7 wr>   )rf   r   r   r   r   )rA   r   s     rD   rh   z_OverlappingCpuLoader.values   sY     **kkmGLLN **
 <<>!! !s*   AA3A/A3A3)A1*A31A3)Ni@B ri   )rF   rG   rH   r   rl   r   rL   rq   propertyboolr   listrk   r   rj   r   r   r   r   rb   rf   r   rh   rM   rN   rD   r   r      s     '+#,	II t#I !	I
 
I. +t + +U5<<#789 N0"%f(<"=> "' '& 'T '
"u||V';!<= "rN   r   c            	       n    e Zd ZdZ	 d	dee   dz  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
extensionsrW   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.
        NrM   )r   )rA   r   s     rD   rq   z!_StorageWriterTransforms.__init__   s     !+ 2"
rN   
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   )rA   r   s     rD   rq   zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__  s	    rN   rW   c                      yNTrM   re   s    rD   	writeablezO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable	  s    rN   bc                 8    | j                   j                  |      S r>   )r   write)rA   r   s     rD   r   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write  s    xx~~a((rN   c                 X    | j                          | j                  j                          y r>   )flushr   re   s    rD   closezK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close  s    

 rN   N)rF   rG   rH   ioIOBaserq   r   r   r   rL   r   r   rM   rN   rD   NoCloseWriterr     s6    BII 4 )v )# )!rN   r   )	r   r   r   r   bytesr   transform_toreversedget_descriptor)rA   r   r   r   r   exs         rD   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>   )rF   rG   rH   rI   r	   r   rq   r(   r   r   rk   r   r   r   rJ   r   rM   rN   rD   r   r      sh     GK	C"#;<tC	C		CY#Y13Y	r%y$s)#	$YrN   r   itemc                     d}| j                   t        d      | j                   j                  D ]  }||z  }	 | j                   j                  j                  }|t
        j                  j                  |      z  S )Nr   z&WriteItem tensor_data must not be None)tensor_datar   r^   
propertiesdtyperl   _utils_element_size)r   r^   sr   s       rD   
_item_sizer     sv    DEFF"" 	 ''--E%,,,,U333rN   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   	enumeraters   minr   r   )
r   r@   wibytes_wtensor_wr|   bucketsbucket_sizesir   s
             rD   _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           
      X   |j                         }| j                  ||      \  }}|j                  t        j                  k(  rEt        |t        j                        st        d      |j                  |j                                n{t        |t        j                        st        d      |j                  t        j                  d      k7  rt        d      |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 )Nz/Data must be io.BytesIO for BYTE_IO write itemsz5Data must be torch.Tensor for non-BYTE_IO write itemsrw   zTensor must be on CPU devicer   )r<   )indexsize_in_bytesstorage_data)tellr   r   r)   r   
isinstancer   BytesIOr   r   	getbufferrl   r   r   r4   rU   saver   r   r   r   r-   r   r8   )r   r   r   r   r   r   r:   r   r<   r;   info_transform_descriptorss              rD   _write_itemr   @  sk    [[]F,6,L,LF-)\( -///$

+ !RSS4>>+,$- G  ;;%,,u-- !?@@#6#A#AAJJt\*2===bjjB ' 1 1 33
 )*a/5J  !"<	
	 	rN   create_stream
file_queueresult_queueplannerr   	use_fsyncthread_countc	                 b   	 	 |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t)        d      |j!                  t#        |||||
|             |||j*                  j,                  <   d|j.                  j0                  j2                  i||j*                  j,                  <    |t4        j6                  k(  rUddlm} |j=                   ||t>        tA        jB                  |      tD        tG        tH              tJ        tL        i             |r$	 tO        jP                  |jS                                |j[                          d d d        |j]                  |       c c}w c c}w # tT        tV        f$ r tO        jX                          Y Zw xY w# 1 sw Y   OxY w# t^        j`                  $ r Y y w xY w)	Nr   r   )r   wbzTensor must be on CPUsaved_offsets)r   )metadata)1
get_nowaitrl   _C_get_privateuse1_backend_namegetattrr   is_availabler   resolve_datarn   r   r)   r   rb   r   rf   rs   r   rh   is_cpur   r   fqnr   chunkoffsetsr4   rV   safetensors.torchr   r   r   jsondumpsr   rJ   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                             rD   _write_files_from_queuer  w  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$/ 56") J"//
;D!((#&" &'0	 ! "*0--/ &FJ!==,-DEE!((#&""&'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 k5l ]+s 6 V
 Ul +,@A "	"g5 5n ;; ss   B/L 1"KK8L "K3K7L EL#K#.L>%L ##L	LL		LLL L.-L.c                   :   e Zd Zeedeej                  z  dedee	j                  ddf   fd              Zedeej                  z  dedeej                  z  fd       Zedeej                  z  deej                  z  ddfd	       Zedeej                  z  deej                  z  fd
       Zedeej                  z  ddfd       Zeedeej                  z  defd              Zedeej                  z  defd       Zedeej                  z  ddfd       Zy)r3   pathmoderW   Nc                      y r>   rM   )rA   r  r  s      rD   r   zFileSystemBase.create_stream  s     ,/rN   suffixc                      y r>   rM   rA   r  r!  s      rD   concat_pathzFileSystemBase.concat_path  s      rN   new_pathc                      y r>   rM   rA   r  r%  s      rD   renamezFileSystemBase.rename  s    TWrN   c                      y r>   rM   rA   r  s     rD   	init_pathzFileSystemBase.init_path  s    GJrN   c                      y r>   rM   r*  s     rD   mkdirzFileSystemBase.mkdir  s    69rN   checkpoint_idc                      y r>   rM   clsr.  s     rD   validate_checkpoint_idz%FileSystemBase.validate_checkpoint_id  s    ORrN   c                      y r>   rM   r*  s     rD   existszFileSystemBase.exists  s    7:rN   c                      y r>   rM   r*  s     rD   rm_filezFileSystemBase.rm_file  s    8;rN   )rF   rG   rH   r
   r   rJ   r  PathLiker   r   r   r   r$  r(  r+  r-  classmethodr   r2  r4  r6  rM   rN   rD   r3   r3     sr   /"++%/-0/	299dD(	)/  /  "++% /2 	r{{	    W3,Wbkk8IWdW WJcBKK/JC"++4EJ J9#+99 9R33DRR  R:3,:: :;C"++-;$; ;rN   r3   c            
          e Zd Zedeej                  z  dedeej                  ddf   fd       Z
deej                  z  dedeej                  z  fdZdeej                  z  deej                  z  fdZdeej                  z  d	eej                  z  ddfd
Zdeej                  z  ddfdZedeej                  z  defd       Zdeej                  z  defdZdeej                  z  ddfdZdeej                  z  dee   fdZy)r2   r  r  rW   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   )rA   r  r  r   s       rD   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      rD   r$  zFileSystem.concat_path  s    $%:Df}rN   c                 <    t        |t              st        |      }|S r>   r=  r*  s     rD   r+  zFileSystem.init_path  s    $%:DrN   r%  c                 x    t        |t              st        |      }|j                  t        t        |             y r>   )r   r   r(  r   r'  s      rD   r(  zFileSystem.rename  s(    $%:DDx()rN   c                 `    t        |t              st        |      }|j                  dd       y )NT)parentsexist_ok)r   r   r-  r*  s     rD   r-  zFileSystem.mkdir  s%    $%:D

4$
/rN   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   rJ   rA  r4  r  accessW_OK)r1  r.  ps      rD   r2  z!FileSystem.validate_checkpoint_id   s_    mT*C&&m$,, 	AxxzbiiA8	 rN   c                 X    t        |t              st        |      }|j                         S r>   )r   r   r4  r*  s     rD   r4  zFileSystem.exists.  s!    $%:D{{}rN   c                 Z    t        |t              st        |      }|j                          y r>   )r   r   unlinkr*  s     rD   r6  zFileSystem.rm_file3  s    $%:DrN   c                     t        |t              st        |      }|j                         D cg c]  }t        |       c}S c c}w r>   )r   r   iterdirrJ   )rA   r  rF  s      rD   lszFileSystem.ls8  s3    $%:D $/1A///s   A)rF   rG   rH   r
   rJ   r  r7  r   r   r   r   r$  r+  r(  r-  r8  r   r2  r4  r6  r   rL  rM   rN   rD   r2   r2     sa   *"++%*-0*	299dD(	)* *bkk 1 3 3CT 
cBKK/ C"++4E 
*3, *bkk8I *d *0#+ 0 0
 33D   3,  
C"++- $ 
0sR[[( 0T#Y 0rN   r2   c                   2    e Zd ZdZddddddej
                  fdeej                  z  de	de	d	e
d
e
de	dee   dz  dedededdf fdZd'deej                  z  dz  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j6                  deee      fdZded eee      ddfd!Zdedz  fd"Z d'd#e
dz  dej                  fd$Z!e"deej                  z  fd%       Z#e$deej                  z  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kwargsrW   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)superrq   r2   fsr+  r  rP  rQ  r   rR  r[   save_idrS  r   r   r   rankuse_collectives)rA   r  rP  rQ  r   rR  rS  rT  r   rU  rV  	__class__s              rD   rq   z_FileSystemWriter.__init__L  s    6 	,GG%%d+	$8!$(%:"%'"2;?$8! $	%)rN   r.  c                 f    |r | j                   j                  |      | _        t               | _        y r>   )rY  r+  r  r[   rZ  rA   r.  s     rD   resetz_FileSystemWriter.resetu  s%    ))-8DI%'rN   is_coordinatorc                 ^    |j                  d      | _        |j                  dd      | _        y )Nr[  r\  T)getr[  r\  )rA   ra  rU  rV  s       rD   set_up_storage_writerz'_FileSystemWriter.set_up_storage_writerz  s(     JJv&	%zz*;TBrN   c                     | j                   r| j                  d       }n| j                  d      }| j                  j                  |      S )N)r[  r   )r\  _get_metadata_pathrY  r4  )rA   metadata_paths     rD   _metadata_existsz"_FileSystemWriter._metadata_exists  sF     333>M !333;Mww~~m,,rN   planc                    | j                   j                  | j                         | j                         rX| j                  r3t        j                  d| j                   d| j                  d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.   )
stacklevelz-Checkpoint already exists and self.overwrite=.__r|   r   )rY  r-  r  rh  rS  warningswarnr   r[  r\  dataclassesreplacerP   rA   ri  s     rD   prepare_local_planz$_FileSystemWriter.prepare_local_plan  s    dii   "~~9$))DhY]YgYgXi jk k  !	 #%SDNNCTTU#VWW99 )=)=&&>Btyyk2C#DD rN   plansc                     t        |      D cg c]7  \  }}|j                  $t        j                  |t	        d| d            n|9 }}}|S c c}}w )Nrn  r|   ro  )r   r   rr  rs  rP   )rA   rv  r   ri  	new_planss        rD   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 )Nr   )rQ   DEFAULT_SUFFIX)r  
file_countstorage_plans    rD   gen_filez._FileSystemWriter.write_data.<locals>.gen_file  s,    '../
|N;KLI!OJrN   )r   r  QueuerP  r   r   r@   rY  r$  r  r  _write_data)rA   ri  r   r  r   bucketr  r  r   r}  r~  s            @@rD   
write_dataz_FileSystemWriter.write_data  s    
 (,'8'8
	 #(++-
$$1$2C2CTZZP :$J	ww**499i@i89:
 

 :$J	ww**499i@i$89:
 44rN   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   )targetrU  )	r   r   r   r   r   r   r   r   r   )r  r  r   r   	threadingThreadr  rY  r   r   rR  rQ  r   startrs   joinr   r  r/   
set_result)	rA   r   r   r   threadsr|   tresfuts	            rD   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                    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                  | j1                  | j                        }	n| j1                         }	| j                  j3                  |	      r| j                  j5                  |	       | j                  j7                  ||	       y c c}w # t*        t,        f$ r t%        j.                          Y w xY w# 1 sw Y   xY w)Nrn  z.tmpr   )r6   versionupdater   r   storage_metar\  r[  r5   r   r   rY  r$  r  r   pickledumprQ  r  r  r  r  r   r  rf  r4  r6  r(  )
rA   r   r  
storage_mdwr_listwrtmp_filenametmp_pathmetadata_filerg  s
             rD   finishz_FileSystemWriter.finish  s   .
 	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#G=:H <G==H  H	c                 D    t        | j                  | j                        S )N)r.  rZ  )r!   r.  rZ  re   s    rD   r  z_FileSystemWriter.storage_meta  s    ););T\\RRrN   r[  c                     |t          n
d| t          }t        t        | j                  j	                  | j
                  |            S Nrn  r5   r   r   rY  r$  r  rA   r[  filenames      rD   rf  z$_FileSystemWriter._get_metadata_path  <    (,l^Btf\N:SD$''--diiBCCrN   c                     | j                   S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r  re   s    rD   r.  z_FileSystemWriter.checkpoint_id      
 yyrN   c                 ,    t         j                  |      S r>   r2   r2  r0  s     rD   r2  z(_FileSystemWriter.validate_checkpoint_id&      00??rN   r>   )'rF   rG   rH   rI   r4   rU   rJ   r  r7  r   rL   r	   r   r   rq   r`  rd  rh  r&   ru  r   ry  r'   r/   r-   r  r  r  r  r   r  r!   r  rf  r   r.  r8  r2  __classcell__r]  s   @rD   rN  rN  >  s4     &*%/AE4G4R4R'*BKK'* #'* 	'*
 '*  #'* '* 67$>'* 2'* '* '* 
'*R(3#4t#; (t (
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kD0 SDsTz DR[[ D sR[[0   @33D @ @ @rN   rN  c            	       R    e Zd ZdZd
dedz  ddfdZdedee   de	e
   de	e
   fd	Zy)_StorageReaderTransformsr   Nextension_registryrW   c                 6    |t               | _        y || _        y r>   )r   r  )rA   r  s     rD   rq   z!_StorageReaderTransforms.__init__2  s!    #5#= 	CU 	rN   	read_itemr<   r   c                     | j                   j                  |      }|}|D ]$  }t        |t              s|j	                  |      }& |S r>   )r  from_descriptor_listr   r   transform_from)rA   r  r<   r   r   r  r   s          rD   transform_load_streamz._StorageReaderTransforms.transform_load_stream7  sT     ,,AABWX
# 	CB"67!#!2!2>!B	C rN   r>   )rF   rG   rH   rI   r   rq   r%   r	   rJ   r   r   r  rM   rN   rD   r  r  +  sW    
+<t+C 
t 

  (} uI	
 
ErN   r  c            
           e Zd Z	 ddeej
                  z  dedz  ddf fdZdede	e
   fdZddeej
                  z  dz  ddfd	Zd
ededed   fdZddedz  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j
                  z  fd       Zedeej
                  z  defd       Z xZS )r1   Nr  _extension_registryrW   c                     t         |           t               | _        | j                  j	                  |      | _        i | _        t               | _        t        |      | _
        d | _        d| _        y r   )rX  rq   r2   rY  r+  r  r   r[   load_idr  r   r[  r\  )rA   r  r  r]  s      rD   rq   zFileSystemReader.__init__F  s]    
 	,GG%%d+	,.%'23FG	#rN   sinfoc                 n    t        t        t           t        ||j                  |j
                              S r>   )r   r   r   r.   r:   r;   )rA   filer  s      rD   _slice_filezFileSystemReader._slice_fileT  s%    BuI0u||U\\RSSrN   r.  c                 t    i | _         |r | j                  j                  |      | _        t	               | _        y r>   )r   rY  r+  r  r[   r  r_  s     rD   r`  zFileSystemReader.resetW  s-    ))-8DI%'rN   ri  r   c                    i }|j                   D ]H  }| j                  |j                     }|j                  }|j	                  |g       j                  |       J |j                         D ]B  \  }}| 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                         k7  r:tC        d|j                   d	|jA                          d
|jA                                |jE                  |       |jG                  ||        	 d d d        E tI               }|jK                  d        |S # 1 sw Y   mxY w)NrbrM   r   rw   T)map_locationweights_onlyzreq z mismatch sizes z vs )&r@   r   storage_indexr9   
setdefaultrs   rY  r$  r  r   r  r   r  r<   r   r"   r   r   r   readseek
load_bytesseekabler   r   rl   loadr   storage_offsetslengthsresolve_tensorrv   r^   r   copy_commit_tensorr/   r  )rA   ri  r   per_filer  item_mdr  r9   reqsr%  r   req
file_slicer  
read_bytesr  r}   target_tensorr  s                      rD   	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(--/6;;=@"0"&s'8'8&99I-J\J\J^I__cdjdododqcr s#  &++F3--c=AU*B,B ,B.	B` ht
a,B ,Bs   3G1KK	r[  c                     |t          n
d| t          }t        t        | j                  j	                  | j
                  |            S r  r  r  s      rD   rf  z#FileSystemReader._get_metadata_path  r  rN   rU  rV  c                 D   |j                  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  )
rc  rf  rY  r   r  r  r  r!   r  r  )rA   rU  rV  r[  r  r  r   s          rD   read_metadatazFileSystemReader.read_metadata  s    zz&!&&t,WW""4. 	2-{{=1H	2 8^T2:$/MH!(,%	2 	2s   BBr   ra  c                     |j                   | _         |j                  d      | _        |j                  dd      | _        | j                   t	        d      y )Nr[  r\  Tz)storage_data must not be None in metadata)r   rc  r[  r\  r   )rA   r   ra  rU  rV  s        rD   set_up_storage_readerz&FileSystemReader.set_up_storage_reader  sS     %11JJv&	%zz*;TB$ !LMM %rN   c                     |S r>   rM   rt  s     rD   ru  z#FileSystemReader.prepare_local_plan  s    rN   rv  c                     |S r>   rM   )rA   rv  s     rD   ry  z$FileSystemReader.prepare_global_plan  s    rN   c                     | j                   S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        r  re   s    rD   r.  zFileSystemReader.checkpoint_id  r  rN   c                 ,    t         j                  |      S r>   r  r0  s     rD   r2  z'FileSystemReader.validate_checkpoint_id  r  rN   r>   ) rF   rG   rH   rJ   r  r7  r   rq   r8   r   r   r  r`  r#   r$   r/   r  rL   rf  r   r   r  r   r  ru  r   ry  r   r.  r8  r2  r  r  s   @rD   r1   r1   E  s}    9=$BKK$ /5$ 
	$T| T5	 T(3#4t#; (t (:h : : :xDsTz DR[[ D

3 
# 
( 
N N26N?BNNQN	Nx H h DN  sR[[0   @33D @ @ @rN   r1   c                        e Zd ZdZdddddddej
                  fdeej                  z  de	d	e	d
e
de
de	de	dee   dz  deddfdZdedef fdZ xZS )r0   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   rO  FNr  rP  rQ  r   rR  cache_staged_state_dictrS  rT  r   rW   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  rP  rQ  r   rR  rS  rT  r   )r  N)rN  rq   r*   )
rA   r  rP  rQ  r   rR  r  rS  rT  r   s
             rD   rq   zFileSystemWriter.__init__  sH    : 	""!5!%"7#!5 	# 
	
 	$$$;	
rN   
state_dictc                 0    d| _         t        | 	  |      S )zOverride of AsyncStager.stager   )rR  rX  stage)rA   r  r]  s     rD   r  zFileSystemWriter.stage  s     &'"w}Z((rN   )rF   rG   rH   rI   r4   rU   rJ   r  r7  r   rL   r	   r   rq   r    r  r  r  s   @rD   r0   r0     s    " &*%/(-AE4G4R4R+
BKK+
 #+
 	+

 +
  #+
 "&+
 +
 67$>+
 2+
 
+
Z) )O ) )rN   r0   )hr   rr  r   r
  r   r  r  r  r  rY   rp  abcr   r   collections.abcr   r   r   r   r	   
contextlibr
   r   enumr   r   pathlibr   typingr   r   r   r   typing_extensionsr   rl   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.utilsr.   torch.futuresr/   __all__r5   rJ   rK   r6   r8   rP   r4   r|  r[   r]   rn   r   r   rL   r   r   r   r   r   r   r  r   r  r3   r2   rN  r  r1   r0   rM   rN   rD   <module>r     s     	   	      # M M % !  #  ' ' %   G B  Y X	 	 	 E 
 A    c ") U3Z ) 	I 	I 	I    $  
  C } 0X"M X"v0Y 0Yf	4Y 	43 	4# d9o $tIBW 04(4II4 **u||
#4 	4
 4 .4 4nggg ++g 	g
 )g g g g .g 
gT<S <@:0 :0zj@ j@Z 4}@} }@@A)(*= A)rN   