
    AܶiY                     h   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 m!Z!m"Z" d d
l#m$Z$ d dl%Z%d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA d dlBmCZC d dlDmEZEmFZFmGZG d dlHmIZI d dlJmKZK g dZLdZMeNeOd<   dZPeeN         eOd<   e G d d                      ZQe G d d                      ZR G d d e          ZSd!ZTd"eNfd#ZU G d$ d%e          ZV G d& d'eV          ZW G d( d)eV          ZX G d* d+          ZYd,e@d"eZfd-Z[d.eZd/e\e@         d"e\e\e@                  fd0Z]d1eYd2ej^        d3e"ej_        e%j&        f         d4e@d5eNd6eSd"eGfd7Z`d8ed9eja        d:eja        d;e?d1eYd<eZd=ebd>eZd6eSd"dfd?Zc G d@ dAe          Zd G dB dCed          Ze G dD dEeF          Zf G dF dG          Zg G dH dIeE          Zh G dJ dKefeC          ZidS )L    N)ABCabstractmethod)Callable	GeneratorIterableIteratorSequence)contextmanager)	dataclass)Enum)UnsupportedOperation)Path)AnycastFinalIOOptionalUnion)Buffer)Tensor)_get_available_device_type_get_device_module)narrow_tensor_by_index)ExtensionRegistryStreamTransformExtension)CUSTOM_METADATA_KEYDCP_VERSION_KEY
FORMAT_KEYFORMAT_VALUEHF_DCP_VERSION)MetadataSTATE_DICT_TYPEStorageMeta)LoadItemTypeLoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItemWriteItemType)BlockingAsyncStager)StorageReaderStorageWriterWriteResult)_create_file_view)Future)FileSystemWriterFileSystemReader
FileSystemFileSystemBaseSerializationFormatz	.metadata_metadata_fnz1.0.0CURRENT_DCP_VERSIONc                   ^    e Zd ZU dZeed<   eed<   eed<   dZee	e                  ed<   d Z
dS )_StorageInfoz#This is the per entry storage info.relative_pathoffsetlengthNtransform_descriptorsc                 H    d | j                                         D             S )Nc                     i | ]
\  }}|||S N ).0kvs      l/root/projects/openclaw-proxy/venv/lib64/python3.11/site-packages/torch/distributed/checkpoint/filesystem.py
<dictcomp>z-_StorageInfo.__getstate__.<locals>.<dictcomp>T   s    HHHA!-1---    )__dict__itemsselfs    rF   __getstate__z_StorageInfo.__getstate__S   s$    HH!4!4!6!6HHHHrH   )__name__
__module____qualname____doc__str__annotations__intr>   r   r	   rM   rB   rH   rF   r:   r:   J   sh         --KKKKKK598HSM2999I I I I IrH   r:   c                       e Zd ZU eed<   dS )_StoragePrefixprefixN)rN   rO   rP   rR   rS   rB   rH   rF   rV   rV   W   s         KKKKKrH   rV   c                       e Zd ZdZdZdS )r6   
torch_savesafetensorsN)rN   rO   rP   
TORCH_SAVESAFETENSORSrB   rH   rF   r6   r6   \   s        JKKKrH   r6   z.distcpreturnc                  B    t          t          j                              S rA   )rR   uuiduuid4rB   rH   rF   _generate_uuidra   d   s    tz||rH   c                       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dS )	_TensorLoadersizeobjr]   Nc                     d S rA   rB   rL   rd   re   s      rF   addz_TensorLoader.addi       rH   c                     d S rA   rB   rK   s    rF   start_loadingz_TensorLoader.start_loadingm   ri   rH   c                     d S rA   rB   rK   s    rF   valuesz_TensorLoader.valuesq   ri   rH   r]   N)rN   rO   rP   r   rT   objectrh   rk   r   tupletorchr   rm   rB   rH   rF   rc   rc   h   s         & T    ^    ^ u|V';!<=    ^  rH   rc   c                   l    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dS )_SerialCpuLoaderresolve_funr]   Nc                 "    || _         g | _        d S rA   )rt   rJ   )rL   rt   s     rF   __init__z_SerialCpuLoader.__init__w   s    &/1


