
    ȅi                        % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKJrJr  S SKJrJrJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJ r   S S
K!J"r"  S SK#r#S SK#J$r$  S SK%J&r&J'r'  S SK(J)r)  S SK*J+r+J,r,  S SK-J.r.J/r/J0r0J1r1J2r2  S SK3J4r4J5r5J6r6  S SK7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?  S SK@JArA  S SKBJCrCJDrDJErE  S SKFJGrG  S SKHJIrI  / SQrJSrK\L\MS'   SrN\\L   \MS'   \ " S S5      5       rO\ " S S5      5       rP " S S \5      rQS!rRS"\L4S# jrS " S$ S%\5      rT " S& S'\T5      rU " S( S)\T5      rV " S* S+5      rWS,\>S"\X4S- jrYS.\XS/\Z\>   S"\Z\Z\>      4S0 jr[S1\WS2\R                  S3\R                  \#RH                  -  S4\>S5\LS6\QS"\E4S7 jr^S8\S9\R                  S:\R                  S;\=S1\WS<\XS=\`S>\XS6\QS"S4S? jra " S@ SA\5      rb " SB SC\b5      rc " SD SE\D5      rd " SF SG5      re " SH SI\C5      rf " SJ SK\d\A5      rgg)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                   X    \ rS rSr% Sr\\S'   \\S'   \\S'   Sr\	\   S-  \S'   S r
S	rg)
_StorageInfoJ   z#This is the per entry storage info.relative_pathoffsetlengthNtransform_descriptorsc                 v    U R                   R                  5        VVs0 s H  u  pUc  M
  X_M     snn$ s  snnf N)__dict__items)selfkvs      a/home/james-whalen/.local/lib/python3.13/site-packages/torch/distributed/checkpoint/filesystem.py__getstate___StorageInfo.__getstate__S   s1    !%!4!4!6H!6!!6HHHs   	55 )__name__
__module____qualname____firstlineno____doc__str__annotations__intr=   r	   rF   __static_attributes__rH       rE   r8   r8   J   s/    -KK268C=4/6IrR   r8   c                        \ rS rSr% \\S'   Srg)_StoragePrefixW   prefixrH   N)rI   rJ   rK   rL   rN   rO   rQ   rH   rR   rE   rT   rT   W   s    KrR   rT   c                       \ rS rSrSrSrSrg)r4   \   
torch_savesafetensorsrH   N)rI   rJ   rK   rL   
TORCH_SAVESAFETENSORSrQ   rH   rR   rE   r4   r4   \   s    JKrR   r4   z.distcpreturnc                  >    [        [        R                  " 5       5      $ r?   )rN   uuiduuid4rH   rR   rE   _generate_uuidra   d   s    tzz|rR   c                       \ rS rSr\S\S\SS4S j5       r\S
S j5       r\S\	\
\R                  \4      4S j5       rS	rg)_TensorLoaderh   sizeobjr]   Nc                     g r?   rH   rB   re   rf   s      rE   add_TensorLoader.addi       rR   c                     g r?   rH   rB   s    rE   start_loading_TensorLoader.start_loadingm   rk   rR   c                     g r?   rH   rm   s    rE   values_TensorLoader.valuesq   rk   rR   rH   r]   N)rI   rJ   rK   rL   r   rP   objectri   rn   r   tupletorchr   rq   rQ   rH   rR   rE   rc   rc   h   sk     & T     u||V';!<=  rR   rc   c                   x    \ rS rSrS\SS4S jrS\S\SS4S jrSS	 jr	S\
\\R                  \4      4S
 jrSrg)_SerialCpuLoaderv   resolve_funr]   Nc                     Xl         / U l        g r?   )rz   rA   )rB   rz   s     rE   __init___SerialCpuLoader.__init__w   s    &/1
