
    Ph?              
          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             Z-e G d d             Z.dZ/dej"                  dej"                  fdZ0de$defdZ1 G d de      Z2 G d de2      Z3 G d d e2      Z4de$de5fd!Z6d"ee$   deee$      fd#Z7d$ Z8d%ejr                  d&ejr                  d'e"d(e5d)e:f
d*Z; G d+ de      Z< G d, de      Z=y)-    )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                   0    e Zd ZU dZeed<   eed<   eed<   y)_StorageInfoz#This is the per entry storage info.relative_pathoffsetlengthN)__name__
__module____qualname____doc__str__annotations__int     rC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/distributed/checkpoint/filesystem.pyr!   r!   2   s    -KKr-   r!   c                       e Zd ZU eed<   y)_StoragePrefixprefixN)r%   r&   r'   r)   r*   r,   r-   r.   r0   r0   ;   s    Kr-   r0   z.distcptensorreturnc                     | j                         j                         } | j                         j                         | j	                         k7  r| j                         } | S N)detachcpu_typed_storage_sizenumelclone)r2   s    r.   _trimr<   C   sF    ]]_  "F$$&&,,.8Mr-   itemc                 2    t        | j                  ||      S )N)indexsize_in_bytesstorage_data)r   r?   )r=   r@   rA   s      r.   _result_from_write_itemrB   J   s     jjL r-   c                   <    e Zd Zed        Zed        Zed        Zy)_TensorLoaderc                      y r5   r,   selfsizeobjs      r.   addz_TensorLoader.addS       r-   c                      y r5   r,   rG   s    r.   start_loadingz_TensorLoader.start_loadingW   rK   r-   c                      y r5   r,   rM   s    r.   valuesz_TensorLoader.values[   rK   r-   N)r%   r&   r'   r   rJ   rN   rP   r,   r-   r.   rD   rD   R   s<         r-   rD   c                   $    e Zd Zd Zd Zd Zd Zy)_SerialCpuLoaderc                      || _         g | _        y r5   )resolve_funitems)rG   rT   s     r.   __init__z_SerialCpuLoader.__init__a   s    &
r-   c                 >    | j                   j                  ||f       y r5   )rU   appendrF   s      r.   rJ   z_SerialCpuLoader.adde   s    

4+&r-   c                      y r5   r,   rM   s    r.   rN   z_SerialCpuLoader.start_loadingh       r-   c              #     K   | j                   D ]y  \  }}| j                  |      j                         }|j                         }|j	                         j                         |j                         k7  r|j                         }||f { y wr5   )rU   rT   r6   r7   storagerH   r:   r;   rG   _rI   r2   s       r.   rP   z_SerialCpuLoader.valuesk   su     jjFAs%%c*113FZZ\F~~$$&&,,.8  !s   B
BN)r%   r&   r'   rV   rJ   rN   rP   r,   r-   r.   rR   rR   `   s    '	r-   rR   c                   H    e Zd Zd
dZed        Zd Zd Zd Zd Z	d Z
d	 Zy)_OverlappingCpuLoaderNc                    || _         g | _        || _        d| _        t	        j
                         | _        d| _        d| _        |r|j                  nt        j                  d      j                  | _	        t        | j                        | _        |xs | j                  j                         | _        | j                   | j                  j                         k7  r4| j                   j#                  | j                  j                                y y )Nr   Fcuda)rT   rU   inflight_threshholdin_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typetorchdevicetyper   device_modulecurrent_streamstreamwait_stream)rG   rT   rp   rc   s       r.   rV   z_OverlappingCpuLoader.__init__x   s    &