rH   rd   re   c                 >    | j                             ||f           d S rA   )rJ   appendrg   s      rF   rh   z_SerialCpuLoader.add{   s"    
4+&&&&&rH   c                     d S rA   rB   rK   s    rF   rk   z_SerialCpuLoader.start_loading~   s    rH   c              #   F  K   | j         D ]\  }}|                     |                                          }|                                }|                                                                |                                k    r|                                }||fV  d S rA   )rJ   rt   detachcpustoragerd   numelclonerL   _re   tensors       rF   rm   z_SerialCpuLoader.values   s      j 	 	FAs%%c**1133FZZ\\F~~$$&&&,,..88    	 	rH   rn   )rN   rO   rP   r   rv   rT   ro   rh   rk   r   rp   rq   r   rm   rB   rH   rF   rs   rs   v   s        2H 2 2 2 2 2' '& 'T ' ' ' '   	u|V';!<= 	 	 	 	 	 	rH   rs   c            	          e Zd Z	 	 ddedeej                 deddfdZe	de
fd            Zdeeej        ef                  fd	Zdd
Zdeeej        ef                  fdZdededdfdZddZdeeej        ef                  fdZdS )_OverlappingCpuLoaderN@B rt   streaminflight_threshholdr]   c                    || _         g | _        || _        d| _        t	          j                    | _        d| _        d| _        |r|j	        nt                      | _	        t          | j	                  | _        t          t          j        j        |p| j                                                  | _        | j        | j                                        k    r3| j                            | j                                                   d S d S )Nr   F)rt   rJ   r   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   rq   cudaStreamcurrent_streamr   wait_stream)rL   rt   r   r   s       rF   rv   z_OverlappingCpuLoader.__init__   s     '/1
#6 0;0A0C0C"(JF.H.J.J 	 00@AAJvL);)J)J)L)L
 
 ;$,;;====K##D$6$E$E$G$GHHHHH >=rH   c                 <    | j         t          | j                  k    S rA   )r   lenrJ   rK   s    rF   _donez_OverlappingCpuLoader._done   s    x3tz??**rH   c                 ~   g }| j         | j        k    r| j                                         | j         | j        k    r| j                                        }| xj         |d                                         |d                                         z  z  c_         |                    |           | j         | j        k    |S )Nr   )	r   r   r   synchronizer   popleftr~   element_sizerx   )rL   drainedvals      rF   _drainz_OverlappingCpuLoader._drain   s    $":::K##%%%!T%===$,,..C3q6<<>>CF4G4G4I4I#IINN3 !T%=== rH   c                 Z   | j                             | j                  5  | j        sj| j        | j        k     rY| j        | j                 \  }}| xj        dz  c_        |                     |                                          }|j	        j
        | j        k    r|                    dd          }nu|j	        t          j	        d          k    rX|                                                                |                                |j        z  k    r|                                }| j                            ||f           | xj        |                                |                                z  z  c_        | j        s| j        | j        k     Yd d d            d S # 1 swxY w Y   d S )N   r|   T)devicenon_blocking)r   r   r   r   r   rJ   r   rt   r{   r   typer   torq   untyped_storagerd   r~   itemsizer   r   rx   r   r   s       rF   _refillz_OverlappingCpuLoader._refill   s   &&t{33 	N 	Nj NT%84;S%S%SDH-3A))#..5577=%)999#YYe$YGGFF]el5&9&999..005577!<<>>FO;< < "("))   ##v||~~8K8K8M8M'MM##) j NT%84;S%S%S	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	Ns   E3F  F$'F$c                     | j         st          d          t          | j                  dk    r| j                                         | j        S )Nz._finish called before all items were processedr   )r   AssertionErrorr   r   r   r   rK   s    rF   _finishz_OverlappingCpuLoader._finish   sO    z 	S !QRRRt!""Q&&K##%%%!!rH   rd   re   c                 j    | j         rt          d          | j                            ||f           d S )Nz&cannot add items after loading started)r   RuntimeErrorrJ   rx   rg   s      rF   rh   z_OverlappingCpuLoader.add   s<    < 	IGHHH
4+&&&&&rH   c                     | j         rd S d| _         | j                            t          j        d                     |                                  d S )NTr   key)r   rJ   sortoperator
itemgetterr   rK   s    rF   rk   z#_OverlappingCpuLoader.start_loading   sJ    < 	F
H/22333rH   c              #      K   |                                   | j        s7|                                 }|                                  |E d {V  | j        7|                                 E d {V  d S rA   )rk   r   r   r   r   )rL   r   s     rF   rm   z_OverlappingCpuLoader.values   s      * 	kkmmGLLNNN * 	
 <<>>!!!!!!!!!rH   )Nr   rn   )rN   rO   rP   r   r   rq   r   rT   rv   propertyboolr   listrp   r   ro   r   r   r   r   rh   rk   r   rm   rB   rH   rF   r   r      sk        *.#,	I II &I !	I
 
I I I I. +t + + + X+U5<#789    N N N N0"%f(<"=> " " " "' '& 'T ' ' ' '
   "u|V';!<= " " " " " "rH   r   c            	           e Zd ZdZ	 d	deee                  ddfdZdede	j
        deee         ee         f         fdZdS )
_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                     |dn|| _         dS )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.
        NrB   )r   )rL   r   s     rF   rv   z!_StorageWriterTransforms.__init__   s     !+ 2""