rR   re   rf   c                 <    U R                   R                  X45        g r?   )rA   appendrh   s      rE   ri   _SerialCpuLoader.add{   s    

4+&rR   c                     g r?   rH   rm   s    rE   rn   _SerialCpuLoader.start_loading~   s    rR   c              #     #    U R                    Hv  u  pU R                  U5      R                  5       nUR                  5       nUR	                  5       R                  5       UR                  :w  a  UR                  5       nUU4v   Mx     g 7fr?   )rA   rz   detachcpuuntyped_storagere   nbytesclonerB   _rf   tensors       rE   rq   _SerialCpuLoader.values   sr     jjFA%%c*113FZZ\F%%',,.&--?  !s   BB
)rA   rz   rs   )rI   rJ   rK   rL   r   r|   rP   rt   ri   rn   r   ru   rv   r   rq   rQ   rH   rR   rE   rx   rx   v   sS    2H 2 2' '& 'T '
u||V';!<= 
rR   rx   c            	       (   \ rS rSr  SS\S\R                  S-  S\SS4S jjr\	S\
4S j5       rS\\\R                  \4      4S	 jrSS
 jrS\\\R                  \4      4S jrS\S\SS4S jrSS jrS\\\R                  \4      4S jrSrg)_OverlappingCpuLoader   Nrz   streaminflight_threshholdr]   c                 L   Xl         / U l        X0l        SU l        [        R
                  " 5       U l        SU l        SU l        U(       a  UR                  O	[        5       U l	        [        U R                  5      U l        [        [        R                  R                   U=(       d    U R                  R#                  5       5      U l        U R$                  U R                  R#                  5       :w  a4  U R$                  R'                  U R                  R#                  5       5        g g )Nr   F)rz   rA   r   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   rv   cudaStreamcurrent_streamr   wait_stream)rB   rz   r   r   s       rE   r|   _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 >rR   c                 F    U R                   [        U R                  5      :  $ r?   )r   lenrA   rm   s    rE   _done_OverlappingCpuLoader._done   s    xx3tzz?**rR   c                    / nU R                   U R                  :  a  U R                  R                  5         U R                   U R                  :  a  U R                  R                  5       nU =R                   US   R                  5       US   R                  5       -  -  sl         UR                  U5        U R                   U R                  :  a  M  U$ )Nr   )	r   r   r   synchronizer   popleftnumelelement_sizer   )rB   drainedvals      rE   _drain_OverlappingCpuLoader._drain   s    $":"::KK##%!!T%=%==$$,,.C3q6<<>CF4G4G4I#IINN3 !!T%=%== rR   c                    U R                   R                  U R                  5         U R                  (       Gd  U R                  U R                  :  Gat  U R
                  U R                     u  pU =R                  S-  sl        U R                  U5      R                  5       nUR                  R                  U R                  :X  a  UR                  SSS9nOqUR                  [        R                  " S5      :X  aM  UR                  5       R                  5       UR!                  5       UR"                  -  :w  a  UR%                  5       nU R&                  R)                  UU45        U =R                  UR!                  5       UR+                  5       -  -  sl        U R                  (       d  U R                  U R                  :  a  GMt  S S S 5        g ! , (       d  f       g = f)N   r   T)devicenon_blocking)r   r   r   r   r   rA   r   rz   r   r   typer   torv   r   re   r   itemsizer   r   r   r   r   s       rE   _refill_OverlappingCpuLoader._refill   sV   &&t{{3jjjT%8%84;S;S%SDHH-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 433s   FG
Gc                     U R                   (       d  [        S5      e[        U R                  5      S:  a  U R                  R                  5         U R                  $ )Nz._finish called before all items were processedr   )r   AssertionErrorr   r   r   r   rm   s    rE   _finish_OverlappingCpuLoader._finish   sD    zz !QRRt!!"Q&KK##%!!!rR   re   rf   c                 t    U R                   (       a  [        S5      eU R                  R                  X45        g )Nz&cannot add items after loading started)r   RuntimeErrorrA   r   rh   s      rE   ri   _OverlappingCpuLoader.add   s)    <<GHH

4+&rR   c                     U R                   (       a  g SU l         U R                  R                  [        R                  " S5      S9  U R                  5         g )NTr   key)r   rA   sortoperator
itemgetterr   rm   s    rE   rn   #_OverlappingCpuLoader.start_loading   s9    <<

H//23rR   c              #      #    U R                  5         U R                  (       d=  U R                  5       nU R                  5         U S h  vN   U R                  (       d  M=  U R	                  5        S h  vN   g  N0 N7fr?   )rn   r   r   r   r   )rB   r   s     rE   rq   _OverlappingCpuLoader.values   sY     **kkmGLLN ***
 <<>!! !s*   AA>	A:
A>!A>4A<5A><A>)
r   r   r   r   r   r   rA   rz   r   r   )Ni@B rs   )rI   rJ   rK   rL   r   rv   r   rP   r|   propertyboolr   listru   r   rt   r   r   r   r   ri   rn   r   rq   rQ   rH   rR   rE   r   r      s     '+#,	II t#I !	I
 
I. +t + +U5<<#789 N0"%f(<"=> "' '& 'T '
"u||V';!<= "rR   r   c            	       |    \ rS rSrSr SS\\   S-  SS4S jjrS\S\	R                  S\\\   \\   4   4S	 jrS
rg)_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
extensionsr]   c                 (    Uc  SU l         gUU l         g)z
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.
NrH   r   )rB   r   s     rE   r|   !_StorageWriterTransforms.__init__   s     !+ 2"
rR   
write_item
raw_streamc                 *    " S S[         R                  5      n[        [        [           U" U5      5      nU R
                   H  nUR                  U5      nM     U[        U R
                  5       Vs/ s H  oUR                  5       PM     sn4$ s  snf )Nc                   \    \ rS rSrS\R
                  4S jrS\4S jrS\	S\
