a
    h                     @   s0  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 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.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z5m6Z6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZF d dlGmHZH d dlImJZJ g dZKdZLeMeNd< eG dd dZOeG dd dZPG dd deZQdZReMd d!d"ZSG d#d$ d$eZTG d%d& d&eTZUG d'd( d(eTZVG d)d* d*ZWe?eXd+d,d-ZYeXeZe? eZeZe?  d.d/d0Z[eWej\e!ej]e$j%f e?eMeQeFd1d2d3Z^eej_ej_e>eWeXe`eXeQdd4
d5d6ZaG d7d8 d8eZbG d9d: d:ebZcG d;d< d<eEZdG d=d> d>ZeG d?d@ d@eDZfG dAdB dBedeBZgdS )C    N)ABCabstractmethod)	GeneratorIterableIteratorSequence)contextmanager)	dataclass)Enum)UnsupportedOperation)Path)AnyCallablecast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SerializationFormat	.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vr=   r=   U/var/www/auris/lib/python3.9/site-packages/torch/distributed/checkpoint/filesystem.py
<dictcomp>R       z-_StorageInfo.__getstate__.<locals>.<dictcomp>)__dict__itemsselfr=   r=   rA   __getstate__Q   s    z_StorageInfo.__getstate__)__name__
__module____qualname____doc__str__annotations__intr;   r   r   rH   r=   r=   r=   rA   r7   H   s   
r7   c                   @   s   e Zd ZU eed< dS )_StoragePrefixprefixN)rI   rJ   rK   rM   rN   r=   r=   r=   rA   rP   U   s   
rP   c                   @   s   e Zd ZdZdZdS )r4   Z
torch_saveZsafetensorsN)rI   rJ   rK   
TORCH_SAVESAFETENSORSr=   r=   r=   rA   r4   Z   s   r4   z.distcpreturnc                   C   s   t t S r<   )rM   uuiduuid4r=   r=   r=   rA   _generate_uuidb   s    rX   c                   @   sT   e Zd ZeeeddddZeddddZeee	e
jef  ddd	ZdS )
_TensorLoaderNsizeobjrU   c                 C   s   d S r<   r=   rG   r[   r\   r=   r=   rA   addg   s    z_TensorLoader.addrT   c                 C   s   d S r<   r=   rF   r=   r=   rA   start_loadingk   s    z_TensorLoader.start_loadingc                 C   s   d S r<   r=   rF   r=   r=   rA   valueso   s    z_TensorLoader.values)rI   rJ   rK   r   rO   objectr^   r_   r   tupletorchr   r`   r=   r=   r=   rA   rY   f   s   rY   c                   @   sX   e Zd ZeddddZeeddddZddd	d
Ze	e
ejef  dddZdS )_SerialCpuLoaderN)resolve_funrU   c                 C   s   || _ g | _d S r<   )re   rE   )rG   re   r=   r=   rA   __init__u   s    z_SerialCpuLoader.__init__rZ   c                 C   s   | j ||f d S r<   )rE   appendr]   r=   r=   rA   r^   y   s    z_SerialCpuLoader.addrT   c                 C   s   d S r<   r=   rF   r=   r=   rA   r_   |   s    z_SerialCpuLoader.start_loadingc                 c   sP   | j D ]D\}}| | }| }|  | kr@| }||fV  qd S r<   )rE   re   detachcpuZstorager[   numelclonerG   _r\   tensorr=   r=   rA   r`      s    z_SerialCpuLoader.values)rI   rJ   rK   r   rf   rO   ra   r^   r_   r   rb   rc   r   r`   r=   r=   r=   rA   rd   t   s   rd   c                   @   s   e Zd Zdeeej eddddZe	e
dddZeeejef  dd	d
ZddddZeeejef  dddZeeddddZddddZeeejef  dddZdS )_OverlappingCpuLoaderN@B )re   streaminflight_threshholdrU   c                 C   s   || _ g | _|| _d| _t | _d| _d| _|r8|j	nt
 | _	t| j	| _ttjj|p`| j | _| j| j kr| j| j  d S )Nr   F)re   rE   rr   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typer   r   device_moduler   rc   cudaStreamZcurrent_streamrq   Zwait_stream)rG   re   rq   rr   r=   r=   rA   rf      s    
