o
    h                     @   s  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
mZmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ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+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z= d dl>m?Z? d dl@mAZA g dZBdZCeDeEd< eG dd dZFeG dd dZGdZHdeDfddZIG dd  d eZJG d!d" d"eJZKG d#d$ d$eJZLG d%d& d&ZMd'e6deNfd(d)ZOd*eNd+ePe6 dePePe6  fd,d-ZQ	.dLd/eMd0ejRd1eejSe!j"f d2e6d3eDd4eTde=fd5d6ZUd7ed8ejVd9ejVd:e5d/eMd;eNd<eTd=eNd4eTddfd>d?ZWG d@dA dAeZXG dBdC dCeXZYG dDdE dEe<ZZG dFdG dGZ[G dHdI dIe;Z\G dJdK dKeZe9Z]dS )M    N)ABCabstractmethod)	GeneratorIterableIteratorSequence)contextmanager)	dataclass)UnsupportedOperation)Path)AnyCallablecastIOOptionalUnion)Buffer)Tensor)_get_available_device_type_get_device_module)narrow_tensor_by_index)ExtensionRegistryStreamTransformExtension)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	.metadata_metadata_fnc                   @   sF   e Zd ZU dZeed< eed< eed< dZee	e  ed< dd Z
dS )	_StorageInfoz#This is the per entry storage info.relative_pathoffsetlengthNtransform_descriptorsc                 C   s   dd | j  D S )Nc                 S   s   i | ]\}}|d ur||qS N ).0kvr6   r6   {/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torch/distributed/checkpoint/filesystem.py
<dictcomp>C   s    z-_StorageInfo.__getstate__.<locals>.<dictcomp>)__dict__itemsselfr6   r6   r:   __getstate__B      z_StorageInfo.__getstate__)__name__
__module____qualname____doc__str__annotations__intr4   r   r   r@   r6   r6   r6   r:   r0   9   s   
 r0   c                   @   s   e Zd ZU eed< dS )_StoragePrefixprefixN)rB   rC   rD   rF   rG   r6   r6   r6   r:   rI   F   s   
 rI   z.distcpreturnc                   C   s   t t S r5   )rF   uuiduuid4r6   r6   r6   r:   _generate_uuidN      rN   c                   @   sT   e Zd ZedededdfddZedddZedee	e
jef  fd	d
ZdS )_TensorLoadersizeobjrK   Nc                 C      d S r5   r6   r?   rQ   rR   r6   r6   r:   addS      z_TensorLoader.addc                 C   rS   r5   r6   r>   r6   r6   r:   start_loadingW   rV   z_TensorLoader.start_loadingc                 C   rS   r5   r6   r>   r6   r6   r:   values[   rV   z_TensorLoader.valuesrK   N)rB   rC   rD   r   rH   objectrU   rW   r   tupletorchr   rX   r6   r6   r6   r:   rP   R   s    "rP   c                   @   sZ   e Zd ZdeddfddZdededdfdd	Zdd
dZde	e
ejef  fddZdS )_SerialCpuLoaderresolve_funrK   Nc                 C   s   || _ g | _d S r5   )r^   r=   )r?   r^   r6   r6   r:   __init__a   s   
z_SerialCpuLoader.__init__rQ   rR   c                 C   s   | j ||f d S r5   )r=   appendrT   r6   r6   r:   rU   e   rA   z_SerialCpuLoader.addc                 C   rS   r5   r6   r>   r6   r6   r:   rW   h      z_SerialCpuLoader.start_loadingc                 c   sR    | j D ]"\}}| | }| }|  | kr!| }||fV  qd S r5   )r=   r^   detachcpustoragerQ   numelcloner?   _rR   tensorr6   r6   r:   rX   k   s   z_SerialCpuLoader.valuesrY   )rB   rC   rD   r   r_   rH   rZ   rU   rW   r   r[   r\   r   rX   r6   r6   r6   r:   r]   `   s
    
 r]   c                	   @   s   e Zd Z		ddedeej deddfddZe	de
fd	d
Zdeeejef  fddZdddZdeeejef  fddZdededdfddZdddZdeeejef  fddZdS )_OverlappingCpuLoaderN@B r^   streaminflight_threshholdrK   c                 C   s   || _ g | _|| _d| _t | _d| _d| _|r|j	nt
 | _	t| j	| _ttjj|p0| j | _| j| j krF| j| j  d S d S )Nr   F)r^   r=   rm   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   r\   cudaStreamcurrent_streamrl   wait_stream)r?   r^   rl   rm   r6   r6   r:   r_   x   s    