4S jrS rS	rg
)E_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriteri  rawc                     Xl         g r?   r   )rB   r   s     rE   r|   N_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__  s    rR   r]   c                     gNTrH   rm   s    rE   	writeableO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable	  s    rR   bc                 8    U R                   R                  U5      $ r?   )r   write)rB   r   s     rE   r   K_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write  s    xx~~a((rR   c                 X    U R                  5         U R                  R                  5         g r?   )flushr   rm   s    rE   closeK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close  s    

 rR   r   N)rI   rJ   rK   rL   ioIOBaser|   r   r   r   rP   r   r   rQ   rH   rR   rE   NoCloseWriterr     s6    BII 4 )v )# )!rR   r   )	r   r   r   r   bytesr   transform_toreversedget_descriptor)rB   r   r   r   r   exs         rE   transform_save_stream._StorageWriterTransforms.transform_save_stream   sv    	!BII 	! BuI}Z'@A//B??<8L " Xdoo=VW=Vr002=VWXXWs   3Br   r?   )rI   rJ   rK   rL   rM   r	   r   r|   r(   r   r   ru   r   r   r   rN   r   rQ   rH   rR   rE   r   r      sh     GK	C"#;<tC	C		CY#Y13Y	r%y$s)#	$YrR   r   itemc                     SnU R                   c  [        S5      eU R                   R                   H  nX-  nM	     U R                   R                  R                  nU[
        R                  R                  U5      -  $ )Nr   z&WriteItem tensor_data must not be None)tensor_datar   re   
