U
    ©Ê¹jD=  ã                   @   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*   úf/var/www/html/bwave/python/venv/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   Z_utilsZ_element_size)r7   r?   Úsru   r*   r*   r+   Ú
_item_sizeÊ   s    

rw   )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*   rx   rz   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   rw   Ú	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   ry   Ú
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sÚt‚| 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*   rx   rz   r*   r*   r+   r}     s     z+_write_files_from_queue.<locals>.<listcomp>c                 S   s   g | ]}|j tjkr|‘qS r*   rx   rz   r*   r*   r+   r}     s     Úwb)Ú
get_nowaitrX   rO   Zis_availablerM   rE   rA   rw   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�}| ¡  |	 |¡ qšt|||| j| jd� |	D ]}| ¡  qèg }z|| ¡ 7 }qüW 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r®t | |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   ry   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)   rw   r†   r‘   rÄ   rÜ   r¥   r   r   r*   r*   r*   r+   Ú<module>   s`   (þ
þQ
þû6 	