U
    *-eD=                     @   s  d dl mZmZ d dlZd dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZmZ d dlZd dlmZ d dl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mZmZm Z 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gZ,eG dd dZ-eG dd dZ.dZ/ejejdddZ0e$edddZ1G dd deZ2G dd de2Z3G d d! d!e2Z4e$e5dd"d#Z6ee$ eee$  d$d%d&Z7d'd( Z8ej9ej9e"e5e:d)d*d+Z;G d,d deZ<G d-d deZ=dS ).    )ABCabstractmethodN)	dataclass)ListUnionDictcast)Tensor)Future)Path   )MetadataMetadataIndex)StorageReaderStorageWriterWriteResult)LoadItemTypeLoadPlannerLoadPlanSavePlanSavePlannerReadItem	WriteItemWriteItemType)_create_file_view)narrow_tensor_by_index)_get_device_moduleFileSystemWriterFileSystemReaderc                   @   s*   e Zd ZU dZeed< eed< eed< dS )_StorageInfoz,
    This is the per entry storage info
    relative_pathoffsetlengthN)__name__
__module____qualname____doc__str__annotations__int r*   r*   h/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/distributed/checkpoint/filesystem.pyr   2   s   
r   c                   @   s   e Zd ZU eed< dS )_StoragePrefixprefixN)r#   r$   r%   r'   r(   r*   r*   r*   r+   r,   =   s   
r,   z.distcp)tensorreturnc                 C   s,   |    } |   |  kr(|  } | S N)detachcpuZ_typed_storage_sizenumelclone)r.   r*   r*   r+   _trimE   s    r6   )itemr/   c                 C   s   t | j||dS )N)indexsize_in_bytesstorage_data)r   r8   )r7   r9   r:   r*   r*   r+   _result_from_write_itemL   s
      r;   c                   @   s0   e Zd Zedd Zedd Zedd ZdS )_TensorLoaderc                 C   s   d S r0   r*   selfsizeobjr*   r*   r+   addU   s    z_TensorLoader.addc                 C   s   d S r0   r*   r>   r*   r*   r+   start_loadingY   s    z_TensorLoader.start_loadingc                 C   s   d S r0   r*   rB   r*   r*   r+   values]   s    z_TensorLoader.valuesN)r#   r$   r%   r   rA   rC   rD   r*   r*   r*   r+   r<   T   s   

r<   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_SerialCpuLoaderc                 C   s   || _ g | _d S r0   )resolve_funitems)r>   rF   r*   r*   r+   __init__c   s    z_SerialCpuLoader.__init__c                 C   s   | j ||f d S r0   )rG   appendr=   r*   r*   r+   rA   g   s    z_SerialCpuLoader.addc                 C   s   d S r0   r*   rB   r*   r*   r+   rC   j   s    z_SerialCpuLoader.start_loadingc                 c   sP   | j D ]D\}}| | }| }|  | kr@| }||fV  qd S r0   )rG   rF   r1   r2   storager?   r4   r5   r>   _r@   r.   r*   r*   r+   rD   m   s    z_SerialCpuLoader.valuesN)r#   r$   r%   rH   rA   rC   rD   r*   r*   r*   r+   rE   b   s   rE   c                   @   sR   e Zd ZdddZedd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )_OverlappingCpuLoaderN@B c                 C   s   || _ g | _|| _d| _t | _d| _d| _|r8|j	n
t
dj| _	t| j	| _|p^| j | _| j| j kr| j| j  d S )Nr   Fcuda)rF   rG   inflight_threshholdin_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typetorchdevicetyper   device_moduleZcurrent_streamstreamZwait_stream)r>   rF   r\   rP   r*   r*   r+   rH   z   s    
z_OverlappingCpuLoader.__init__c                 C   s   | j t| jkS r0   )rU   lenrG   rB   r*   r*   r+   _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   )	rQ   rP   r\   synchronizerT   popleftr4   element_sizerI   )r>   drainedvalr*   r*   r+   _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}n,|j	t	dkr|  | kr| }| j||f |  j| |  7  _qW 5 Q R X d S )Nr   r2   T)rY   Znon_blocking)r[   r\   r^   rQ   rP   rG   rU   rF   r1   rY   rZ   rW   torX   rJ   r?   r4   r5   rT   rI   rb   rK   r*   r*   r+   _refill   s&    
z_OverlappingCpuLoader._refillc                 C   s(   | j s
tt| jdkr"| j  | jS r_   )r^   AssertionErrorr]   rT   r\   r`   rB   r*   r*   r+   _finish   s    

z_OverlappingCpuLoader._finishc                 C   s"   | j rtd| j||f d S )Nz&cannot add items after loading started)rV   RuntimeErrorrG   rI   r=   r*   r*   r+   rA      s    z_OverlappingCpuLoader.addc                 C   s.   | j r
d S d| _ | jjdd d |   d S )NTc                 S   s   | d S r_   r*   xr*   r*   r+   <lambda>       z5_OverlappingCpuLoader.start_loading.<locals>.<lambda>key)rV   rG   sortrg   rB   r*   r*   r+   rC      s
    z#_OverlappingCpuLoader.start_loadingc                 c   s<   |    | js*|  }|   |E d H  q|  E d H  d S r0   )rC   r^   re   rg   ri   )r>   rc   r*   r*   r+   rD      s    z_OverlappingCpuLoader.values)NrN   )r#   r$   r%   rH   propertyr^   re   rg   ri   rA   rC   rD   r*   r*   r*   r+   rM   y   s   