rH   
write_item
raw_streamc                     G d dt           j                  }t          t          t                    ||                    }| j        D ]}|                    |          }|d t          | j                  D             fS )Nc                   F    e Zd Zdej        fdZdefdZdede	fdZ
d ZdS )	E_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriterrawc                     || _         d S rA   )r   )rL   r   s     rF   rv   zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__  s    rH   r]   c                     dS NTrB   rK   s    rF   	writeablezO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable  s    trH   bc                 6    | j                             |          S rA   )r   write)rL   r   s     rF   r   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write  s    x~~a(((rH   c                 `    |                                   | j                                          d S rA   )flushr   rK   s    rF   closezK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close  s'    

     rH   N)rN   rO   rP   ioIOBaserv   r   r   r   rT   r   r   rB   rH   rF   NoCloseWriterr     s}        BI    4    )v )# ) ) ) )! ! ! ! !rH   r   c                 6    g | ]}|                                 S rB   )get_descriptor)rC   exs     rF   
<listcomp>zB_StorageWriterTransforms.transform_save_stream.<locals>.<listcomp>  s$    WWWrr0022WWWrH   )r   r   r   r   bytesr   transform_toreversed)rL   r   r   r   r   r   s         rF   transform_save_streamz._StorageWriterTransforms.transform_save_stream   s    	! 	! 	! 	! 	!BI 	! 	! 	! BuI}}Z'@'@AA/ 	9 	9B??<88LLWWXdo=V=VWWWXXrH   rA   )rN   rO   rP   rQ   r   r	   r   rv   r*   r   r   rp   r   r   r   rR   r   rB   rH   rF   r   r      s          JN	C 	C"8,D#EF	C		C 	C 	C 	CY#Y13Y	r%y$s)#	$Y Y Y Y Y YrH   r   itemc                     d}| j         t          d          | j         j        D ]}||z  }| j         j        j        }|t
          j                            |          z  S )Nr   z&WriteItem tensor_data must not be None)tensor_datar   rd   
propertiesdtyperq   _utils_element_size)r   rd   sr   s       rF   
_item_sizer     sh    DEFFF"  	'-E%,,,U3333rH   binsrJ   c                 0   | dk    r|gS d |D             }d |D             }d t          |           D             }d t          |           D             }|                    t          d           t          |          D ]#\  }}||| z                               |           $|D ]p}t          t          |          t          j        d                    d	         }||                             |           ||xx         t          |          z  cc<   q|S )
Nr   c                 <    g | ]}|j         t          j        k    |S rB   r   r+   BYTE_IOrC   wis     rF   r   z+_split_by_size_and_type.<locals>.<listcomp>+  s'    FFFbRW0E%E%Er%E%E%ErH   c                 <    g | ]}|j         t          j        k    |S rB   r   r   s     rF   r   z+_split_by_size_and_type.<locals>.<listcomp>,  s'    GGGrbg1F&F&F&F&F&FrH   c                     g | ]}g S rB   rB   rC   r   s     rF   r   z+_split_by_size_and_type.<locals>.<listcomp>.  s    %>%>%>Qb%>%>%>rH   c                     g | ]}d S )r   rB   r   s     rF   r   z+_split_by_size_and_type.<locals>.<listcomp>/  s    +++!A+++rH   T)r   reverser   r   )ranger   r   	enumeraterx   minr   r   )	r   rJ   bytes_wtensor_wbucketsbucket_sizesir   r   s	            rF   _split_by_size_and_typer   '  s6   qyywFFEFFFGGGUGGGH%>%>%++%>%>%>G++uT{{+++LMMj$M///7## % %2D  $$$$ , ,)L))x/B1/E/EFFFqIBSZ^^+NrH   
transformsr   datar   storage_keyserialization_formatc           
         |                                 }|                     ||          \  }}|j        t          j        k    rQt          |t          j                  st          d          |	                    |
                                           nzt          |t          j                  st          d          |j        t          j        d          k    rt          d          |t          j        k    rt          j        ||           |                                 |t          j        k    st          |t          j                  r|                                 |z
  }	n)|                                |                                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 itemsr|   zTensor must be on CPU devicer   )r>   )indexsize_in_bytesstorage_data)tellr   r   r+   r   
isinstancer   BytesIOr   r   	getbufferrq   r   r   r6   r[   saver   r~   r   r   r/   r   r:   )r   r   r   r   r   r   r<   r   r>   r=   info_transform_descriptorss              rF   _write_itemr  ?  s    [[]]F,6,L,LF- -)\( -///$
++ 	T !RSSS4>>++,,,,$-- 	 G   ;%,u---- !?@@@#6#AAAJt\***2===bjB B= ' 1 1 3 33
 )**a//5J  !"<	
 
 
	 	 	 	rH   create_stream
file_queueresult_queueplannerr   	use_fsyncthread_countc	                    	 	 |                                 \  }	}
}t          j                                        }t	          t          |d           }|dk    rQt          j                                        s|r1|                                r|dk    rt          |j        |          }nt          |j                  }d |D             }|D ]%}|
                    t          |          |           &|                                 d |D             }g } | |	d          5 }|D ]>}|                    |          }|                    t          |||||
|                     ?i }i }|                                D ]q\  }}|j        st#          d          |                    t          |||||
|                     |||j        j        <   d	|j        j        j        i||j        j        <   r|t.          j        k    rddd
lm} |                     ||t8          t;          j        |          t>          tA          tB                    tD          tF          i                     |rR	 tI          j%        |&                                           n*# tN          tP          f$ r tI          j)                     Y nw xY w|*                                 d d d            n# 1 swxY w Y   |+                    |           # tX          j-        $ r Y d S w xY w)NTr   r   )r   c                 <    g | ]}|j         t          j        k    |S rB   r   r   s     rF   r   z+_write_files_from_queue.<locals>.<listcomp>  s'    UUUrBG}?T4T4T4T4T4TrH   c                 <    g | ]}|j         t          j        k    |S rB   r   r   s     rF   r   z+_write_files_from_queue.<locals>.<listcomp>  s'    TTTb27m>S3S3Sr3S3S3SrH   wbzTensor must be on CPUsaved_offsets)r  )metadata).
get_nowaitrq   _C_get_privateuse1_backend_namegetattrr   is_availabler   resolve_datars   rh   r   rk   rx   r  rm   is_cpur   r   fqnr   chunkoffsetsr6   r\   safetensors.torchr  r   r   jsondumpsr   rR   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   write_resultsr   r   tensor_dictmetadata_dictr   r  s                            rF   _write_files_from_queuer-  v  s   \Y	,2<2G2G2I2I/I{K #(("H"H"J"J '/BD I I !!J++-- " * " /@.L.L.N.N "
 (!++.((;  
 *(  VU[UUUH& ? ?


:j11:>>>>  """TTKTTTGMy$// 56")  J"//
;;D!((#&" &'0 	 	 	 	 ! "*0--//  &FJ!= F,-DEEE!((#&""&'0 	 	 	 9?K
 0 45')?)E)M;M*"2"677 (+>+JJJ666666LL' 3TZ5N5N /^1D1D *L&  	 	 	  ""1111*,@A " " "					"k5 5 5 5 5 5 5 5 5 5 5 5 5 5 5l ]+++sY	,t ;   s[   DK2 EK&JK$J-*K,J--KK2 KK2 KK2 2LLc                   t   e Zd Zeedeeej        f         dede	e
j        ddf         fd                        Zedeeej        f         dedeeej        f         fd            Zedeeej        f         deeej        f         ddfd	            Zedeeej        f         deeej        f         fd
            Zedeeej        f         ddfd            Zeedeeej        f         defd                        Zedeeej        f         defd            Zedeeej        f         ddfd            ZdS )r5   pathmoder]   Nc                     d S rA   rB   )rL   r/  r0  s      rF   r  zFileSystemBase.create_stream  s	     ,/3rH   suffixc                     d S rA   rB   rL   r/  r2  s      rF   concat_pathzFileSystemBase.concat_path  s	     #&#rH   new_pathc                     d S rA   rB   rL   r/  r6  s      rF   renamezFileSystemBase.rename  s	     srH   c                     d S rA   rB   rL   r/  s     rF   	init_pathzFileSystemBase.init_path  s    SVSVrH   c                     d S rA   rB   r;  s     rF   mkdirzFileSystemBase.mkdir  s    <?CrH   checkpoint_idc                     d S rA   rB   clsr?  s     rF   validate_checkpoint_idz%FileSystemBase.validate_checkpoint_id  s    UXUXrH   c                     d S rA   rB   r;  s     rF   existszFileSystemBase.exists  s    =@SrH   c                     d S rA   rB   r;  s     rF   rm_filezFileSystemBase.rm_file  s    >AcrH   )rN   rO   rP   r
   r   r   rR   r  PathLiker   r   r   r  r5  r9  r<  r>  classmethodr   rC  rE  rG  rB   rH   rF   r5   r5     s       /#r{*+/36/	29dD(	)/ / / ^ ^/ &#r{*+&58&	sBK	 & & & ^& #r{*+7<S"+=M7N	   ^ VeC$45V%R[@P:QVVV ^V?%R[ 01?d??? ^?X5bk9I3JXtXXX ^ [X@5bk!12@t@@@ ^@AE#r{"23AAAA ^AAArH   r5   c            
       *   e Zd Zedeeej        f         dedee	j
        ddf         fd            Zdeeej        f         dedeeej        f         fdZdeeej        f         deeej        f         fdZdeeej        f         d	eeej        f         ddfd
Zdeeej        f         ddfdZedeeej        f         defd            Zdeeej        f         defdZdeeej        f         ddfdZdeeej        f         dee         fdZdS )r4   r/  r0  r]   Nc              #      K   t          |t                    st          |          }|                    |          5 }t          t          j        |          V  d d d            d S # 1 swxY w Y   d S rA   )r   r   openr   r   r   )rL   r/  r0  r   s       rF   r  zFileSystem.create_stream  s       $%% 	::DYYt__ 	*ry&)))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   A&&A*-A*r2  c                 T    t          |t                    st          |          }||z  S rA   r   r   r4  s      rF   r5  zFileSystem.concat_path  s+     $%% 	::Df}rH   c                 N    t          |t                    st          |          }|S rA   rN  r;  s     rF   r<  zFileSystem.init_path  s$    $%% 	::DrH   r6  c                     t          |t                    st          |          }|                    t          t          |                     d S rA   )r   r   r9  r   r8  s      rF   r9  zFileSystem.rename  sC     $%% 	::DDx(()))))rH   c                 |    t          |t                    st          |          }|                    dd           d S )NT)parentsexist_ok)r   r   r>  r;  s     rF   r>  zFileSystem.mkdir   s;    $%% 	::D

4$
/////rH   r?  c                    t          |t                    rdS dt          |          v rdS t          |          j        D ]E}|                                r/t          j        t          |          t
          j                  r dS FdS )NTz://F)r   r   rR   rR  rE  r  accessW_OK)rB  r?  ps      rF   rC  z!FileSystem.validate_checkpoint_id%  s    mT** 	4C&&&&5m$$, 	 	Axxzz biA88 tturH   c                 r    t          |t                    st          |          }|                                S rA   )r   r   rE  r;  s     rF   rE  zFileSystem.exists3  s-    $%% 	::D{{}}rH   c                 v    t          |t                    st          |          }|                                 d S rA   )r   r   unlinkr;  s     rF   rG  zFileSystem.rm_file8  s0    $%% 	::DrH   c                     t          |t                    st          |          }d |                                D             S )Nc                 ,    g | ]}t          |          S rB   )rR   )rC   rW  s     rF   r   z!FileSystem.ls.<locals>.<listcomp>@  s    ///1A///rH   )r   r   iterdirr;  s     rF   lszFileSystem.ls=  s;    $%% 	::D//////rH   )rN   rO   rP   r
   r   rR   r  rH  r   r   r   r  r5  r<  r9  r>  rI  r   rC  rE  rG  r   r^  rB   rH   rF   r4   r4     s       *#r{*+*36*	29dD(	)* * * ^*#r{*+58	sBK	    eC$45 %R[@P:Q    
*#r{*+*7<S"+=M7N*	* * * *0%R[ 01 0d 0 0 0 0
 5bk9I3J t    [5bk!12 t    
E#r{"23     
0uS"+-. 049 0 0 0 0 0 0rH   r4   c                   d    e Zd ZdZddddddej        fdeeej	        f         de
de
d	ed
ede
deee                  dedededdf fdZd'deeej	        df         ddfdZde
dededdfdZde
fdZdedefdZdee         dee         fdZdededeee                  fdZdedej        deee                  fdZded eee                  ddfd!Z dee!         fd"Z"d'd#ee         dej	        fd$Z#e$deeej	        f         fd%            Z%e&deeej	        f         de
fd&            Z' xZ(S )(_FileSystemWriteraa  
    Basic implementation of StorageWriter using file IO.

    This implementation makes the following assumptions and simplifications:

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

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

    Tr   逖 Nr/  single_file_per_rank
sync_filesr	  per_thread_copy_ahead	overwrite_extensionsr   argskwargsr]   c	                 j   t                                                       t                      | _        | j                            |          | _        || _        || _        || _        || _	        t                      | _        || _        t          |          | _        || _        d| _        d| _        dS )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)superrv   r4   fsr<  r/  rb  rc  r	  rd  ra   save_idre  r   r   r   rankuse_collectives)rL   r/  rb  rc  r	  rd  re  rf  r   rg  rh  	__class__s              rF   rv   z_FileSystemWriter.__init__Q  s    6 	,,G%%d++	$8!$(%:"%''"2;??$8!#'	%)rH   r?  c                 n    |r| j                             |          | _        t                      | _        d S rA   )rk  r<  r/  ra   rl  rL   r?  s     rF   resetz_FileSystemWriter.resetz  s2     	9))-88DI%''rH   is_coordinatorc                 p    |                     d          | _        |                     dd          | _        d S )Nrm  rn  T)getrm  rn  )rL   rs  rg  rh  s       rF   set_up_storage_writerz'_FileSystemWriter.set_up_storage_writer  s4     JJv&&	%zz*;TBBrH   c                     | j         r|                     d           }n|                     d          }| j                            |          S )N)rm  r   )rn  _get_metadata_pathrk  rE  )rL   metadata_paths     rF   _metadata_existsz"_FileSystemWriter._metadata_exists  sQ     	< 333>>MM !333;;Mw~~m,,,rH   planc                 n   | j                             | j                   |                                 rG| j        r(t          j        d| j         d| j        dd           nt          d| j        d          | j        3| 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   )rk  r>  r/  rz  re  warningswarnr   rm  rn  dataclassesreplacerV   rL   r{  s     rF   prepare_local_planz$_FileSystemWriter.prepare_local_plan  s    di     "" 		X~ Xk$) k kY]Yg k k k  !	     ##VDN#V#V#VWWW9 )= &>2Cty2C2C2C#D#D  D rH   plansc                 8    d t          |          D             }|S )Nc           
      t    g | ]5\  }}|j         't          j        |t          d| d                    n|6S )Nr  r   r  )r   r  r  rV   )rC   r   r{  s      rF   r   z9_FileSystemWriter.prepare_global_plan.<locals>.<listcomp>  s_     
 
 
 4  ( >)q)))3L3LMMMM
 
 
rH   )r   )rL   r  	new_planss      rF   prepare_global_planz%_FileSystemWriter.prepare_global_plan  s2    
 
 %U++	
 
 
	 rH   r  c                   	
 |j         
d		
fd}t          j                    }| j        r`t	          | j        |j                  D ]D} |            }| j                            | j	        |          }|
                    |||f           EnM|j        D ]E} |            }| j                            | j	        |          }|
                    |||gf           F|                     ||          S )Nr   c                  6    j           t           } dz  | S )Nr   )rW   DEFAULT_SUFFIX)r%  