z_OverlappingCpuLoader.__init__c                 C   s   | j t| jkS r5   )rr   lenr=   r>   r6   r6   r:   _done   s   z_OverlappingCpuLoader._donec                 C   sl   g }| j | jkr| j  | j | jkr4| j }|  j |d  |d   8  _ || | j | jks|S Nr   )	rn   rm   rl   synchronizerq   popleftre   element_sizer`   )r?   drainedvalr6   r6   r:   _drain   s   

"
z_OverlappingCpuLoader._drainc                 C   s.  | j | j | jsu| j| jk r}| j| j \}}|  jd7  _| | }|j	j
| jkr6|jddd}n|j	t	dkrO|  | |j krO| }| j||f |  j| |  7  _| js| j| jk sW d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )N   rc   T)devicenon_blocking)ru   rl   r{   rn   rm   r=   rr   r^   rb   r   typert   tor\   untyped_storagerQ   re   itemsizerf   rq   r`   r   rg   r6   r6   r:   _refill   s4   
"z_OverlappingCpuLoader._refillc                 C   s(   | j sJ t| jdkr| j  | jS r|   )r{   rz   rq   rl   r}   r>   r6   r6   r:   _finish   s   

z_OverlappingCpuLoader._finishrQ   rR   c                 C   s"   | j rtd| j||f d S )Nz&cannot add items after loading started)rs   RuntimeErrorr=   r`   rT   r6   r6   r:   rU      s   z_OverlappingCpuLoader.addc                 C   s0   | j rd S d| _ | jjtdd |   d S )NTr   key)rs   r=   sortoperator
itemgetterr   r>   r6   r6   r:   rW      s
   z#_OverlappingCpuLoader.start_loadingc                 c   sB    |    | js|  }|   |E d H  | jr|  E d H  d S r5   )rW   r{   r   r   r   )r?   r   r6   r6   r:   rX      s   
z_OverlappingCpuLoader.values)Nrk   rY   )rB   rC   rD   r   r   r\   rw   rH   r_   propertyboolr{   listr[   r   rZ   r   r   r   r   rU   rW   r   rX   r6   r6   r6   r:   rj   w   s(    



 rj   c                	   @   sV   e Zd ZdZ	ddeee  ddfddZdede	j
deee ee f fd	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
extensionsrK   c                 C   s   |du r	d| _ dS || _ 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.
        Nr6   )r   )r?   r   r6   r6   r:   r_      s   	z!_StorageWriterTransforms.__init__
write_item
raw_streamc                 C   sR   G dd dt j}ttt ||}| jD ]}||}q|dd t| jD fS )Nc                   @   sD   e Zd ZdejfddZdefddZdede	fdd	Z
d
d ZdS )zE_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriterrawc                 S   s
   || _ d S r5   )r   )r?   r   r6   r6   r:   r_      s   
zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__rK   c                 S   s   dS )NTr6   r>   r6   r6   r:   	writeable   ra   zO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeablebc                 S   s   | j |S r5   )r   write)r?   r   r6   r6   r:   r      rO   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writec                 S   s   |    | j   d S r5   )flushr   r>   r6   r6   r:   close   s   zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.closeN)rB   rC   rD   ioIOBaser_   r   r   r   rH   r   r   r6   r6   r6   r:   NoCloseWriter   s
    r   c                 S   s   g | ]}|  qS r6   )get_descriptor)r7   exr6   r6   r:   
<listcomp>  s    zB_StorageWriterTransforms.transform_save_stream.<locals>.<listcomp>)r   r   r   r   bytesr   transform_toreversed)r?   r   r   r   r   r   r6   r6   r:   transform_save_stream   s
   

z._StorageWriterTransforms.transform_save_streamr5   )rB   rC   rD   rE   r   r   r   r_   r"   r   r   r[   r   r   r   rF   r   r6   r6   r6   r:   r      s    

r   itemc                 C   sB   d}| j d us	J | j jD ]}||9 }q| j jj}|tj| S Nr   )tensor_datarQ   
propertiesdtyper\   _utils_element_size)r   rQ   sr   r6   r6   r:   
_item_size  s   