#6 0;0A0A0C176--U\\&=Q=V=V/0@0@AC 2 2 A A C;;$,,;;==KK##D$6$6$E$E$GH >r-   c                 F    | j                   t        | j                        k\  S r5   )rh   lenrU   rM   s    r.   _donez_OverlappingCpuLoader._done   s    xx3tzz?**r-   c                    g }| j                   | j                  k\  r| j                  j                          | j                   | j                  k\  r| j                  j                         }| xj                   |d   j                         |d   j                         z  z  c_         |j                  |       | j                   | j                  k\  r|S Nr   )	rd   rc   rp   synchronizerg   popleftr:   element_sizerX   )rG   drainedvals      r.   _drainz_OverlappingCpuLoader._drain   s    $":"::KK##%!!T%=%==$$,,.C3q6<<>CF4G4G4I#IINN3 !!T%=%== r-   c                    | j                   j                  | j                        5  | j                  sz| j                  | j                  k  r`| j
                  | j                     \  }}| xj                  dz  c_        | j                  |      j                         }|j                  j                  | j                  k(  r|j                  dd      }na|j                  t        j                  d      k(  r?|j                         j                         |j!                         k7  r|j#                         }| j$                  j'                  ||f       | xj                  |j!                         |j)                         z  z  c_        | j                  s| j                  | j                  k  r`d d d        y # 1 sw Y   y xY w)Nr   r7   T)rl   non_blocking)rn   rp   rt   rd   rc   rU   rh   rT   r6   rl   rm   rj   tork   r\   rH   r:   r;   rg   rX   ry   r]   s       r.   _refillz_OverlappingCpuLoader._refill   sH   &&t{{3JJ''$*B*BBDHH-3A))#.557==%%)9)99#YYe$YGF]]ell5&99~~',,.&,,.@!'"")) ##v||~8K8K8M'MM#' JJ''$*B*BB 433s   FF77G c                     | j                   sJ t        | j                        dkD  r| j                  j	                          | j                  S rv   )rt   rs   rg   rp   rw   rM   s    r.   _finishz_OverlappingCpuLoader._finish   s=    zzzt!!"Q&KK##%!!!r-   c                 l    | j                   rt        d      | j                  j                  ||f       y )Nz&cannot add items after loading started)ri   RuntimeErrorrU   rX   rF   s      r.   rJ   z_OverlappingCpuLoader.add   s+    <<GHH

4+&r-   c                     | j                   ry d| _         | j                  j                  d        | j                          y )NTc                     | d   S rv   r,   xs    r.   <lambda>z5_OverlappingCpuLoader.start_loading.<locals>.<lambda>   s    adr-   key)ri   rU   sortr   rM   s    r.   rN   z#_OverlappingCpuLoader.start_loading   s.    <<

N+r-   c              #      K   | j                          | j                  s7| j                         }| j                          |E d {    | j                  s7| j	                         E d {    y 7 *7 wr5   )rN   rt   r|   r   r   )rG   rz   s     r.   rP   z_OverlappingCpuLoader.values   sY     **kkmGLLN **
 <<>!! !s*   AA3A/A3A3)A1*A31A3)Ni@B )r%   r&   r'   rV   propertyrt   r|   r   r   rJ   rN   rP   r,   r-   r.   r`   r`   w   s;    I + +N0"'
"r-   r`   c                     d}| j                   J | j                   j                  D ]  }||z  }	 | j                   j                  j                  }|t        j
                  j                  |      z  S Nr   )tensor_datarH   