propertiesdtyperv   _utils_element_size)r   re   sr   s       rE   
_item_sizer     so    DEFF""	 # ''--E%,,,,U333rR   binsrA   c                    U S:X  a  U/$ U Vs/ s H$  o"R                   [        R                  :X  d  M"  UPM&     nnU Vs/ s H$  o"R                   [        R                  :w  d  M"  UPM&     nn[        U 5       Vs/ s H  n/ PM     nn[        U 5       Vs/ s H  nSPM     nnUR	                  [
        SS9  [        U5       H  u  pXhU -     R                  U5        M     U HU  n[        [        U5      [        R                  " S5      S9S   n	Xi   R                  U5        Xy==   [        U5      -  ss'   MW     U$ s  snf s  snf s  snf s  snf )Nr   r   T)r   reverser   )r   r)   BYTE_IOranger   r   	enumerater   minr   r   )
r   rA   wibytes_wtensor_wr   bucketsbucket_sizesir   s
             rE   _split_by_size_and_typer  (  s!   qyw!FEbWW0E0E%ErEGF"GUrgg1F1F&FUHG27+%>+Qb+G%>$T{+{!A{L+MMj$M/7#D  $ $ )L)x/B/B1/EFqIBZ^+	  N# GG%>+s!   !D=D=!E$E9EE
transformsr   datar   storage_keyserialization_formatc                 r   UR                  5       nU R                  X15      u  pxUR                  [        R                  :X  aJ  [        U[        R                  5      (       d  [        S5      eUR                  UR                  5       5        O[        U[        R                  5      (       d  [        S5      eUR                  [        R                  " S5      :w  a  [        S5      eU[        R                  :X  a  [        R                   " X'5        UR#                  5         U[        R                  :X  d  [        U[        R                  5      (       a  UR                  5       U-
  n	O!UR%                  5       UR'                  5       -  n	[)        U5      S:X  a  S OUn
[+        UR,                  U	[/        UUU	U
S9S9$ )Nz/Data must be io.BytesIO for BYTE_IO write itemsz5Data must be torch.Tensor for non-BYTE_IO write itemsr   zTensor must be on CPU devicer   )r=   )indexsize_in_bytesstorage_data)tellr   r   r)   r   
isinstancer   BytesIOr   r   	getbufferrv   r   r   r4   r[   saver   r   r   r   r-   r  r8   )r  r   r  r   r	  r
  r;   r   r=   r<   info_transform_descriptorss              rE   _write_itemr  @  sp    [[]F,6,L,L-)\ -///$

++ !RSS4>>+,$-- G  ;;%,,u-- !?@@#6#A#AAJJt*2===bjjB B ' 1 1 33
 )*a/5J  !"<	
	 	rR   create_stream
file_queueresult_queueplannerr   	use_fsyncthread_countc	                      UR                  5       u  pn[        R                  R                  5       n[	        [        US 5      nUS:X  aZ  [        R
                  R                  5       (       d  U(       a0  UR                  5       (       a  US:  a  [        UR                  US9nO[        UR                  5      nU Vs/ s H$  oR                  [        R                  :w  d  M"  UPM&     nnU H  nUR                  [        U5      U5        M      UR                  5         U Vs/ s H$  oR                  [        R                  :X  d  M"  UPM&     nn/ nU " U	S5       nU H3  nUR                  U5      nUR!                  [#        UUUUU
U5      5        M5     0 n0 nUR%                  5        H  u  nnUR&                  (       d  [)        S5      eUR!                  [#        UUUUU
U5      5        UUUR*                  R,                  '   SUR.                  R0                  R2                  0UUR*                  R,                  '   M     U[4        R6                  :X  aS  SSKJn  UR=                  U" U[>        [@        RB                  " U5      [D        [G        [H        5      [J        [L        0S95        U(       a%   [N        RP                  " URS                  5       5        UR[                  5         S S S 5        UR]                  U5        GM  s  snf s  snf ! [T        [V        4 a    [N        RX                  " 5          N]f = f! , (       d  f       NW= f! [^        R`                   a     g f = f)	Nr   r   )r   wbzTensor must be on CPUsaved_offsets)r  )metadata)1
get_nowaitrv   _C_get_privateuse1_backend_namegetattrr   is_availabler   resolve_datarx   r   r)   r   ri   r   rn   r   r  rq   is_cpur   r  fqnr   chunkoffsetsr4   r\   safetensors.torchr  r   r   jsondumpsr   rN   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                             rE   _write_files_from_queuer=  w  s   \2<2G2G2I/IK #((("H"H"J '/BD I !JJ++--).?.L.L.N.N'!+.(((;
 *(( &1U[rGG}?T?T4T[HU&


:j1:> '  "$/TKb77m>S>S3SrKGTMy$/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 0l ]+s 6 V
 Ul +,@A "	"g 0/n ;; ss   B<M >!K?#K?):M #!LLM EL4/$L	L4#&M 	%L1.L40L11L44
M>M MMc                   R   \ rS rSr\\S\\R                  -  S\S\	\
R                  SS4   4S j5       5       r\S\\R                  -  S\S\\R                  -  4S j5       r\S\\R                  -  S	\\R                  -  SS4S
 j5       r\S\\R                  -  S\\R                  -  4S j5       r\S\\R                  -  SS4S j5       r\\S\\R                  -  S\4S j5       5       r\S\\R                  -  S\4S j5       r\S\\R                  -  SS4S j5       rSrg)r3   i  pathmoder]   Nc                     g r?   rH   )rB   r?  r@  s      rE   r  FileSystemBase.create_stream  s     ,/rR   suffixc                     g r?   rH   rB   r?  rC  s      rE   concat_pathFileSystemBase.concat_path  s      rR   new_pathc                     g r?   rH   rB   r?  rH  s      rE   renameFileSystemBase.rename  s    TWrR   c                     g r?   rH   rB   r?  s     rE   	init_pathFileSystemBase.init_path  s    GJrR   c                     g r?   rH   rN  s     rE   mkdirFileSystemBase.mkdir  s    69rR   checkpoint_idc                     g r?   rH   clsrT  s     rE   validate_checkpoint_id%FileSystemBase.validate_checkpoint_id  s    ORrR   c                     g r?   rH   rN  s     rE   existsFileSystemBase.exists  s    7:rR   c                     g r?   rH   rN  s     rE   rm_fileFileSystemBase.rm_file  s    8;rR   rH   )rI   rJ   rK   rL   r
   r   rN   r-  PathLiker   r   r   r  rF  rK  rO  rR  classmethodr   rX  r[  r^  rQ   rH   rR   rE   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"++-;$; ;rR   r3   c            
       4   \ rS rSr\S\\R                  -  S\S\\	R                  SS4   4S j5       rS\\R                  -  S\S\\R                  -  4S jrS\\R                  -  S\\R                  -  4S	 jrS\\R                  -  S
\\R                  -  SS4S jrS\\R                  -  SS4S jr\S\\R                  -  S\4S j5       rS\\R                  -  S\4S jrS\\R                  -  SS4S jrS\\R                  -  S\\   4S jrSrg)r2   i  r?  r@  r]   Nc              #      #    [        U[        5      (       d  [        U5      nUR                  U5       n[        [        R
                  U5      v   S S S 5        g ! , (       d  f       g = f7fr?   )r  r   openr   r   r   )rB   r?  r@  r   s       rE   r  FileSystem.create_stream  sD      $%%:DYYt_ryy&)) __s   2A+A	A+
A($A+rC  c                 J    [        U[        5      (       d  [        U5      nX-  $ r?   r  r   rE  s      rE   rF  FileSystem.concat_path  s     $%%:D}rR   c                 F    [        U[        5      (       d  [        U5      nU$ r?   rg  rN  s     rE   rO  FileSystem.init_path  s    $%%:DrR   rH  c                     [        U[        5      (       d  [        U5      nUR                  [        [        U5      5        g r?   )r  r   rK  r   rJ  s      rE   rK  FileSystem.rename  s+    $%%:DDx()rR   c                 d    [        U[        5      (       d  [        U5      nUR                  SSS9  g )NT)parentsexist_ok)r  r   rR  rN  s     rE   rR  FileSystem.mkdir  s(    $%%:D

4$
/rR   rT  c                     [        U[        5      (       a  gS[        U5      ;   a  g[        U5      R                   HO  nUR	                  5       (       d  M  [
        R                  " [        U5      [
        R                  5      (       d  MO    g   g)NTz://F)r  r   rN   rn  r[  r-  accessW_OK)rW  rT  ps      rE   rX  !FileSystem.validate_checkpoint_id   sb    mT**C&&m$,,AxxzzbiiA88 - rR   c                 b    [        U[        5      (       d  [        U5      nUR                  5       $ r?   )r  r   r[  rN  s     rE   r[  FileSystem.exists.  s$    $%%:D{{}rR   c                 d    [        U[        5      (       d  [        U5      nUR                  5         g r?   )r  r   unlinkrN  s     rE   r^  FileSystem.rm_file3  s!    $%%:DrR   c                     [        U[        5      (       d  [        U5      nUR                  5        Vs/ s H  n[        U5      PM     sn$ s  snf r?   )r  r   iterdirrN   )rB   r?  rt  s      rE   lsFileSystem.ls8  s:    $%%:D $/1A///s   ArH   )rI   rJ   rK   rL   r
   rN   r-  r`  r   r   r   r  rF  rO  rK  rR  ra  r   rX  r[  r^  r   r}  rQ   rH   rR   rE   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 0rR   r2   c                   \  ^  \ rS rSrSrSSSSSS\R                  4S\\R                  -  S\
S	\
S
\S\S\
S\\   S-  S\S\S\SS4U 4S jjjrS)S\\R                  -  S-  SS4S jjrS\
S\S\SS4S jrS\
4S jrS\S\4S jrS\\   S\\   4S jrS\S\S\\\      4S jrS\S\R8                  S\\\      4S jrS \S!\\\      SS4S" jrS\ S-  4S# jr!S)S$\S-  S\R                  4S% jjr"\#S\\R                  -  4S& j5       r$\%S\\R                  -  S\
4S' j5       r&S(r'U =r($ )*_FileSystemWriteri>  aE  
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kwargsr]   c	                 "  > [         TU ]  5         [        5       U l        U R                  R	                  U5      U l        X l        X0l        X@l        XPl	        [        5       U l        X`l        [        U5      U l        Xl        SU l        SU l        g)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)superr|   r2   fsrO  r?  r  r  r  r  ra   save_idr  r   r  r
  rankuse_collectives)rB   r?  r  r  r  r  r  r  r
  r  r  	__class__s              rE   r|   _FileSystemWriter.__init__L  sv    6 	,GG%%d+	$8!$(%:"%'"2;?$8! $	%)rR   rT  c                 p    U(       a   U R                   R                  U5      U l        [        5       U l        g r?   )r  rO  r?  ra   r  rB   rT  s     rE   reset_FileSystemWriter.resetu  s%    ))-8DI%'rR   is_coordinatorc                 ^    UR                  S5      U l        UR                  SS5      U l        g )Nr  r  T)getr  r  )rB   r  r  r  s       rE   set_up_storage_writer'_FileSystemWriter.set_up_storage_writerz  s(     JJv&	%zz*;TBrR   c                     U R                   (       a  U R                  S S9nOU R                  SS9nU R                  R                  U5      $ )N)r  r   )r  _get_metadata_pathr  r[  )rB   metadata_paths     rE   _metadata_exists"_FileSystemWriter._metadata_exists  sF     333>M !333;Mww~~m,,rR   planc                    U R                   R                  U R                  5        U R                  5       (       a]  U R                  (       a2  [
        R                  " SU R                   SU R                  < S3SS9  O[        SU R                  < S35      eU R                  b=  U R                  (       d,  [        R                  " U[        SU R                   S	35      S
9nU$ )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  )r  rR  r?  r  r  warningswarnr   r  r  dataclassesreplacerT   rB   r  s     rE   prepare_local_plan$_FileSystemWriter.prepare_local_plan  s    dii   ""~~9$))DhY]YgYgXi jk k  !	 #%SDNNCTTU#VWW99 )=)=&&>Btyyk2C#DD rR   plansc                     [        U5       VVs/ s H6  u  p#UR                  c"  [        R                  " U[	        SU S35      S9OUPM8     nnnU$ s  snnf )Nr  r   r  )r   r  r  r  rT   )rB   r  r  r  	new_planss        rE   prepare_global_plan%_FileSystemWriter.prepare_global_plan  sl    
 %U+	
 ,   ( >Bqc)3LM ,	 	 
 
s   =Ar  c                   ^	^
 UR                   m
Sm	U	U
4S jn[        R                  " 5       nU R                  (       ah  [	        U R
                  UR                  5       HC  nU" 5       nU R                  R                  U R                  U5      nUR                  XvU45        ME     OTUR                   HD  nU" 5       nU R                  R                  U R                  U5      nUR                  XvU/45        MF     U R                  X$5      $ )Nr   c                  >   > TR                    T [         3n TS-  mU $ )Nr   )rV   DEFAULT_SUFFIX)r5  
file_countstorage_plans    rE   gen_file._FileSystemWriter.write_data.<locals>.gen_file  s,    '../
|N;KLI!OJrR   )r  r3  Queuer  r  r  rA   r  rF  r?  r2  _write_data)rB   r  r  r  r  bucketr5  r?  r   r  r  s            @@rE   
write_data_FileSystemWriter.write_data  s    
 (,'8'8
	 #(++-
$$1$2C2CTZZP$J	ww**499i@89 Q
 

$J	ww**499i@$89 #
 44rR   r  c                    [         R                  " 5       n/ n[        SU R                  5       H  n[        R
                  " [        U R                  R                  UUUU R                  U R                  U R                  U R                  U R                  4	S9nUR                  5         UR                  U5        M     [        U R                  R                  UUUU R                  U R                  U R                  U R                  U R                  S9	  U H  nUR                  5         M     / n  XsR!                  5       -  nM  ! [         R"                   a     [%        5       nUR'                  U5        Us $ f = f)Nr   )targetr  )	r  r  r  r  r  r   r  r  r
  )r3  r  r   r  	threadingThreadr=  r  r  r  r  r  r
  startr   joinr   r4  r/   
set_result)	rB   r  r  r  threadsr   tresfuts	            rE   r  _FileSystemWriter._write_data  sG   
 %*KKMq$++,A  .GG)) OO..OO%%--
A GGINN1! -$ 	 ''//!% $ : :oo**!%!:!:
	
 AFFH  	..00 {{ 	-3XCNN3J	s   1E 1E:9E:r  resultsc                 t   [         R                  " U[        S9n0 nU H9  nUR                  U Vs0 s H  oUR                  UR
                  _M     sn5        M;     X1l        U R                  5       Ul        U R                  (       d#  U R                  b  SU R                   [         S3O[         S3n[        [        U R                  R                  U R                  U5      5      nU R                  R                  US5       n[         R"                  " X5        U R$                  (       a%   [&        R(                  " UR+                  5       5        S S S 5        U R                  (       d)  U R                  b  U R3                  U R                  5      n	OU R3                  5       n	U R                  R5                  U	5      (       a  U R                  R7                  U	5        U R                  R9                  Xy5        g s  snf ! [,        [.        4 a    [&        R0                  " 5          Nf = f! , (       d  f       N= f)N)versionr  z.tmpr  )r  r  r6   updater  r  storage_metar  r  r5   r   r   r  rF  r?  r  pickledumpr  r-  r.  r/  r0  r   r1  r  r[  r^  rK  )
rB   r  r  
storage_mdwr_listwrtmp_filenametmp_pathmetadata_filer  s
             rE   finish_FileSystemWriter.finish  s   &&x9LM
G7K7Rxx87KL  * $ 1 1 3 ''DII,A L>. >& 	
 dgg11$))\JKWW""8T2mKK0HH]1134	 3 ##		(= 33DII>M 335M77>>-((GGOOM*x/7 L '(<= GGI 32s/    G9
(H),$G>>%H&#H)%H&&H))
H7c                 >    [        U R                  U R                  S9$ )N)rT  r  )r!   rT  r  rm   s    rE   r  _FileSystemWriter.storage_meta  s    ););T\\RRrR   r  c                     Uc  [          O
SU [          3n[        [        U R                  R	                  U R
                  U5      5      $ Nr  r5   r   r   r  rF  r?  rB   r  filenames      rE   r  $_FileSystemWriter._get_metadata_path  <    (,l^Btf\N:SD$''--diiBCCrR   c                     U R                   $ )zD
return the checkpoint_id that will be used to save the checkpoint.
r?  rm   s    rE   rT  _FileSystemWriter.checkpoint_id      
 yyrR   c                 ,    [         R                  U5      $ r?   r2   rX  rV  s     rE   rX  (_FileSystemWriter.validate_checkpoint_id&      00??rR   )r  r  r?  r  r  r  r
  r  r  r  r  r  r?   ))rI   rJ   rK   rL   rM   r4   r[   rN   r-  r`  r   rP   r	   r   r   r|   r  r  r  r&   r  r   r  r'   r/   r-   r  r3  r  r  r   r  r!   r  r  r   rT  ra  rX  rQ   __classcell__r  s   @rE   r  r  >  s9     &*%/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 @ @ @rR   r  c            	       `    \ rS rSrSrSS\S-  SS4S jjrS\S\\	   S	\
\   S\
\   4S
 jrSrg)_StorageReaderTransformsi+  r   Nextension_registryr]   c                 8    Uc  [        5       U l        g UU l        g r?   )r   r  )rB   r  s     rE   r|   !_StorageReaderTransforms.__init__2  s!    #5#= 	CU 	rR   	read_itemr=   r   c                     U R                   R                  U5      nUnU H+  n[        U[        5      (       d  M  UR	                  U5      nM-     U$ r?   )r  from_descriptor_listr  r   transform_from)rB   r  r=   r   r   r  r   s          rE   transform_load_stream._StorageReaderTransforms.transform_load_stream7  sP     ,,AABWX
#B"677!#!2!2>!B  rR   )r  r?   )rI   rJ   rK   rL   rM   r   r|   r%   r	   rN   r   r   r  rQ   rH   rR   rE   r  r  +  sW    
+<t+C 
t 

  (} uI	
 
ErR   r  c            
         ^  \ rS rSr SS\\R                  -  S\S-  SS4U 4S jjjrS\	S\
\   4S jrSS	\\R                  -  S-  SS4S
 jjrS\S\S\S   4S jrSS\S-  S\R                  4S jjrS\S\S\4S jrS\S\S\S\SS4
S jrS\S\4S jrS\\   S\\   4S jr\S\\R                  -  4S j5       r\S	\\R                  -  S\4S j5       rSr U =r!$ )r1   iE  Nr?  _extension_registryr]   c                    > [         TU ]  5         [        5       U l        U R                  R	                  U5      U l        0 U l        [        5       U l        [        U5      U l
        S U l        SU l        g r   )r  r|   r2   r  rO  r?  r  ra   load_idr  r  r  r  )rB   r?  r  r  s      rE   r|   FileSystemReader.__init__F  s]    
 	,GG%%d+	,.%'23FG	#rR   sinfoc                 l    [        [        [           [        XR                  UR
                  5      5      $ r?   )r   r   r   r.   r;   r<   )rB   filer  s      rE   _slice_fileFileSystemReader._slice_fileT  s#    BuI0||U\\RSSrR   rT  c                 ~    0 U l         U(       a   U R                  R                  U5      U l        [	        5       U l        g r?   )r  r  rO  r?  ra   r  r  s     rE   r  FileSystemReader.resetW  s-    ))-8DI%'rR   r  r  c                    0 nUR                    HI  nU R                  UR                     nUR                  nUR	                  U/ 5      R                  U5        MK     UR                  5        GHN  u  pxU R                  R                  U R                  U5      n	U R                  R                  U	S5       n
U GH  nU R                  UR                     nU R                  X5      nU R                  R                  UUR                  =(       d    SU5      nUR                  [        R                   :X  aI  ["        R$                  " UR'                  S5      5      nUR)                  S5        UR+                  X5        M  UR-                  5       (       a  UnO6["        R$                  " UR'                  S5      5      nUR)                  S5        [/        [0        [2        R4                  " USSS95      n[7        UUR8                  UR:                  5      nUR=                  U5      R?                  5       nURA                  5       URA                  5       :w  a:  [C        SUR                   S	URA                  5        S
URA                  5        35      eURE                  U5        URG                  UU5        GM     S S S 5        GMQ     [I        5       nURK                  S 5        U$ ! , (       d  f       GM  = f)NrbrH   r   r   T)map_locationweights_onlyzreq z mismatch sizes z vs )&rA   r  storage_indexr:   
setdefaultr   r  rF  r?  r  r  r  r  r=   r   r"   r   r   r  readseek
load_bytesseekabler   r   rv   loadr   storage_offsetslengthsresolve_tensorr   re   r   copy_commit_tensorr/   r  )rB   r  r  per_filer  item_mdr?  r:   reqsrH  r   req
file_slicer  
read_bytesr  r   target_tensorr  s                      rE   	read_dataFileSystemReader.read_data]  ss   .0I$($5$5i6M6M$NG((Db)00; $
 $,>>#3Mww**499mDH&&x6&C"//0A0ABG!%!1!1&!BJ%)__%J%J  55;"&N xx<#7#77%'ZZ0C0CB0G%H
"***3;)224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   76 $4` ht
a 76s   4G>K
K,	r  c                     Uc  [          O
SU [          3n[        [        U R                  R	                  U R
                  U5      5      $ r  r  r  s      rE   r  #FileSystemReader._get_metadata_path  r  rR   r  r  c                 R   UR                  S5      nU R                  U5      nU R                  R                  US5       n[        R
                  " U5      nS S S 5        [        WSS 5      c  [        5       Ul        U R                  UR                  l	        U$ ! , (       d  f       NH= f)Nr  r  r  )
r  r  r  r  r  r  r#  r!   r  r  )rB   r  r  r  r?  r  r  s          rE   read_metadataFileSystemReader.read_metadata  s    zz&!&&t,WW""4.-{{=1H / 8^T2:$/MH!(,% /.s   B
B&r  r  c                     UR                   U l         UR                  S5      U l        UR                  SS5      U l        U R                   c  [	        S5      eg )Nr  r  Tz)storage_data must not be None in metadata)r  r  r  r  r   )rB   r  r  r  r  s        rE   set_up_storage_reader&FileSystemReader.set_up_storage_reader  sS     %11JJv&	%zz*;TB$ !LMM %rR   c                     U$ r?   rH   r  s     rE   r  #FileSystemReader.prepare_local_plan  s    rR   r  c                     U$ r?   rH   )rB   r  s     rE   r  $FileSystemReader.prepare_global_plan  s    rR   c                     U R                   $ )zD
return the checkpoint_id that will be used to load the checkpoint.
r  rm   s    rE   rT  FileSystemReader.checkpoint_id  r  rR   c                 ,    [         R                  U5      $ r?   r  rV  s     rE   rX  'FileSystemReader.validate_checkpoint_id  r  rR   )r  r  r?  r  r  r  r  r?   )"rI   rJ   rK   rL   rN   r-  r`  r   r|   r8   r   r   r  r  r#   r$   r/   r  rP   r  r   r   r   r   r#  r  r   r  r   rT  ra  rX  rQ   r  r  s   @rE   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 @ @ @rR   r1   c                      ^  \ rS rSrSrSSSSSSS\R                  4S\\R                  -  S	\
S
\
S\S\S\
S\
S\\   S-  S\SS4S jjrS\S\4U 4S jjrSrU =r$ )r0   i  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   r  FNr?  r  r  r  r  cache_staged_state_dictr  r  r
  r]   c
                 d    [         R                  U UUUUUUUU	S9	  [        R                  " U US9  g)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?  r  r  r  r  r  r  r
  )r.  N)r  r|   r*   )
rB   r?  r  r  r  r  r.  r  r  r
  s
             rE   r|   FileSystemWriter.__init__  sH    : 	""!5!%"7#!5 	# 
	
 	$$$;	
rR   
state_dictc                 0   > SU l         [        TU ]	  U5      $ )zOverride of AsyncStager.stager   )r  r  stage)rB   r1  r  s     rE   r3  FileSystemWriter.stage  s     &'"w}Z((rR   )r  )rI   rJ   rK   rL   rM   r4   r[   rN   r-  r`  r   rP   r	   r   r|   r    r3  rQ   r  r  s   @rE   r0   r0     s    " &*%/(-AE4G4R4R+
BKK+
 #+
 	+

 +
  #+
 "&+
 +
 67$>+
 2+
 
+
Z) )O ) )rR   r0   )hr   r  r   r+  r   r-  r  r3  r  r_   r  abcr   r   collections.abcr   r   r   r   r	   
contextlibr
   r   enumr   r   pathlibr   typingr   r   r   r   typing_extensionsr   rv   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   rN   rO   r6   r8   rT   r4   r  ra   rc   rx   r   r   rP   r   r   r  r   r  r  r  r   r=  r3   r2   r  r  r1   r0   rH   rR   rE   <module>rG     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)rR   