
    Wj                     V   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZm Z  d d
l!m"Z" d dl#Z#d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZCmDZDmEZE d dlFmGZG d dlHmIZI g dZJdZKeLeMd<   dZNeeL         eMd<   e G d d                      ZOe G d d                      ZP G d d e          ZQd!ZRd"eLfd#ZS G d$ d%e          ZT G d& d'eT          ZU G d( d)eT          ZV G d* d+          ZWd,e>d"eXfd-ZYd.eXd/eZe>         d"eZeZe>                  fd0Z[d1eWd2ej\        d3ej]        e#j$        z  d4e>d5eLd6eQd"eEfd7Z^d8ed9ej_        d:ej_        d;e=d1eWd<eXd=e`d>eXd6eQd"dfd?Za G d@ dAe          Zb G dB dCeb          Zc G dD dEeD          Zd G dF dG          Ze G dH dIeC          Zf G dJ dKedeA          ZgdS )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    e Zd ZU dZeed<   eed<   eed<   dZee         dz  ed<   d Z	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/home/longshao/multi-rider-rag/.venv/lib/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    rD   __getstate__z_StorageInfo.__getstate__S   s$    HH!4!4!6!6HHHHrF   )
__name__
__module____qualname____doc__str__annotations__intr<   r	   rK   r@   rF   rD   r8   r8   J   sh         --KKKKKK268C=4/666I I I I IrF   r8   c                       e Zd ZU eed<   dS )_StoragePrefixprefixN)rL   rM   rN   rP   rQ   r@   rF   rD   rT   rT   W   s         KKKKKrF   rT   c                       e Zd ZdZdZdS )r4   
torch_savesafetensorsN)rL   rM   rN   
TORCH_SAVESAFETENSORSr@   rF   rD   r4   r4   \   s        JKKKrF   r4   z.distcpreturnc                  B    t          t          j                              S r?   )rP   uuiduuid4r@   rF   rD   _generate_uuidr_   d   s    tz||rF   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 r?   r@   rJ   rb   rc   s      rD   addz_TensorLoader.addi       rF   c                     d S r?   r@   rI   s    rD   start_loadingz_TensorLoader.start_loadingm   rg   rF   c                     d S r?   r@   rI   s    rD   valuesz_TensorLoader.valuesq   rg   rF   r[   N)rL   rM   rN   r   rR   objectrf   ri   r   tupletorchr   rk   r@   rF   rD   ra   ra   h   s         & T    ^    ^ u|V';!<=    ^  rF   ra   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 r?   )rr   rH   )rJ   rr   s     rD   __init__z_SerialCpuLoader.__init__w   s    &/1


rF   rb   rc   c                 >    | j                             ||f           d S r?   )rH   appendre   s      rD   rf   z_SerialCpuLoader.add{   s"    
4+&&&&&rF   c                     d S r?   r@   rI   s    rD   ri   z_SerialCpuLoader.start_loading~   s    rF   c              #   ,  K   | j         D ]\  }}|                     |                                          }|                                }|                                                                |j        k    r|                                }||fV  d S r?   )rH   rr   detachcpuuntyped_storagerb   nbytesclonerJ   _rc   tensors       rD   rk   z_SerialCpuLoader.values   s      j 		 		FAs%%c**1133FZZ\\F%%'',,..&-??    		 		rF   rl   )rL   rM   rN   r   rt   rR   rm   rf   ri   r   rn   ro   r   rk   r@   rF   rD   rq   rq   v   s        2H 2 2 2 2 2' '& 'T ' ' ' '   
u|V';!<= 
 
 
 
 
 
rF   rq   c            	          e Zd Z	 	 ddedej        dz  deddfdZede	fd            Z
deeej        ef                  fd	Zdd
Zdeeej        ef                  fdZdededdfdZddZdeeej        ef                  fdZdS )_OverlappingCpuLoaderN@B rr   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)rr   rH   r   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   ro   cudaStreamcurrent_streamr   wait_stream)rJ   rr   r   r   s       rD   rt   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 >=rF   c                 <    | j         t          | j                  k    S r?   )r   lenrH   rI   s    rD   _donez_OverlappingCpuLoader._done   s    x3tz??**rF   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   popleftnumelelement_sizerv   )rJ   drainedvals      rD   _drainz_OverlappingCpuLoader._drain   s    $":::K##%%%!T%===$,,..C3q6<<>>CF4G4G4I4I#IINN3 !T%=== rF   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   rz   T)devicenon_blocking)r   r   r   r   r   rH   r   rr   ry   r   typer   toro   r{   rb   r   itemsizer}   r   rv   r   r~   s       rD   _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   rI   s    rD   _finishz_OverlappingCpuLoader._finish   sO    z 	S !QRRRt!""Q&&K##%%%!!rF   rb   rc   c                 j    | j         rt          d          | j                            ||f           d S )Nz&cannot add items after loading started)r   RuntimeErrorrH   rv   re   s      rD   rf   z_OverlappingCpuLoader.add   s<    < 	IGHHH
4+&&&&&rF   c                     | j         rd S d| _         | j                            t          j        d                     |                                  d S )NTr   key)r   rH   sortoperator
itemgetterr   rI   s    rD   ri   z#_OverlappingCpuLoader.start_loading   sJ    < 	F
H/22333rF   c              #      K   |                                   | j        s7|                                 }|                                  |E d {V  | j        7|                                 E d {V  d S r?   )ri   r   r   r   r   )rJ   r   s     rD   rk   z_OverlappingCpuLoader.values   s      * 	kkmmGLLNNN * 	
 <<>>!!!!!!!!!rF   )Nr   rl   )rL   rM   rN   r   ro   r   rR   rt   propertyboolr   listrn   r   rm   r   r   r   r   rf   ri   r   rk   r@   rF   rD   r   r      sk        '+#,	I II t#I !	I
 