rM   c                 C   sB   d}| j d k	st| j jD ]}||9 }q| j jj}|tj| S Nr   )Ztensor_datarh   r?   
propertiesdtyperX   _utilsZ_element_size)r7   r?   sru   r*   r*   r+   
_item_size   s    

rx   )rG   r/   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|d	d
 dd }|| | ||  t|7  < q|S )Nr   c                 S   s   g | ]}|j tjkr|qS r*   rZ   r   BYTE_IO.0wir*   r*   r+   
<listcomp>   s      z+_split_by_size_and_type.<locals>.<listcomp>c                 S   s   g | ]}|j tjkr|qS r*   ry   r{   r*   r*   r+   r~      s      c                 S   s   g | ]}g qS r*   r*   r|   rL   r*   r*   r+   r~      s     c                 S   s   g | ]}d qS )r   r*   r   r*   r*   r+   r~      s     T)rp   reversec                 S   s   | d S rs   r*   rk   r*   r*   r+   rm      rn   z)_split_by_size_and_type.<locals>.<lambda>ro   r   )rangerq   rx   	enumeraterI   min)	ZbinsrG   bytes_wtensor_wZbucketsZbucket_sizesir}   rU   r*   r*   r+   _split_by_size_and_type   s    r   c                 C   s   |   }|jtjkr4t|tjs$t| |	  n0t|t
jsDt|jt
dksXtt
||  |   | }t||t|||S )Nr2   )tellrZ   r   rz   
isinstanceioBytesIOrh   write	getbufferrX   r	   rY   saver;   r   )r\   data
write_itemstorage_keyr!   r"   r*   r*   r+   _write_item   s      
r   
file_queueresult_queueplannerrP   	use_fsyncc              	      s:  z|   \}}}tj r:|dkr:t fdd|d}nt fdd}dd |D }	|	D ]}
|t|
|
 q\|  dd |D }g }t	|d	r}|D ]"}
 
|
}|t|||
| q| D ]&\}}
|jst|t|||
| q|rt|  W 5 Q R X || qW n tjk
r4   Y nX d S )
Nr   c                    s
     | S r0   resolve_datark   r   r*   r+   rm     rn   z)_write_files_from_queue.<locals>.<lambda>)rP   c                    s
     | S r0   r   rk   r   r*   r+   rm     rn   c                 S   s   g | ]}|j tjkr|qS r*   ry   r{   r*   r*   r+   r~     s     z+_write_files_from_queue.<locals>.<listcomp>c                 S   s   g | ]}|j tjkr|qS r*   ry   r{   r*   r*   r+   r~     s     wb)
get_nowaitrX   rO   Zis_availablerM   rE   rA   rx   rC   openr   rI   r   rD   Zis_cpurh   osfsyncfilenoputqueueEmpty)r   r   r   rP   r   	file_namer   Zwrite_itemsloaderr   r   r   Zwrite_resultsr\   r   r.   r*   r   r+   _write_files_from_queue   sH    



r   c                       s   e Zd ZdZdeeejf eee	e	dd f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ee  ddddZ  ZS )r   aa  
    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)pathsingle_file_per_rank
sync_filesthread_countper_thread_copy_aheadr/   c                    s0   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.

        N. B. If sync_files is disabled, there's no guarantee that the checkpoint will be consistent in the case of a failure.
        N)superrH   r   r   r   r   r   r   )r>   r   r   r   r   r   	__class__r*   r+   rH   D  s    