z_OverlappingCpuLoader.__init__rT   c                 C   s   | j t| jkS r<   )rw   lenrE   rF   r=   r=   rA   _done   s    z_OverlappingCpuLoader._donec                 C   sb   g }| j | jkr| j  | j | jkr^| j }|  j |d  |d   8  _ || q|S Nr   )	rs   rr   rq   synchronizerv   popleftrj   element_sizerg   )rG   drainedvalr=   r=   rA   _drain   s    

"z_OverlappingCpuLoader._drainc                 C   s   | j | j | js| j| jk r| j| j \}}|  jd7  _| | }|j	j
| jkrl|jddd}n2|j	t	dkr|  | |j kr| }| j||f |  j| |  7  _qW d    n1 s0    Y  d S )N   ri   T)deviceZnon_blocking)rz   rq   r~   rs   rr   rE   rw   re   rh   r   typery   torc   Zuntyped_storager[   rj   itemsizerk   rv   rg   r   rl   r=   r=   rA   _refill   s&    
z_OverlappingCpuLoader._refillc                 C   s(   | j s
J t| jdkr"| j  | jS r   )r~   r}   rv   rq   r   rF   r=   r=   rA   _finish   s    

z_OverlappingCpuLoader._finishrZ   c                 C   s"   | j rtd| j||f d S )Nz&cannot add items after loading started)rx   RuntimeErrorrE   rg   r]   r=   r=   rA   r^      s    z_OverlappingCpuLoader.addc                 C   s0   | j r
d S d| _ | jjtdd |   d S )NTr   key)rx   rE   sortoperator
itemgetterr   rF   r=   r=   rA   r_      s
    z#_OverlappingCpuLoader.start_loadingc                 c   s<   |    | js*|  }|   |E d H  q|  E d H  d S r<   )r_   r~   r   r   r   )rG   r   r=   r=   rA   r`      s    z_OverlappingCpuLoader.values)Nrp   )rI   rJ   rK   r   r   rc   r|   rO   rf   propertyboolr~   listrb   r   ra   r   r   r   r   r^   r_   r   r`   r=   r=   r=   rA   ro      s      
ro   c                   @   sN   e Zd ZdZd	eee  ddddZee	j
eee ee f d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)
extensionsrU   c                 C   s   |du r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   )rG   r   r=   r=   rA   rf      s    	z!_StorageWriterTransforms.__init__)
write_item
raw_streamrU   c                 C   sR   G dd dt j}ttt ||}| jD ]}||}q*|dd t| jD fS )Nc                   @   sB   e Zd ZejdddZedddZee	ddd	Z
d
d ZdS )zE_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriterrawc                 S   s
   || _ d S r<   r   )rG   r   r=   r=   rA   rf     s    zN_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.__init__rT   c                 S   s   dS )NTr=   rF   r=   r=   rA   	writeable  s    zO_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writeable)brU   c                 S   s   | j |S r<   )r   write)rG   r   r=   r=   rA   r     s    zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.writec                 S   s   |    | j   d S r<   )flushr   rF   r=   r=   rA   close  s    zK_StorageWriterTransforms.transform_save_stream.<locals>.NoCloseWriter.closeN)rI   rJ   rK   ioIOBaserf   r   r   r   rO   r   r   r=   r=   r=   rA   NoCloseWriter  s   r   c                 S   s   g | ]}|  qS r=   )Zget_descriptor)r>   exr=   r=   rA   
<listcomp>  rC   zB_StorageWriterTransforms.transform_save_stream.<locals>.<listcomp>)r   r   r   r   bytesr   transform_toreversed)rG   r   r   r   r   r   r=   r=   rA   transform_save_stream   s
    

z._StorageWriterTransforms.transform_save_stream)N)rI   rJ   rK   rL   r   r   r   rf   r(   r   r   rb   r   r   r   rM   r   r=   r=   r=   rA   r      s    
r   )itemrU   c                 C   sB   d}| j d usJ | j jD ]}||9 }q| j jj}|tj| S Nr   )tensor_datar[   Z
propertiesdtyperc   _utilsZ_element_size)r   r[   sr   r=   r=   rA   
_item_size  s    

r   )binsrE   rU   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 ]\}}|||   | qd|D ]@}tt|tdd	d
 }|| | ||  t|7  < q|S )Nr   c                 S   s   g | ]}|j tjkr|qS r=   r   r)   BYTE_IOr>   wir=   r=   rA   r   '  rC   z+_split_by_size_and_type.<locals>.<listcomp>c                 S   s   g | ]}|j tjkr|qS r=   r   r   r=   r=   rA   r   (  rC   c                 S   s   g | ]}g qS r=   r=   r>   rm   r=   r=   rA   r   *  rC   c                 S   s   g | ]}d qS )r   r=   r   r=   r=   rA   r   +  rC   T)r   reverser   r   )ranger   r   	enumeraterg   minr   r   )	r   rE   bytes_wtensor_wZbucketsZbucket_sizesir   rw   r=   r=   rA   _split_by_size_and_type#  s    r   )