I I I I. +t + + + X+U5<#789    N N N N0"%f(<"=> " " " "' '& 'T ' ' ' '
   "u|V';!<= " " " " " "rF   r   c            	       ~    e Zd ZdZ	 d	dee         dz  ddfdZdedej	        de
ee         ee         f         fdZ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.
        Nr@   )r   )rJ   r   s     rD   rt   z!_StorageWriterTransforms.__init__   s     !+ 2""
rF   
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 r?   )r   )rJ   r   s     rD   rt   zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__  s    rF   r[   c                     dS NTr@   rI   s    rD   	writeablezO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable	  s    trF   bc                 6    | j                             |          S r?   )r   write)rJ   r   s     rD   r   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.write  s    x~~a(((rF   c                 `    |                                   | j                                          d S r?   )flushr   rI   s    rD   closezK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.close  s'    

     rF   N)rL   rM   rN   ioIOBasert   r   r   r   rR   r   r   r@   rF   rD   NoCloseWriterr     s}        BI    4    )v )# ) ) ) )! ! ! ! !rF   r   c                 6    g | ]}|                                 S r@   )get_descriptor)rA   exs     rD   
<listcomp>zB_StorageWriterTransforms.transform_save_stream.<locals>.<listcomp>  s$    WWWrr0022WWWrF   )r   r   r   r   bytesr   transform_toreversed)rJ   r   r   r   r   r   s         rD   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XrF   r?   )rL   rM   rN   rO   r	   r   rt   r(   r   r   rn   r   r   r   rP   r   r@   rF   rD   r   r      s          GK	C 	C"#;<tC	C		C 	C 	C 	CY#Y13Y	r%y$s)#	$Y Y Y Y Y YrF   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   rb   
propertiesdtypero   _utils_element_size)r   rb   sr   s       rD   
_item_sizer     sh    DEFFF"  	'-E%,,,U3333rF   binsrH   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 r@   r   r)   BYTE_IOrA   wis     rD   r   z+_split_by_size_and_type.<locals>.<listcomp>,  s'    FFFbRW0E%E%Er%E%E%ErF   c                 <    g | ]}|j         t          j        k    |S r@   r   r   s     rD   r   z+_split_by_size_and_type.<locals>.<listcomp>-  s'    GGGrbg1F&F&F&F&F&FrF   c                     g | ]}g S r@   r@   rA   r   s     rD   r   z+_split_by_size_and_type.<locals>.<listcomp>/  s    %>%>%>Qb%>%>%>rF   c                     g | ]}d S )r   r@   r   s     rD   r   z+_split_by_size_and_type.<locals>.<listcomp>0  s    +++!A+++rF   T)r   reverser   r   )ranger   r   	enumeraterv   minr   r   )	r   rH   bytes_wtensor_wbucketsbucket_sizesir   r   s	            rD   _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^^+NrF   
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 itemsrz   zTensor must be on CPU devicer   )r<   )indexsize_in_bytesstorage_data)tellr   r   r)   r   
isinstancer   BytesIOr   r   	getbufferro   r   r   r4   rY   saver   r   r   r   r-   r   r8   )r   r   r   r   r   r   r:   r   r<   r;   info_transform_descriptorss              rD   _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  !"<	
 
 
	 	 	 	rF   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 r@   r   r   s     rD   r   z+_write_files_from_queue.<locals>.<listcomp>  s'    UUUrBG}?T4T4T4T4T4TrF   c                 <    g | ]}|j         t          j        k    |S r@   r   r   s     rD   r   z+_write_files_from_queue.<locals>.<listcomp>  s'    TTTb27m>S3S3Sr3S3S3SrF   wbzTensor must be on CPUsaved_offsets)r   )metadata).
get_nowaitro   _C_get_privateuse1_backend_namegetattrr   is_availabler   resolve_datarq   rf   r   ri   rv   r  rk   is_cpur   r   fqnr   chunkoffsetsr4   rZ   safetensors.torchr   r   r   jsondumpsr   rP   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                            rD   _write_files_from_queuer+  w  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                      e Zd Zeedeej        z  dedee	j
        ddf         fd                        Zedeej        z  dedeej        z  fd            Zedeej        z  deej        z  ddfd	            Zedeej        z  deej        z  fd
            Zedeej        z  ddfd            Zeedeej        z  defd                        Zedeej        z  defd            Zedeej        z  ddfd            ZdS )r3   pathmoder[   Nc                     d S r?   r@   )rJ   r-  r.  s      rD   r  zFileSystemBase.create_stream  s	     ,/3rF   suffixc                     d S r?   r@   rJ   r-  r0  s      rD   concat_pathzFileSystemBase.concat_path  s	      CrF   new_pathc                     d S r?   r@   rJ   r-  r4  s      rD   renamezFileSystemBase.rename  s    TWTWrF   c                     d S r?   r@   rJ   r-  s     rD   	init_pathzFileSystemBase.init_path  s    GJsrF   c                     d S r?   r@   r9  s     rD   mkdirzFileSystemBase.mkdir  s    69crF   checkpoint_idc                     d S r?   r@   clsr=  s     rD   validate_checkpoint_idz%FileSystemBase.validate_checkpoint_id  s    ORsrF   c                     d S r?   r@   r9  s     rD   existszFileSystemBase.exists  s    7:srF   c                     d S r?   r@   r9  s     rD   rm_filezFileSystemBase.rm_file  s    8;rF   )rL   rM   rN   r
   r   rP   r  PathLiker   r   r   r  r3  r7  r:  r<  classmethodr   rA  rC  rE  r@   rF   rD   r3   r3     s       /"+%/-0/	29dD(	)/ / / ^ ^/  "+% /2 	r{	      ^  W3,Wbk8IWdWWW ^WJcBK/JC"+4EJJJ ^J9#+9999 ^9R33DRRRR ^ [R:3,:::: ^:;C"+-;$;;; ^;;;rF   r3   c            
          e Zd Zedeej        z  dedeej	        ddf         fd            Z
deej        z  dedeej        z  fdZdeej        z  deej        z  fdZdeej        z  d	eej        z  ddfd
Zdeej        z  ddfdZedeej        z  defd            Zdeej        z  defdZdeej        z  ddfdZdeej        z  dee         fdZdS )r2   r-  r.  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 r?   )r   r   openr   r   r   )rJ   r-  r.  r   s       rD   r  zFileSystem.create_stream  s       $%% 	::DYYt__ 	*ry&)))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   A&&A*-A*r0  c                 T    t          |t                    st          |          }||z  S r?   r   r   r2  s      rD   r3  zFileSystem.concat_path  s)    $%% 	::Df}rF   c                 N    t          |t                    st          |          }|S r?   rL  r9  s     rD   r:  zFileSystem.init_path  s$    $%% 	::DrF   r4  c                     t          |t                    st          |          }|                    t          t          |                     d S r?   )r   r   r7  r   r6  s      rD   r7  zFileSystem.rename  sA    $%% 	::DDx(()))))rF   c                 |    t          |t                    st          |          }|                    dd           d S )NT)parentsexist_ok)r   r   r<  r9  s     rD   r<  zFileSystem.mkdir  s;    $%% 	::D

4$
/////rF   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   rP   rP  rC  r  accessW_OK)r@  r=  ps      rD   rA  z!FileSystem.validate_checkpoint_id   s    mT** 	4C&&&&5m$$, 	 	Axxzz biA88 tturF   c                 r    t          |t                    st          |          }|                                S r?   )r   r   rC  r9  s     rD   rC  zFileSystem.exists.  s-    $%% 	::D{{}}rF   c                 v    t          |t                    st          |          }|                                 d S r?   )r   r   unlinkr9  s     rD   rE  zFileSystem.rm_file3  s0    $%% 	::DrF   c                     t          |t                    st          |          }d |                                D             S )Nc                 ,    g | ]}t          |          S r@   )rP   )rA   rU  s     rD   r   z!FileSystem.ls.<locals>.<listcomp>;  s    ///1A///rF   )r   r   iterdirr9  s     rD   lszFileSystem.ls8  s;    $%% 	::D//////rF   )rL   rM   rN   r
   rP   r  rF  r   r   r   r  r3  r:  r7  r<  rG  r   rA  rC  rE  r   r\  r@   rF   rD   r2   r2     s       *"+%*-0*	29dD(	)* * * ^*bk 1 3 3CT    
cBK/ C"+4E    
*3, *bk8I *d * * * *0#+ 0 0 0 0 0
 33D     [3,     
C"+- $    
0sR[( 0T#Y 0 0 0 0 0 0rF   r2   c                   .    e Zd ZdZddddddej        fdeej        z  de	de	d	e
d
e
de	dee         dz  dedededdf fdZd'deej        z  dz  ddfdZde	dededdfdZde	fdZdedefdZdee         dee         fdZdededeee                  fdZdedej        deee                  fdZded eee                  ddfd!Zdedz  fd"Z d'd#e
dz  dej        fd$Z!e"deej        z  fd%            Z#e$deej        z  de	fd&            Z% xZ&S )(_FileSystemWriteraa  
    Basic implementation of StorageWriter using file IO.

    This implementation makes the following assumptions and simplifications:

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

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

    Tr   逖 Nr-  single_file_per_rank
sync_filesr  per_thread_copy_ahead	overwrite_extensionsr   args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)superrt   r2   fsr:  r-  r`  ra  r  rb  r_   save_idrc  r   r   r   rankuse_collectives)rJ   r-  r`  ra  r  rb  rc  rd  r   re  rf  	__class__s              rD   rt   z_FileSystemWriter.__init__L  s    6 	,,G%%d++	$8!$(%:"%''"2;??$8! $	%)rF   r=  c                 n    |r| j                             |          | _        t                      | _        d S r?   )ri  r:  r-  r_   rj  rJ   r=  s     rD   resetz_FileSystemWriter.resetu  s2     	9))-88DI%''rF   is_coordinatorc                 p    |                     d          | _        |                     dd          | _        d S )Nrk  rl  T)getrk  rl  )rJ   rq  re  rf  s       rD   set_up_storage_writerz'_FileSystemWriter.set_up_storage_writerz  s4     JJv&&	%zz*;TBBrF   c                     | j         r|                     d           }n|                     d          }| j                            |          S )N)rk  r   )rl  _get_metadata_pathri  rC  )rJ   metadata_paths     rD   _metadata_existsz"_FileSystemWriter._metadata_exists  sQ     	< 333>>MM !333;;Mw~~m,,,rF   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   )ri  r<  r-  rx  rc  warningswarnr   rk  rl  dataclassesreplacerT   rJ   ry  s     rD   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 rF   plansc                 8    d t          |          D             }|S )Nc           
      t    g | ]5\  }}|j         't          j        |t          d| d                    n|6S )Nr~  r   r  )r   r  r  rT   )rA   r   ry  s      rD   r   z9_FileSystemWriter.prepare_global_plan.<locals>.<listcomp>  s_     
 
 
 4  ( >)q)))3L3LMMMM
 
 
rF   )r   )rJ   r  	new_planss      rD   prepare_global_planz%_FileSystemWriter.prepare_global_plan  s2    
 
 %U++	
 
 
	 rF   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   )rU   DEFAULT_SUFFIX)r#  
file_countstorage_plans    rD   gen_filez._FileSystemWriter.write_data.<locals>.gen_file  s*    '.L
LNLLI!OJrF   )r   r!  Queuer`  r   r  rH   ri  r3  r-  r   _write_data)rJ   ry  r  r  r  bucketr#  r-  r   r  r  s            @@rD   
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4rF   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   )targetre  )	r  r  r  r  r   r   r  r  r   )r!  r  r   r  	threadingThreadr+  ri  r  r   rb  ra  r   startrv   joinr  r"  r/   
set_result)	rJ   r  r  r  threadsr   tresfuts	            rD   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 r@   )r   r   )rA   wrs     rD   rE   z,_FileSystemWriter.finish.<locals>.<dictcomp>  s    KKKRrxKKKrF   r~  z.tmpr  )r  r  r6   updater   storage_metarl  rk  r5   r   r   ri  r3  r-  r  pickledumpra  r  r  r  r  r   r  rv  rC  rE  r7  )	rJ   r  r  
storage_mdwr_listtmp_filenametmp_pathmetadata_filerw  s	            rD   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=  rj  )r!   r=  rj  rI   s    rD   r  z_FileSystemWriter.storage_meta  s    );T\RRRRrF   rk  c                     |t            nd| t            }t          t          | j                            | j        |                    S Nr~  r5   r   r   ri  r3  r-  rJ   rk  filenames      rD   rv  z$_FileSystemWriter._get_metadata_path  E    (,l$$:St:S\:S:SD$'--diBBCCCrF   c                     | j         S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r-  rI   s    rD   r=  z_FileSystemWriter.checkpoint_id      
 yrF   c                 6    t                               |          S r?   r2   rA  r?  s     rD   rA  z(_FileSystemWriter.validate_checkpoint_id&      00???rF   r?   )'rL   rM   rN   rO   r4   rY   rP   r  rF  r   rR   r	   r   r   rt   rp  rt  rx  r&   r  r   r  r'   r/   r-   r  r!  r  r  r   r  r!   r  rv  r   r=  rG  rA  __classcell__rm  s   @rD   r^  r^  >  s,          &*%/AE4G4R'* '*BK'* #'* 	'*
 '*  #'* '* 67$>'* 2'* '* '* 
'* '* '* '* '* '*R( (3#4t#; (t ( ( ( (
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kD0 S S S SD DsTz DR[ D D D D sR[0    X @33D @ @ @ @ [@ @ @ @ @rF   r^  c            	       f    e Zd ZdZd
dedz  ddfdZdedee         de	e
         de	e
         fd	ZdS )_StorageReaderTransformsr   Nextension_registryr[   c                 4    |t                      n|| _        d S r?   )r   r  )rJ   r  s     rD   rt   z!_StorageReaderTransforms.__init__2  s%    #5#=CU 	rF   	read_itemr<   r   c                     | j                             |          }|}|D ],}t          |t                    r|                    |          }-|S r?   )r  from_descriptor_listr   r   transform_from)rJ   r  r<   r   r   r  r   s          rD   transform_load_streamz._StorageReaderTransforms.transform_load_stream7  s_     ,AABWXX
# 	C 	CB"677 C!#!2!2>!B!BrF   r?   )rL   rM   rN   rO   r   rt   r%   r	   rP   r   r   r  r@   rF   rD   r  r  +  s         
 
+<t+C 
t 
 
 
 

  (} uI	
 
E     rF   r  c            
           e Zd Z	 ddeej        z  dedz  ddf fdZdede	e
         fdZddeej        z  dz  ddfd	Zd
ededed         fdZddedz  dej        fdZdededefdZdededededdf
dZd
edefdZdee         dee         fdZedeej        z  fd            Zedeej        z  defd            Z xZS )r1   Nr-  _extension_registryr[   c                 $   t                                                       t                      | _        | j                            |          | _        i | _        t                      | _        t          |          | _
        d | _        d| _        d S r   )rh  rt   r2   ri  r:  r-  r   r_   load_idr  r   rk  rl  )rJ   r-  r  rm  s      rD   rt   zFileSystemReader.__init__F  sw    
 	,,G%%d++	,.%''23FGG	#rF   sinfoc                 t    t          t          t                   t          ||j        |j                            S r?   )r   r   r   r.   r:   r;   )rJ   filer  s      rD   _slice_filezFileSystemReader._slice_fileT  s'    BuI0u|U\RRSSSrF   r=  c                 |    i | _         |r| j                            |          | _        t	                      | _        d S r?   )r   ri  r:  r-  r_   r  ro  s     rD   rp  zFileSystemReader.resetW  s:     	9))-88DI%''rF   ry  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rbr@   r   rz   T)map_locationweights_onlyzreq z mismatch sizes z vs )&rH   r   storage_indexr9   
setdefaultrv   ri  r3  r-  r  r  r   r  r<   r   r"   r   r   r   readseek
load_bytesseekabler   r   ro   loadr   storage_offsetslengthsresolve_tensorry   rb   r   copy_commit_tensorr/   r  )rJ   ry  r  per_filer  item_mdr-  r9   reqsr4  r   req
file_slicer  
read_bytesr  r   target_tensorr  s                      rD   	read_datazFileSystemReader.read_data]  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	rk  c                     |t            nd| t            }t          t          | j                            | j        |                    S r  r  r  s      rD   rv  z#FileSystemReader._get_metadata_path  r  rF   re  rf  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 )Nrk  r  r  )
rs  rv  ri  r  r  r  r  r!   r  r  )rJ   re  rf  rk  r-  r  r  s          rD   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  rq  c                     |j         | _         |                    d          | _        |                    dd          | _        | j         t	          d          d S )Nrk  rl  Tz)storage_data must not be None in metadata)r   rs  rk  rl  r   )rJ   r  rq  re  rf  s        rD   set_up_storage_readerz&FileSystemReader.set_up_storage_reader  sY     %1JJv&&	%zz*;TBB$ !LMMM %$rF   c                     |S r?   r@   r  s     rD   r  z#FileSystemReader.prepare_local_plan  s    rF   r  c                     |S r?   r@   )rJ   r  s     rD   r  z$FileSystemReader.prepare_global_plan  s    rF   c                     | j         S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        r  rI   s    rD   r=  zFileSystemReader.checkpoint_id  r  rF   c                 6    t                               |          S r?   r  r?  s     rD   rA  z'FileSystemReader.validate_checkpoint_id  r  rF   r?   ) rL   rM   rN   rP   r  rF  r   rt   r8   r   r   r  rp  r#   r$   r/   r  rR   rv  r   r   r  r   r  r  r   r  r   r=  rG  rA  r  r  s   @rD   r1   r1   E  sW        9=$ $BK$ /5$ 
	$ $ $ $ $ $T| T5	 T T T T( (3#4t#; (t ( ( ( (:h : : : : : :xD DsTz DR[ D D D D

3 
# 
( 
 
 
 
N N26N?BNNQN	N N N Nx H    h DN     sR[0    X @33D @ @ @ @ [@ @ @ @ @rF   r1   c                        e Zd ZdZdddddddej        fdeej        z  de	d	e	d
e
de
de	de	dee         dz  deddfdZdedef fdZ xZS )r0   a  
    Basic implementation of StorageWriter using file IO.

    This implementation makes the following assumptions and simplifications:

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

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

    Tr   r_  FNr-  r`  ra  r  rb  cache_staged_state_dictrc  rd  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-  r`  ra  r  rb  rc  rd  r   )r  N)r^  rt   r*   )
rJ   r-  r`  ra  r  rb  r  rc  rd  r   s
             rD   rt   zFileSystemWriter.__init__  sh    : 	""!5!%"7#!5 	# 
	
 
	
 
	
 	$$;	
 	
 	
 	
 	
 	
rF   
state_dictc                 T    d| _         t                                          |          S )zOverride of AsyncStager.stager   )rb  rh  stage)rJ   r  rm  s     rD   r  zFileSystemWriter.stage  s#     &'"ww}}Z(((rF   )rL   rM   rN   rO   r4   rY   rP   r  rF  r   rR   r	   r   rt   r    r  r  r  s   @rD   r0   r0     s         " &*%/(-AE4G4R+
 +
BK+
 #+
 	+

 +
  #+
 "&+
 +
 67$>+
 2+
 
+
 +
 +
 +
Z) )O ) ) ) ) ) ) ) ) ) )rF   r0   )hr   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   typing_extensionsr   ro   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   rP   rQ   r6   r8   rT   r4   r  r_   ra   rq   r   r   rR   r   r   r   r   r   r  r  r   r+  r3   r2   r^  r  r1   r0   r@   rF   rD   <module>r
     s            				   				         # # # # # # # # M M M M M M M M M M M M M M % % % % % % ! ! ! ! ! !       # # # # # #       ' ' ' ' ' ' ' ' ' ' ' ' % $ $ $ $ $        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       }   0X" 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 *u|
#4 	4
 4 .4 4 4 4 4nggg +g 	g
 )g g g g .g 
g g g gT< < < < <S < < <@:0 :0 :0 :0 :0 :0 :0 :0zj@ j@ j@ j@ j@ j@ j@ j@Z       4}@ }@ }@ }@ }@} }@ }@ }@@A) A) A) A) A)(*= A) A) A) A) A)rF   