propertiesdtyperk   _utils_element_size)r=   rH   sr   s       r.   
_item_sizer      sk    D'''""	 # ''--E%,,,,U333r-   rU   c                 j   | dk(  r|gS |D cg c]"  }|j                   t        j                  k(  s!|$ }}|D cg c]"  }|j                   t        j                  k7  s!|$ }}t        |       D cg c]  }g  }}t        |       D cg c]  }d }}|j	                  t
        d       t        |      D ]  \  }}||| z     j                  |        |D ]F  }t        t        |      d       d   }	||	   j                  |       ||	xx   t        |      z  cc<   H |S c c}w c c}w c c}w c c}w )Nr   r   T)r   reversec                     | d   S r   r,   r   s    r.   r   z)_split_by_size_and_type.<locals>.<lambda>   s    1r-   r   )	rm   r   BYTE_IOranger   r   	enumeraterX   min)
binsrU   wibytes_wtensor_wr^   bucketsbucket_sizesirh   s
             r.   _split_by_size_and_typer      s$    qyw!FEbRWW0E0E%ErEGF"GUrbgg1F1F&FUHG27+%>+Qb+G%>$T{+{!A{L+MMj$M/7#2D  $ $ )L)~>qABSZ^+	  N# GG%>+s!   "D!D!"D&D&0	D+	D0c           	         | j                         }|j                  t        j                  k(  r<t	        |t
        j                        sJ | j                  |j                                nVt	        |t        j                        sJ |j                  t        j                  d      k(  sJ t        j                  ||        | j                         |z
  }t        ||t        |||            S )Nr7   )tellrm   r   r   
isinstanceioBytesIOwrite	getbufferrk   r
   rl   saverB   r!   )rp   data
write_itemstorage_keyr#   r$   s         r.   _write_itemr      s    [[]F-///$

+++T^^%&$---{{ell51111

4 [[]V#F"FLffE r-   
file_queueresult_queueplannerrc   	use_fsyncc           
         	 	 | j                         \  }}}t        j                  j                         r|dkD  rt	        |j
                  |      }nt        |j
                        }|D 	cg c]"  }	|	j                  t        j                  k7  s!|	$ }
}	|
D ]  }|j                  t        |      |        |j                          |D 	cg c]"  }	|	j                  t        j                  k(  s!|	$ }}	g }|j                  d      5 }|D ]0  }|j                  |      }|j                  t        ||||             2 |j!                         D ]0  \  }}|j"                  sJ |j                  t        ||||             2 |r#t%        j&                  |j)                                d d d        |j+                  |       c c}	w c c}	w # 1 sw Y   &xY w# t,        j.                  $ r Y y w xY w)Nr   )rc   wb)
get_nowaitrk   rb   is_availabler`   resolve_datarR   rm   r   r   rJ   r   rN   openrX   r   rP   is_cpuosfsyncfilenoputqueueEmpty)r   r   r   rc   r   	file_namer   write_itemsloaderr   r   r   r   write_resultsrp   r   r2   s                    r.   _write_files_from_queuer      s   ,2<2G2G2I/I{K zz&&(-@1-D.(((;
 *((
 )(rBGG}7L7L,L[   '


:j1:> '  " )(rBGG}7L7L,L[   M%")J"//
;D!((#FD*kJ #* +1--/&FJ!==(=!((#FFJL +: HHV]]_- & ]+S 
 &%  ;; sO   A)G +"F?F?8G 
"G-G1G BG	$%G 	GG G+*G+c                        e Zd ZdZ	 	 	 	 ddeeej                  f   dedede	de	ddf fd	Z
d
edd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ee      ddfdZ x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.

    pathsingle_file_per_rank
sync_filesthread_countper_thread_copy_aheadr3   Nc                     t         |           t        |t              st        |      }|| _        || _        || _        || _        || _        y)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)	superrV   r   r   r   r   r   r   r   )rG   r   r   r   r   r   	__class__s         r.   rV   zFileSystemWriter.__init__B  sI    ( 	$%:D	$8!$(%:"r-   is_coordinatorc                      y r5   r,   )rG   r   s     r.   set_up_storage_writerz&FileSystemWriter.set_up_storage_writer_  rZ   r-   planc                 @    | j                   j                  dd       |S )NT)parentsexist_ok)r   mkdirrG   r   s     r.   prepare_local_planz#FileSystemWriter.prepare_local_planb  s    		t4r-   global_planc                     t        |      D cg c])  \  }}t        j                  |t        d| d            + }}}|S c c}}w )N__r^   rA   )r   dataclassesreplacer0   )rG   r   r   r   	new_planss        r.   prepare_global_planz$FileSystemWriter.prepare_global_planf  sT    
 %[1
14 >Bqc)3LM1 	 
 	
s   .Ar   c           	         |j                   dfd}t        j                         }| j                  rNt	        | j
                  |j                        D ]*  } |       }|j                  | j                  |z  ||f       , n:|j                  D ]+  } |       }|j                  | j                  |z  ||gf       - t        j                         }g }	t        d| j
                        D ]W  }
t        j                  t        |||| j                  | j                  f      }|j                          |	j!                  |       Y t        |||| j                  | j                         |	D ]  }|j#                           g }	 	 ||j%                         z  }# t        j&                  $ r! 	 t)               }|j+                  |       |cY S w xY w)Nr   c                  >    j                     t         } dz  | S r   )r1   DEFAULT_SUFFIX)r   
file_countstorage_plans    r.   gen_filez-FileSystemWriter.write_data.<locals>.gen_filew  s,    '../
|N;KLI!OJr-   r   )targetargs)r   r   r   rc   r   )rA   r   Queuer   r   r   rU   r   r   r   	threadingThreadr   r   r   startrX   joinr   r   r   
set_result)rG   r   r   r   r   bucketr   r=   r   threadsr^   tresfutr   r   s                 @@r.   
write_datazFileSystemWriter.write_datao  s   
 (,'8'8
	 #(++-
$$1!!4:: %J			I 5y&IJ	 

$J			I 5y4&IJ # %*KKMq$++,A  . ..OO	A GGINN1 - 	 !% $ : :oo	
 AFFH  	|..00 {{ 	-3XCNN3J	s   F 1GGmetadataresultsc                    t               }|D ]6  }|j                  |D ci c]  }|j                  |j                   c}       8 ||_        | j                  dz  j                  d      5 }t        j                  ||       | j                  r#t        j                  |j                                d d d        | j                  dz  j                  | j                  dz         y c c}w # 1 sw Y   :xY w)Nz.metadata.tmpr   	.metadata)dictupdater?   rA   r   r   pickledumpr   r   r   r   rename)rG   r   r   
storage_mdwr_listwrmetadata_files          r.   finishzFileSystemWriter.finish  s     V
G7K7Rrxx87KL  *ii/)//5KK-0--/0 6
 
_	$,,TYY-DE L55s   C%
+AC**C3)TTr   i )r%   r&   r'   r(   r   r)   r   PathLikeboolr+   rV   r   r   r   r   r   r   r   r   r   r   r  __classcell__r   s   @r.   r   r   4  s      &*%/;C$%; #; 	;
 ;  #; 
;:D T x H >	h?? ? 
[!	"	?BF F+/[0A+BF	Fr-   c                        e Zd Zdeeej                  f   ddf fdZdefdZ	de
deded   fd	Zdefd
Z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 xZS )r   r   r3   Nc                     t         |           t        |t              st        |      }|| _        t               | _        y r5   )r   rV   r   r   r   r   rA   )rG   r   r   s     r.   rV   zFileSystemReader.__init__  s2    $%:D	?Cvr-   sinfoc                 D    t        ||j                  |j                        S r5   )r   r#   r$   )rG   filer  s      r.   _slice_filezFileSystemReader._slice_file  s     u||U\\BBr-   r   r   c                    t               }|j                  D ]H  }| j                  |j                     }|j                  }|j                  |g       j                  |       J |j                         D ]  \  }}| j                  |z  j                  d      5 }	|D ]|  }
| j                  |
j                     }| j                  |	|      }|
j                  t        j                  k(  rRt        j                  |j                  |j                               }|j#                  d       |j%                  |
|       t'        t(        t+        j,                  |d            }t/        ||
j0                  |
j2                        }|j5                  |
      j7                         }|j9                         |j9                         k(  s6J d|
j                   d|j9                          d|j9                                 |j;                  |       |j=                  |
|        	 d d d         t?               }|jA                  d        |S # 1 sw Y   xY w)Nrbr   r7   )map_locationzreq z mismatch sizes z vs )!r   rU   rA   storage_indexr"   
setdefaultrX   r   r   r  rm   r   r   r   r   readr$   seek
load_bytesr	   r
   rk   loadr   storage_offsetslengthsresolve_tensorr6   rH   copy_commit_tensorr   r   )rG   r   r   per_file	read_itemitem_mdr   r"   reqsr  req
file_slicebytesr2   target_tensorr   s                   r.   	read_datazFileSystemReader.read_data  s   .2fI''	(?(?@G((Db)00; $
 $,>>#3M4))m+11$74C"//0A0ABG!%!1!1$!@Jxx<#7#77 "

:??7>>+J K

1**36!%"EJJz$N" "8"C$7$7" )0(>(>s(C(J(J(L *..0FKKMAo!#"3"3!44D]EWEWEYDZZ^_e_j_j_l^mnoA%++F3--c=A)   87 $42 ht
5 87s   FII	c                     | j                   dz  j                  d      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nr   r  )r   r   r   r  )rG   r  s     r.   read_metadatazFileSystemReader.read_metadata  s3    ii+%++D1];;}- 211s	   >Ar   r   c                 B    |j                   | _         | j                   J y r5   r   )rG   r   r   s      r.   set_up_storage_readerz&FileSystemReader.set_up_storage_reader  s"    $11  ,,,r-   c                     |S r5   r,   r   s     r.   r   z#FileSystemReader.prepare_local_plan  s    r-   r   c                     |S r5   r,   )rG   r   s     r.   r   z$FileSystemReader.prepare_global_plan  s
     r-   )r%   r&   r'   r   r)   r   r  rV   r!   r  r   r   r   r&  r   r(  r  r*  r   r   r   r  r	  s   @r.   r   r     s    FU3#34 F FC| C#h # # #L.x .-h - -QU -x H >	hr-   )>abcr   r   r   r   re   r   r   r   r   r   typingr   r   r   r	   rk   r
   torch.futuresr   pathlibr   r   r   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   utilsr   torch.distributed._shard._utilsr   torch._utilsr   __all__r!   r0   r   r<   rB   rD   rR   r`   r+   r   r   r   r   r  r   r   r   r,   r-   r.   <module>r5     s   #    ! 	  	  * *      	 	 	 % B +        %,, 5<< 
C } .N"M N"b4Y 43 4i	$y/4"33++3 3 	3
 3lHF} HFV?} ?r-   