r   binsr=   c           	      C   s   | dkr|gS dd |D }dd |D }dd t | D }dd t | D }|jtdd t|D ]\}}|||   | q2|D ] }tt|tdd	d
 }|| | ||  t|7  < qB|S )Nr   c                 S      g | ]
}|j tjkr|qS r6   r   r#   BYTE_IOr7   wir6   r6   r:   r         z+_split_by_size_and_type.<locals>.<listcomp>c                 S      g | ]
}|j tjkr|qS r6   r   r   r6   r6   r:   r     r   c                 S   s   g | ]}g qS r6   r6   r7   rh   r6   r6   r:   r         c                 S   s   g | ]}d qS )r   r6   r   r6   r6   r:   r     r   T)r   reverser   r   )ranger   r   	enumerater`   minr   r   )	r   r=   bytes_wtensor_wbucketsbucket_sizesir   rr   r6   r6   r:   _split_by_size_and_type  s   r   F
transformsrl   datar   storage_keysafe_tensorsc              	   C   s   |  }| ||\}}|jtjkr"t|tjsJ ||	  nt|t
js*J |jt
dks4J |s<t
|| |  |rHt|tjrO|  | }	n| |  }	t|dkr_d n|}
t|j|	t|||	|
ddS )Nrc   r   )r4   )indexsize_in_bytesstorage_data)tellr   r   r#   r   
isinstancer   BytesIOr   	getbufferr\   r   r   saver   re   r   rz   r'   r   r0   )r   rl   r   r   r   r   r2   r   r4   r3   info_transform_descriptorsr6   r6   r:   _write_item'  s6   r   create_stream
file_queueresult_queueplannerrm   	use_fsyncthread_countc	                 C   s  z	 |  \}	}
}tj }tt|d }|dkr/tj s#|r/| r/|dkr/t|j|d}nt	|j}dd |D }|D ]
}|
t|| q=|  dd |D }g }| |	dn}|D ]}||}|t|||||
| q]i }| D ]\}}|jsJ |t|||||
| |||jj< qw|rdd	lm} ||| |rz	t|  W n ttfy   t  Y nw |  W d    n1 sw   Y  || q tjy   Y d S w )
NTr   r   )rm   c                 S   r   r6   r   r   r6   r6   r:   r   ~  r   z+_write_files_from_queue.<locals>.<listcomp>c                 S   r   r6   r   r   r6   r6   r:   r     r   wb)r   ) 
get_nowaitr\   _C_get_privateuse1_backend_namegetattrrv   is_availablerj   resolve_datar]   rU   r   rW   r`   r   rX   is_cpur   fqnsafetensors.torchr   r   osfsyncfilenoAttributeErrorr
   syncr   putqueueEmpty)r   r   r   r   r   rm   r   r   r   	file_namer   write_itemscustom_backend_namecustom_device_modloaderr   r   r   write_resultsrl   r   tensor_dictri   r   r6   r6   r:   _write_files_from_queueW  s   





(Lr   c                   @   sJ  e Zd Zeedeeejf dede	e
jddf fddZedeeejf dedeeejf fdd	Zedeeejf d
eeejf ddfddZedeeejf deeejf fddZedeeejf ddfddZeedeeejf defddZedeeejf defddZedeeejf ddfddZdS )r-   pathmoderK   Nc                 C   rS   r5   r6   )r?   r   r   r6   r6   r:   r     s   zFileSystemBase.create_streamsuffixc                 C   rS   r5   r6   r?   r   r   r6   r6   r:   concat_path     zFileSystemBase.concat_pathnew_pathc                 C   rS   r5   r6   r?   r   r   r6   r6   r:   rename  r   zFileSystemBase.renamec                 C   rS   r5   r6   r?   r   r6   r6   r:   	init_path  ra   zFileSystemBase.init_pathc                 C   rS   r5   r6   r   r6   r6   r:   mkdir  ra   zFileSystemBase.mkdircheckpoint_idc                 C   rS   r5   r6   clsr  r6   r6   r:   validate_checkpoint_id  rV   z%FileSystemBase.validate_checkpoint_idc                 C   rS   r5   r6   r   r6   r6   r:   exists  ra   zFileSystemBase.existsc                 C   rS   r5   r6   r   r6   r6   r:   rm_file  ra   zFileSystemBase.rm_file)rB   rC   rD   r   r   r   rF   r   PathLiker   r   r   r   r   r   r   r   classmethodr   r  r  r  r6   r6   r6   r:   r-     sJ    ( "r-   c                
   @   s*  e Zd Zedeeejf dedee	j
ddf fddZdeeejf dedeeejf fdd	Zdeeejf deeejf fd
dZdeeejf deeejf ddfddZdeeejf ddfddZedeeejf defddZdeeejf defddZdeeejf ddfddZdS )r,   r   r   rK   Nc                 c   sR    t |ts
t|}||}ttj|V  W d    d S 1 s"w   Y  d S r5   )r   r   openr   r   r   )r?   r   r   rl   r6   r6   r:   r     s   
"zFileSystem.create_streamr   c                 C   s   t |ts	t|}|| S r5   r   r   r   r6   r6   r:   r     s   
zFileSystem.concat_pathc                 C   s   t |ts	t|}|S r5   r
  r   r6   r6   r:   r     s   