zFileSystemWriter.__init__)is_coordinatorr/   c                 C   s   d S r0   r*   )r>   r   r*   r*   r+   set_up_storage_writer_  s    z&FileSystemWriter.set_up_storage_writerplanr/   c                 C   s   | j jddd |S )NT)parentsexist_ok)r   mkdirr>   r   r*   r*   r+   prepare_local_planb  s    z#FileSystemWriter.prepare_local_planglobal_planr/   c                 C   s   dd t |D }|S )Nc                 S   s*   g | ]"\}}t j|td | ddqS )__rL   )r:   )dataclassesreplacer,   )r|   r   r   r*   r*   r+   r~   i  s   z8FileSystemWriter.prepare_global_plan.<locals>.<listcomp>)r   )r>   r   Z	new_plansr*   r*   r+   prepare_global_planf  s    z$FileSystemWriter.prepare_global_planr   r   r/   c                    s>  |j d  fdd}t }| jrXt| j|jD ] }| }|| j| ||f q4n*|jD ]"}| }|| j| ||gf q^t }g }	t	d| jD ]2}
t
jt|||| j| jfd}|  |	| qt|||| j| jd |	D ]}|  qg }z|| 7 }qW n, tjk
r8   t }|| | Y S X d S )Nr   c                     s   j    t }  d7  | S rs   )r-   DEFAULT_SUFFIX)r   Z
file_countZstorage_planr*   r+   gen_filew  s    z-FileSystemWriter.write_data.<locals>.gen_filer   )targetargsr   )r:   r   Queuer   r   r   rG   r   r   r   	threadingThreadr   r   r   startrI   joinr   r   r
   
set_result)r>   r   r   r   r   Zbucketr   r7   r   threadsrL   tresfutr*   r   r+   
write_datao  sX     



zFileSystemWriter.write_data)metadataresultsr/   c              	   C   sz   t  }|D ]}|dd |D  q
||_| jd d }t|| t|	  W 5 Q R X | jd 
| jd  d S )Nc                 S   s   i | ]}|j |jqS r*   )r8   r:   )r|   wrr*   r*   r+   
<dictcomp>  s      z+FileSystemWriter.finish.<locals>.<dictcomp>z.metadata.tmpr   	.metadata)dictupdater:   r   r   pickledumpr   r   r   rename)r>   r   r   Z
storage_mdZwr_listmetadata_filer*   r*   r+   finish  s    zFileSystemWriter.finish)TTr   r   )r#   r$   r%   r&   r   r'   r   PathLikeboolr)   rH   r   r   r   r   r   r   r
   r   r   r   r   __classcell__r*   r*   r   r+   r   6  s4       
B 
c                       s   e Zd Zeeejf dd fddZe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  ZS )r   N)r   r/   c                    s    t    t|| _t | _d S r0   )r   rH   r   r   r   r:   )r>   r   r   r*   r+   rH     s    

zFileSystemReader.__init__)sinfoc                 C   s   t ||j|jS r0   )r   r!   r"   )r>   filer   r*   r*   r+   _slice_file  s    zFileSystemReader._slice_filer   c                 C   sN  t  }|jD ](}| j|j }|j}||g | q| D ]\}}| j| d}	|D ]}
| j|
j }| 	|	|}|
j
tjkrt||j}|d ||
| q\tttj|dd}t||
j|
j}||
 }| | kstd|
j d|  d|  || ||
| q\W 5 Q R X q>t  }|!d  |S )Nrbr   r2   )Zmap_locationzreq z mismatch sizes z vs )"r   rG   r:   Zstorage_indexr    
setdefaultrI   r   r   r   rZ   r   rz   r   r   readr"   seekZ
load_bytesr   r	   rX   loadr   Zstorage_offsetslengthsZresolve_tensorr1   r?   rh   Zcopy_Zcommit_tensorr
   r   )r>   r   r   Zper_fileZ	read_itemZitem_mdr   r    reqsr   reqZ
file_slicebytesr.   Ztarget_tensorr   r*   r*   r+   	read_data  sB    

   

zFileSystemReader.read_data)r/   c              
   C   s2   | j d d}t|W  5 Q R  S Q R X d S )Nr   r   )r   r   r   r   )r>   r   r*   r*   r+   read_metadata  s    zFileSystemReader.read_metadata)r   r   r/   c                 C   s   |j | _ | j d k	std S r0   )r:   rh   )r>   r   r   r*   r*   r+   set_up_storage_reader  s    z&FileSystemReader.set_up_storage_readerr   c                 C   s   |S r0   r*   r   r*   r*   r+   r     s    z#FileSystemReader.prepare_local_planr   c                 C   s   |S r0   r*   )r>   r   r*   r*   r+   r     s    z$FileSystemReader.prepare_global_plan)r#   r$   r%   r   r'   r   r   rH   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r*   r*   r   r+   r     s   &)>abcr   r   r   r   rR   r   r   r   r   r   typingr   r   r   r   rX   r	   Ztorch.futuresr
   pathlibr   r   r   r   rJ   r   r   r   r   r   r   r   r   r   r   r   r   utilsr   Ztorch.distributed._shard._utilsr   Ztorch._utilsr   __all__r   r,   r   r6   r;   r<   rE   rM   r)   rx   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   s`   (
Q
6 	