transformsrq   datar   storage_keyserialization_formatrU   c              	   C   s   |  }| ||\}}|jtjkrDt|tjs4J ||	  n:t|t
jsTJ |jt
dkshJ |tjkr~t
|| |  |tjkst|tjr|  | }	n| |  }	t|dkrd n|}
t|j|	t|||	|
ddS )Nri   r   )r;   )indexZsize_in_bytesstorage_data)tellr   r   r)   r   
isinstancer   BytesIOr   	getbufferrc   r   r   r4   rR   saver   rj   r   r}   r-   r   r7   )r   rq   r   r   r   r   r9   r   r;   r:   Zinfo_transform_descriptorsr=   r=   rA   _write_item;  s:    
r   )
create_stream
file_queueresult_queueplannerr   rr   	use_fsyncthread_countr   rU   c	                 C   s  z|  \}	}
}tj }tt|d }|dkr^tj sF|r^| r^|dkr^t|j|d}n
t	|j}dd |D }|D ]}|
t|| qz|  dd |D }g }| |	d}|D ]&}||}|t|||||
| qi }i }| D ]N\}}|jsJ |t|||||
| |||jj< d|jjji||jj< q|tjkrdd	lm} |||tt|ttt t!t"id
 |rzt#$|%  W n  t&t'fy   t#(  Y n0 |)  W d    n1 s0    Y  |*| qW n t+j,y
   Y n0 d S )Nr   r   )rr   c                 S   s   g | ]}|j tjkr|qS r=   r   r   r=   r=   rA   r     rC   z+_write_files_from_queue.<locals>.<listcomp>c                 S   s   g | ]}|j tjkr|qS r=   r   r   r=   r=   rA   r     rC   wbZsaved_offsets)r   )metadata)-