zFileSystem.init_pathr   c                 C   s&   t |ts	t|}|tt| d S r5   )r   r   r   r   r   r6   r6   r:   r     s   
zFileSystem.renamec                 C   s$   t |ts	t|}|jddd d S )NT)parentsexist_ok)r   r   r   r   r6   r6   r:   r     s   
zFileSystem.mkdirr  c                 C   sR   t |trdS dt|v rdS t|jD ]}| r&tt|tjr& dS qdS )NTz://F)r   r   rF   r  r  r   accessW_OK)r  r  pr6   r6   r:   r    s   
z!FileSystem.validate_checkpoint_idc                 C   s   t |ts	t|}| S r5   )r   r   r  r   r6   r6   r:   r    s   
zFileSystem.existsc                 C   s   t |ts	t|}|  d S r5   )r   r   unlinkr   r6   r6   r:   r    s   
zFileSystem.rm_file)rB   rC   rD   r   r   rF   r   r  r   r   r   r   r   r   r   r   r  r   r  r  r  r6   r6   r6   r:   r,     s:    
&
 r,   c                       s  e Zd ZdZ						d2deeejf deded	e	d
e	dede
ee  dededdf fddZd3deeejdf ddfddZdeddfddZdedefddZdee dee fddZdededeee  fdd Z	!d4ded"ejd#edeee  fd$d%Zd&ed'eee  ddfd(d)Zde
e fd*d+Ze deeejf fd,d-Z!e deeejf fd.d/Z"e#deeejf defd0d1Z$  Z%S )5_FileSystemWritera  
    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_extensionsargskwargsrK   c           
         sT   t    t | _| j|| _|| _|| _|| _|| _	t
 | _|| _t|| _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.
        N)superr_   r,   fsr   r   r  r  r   r  rN   save_idr  r   r   )
r?   r   r  r  r   r  r  r  r  r  	__class__r6   r:   r_     s   
z_FileSystemWriter.__init__r  c                 C   s   |r	| j || _t | _d S r5   )r  r   r   rN   r  r?   r  r6   r6   r:   resetD  s   z_FileSystemWriter.resetis_coordinatorc                 C   rS   r5   r6   )r?   r"  r6   r6   r:   set_up_storage_writerI  ra   z'_FileSystemWriter.set_up_storage_writerplanc                 C   sX   | j | j | j | jr*| jr!td| j d| jd |S td| jd|S )Nz#Detected an existing checkpoint in z#, overwriting since self.overwrite=z. Past version 2.5 of PyTorch, `overwrite` will default to False. Set this variable to True to maintain this functionality or False to raise when an existing checkpoint is found.z-Checkpoint already exists and self.overwrite=.)	r  r   r   r  metadata_pathr  warningswarnr   r?   r$  r6   r6   r:   prepare_local_planL  s   z$_FileSystemWriter.prepare_local_planplansc                 C   s   dd t |D }|S )Nc                 S   s*   g | ]\}}t j|td | ddqS )__rh   r   )dataclassesreplacerI   )r7   r   r$  r6   r6   r:   r   [  s    z9_FileSystemWriter.prepare_global_plan.<locals>.<listcomp>)r   )r?   r+  	new_plansr6   r6   r:   prepare_global_planZ  s   z%_FileSystemWriter.prepare_global_planr   c           	         s   |j d  fdd}t }| jr1t| j|jD ]}| }| j| j	|}|
|||f qn|jD ]}| }| j| j	|}|
|||gf q4| ||S )Nr   c                     s   j    t }  d7  | S r   )rJ   DEFAULT_SUFFIX)r   
file_countstorage_planr6   r:   gen_filei  s   z._FileSystemWriter.write_data.<locals>.gen_file)r   r   Queuer  r   r   r=   r  r   r   r   _write_data)	r?   r$  r   r6  r   bucketr   r   r   r6   r3  r:   
write_dataa  s   
z_FileSystemWriter.write_dataFr   r   c           
      C   s   t  }g }td| jD ]!}tjt| jj|||| j	| j