file_countstorage_plans    rF   gen_filez._FileSystemWriter.write_data.<locals>.gen_file  s*    '.L
LNLLI!OJrH   )r   r#  Queuerb  r   r	  rJ   rk  r5  r/  r"  _write_data)rL   r{  r  r  r  bucketr%  r/  r   r  r  s            @@rF   
write_dataz_FileSystemWriter.write_data  s   
 (,'8
	 	 	 	 	 	 #(+--
$ 		:1$2CTZPP : :$HJJ	w**49i@@i89999:
 
 : :$HJJ	w**49i@@i$89999444rH   r  c                    t          j                    }g }t          d| j                  D ]r}t	          j        t          | j        j        |||| j	        | j
        | j        | j        | j        f	          }|                                 |                    |           st          | j        j        |||| j	        | j
        | j        | j        | j        	  	         |D ]}|                                 g }	 	 ||                                z  }# t           j        $ r( t%                      }|                    |           |cY S w xY w)Nr   )targetrg  )	r  r  r  r  r   r   r  r	  r   )r#  r  r   r	  	threadingThreadr-  rk  r  r   rd  rc  r   startrx   joinr  r$  r1   
set_result)	rL   r  r  r  threadsr   tresfuts	            rF   r  z_FileSystemWriter._write_data  so   
 %*KMMq$+,, 	 	A .G) O.O%-
  A GGIIINN1'/!% $ :o*!%!:
	
 
	
 
	
 
	
  	 	AFFHHHH	1|..0001{ 	 	 	-3XXCNN3JJJ	s   5D 4EEr  resultsc                    t          j        |t                    }i }|D ]!}|                    d |D                        "||_        |                                 |_        | j        s| j        d| j         t           dn	t           d}t          t          | j                            | j        |                    }| j                            |d          5 }t          j        ||           | j        rR	 t%          j        |                                           n*# t*          t,          f$ r t%          j                     Y nw xY wd d d            n# 1 swxY w Y   | j        s"| j        |                     | j                  }n|                                 }| j                            |          r| j                            |           | j                            ||           d S )N)versionc                 (    i | ]}|j         |j        S rB   )r   r   )rC   wrs     rF   rG   z,_FileSystemWriter.finish.<locals>.<dictcomp>   s    KKKRrxKKKrH   r  z.tmpr  )r  r  r8   updater   storage_metarn  rm  r7   r   r   rk  r5  r/  r  pickledumprc  r  r  r  r   r   r!  rx  rE  rG  r9  )	rL   r  r  