get_nowaitrc   Z_CZ_get_privateuse1_backend_namegetattrr{   Zis_availablero   Zresolve_datard   r^   r   r_   rg   r   r`   Zis_cpur   Zfqnr   chunkoffsetsr4   rS   Zsafetensors.torchr   r   r   jsondumpsr   rM   r   r   r   osfsyncfilenoAttributeErrorr   syncr   putqueueEmpty)r   r   r   r   r   rr   r   r   r   	file_namer   Zwrite_itemsZcustom_backend_nameZcustom_device_modloaderr   r   r   Zwrite_resultsrq   r   Ztensor_dictZmetadata_dictrn   r   r=   r=   rA   _write_files_from_queuem  s    




(r   c                   @   s4  e Zd Zeeeeejf ee	e
jddf dddZeeeejf eeeejf dddZeeeejf eeejf ddd	d
Zeeeejf eeejf dddZeeeejf ddddZeeeeejf edddZeeeejf edddZeeeejf ddddZdS )r3   NpathmoderU   c                 C   s   d S r<   r=   )rG   r   r   r=   r=   rA   r     s    zFileSystemBase.create_streamr   suffixrU   c                 C   s   d S r<   r=   rG   r   r   r=   r=   rA   concat_path  s    zFileSystemBase.concat_pathr   new_pathrU   c                 C   s   d S r<   r=   rG   r   r   r=   r=   rA   rename  s    zFileSystemBase.renamer   rU   c                 C   s   d S r<   r=   rG   r   r=   r=   rA   	init_path  s    zFileSystemBase.init_pathc                 C   s   d S r<   r=   r   r=   r=   rA   mkdir  s    zFileSystemBase.mkdircheckpoint_idrU   c                 C   s   d S r<   r=   clsr   r=   r=   rA   validate_checkpoint_id  s    z%FileSystemBase.validate_checkpoint_idc                 C   s   d S r<   r=   r   r=   r=   rA   exists  s    zFileSystemBase.existsc                 C   s   d S r<   r=   r   r=   r=   rA   rm_file  s    zFileSystemBase.rm_file)rI   rJ   rK   r   r   r   rM   r   PathLiker   r   r   r   r   r   r   r   classmethodr   r   r   r   r=   r=   r=   rA   r3     s0   &r3   c                   @   s2  e Zd Zeeeejf eee	j
ddf dddZeeejf eeeejf dddZeeejf eeejf dd	d
Zeeejf eeejf ddddZeeejf ddddZeeeejf edddZeeejf edddZeeejf ddddZeeejf ee dddZdS )r2   Nr   c                 c   sN   t |tst|}||}ttj|V  W d    n1 s@0    Y  d S r<   )r   r   openr   r   r   )rG   r   r   rq   r=   r=   rA   r     s    
zFileSystem.create_streamr   c                 C   s   t |tst|}|| S r<   r   r   r   r=   r=   rA   r     s    
zFileSystem.concat_pathr   c                 C   s   t |tst|}|S r<   r   r   r=   r=   rA   r   	  s    
zFileSystem.init_pathr   c                 C   s&   t |tst|}|tt| d S r<   )r   r   r   r   r   r=   r=   rA   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   r=   r=   rA   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   rM   r   r   r   accessW_OK)r   r   pr=   r=   rA   r     s    
z!FileSystem.validate_checkpoint_idc                 C   s   t |tst|}| S r<   )r   r   r   r   r=   r=   rA   r   )  s    
zFileSystem.existsc                 C   s   t |tst|}|  d S r<   )r   r   unlinkr   r=   r=   rA   r   .  s    
zFileSystem.rm_filec                 C   s$   t |tst|}dd | D S )Nc                 S   s   g | ]}t |qS r=   )rM   )r>   r  r=   r=   rA   r   6  rC   z!FileSystem.ls.<locals>.<listcomp>)r   r   iterdirr   r=   r=   rA   ls3  s    
zFileSystem.ls)rI   rJ   rK   r   r   rM   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r=   r=   r=   rA   r2     s"   	$r2   c                       sl  e Zd ZdZddddddejfeeej	f e
e
eee
eee  eeedd fddZd'eeej	df dd	d
dZe
ddddZeedddZee ee dddZeeeee  dddZeejeee  dddZeeee  ddddZee  ddd Z!e"eeej	f dd!d"Z#e"eeej	f dd#d$Z$e%eeej	f e
d	d%d&Z&  Z'S )(_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   逖 N)r   single_file_per_rank
sync_filesr   per_thread_copy_ahead	overwrite_extensionsr   argskwargsrU   c	                    sZ   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)superrf   r2   fsr   r   r
  r  r   r  rX   save_idr  r   r   r   )rG   r   r
  r  r   r  r  r  r   r  r  	__class__r=   rA   rf   G  s    

z_FileSystemWriter.__init__r   c                 C   s   |r| j || _t | _d S r<   )r  r   r   rX   r  rG   r   r=   r=   rA   resetn  s    z_FileSystemWriter.reset)is_coordinatorrU   c                 C   s   d S r<   r=   )rG   r  r=   r=   rA   set_up_storage_writers  s    z'_FileSystemWriter.set_up_storage_writerplanrU   c                 C   sV   | j | j | j | jrR| jr@td| j d| jd n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   rG   r  r=   r=   rA   prepare_local_planv  s    z$_FileSystemWriter.prepare_local_planplansrU   c                 C   s   dd t |D }|S )Nc                 S   s*   g | ]"\}}t j|td | ddqS )__rm   r   )dataclassesreplacerP   )r>   r   r  r=   r=   rA   r     s   z9_FileSystemWriter.prepare_global_plan.<locals>.<listcomp>)r   )rG   r#  Z	new_plansr=   r=   rA   prepare_global_plan  s    z%_FileSystemWriter.prepare_global_planr  r   rU   c           	         s   |j d  fdd}t }| jrbt| j|jD ]*}| }| j| j	|}|
|||f q4n4|jD ],}| }| j| j	|}|
|||gf qh| ||S )Nr   c                     s   j    t }  d7  | S r   )rQ   DEFAULT_SUFFIX)r   Z
file_countZstorage_planr=   rA   gen_file  s    z._FileSystemWriter.write_data.<locals>.gen_file)r   r   Queuer
  r   r   rE   r  r   r   r   _write_data)	rG   r  r   r,  r   Zbucketr   r   r   r=   r+  rA   
write_data  s    
z_FileSystemWriter.write_data)r   r   rU   c           	      C   s   t  }g }td| jD ]D}tjt| jj|||| j	| j
| j| j| jf	d}|  || qt| jj|||| j	| j
| j| j| jd	 |D ]}|  qg }z|| 7 }qW n( t jy   t }|| | Y S 0 d S )Nr   )targetr  )	r   r   r   r   r   rr   r   r   r   )r   r-  r   r   	threadingThreadr   r  r   r   r  r  r   startrg   joinr   r   r/   
set_result)	rG   r   r   r   threadsrm   tresfutr=   r=   rA   r.    sL    

z_FileSystemWriter._write_data)r   resultsrU   c              
   C   s   i }|D ]}| dd |D  q||_|  |_tt| j| jt d}| j	|dT}t
|| | jrzt|  W n ttfy   t  Y n0 W d    n1 s0    Y  | j| jr| j| j | j|| j d S )Nc                 S   s   i | ]}|j |jqS r=   )r   r   )r>   wrr=   r=   rA   rB     rC   z,_FileSystemWriter.finish.<locals>.<dictcomp>z.tmpr   )updater   storage_metar   r   r  r   r   r6   r   pickledumpr  r   r   r   r   r   r   r   r  r   r   )rG   r   r:  Z
storage_mdZwr_listZtmp_pathmetadata_filer=   r=   rA   finish  s     
,z_FileSystemWriter.finishrT   c                 C   s   t | j| jdS )N)r   r  )r!   r   r  rF   r=   r=   rA   r=    s    z_FileSystemWriter.storage_metac                 C   s   t t| j| jtS r<   )r   r   r  r   r   r6   rF   r=   r=   rA   r    s    z_FileSystemWriter.metadata_pathc                 C   s   | j S )zT
        return the checkpoint_id that will be used to save the checkpoint.
        r   rF   r=   r=   rA   r     s    z_FileSystemWriter.checkpoint_idc                 C   s
   t |S r<   r2   r   r   r=   r=   rA   r     s    z(_FileSystemWriter.validate_checkpoint_id)N)(rI   rJ   rK   rL   r4   rR   r   rM   r   r   r   rO   r   r   r   r   rf   r  r  r&   r!  r   r(  r'   r/   r-   r/  r   r-  r.  r   rA  r!   r=  r   r  r   r   r   __classcell__r=   r=   r  rA   r  9  sR   
'	

2r  c                   @   sF   e Zd ZdZd	ee ddddZeee	 e
e e
e dddZdS )
_StorageReaderTransformsr   N)extension_registryrU   c                 C   s   |d u rt  n|| _d S r<   )r   rF  )rG   rF  r=   r=   rA   rf   
  s    z!_StorageReaderTransforms.__init__)	read_itemr;   r   rU   c                 C   s2   | j |}|}|D ]}t|tr||}q|S r<   )rF  Zfrom_descriptor_listr   r   transform_from)rG   rG  r;   r   r   rH  r   r=   r=   rA   transform_load_stream  s    
z._StorageReaderTransforms.transform_load_stream)N)rI   rJ   rK   rL   r   r   rf   r%   r   rM   r   r   rI  r=   r=   r=   rA   rE    s   rE  c                       s   e Zd Zdeeejf ee dd fddZ	e
ee dddZdeeejdf ddd	d
Zeeed dddZedddZeeddddZeedddZee ee dddZeeeejf dddZeeeejf edddZ  ZS ) r1   N)r   _extension_registryrU   c                    s<   t    t | _| j|| _i | _t | _t	|| _
d S r<   )r  rf   r2   r  r   r   r   rX   load_idrE  r   )rG   r   rJ  r  r=   rA   rf     s    
zFileSystemReader.__init__)sinforU   c                 C   s   t tt t||j|jS r<   )r   r   r   r.   r9   r:   )rG   filerL  r=   r=   rA   _slice_file*  s    zFileSystemReader._slice_filer   c                 C   s$   i | _ |r| j|| _t | _d S r<   )r   r  r   r   rX   rK  r  r=   r=   rA   r  -  s    zFileSystemReader.resetr)  c                 C   s  i }|j D ](}| j|j }|j}||g | q
|  D ]`\}}| j| j|}	| j	|	d&}
|D ]}| j|j }| 
|
|}| j||jpd|}|jtjkrt|d}|d ||| ql| r|}nt|d}|d tttj|ddd}t||j|j}|| }|  |  ksfJ d|j d	|   d
|   |!| |"|| qlW d    q<1 s0    Y  q<t# }|$d  |S )Nrbr=   r   ri   T)Zmap_locationZweights_onlyzreq z mismatch sizes z vs )%rE   r   Zstorage_indexr8   
setdefaultrg   r  r   r   r   rN  r   rI  r;   r   r"   r   r   r   readseekZ
load_bytesseekabler   r   rc   loadr   Zstorage_offsetslengthsZresolve_tensorrh   r[   Zcopy_Zcommit_tensorr/   r5  )rG   r  r   Zper_filerG  Zitem_mdr   r8   reqsr   rq   reqZ
file_slicerH  
read_bytesrT  rn   Ztarget_tensorr9  r=   r=   rA   	read_data3  sX    