| j| j|f	d}|  || qt| jj|||| j	| j
| j| j|d	 |D ]}|  qCg }z	 || 7 }qN t jyh   t }	|	| |	 Y S w )Nr   )targetr  )	r   r   r   r   r   rm   r   r   r   )r   r7  r   r   	threadingThreadr   r  r   r   r  r  startr`   joinr   r   r)   
set_result)
r?   r   r   r   r   threadsrh   tresfutr6   r6   r:   r8  }  sR   

z_FileSystemWriter._write_datametadataresultsc              
   C   s   i }|D ]}| dd |D  q||_|  |_tt| j| jt d}| j	|d*}t
|| | jrQz	t|  W n ttfyP   t  Y nw W d    n1 s[w   Y  | j| jrn| j| j | j|| j d S )Nc                 S   s   i | ]}|j |jqS r6   )r   r   )r7   wrr6   r6   r:   r;     s    z,_FileSystemWriter.finish.<locals>.<dictcomp>z.tmpr   )updater   storage_metar   r   r  r   r   r/   r   pickledumpr  r   r   r   r   r
   r   r  r&  r  r   )r?   rE  rF  
storage_mdwr_listtmp_pathmetadata_filer6   r6   r:   finish  s&   
	z_FileSystemWriter.finishc                 C   s   t | j| jdS )N)r  r  )r   r  r  r>   r6   r6   r:   rI    s   z_FileSystemWriter.storage_metac                 C   s   t t| j| jtS r5   )r   r   r  r   r   r/   r>   r6   r6   r:   r&    s   z_FileSystemWriter.metadata_pathc                 C      | j S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r   r>   r6   r6   r:   r       z_FileSystemWriter.checkpoint_idc                 C   
   t |S r5   r,   r  r  r6   r6   r:   r       
z(_FileSystemWriter.validate_checkpoint_id)TTr   r  TNr5   F)&rB   rC   rD   rE   r   rF   r   r  r   rH   r   r   r   r   r_   r!  r#  r    r*  r   r1  r!   r)   r'   r:  r   r7  r8  r   rP  r   rI  r   r&  r  r  r  __classcell__r6   r6   r  r:   r    st    
	
 %

 

3&r  c                	   @   sN   e Zd ZdZddee ddfddZdedee	 d	e
e de
e fd
dZdS )_StorageReaderTransformsr   Nextension_registryrK   c                 C   s   |d u r
t  | _d S || _d S r5   )r   rZ  )r?   rZ  r6   r6   r:   r_     s   z!_StorageReaderTransforms.__init__	read_itemr4   r   c                 C   s2   | j |}|}|D ]}t|tr||}q
|S r5   )rZ  from_descriptor_listr   r   transform_from)r?   r[  r4   r   r   r]  r   r6   r6   r:   transform_load_stream  s   

z._StorageReaderTransforms.transform_load_streamr5   )rB   rC   rD   rE   r   r   r_   r   r   rF   r   r   r^  r6   r6   r6   r:   rY    s    rY  c                       s  e Zd Z	d deeejf dee ddf fddZ	de
dee fdd	Zd d
eeejdf ddfddZdededed fddZdefddZdededdfddZdedefddZdee dee fddZedeeejf fddZed
eeejf defddZ  ZS )!r+   Nr   _extension_registryrK   c                    s<   t    t | _| j|| _i | _t | _t	|| _
d S r5   )r  r_   r,   r  r   r   r   rN   load_idrY  r   )r?   r   r_  r  r6   r:   r_     s   
zFileSystemReader.__init__sinfoc                 C   s   t tt t||j|jS r5   )r   r   r   r(   r2   r3   )r?   filera  r6   r6   r:   _slice_file  s   zFileSystemReader._slice_filer  c                 C   s$   i | _ |r| j|| _t | _d S r5   )r   r  r   r   rN   r`  r   r6   r6   r:   r!    s   zFileSystemReader.resetr$  r   c                 C   s  i }|j D ]}| j|j }|j}||g | q|  D ]\}}| j| j|}	| j	|	d}
|D ]}| j|j }| 
|
|}| j||jpJd|}|jtjkrgt|d}|d ||| q4| rn|}nt|d}|d tttj|ddd}t||j|j}|| }|  |  ksJ d|j d	|   d
|   |!| |"|| q4W d    n1 sw   Y  qt# }|$d  |S )Nrbr6   r   rc   T)map_locationweights_onlyzreq z mismatch sizes z vs )%r=   r   storage_indexr1   
setdefaultr`   r  r   r   r   rc  r   r^  r4   r   r   r   r   r   readseek
load_bytesseekabler   r   r\   loadr   storage_offsetslengthsresolve_tensorrb   rQ   copy_commit_tensorr)   r@  )r?   r$  r   per_filer[  item_mdr   r1   reqsr   rl   req
file_slicer]  
read_bytesrm  ri   target_tensorrD  r6   r6   r:   	read_data
  s^   




-
zFileSystemReader.read_datac                 C   sn   | j | jd}| j |d}t|}W d    n1 sw   Y  t|dd d u r0t |_| j	|j_	|S )Nr.   rd  rI  )
r  r   r   r   rJ  rn  r   r   rI  r`  )r?   r   rO  rE  r6   r6   r:   read_metadataF  s   
zFileSystemReader.read_metadatarE  r"  c                 C   s   |j | _ | j d usJ d S r5   r-  )r?   rE  r"  r6   r6   r:   set_up_storage_readerQ  s   z&FileSystemReader.set_up_storage_readerc                 C      |S r5   r6   r)  r6   r6   r:   r*  U  ra   z#FileSystemReader.prepare_local_planr+  c                 C   r~  r5   r6   )r?   r+  r6   r6   r:   r1  X  ra   z$FileSystemReader.prepare_global_planc                 C   rQ  )zT
        return the checkpoint_id that will be used to load the checkpoint.
        rR  r>   r6   r6   r:   r  [  rS  zFileSystemReader.checkpoint_idc                 C   rT  r5   rU  r  r6   r6   r:   r  b  rV  z'FileSystemReader.validate_checkpoint_idr5   )rB   rC   rD   r   rF   r   r  r   r   r_   r0   r   r   rc  r!  r   r   r)   r{  r   r|  r   r}  r*  r   r1  r   r  r  r  rX  r6   r6   r  r:   r+     s(     <&r+   c                       sz   e Zd ZdZ							ddeeejf ded	ed
e	de	dedede
ee  ddfddZdedef fddZ  ZS )r*   r  Tr   r  FNr   r  r  r   r  cache_staged_state_dictr  r  rK   c	           	   
   C   s,   t j| |||||||d tj| |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.
            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 re-used for multiple dcp.async_save calls. Default to False.
            overwrite: Whether to allow overwriting existing checkpoints. Defaults to True.
            _extensions: Extensions to apply to output streams (EXPERIMENTAL)

        N. B. If sync_files is disabled, there's no guarantee that the checkpoint will be consistent in the case of a failure.
        )r   r  r  r   r  r  r  )r  N)r  r_   r$   )	r?   r   r  r  r   r  r  r  r  r6   r6   r:   r_   u  s   

zFileSystemWriter.__init__
state_dictc                    s   d| _ t |S )zOverride of AsyncStager.stager   )r  r  stage)r?   r  r  r6   r:   r    s   zFileSystemWriter.stage)TTr   r  FTN)rB   rC   rD   rE   r   rF   r   r  r   rH   r   r   r   r_   r   r  rX  r6   r6   r  r:   r*   g  s:    
	

+r*   rW  )^ro   r.  r   r   r   rJ  r   r<  rL   r'  abcr   r   collections.abcr   r   r   r   
contextlibr   r	   r
   pathlibr   typingr   r   r   r   r   r   typing_extensionsr   r\   r   torch._utilsr   r   torch.distributed._shard._utilsr   'torch.distributed.checkpoint._extensionr   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__r/   rF   rG   r0   rI   r2  rN   rP   r]   rj   r   rH   r   r   r   r   r   r   r   r7  r   r-   r,   r  rY  r+   r*   r6   r6   r6   r:   <module>   s   
 (
Z3"
0	

\"< Js