storage_mdwr_listtmp_filenametmp_pathmetadata_filery  s	            rF   finishz_FileSystemWriter.finish  s1   &x9LMMM
 	M 	MGKK7KKKLLLL * $ 1 1 3 3 '',0I,A /.L.... &&& 	
 dg11$)\JJKKW""8T22 	mK-000 H]11334444&(<=   GIIIII	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 # 	6	(= 33DI>>MM 3355M7>>-(( 	+GOOM***x/////s6   E8&DE$EEEEEEc                 8    t          | j        | j                  S )N)r?  rl  )r#   r?  rl  rK   s    rF   r  z_FileSystemWriter.storage_meta  s    );T\RRRRrH   rm  c                     |t            nd| t            }t          t          | j                            | j        |                    S Nr  r7   r   r   rk  r5  r/  rL   rm  filenames      rF   rx  z$_FileSystemWriter._get_metadata_path   E    (,l$$:St:S\:S:SD$'--diBBCCCrH   c                     | j         S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r/  rK   s    rF   r?  z_FileSystemWriter.checkpoint_id$      
 yrH   c                 6    t                               |          S rA   r4   rC  rA  s     rF   rC  z(_FileSystemWriter.validate_checkpoint_id+      00???rH   rA   ))rN   rO   rP   rQ   r6   r[   r   rR   r  rH  r   rT   r   r	   r   r   rv   rr  rv  rz  r(   r  r   r  r)   r1   r/   r  r#  r  r  r!   r  r#   r  rx  r   r?  rI  rC  __classcell__ro  s   @rF   r`  r`  C  s=          &*%/DH4G4R'* '*C$%'* #'* 	'*
 '*  #'* '* h'?@A'* 2'* '* '* 
'* '* '* '* '* '*R( (5bk4)?#@ (D ( ( ( (
C"C+.C:=C	C C C C	-$ 	- 	- 	- 	-x H    (h DN    55 5 
[!	"	5 5 5 5800 K0 
[!	"	0 0 0 0d 0x  0$tK7H2I  0d  0  0  0  0DSh{3 S S S SD Dx} D D D D D uS"+%56    X @5bk9I3J @t @ @ @ [@ @ @ @ @rH   r`  c            	       l    e Zd ZdZd
dee         ddfdZdedee	         de
e         de
e         fd	ZdS )_StorageReaderTransformsr   Nextension_registryr]   c                 4    |t                      n|| _        d S rA   )r   r  )rL   r  s     rF   rv   z!_StorageReaderTransforms.__init__7  s%    #5#=CU 	rH   	read_itemr>   r   c                     | j                             |          }|}|D ],}t          |t                    r|                    |          }-|S rA   )r  from_descriptor_listr   r   transform_from)rL   r  r>   r   r   r  r   s          rF   transform_load_streamz._StorageReaderTransforms.transform_load_stream<  s_     ,AABWXX
# 	C 	CB"677 C!#!2!2>!B!BrH   rA   )rN   rO   rP   rQ   r   r   rv   r'   r	   rR   r   r   r  rB   rH   rF   r  r  0  s         
 
84E+F 
RV 
 
 
 

  (} uI	
 
E     rH   r  c            
           e Zd Z	 ddeeej        f         dee         ddf fdZ	de
dee         fdZddeeej        df         ddfd	Zd
ededed         fdZddee         dej        fdZdededefdZdededededdf
dZd
edefdZdee         dee         fdZedeeej        f         fd            Zedeeej        f         defd            Z  xZ!S )r3   Nr/  _extension_registryr]   c                 $   t                                                       t                      | _        | j                            |          | _        i | _        t                      | _        t          |          | _
        d | _        d| _        d S r   )rj  rv   r4   rk  r<  r/  r   ra   load_idr  r   rm  rn  )rL   r/  r  ro  s      rF   rv   zFileSystemReader.__init__K  sw    
 	,,G%%d++	,.%''23FGG	#rH   sinfoc                 t    t          t          t                   t          ||j        |j                            S rA   )r   r   r   r0   r<   r=   )rL   filer  s      rF   _slice_filezFileSystemReader._slice_fileY  s'    BuI0u|U\RRSSSrH   r?  c                 |    i | _         |r| j                            |          | _        t	                      | _        d S rA   )r   rk  r<  r/  ra   r  rq  s     rF   rr  zFileSystemReader.reset\  s:     	9))-88DI%''rH   r{  r  c                    i }|j         D ]D}| j        |j                 }|j        }|                    |g                               |           E|                                 D ]i\  }}| j                            | j        |          }	| j        	                    |	d          5 }
|D ]}| j        |j                 }| 
                    |
|          }| j                            ||j        pd|          }|j        t          j        k    rSt#          j        |                    d                    }|                    d           |                    ||           |                                r|}n<t#          j        |                    d                    }|                    d           t/          t0          t3          j        |dd                    }t7          ||j        |j                  }|                    |                                          }|                                 |                                 k    rAtC          d|j         d	|                                  d
|                                            |"                    |           |#                    ||           	 d d d            n# 1 swxY w Y   ktI                      }|%                    d            |S )NrbrB   r   r|   T)map_locationweights_onlyzreq z mismatch sizes z vs )&rJ   r   storage_indexr;   
setdefaultrx   rk  r5  r/  r  r  r   r  r>   r   r$   r   r   r   readseek
load_bytesseekabler   r   rq   loadr   storage_offsetslengthsresolve_tensorr{   rd   r   copy_commit_tensorr1   r  )rL   r{  r  per_filer  item_mdr/  r;   reqsr6  r   req
file_slicer  
read_bytesr  r   target_tensorr  s                      rF   	read_datazFileSystemReader.read_datab  s?   .0 	< 	<I$($5i6M$NG(Db))00;;;;#+>>#3#3 .	B .	BM4w**49mDDH&&x66 ,B& *B *BC"/0ABG!%!1!1&'!B!BJ%)_%J%J  5;"& &N x<#777%'Z0C0CB0G0G%H%H
"*****3
;;;;)2244 -'5HH (*z.2E2Eb2I2I'J'JH$MM!,,,!%"!J (-2-1  " " "8"C$7" " )0(>(>s(C(C(J(J(L(L(--//6;;==@@"0 ss'8 s s-J\J\J^J^ s sdjdododqdq s s# #  &++F333--c=AAAAU*B,B ,B ,B ,B ,B ,B ,B ,B ,B ,B ,B ,B ,B ,B ,B\ hht
s   $HKK	K	rm  c                     |t            nd| t            }t          t          | j                            | j        |                    S r  r  r  s      rF   rx  z#FileSystemReader._get_metadata_path  r  rH   rg  rh  c                 R   |                     d          }|                     |          }| j                            |d          5 }t	          j        |          }d d d            n# 1 swxY w Y   t          |dd           t                      |_        | j	        |j        _	        |S )Nrm  r  r  )
ru  rx  rk  r  r  r  r  r#   r  r  )rL   rg  rh  rm  r/  r  r  s          rF   read_metadatazFileSystemReader.read_metadata  s    zz&!!&&t,,W""4.. 	2-{=11H	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 8^T22:$/MMH!(,%s   A''A+.A+r  rs  c                     |j         | _         |                    d          | _        |                    dd          | _        | j         t	          d          d S )Nrm  rn  Tz)storage_data must not be None in metadata)r   ru  rm  rn  r   )rL   r  rs  rg  rh  s        rF   set_up_storage_readerz&FileSystemReader.set_up_storage_reader  sY     %1JJv&&	%zz*;TBB$ !LMMM %$rH   c                     |S rA   rB   r  s     rF   r  z#FileSystemReader.prepare_local_plan  s    rH   r  c                     |S rA   rB   )rL   r  s     rF   r  z$FileSystemReader.prepare_global_plan  s    rH   c                     | j         S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        r  rK   s    rF   r?  zFileSystemReader.checkpoint_id  r  rH   c                 6    t                               |          S rA   r  rA  s     rF   rC  z'FileSystemReader.validate_checkpoint_id  r  rH   rA   )"rN   rO   rP   r   rR   r  rH  r   r   rv   r:   r   r   r  rr  r%   r&   r1   r  rT   rx  r   r!   r  r   r  r  r   r  r   r?  rI  rC  r  r  s   @rF   r3   r3   J  sj        <@$ $C$%$ &&78$ 
	$ $ $ $ $ $T| T5	 T T T T( (5bk4)?#@ (D ( ( ( (:h : : : : : :xD Dx} D D D D D

3 
# 
( 
 
 
 
N N26N?BNNQN	N N N Nx H    h DN     uS"+%56    X @5bk9I3J @t @ @ @ [@ @ @ @ @rH   r3   c                        e Zd ZdZdddddddej        fdeeej	        f         de
d	e
d
edede
de
deee                  deddfdZdedef fdZ xZS )r2   a  
    Basic implementation of StorageWriter using file IO.

    This implementation makes the following assumptions and simplifications:

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

    The checkpoint consist of one file per write request plus
    a global `.metadata` file with the serialized metadata if rank coordination is enabled.
    a rank local `__{rank}.metadata` file with the serialized metadata if rank coordination is NOT enabled.

    Tr   ra  FNr/  rb  rc  r	  rd  cache_staged_state_dictre  rf  r   r]   c
                 x    t                               | ||||||||		  	         t          j        | |           dS )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/  rb  rc  r	  rd  re  rf  r   )r  N)r`  rv   r,   )
rL   r/  rb  rc  r	  rd  r  re  rf  r   s
             rF   rv   zFileSystemWriter.__init__  sh    : 	""!5!%"7#!5 	# 
	
 
	
 
	
 	$$;	
 	
 	
 	
 	
 	
rH   
state_dictc                 T    d| _         t                                          |          S )zOverride of AsyncStager.stager   )rd  rj  stage)rL   r  ro  s     rF   r  zFileSystemWriter.stage  s#     &'"ww}}Z(((rH   )rN   rO   rP   rQ   r6   r[   r   rR   r  rH  r   rT   r   r	   r   rv   r"   r  r  r  s   @rF   r2   r2     s        " &*%/(-DH4G4R+
 +
C$%+
 #+
 	+

 +
  #+
 "&+
 +
 h'?@A+
 2+
 
+
 +
 +
 +
Z) )O ) ) ) ) ) ) ) ) ) )rH   r2   )jr   r  r   r  r   r  r  r#  r  r_   r  abcr   r   collections.abcr   r   r   r   r	   
contextlibr
   r   enumr   r   pathlibr   typingr   r   r   r   r   r   typing_extensionsr   rq   r   torch._utilsr   r   torch.distributed._shard._utilsr   'torch.distributed.checkpoint._extensionr   r   &torch.distributed.checkpoint._hf_utilsr   r   r   r   r    %torch.distributed.checkpoint.metadatar!   r"   r#   $torch.distributed.checkpoint.plannerr$   r%   r&   r'   r(   r)   r*   r+   $torch.distributed.checkpoint.stagingr,   $torch.distributed.checkpoint.storager-   r.   r/   "torch.distributed.checkpoint.utilsr0   torch.futuresr1   __all__r7   rR   rS   r8   r:   rV   r6   r  ra   rc   rs   r   r   rT   r   r   r   r   r   r  r  r   r-  r5   r4   r`  r  r3   r2   rB   rH   rF   <module>r     s*            				   				         # # # # # # # # M M M M M M M M M M M M M M % % % % % % ! ! ! ! ! !       # # # # # #       8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 % $ $ $ $ $        G G G G G G G G B B B B B B                     Y X X X X X X X X X	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 E D D D D D         
 A @ @ @ @ @                c   ") U3Z ) ) ) 	I 	I 	I 	I 	I 	I 	I 	I                 $      
         C       }   .X" X" X" X" X"M X" X" X"v0Y 0Y 0Y 0Y 0Y 0Y 0Y 0Yf	4Y 	43 	4 	4 	4 	4# d9o $tIBW    04(4I4 
EL(
)4 	4
 4 .4 4 4 4 4nggg +g 	g
 )g g g g .g 
g g g gTB B B B BS B B BD>0 >0 >0 >0 >0 >0 >0 >0Bj@ j@ j@ j@ j@ j@ j@ j@Z       4}@ }@ }@ }@ }@} }@ }@ }@@A) A) A) A) A)(*= A) A) A) A) A)rH   