0
zFileSystemReader.read_datarT   c                 C   sn   | j | jd}| j |d}t|}W d    n1 s>0    Y  t|dd d u r`t |_| j	|j_	|S )Nr5   rO  r=  )
r  r   r   r   r>  rU  r   r!   r=  rK  )rG   r   r@  r   r=   r=   rA   read_metadatao  s    (
zFileSystemReader.read_metadata)r   r  rU   c                 C   s   |j | _ | j d usJ d S r<   r%  )rG   r   r  r=   r=   rA   set_up_storage_readerz  s    z&FileSystemReader.set_up_storage_readerr  c                 C   s   |S r<   r=   r   r=   r=   rA   r!  ~  s    z#FileSystemReader.prepare_local_planr"  c                 C   s   |S r<   r=   )rG   r#  r=   r=   rA   r(    s    z$FileSystemReader.prepare_global_planc                 C   s   | j S )zT
        return the checkpoint_id that will be used to load the checkpoint.
        rB  rF   r=   r=   rA   r     s    zFileSystemReader.checkpoint_idc                 C   s
   t |S r<   rC  r   r=   r=   rA   r     s    z'FileSystemReader.validate_checkpoint_id)N)N)rI   rJ   rK   r   rM   r   r   r   r   rf   r7   r   r   rN  r  r#   r$   r/   rZ  r   r[  r   r\  r!  r   r(  r   r   r   r   rD  r=   r=   r  rA   r1     s"    <r1   c                       sn   e Zd ZdZdddddddejfeeej	f e
e
eee
e
eee  edd
dd	Zeed
 fddZ  ZS )r0   r  Tr   r	  FN)
r   r
  r  r   r  cache_staged_state_dictr  r  r   rU   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 reused for multiple dcp.async_save calls. Default to False.
            overwrite: Whether to allow overwriting existing checkpoints. Defaults to True.
            _extensions: Extensions to apply to output streams (EXPERIMENTAL)

        N. B. If sync_files is disabled, there's no guarantee that the checkpoint will be consistent in the case of a failure.
        )r   r
  r  r   r  r  r  r   )r]  N)r  rf   r*   )
rG   r   r
  r  r   r  r]  r  r  r   r=   r=   rA   rf     s    zFileSystemWriter.__init__)
state_dictrU   c                    s   d| _ t |S )zOverride of AsyncStager.stager   )r  r  stage)rG   r^  r  r=   rA   r_    s    zFileSystemWriter.stage)rI   rJ   rK   rL   r4   rR   r   rM   r   r   r   rO   r   r   r   rf   r    r_  rD  r=   r=   r  rA   r0     s,   
-r0   )hrt   r&  r   r   r   r   r>  r   r1  rV   r  abcr   r   collections.abcr   r   r   r   
contextlibr   r	   enumr
   r   pathlibr   typingr   r   r   r   r   r   Ztyping_extensionsr   rc   r   Ztorch._utilsr   r   Ztorch.distributed._shard._utilsr   Z'torch.distributed.checkpoint._extensionr   r   Z&torch.distributed.checkpoint._hf_utilsr   r   r   r   r   Z%torch.distributed.checkpoint.metadatar   r    r!   Z$torch.distributed.checkpoint.plannerr"   r#   r$   r%   r&   r'   r(   r)   Z$torch.distributed.checkpoint.stagingr*   Z$torch.distributed.checkpoint.storager+   r,   r-   Z"torch.distributed.checkpoint.utilsr.   Ztorch.futuresr/   __all__r6   rM   rN   r7   rP   r4   r*  rX   rY   rd   ro   r   rO   r   r   r   r   r   r   r-  r   r   r3   r2   r  rE  r1   r0   r=   r=   r=   rA   <module>   s   
 (
Z33i"A Ks