
    PhO@              
          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
 d dlmZmZmZmZmZmZ d dl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 d d	lmZ d d
l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)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ ddgZ0e
 G d d             Z1e
 G d d             Z2dZ3de&de+fdZ4 G d de      Z5 G d de5      Z6 G d de5      Z7de&de8fdZ9d e8d!ee&   deee&      fd"Z:d#eeejv                  ejx                  f      d$eejz                  ej.                  f   d%e&d&e>fd'Z?d(ej                  d)ej                  d*e%d+e8d,ef
d-ZA G d. de*      ZB G d/ de)      ZCy)0    N)ABCabstractmethod)	dataclass)CallablecastDictListOptionalUnion)AbstractFileSystem)	url_to_fs)Tensor)_get_device_module)narrow_tensor_by_index)MetadataMetadataIndex)LoadItemTypeLoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItemWriteItemType)StorageReaderStorageWriterWriteResult)_create_file_view)FutureFsspecWriterFsspecReaderc                   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     zC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/distributed/checkpoint/_fsspec_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/   r0   r2   r2   ;   s    Kr/   r2   z.distcpitemreturnc                 2    t        | j                  ||      S )N)indexsize_in_bytesstorage_data)r   r7   )r4   r8   r9   s      r0   _result_from_write_itemr:   C   s     jjL r/   c                   F    e Zd Zededefd       Zed        Zed        Zy)_TensorLoadersizeobjc                      y Nr.   selfr=   r>   s      r0   addz_TensorLoader.addL       r/   c                      y r@   r.   rB   s    r0   start_loadingz_TensorLoader.start_loadingP   rD   r/   c                      y r@   r.   rF   s    r0   valuesz_TensorLoader.valuesT   rD   r/   N)	r'   r(   r)   r   r-   objectrC   rG   rI   r.   r/   r0   r<   r<   K   sJ     &      r/   r<   c                   4    e Zd ZdefdZdedefdZd Zd Z	y)	_SerialCpuLoaderresolve_func                      || _         g | _        y r@   )rM   items)rB   rM   s     r0   __init__z_SerialCpuLoader.__init__Z   s    &
r/   r=   r>   c                 >    | j                   j                  ||f       y r@   )rO   appendrA   s      r0   rC   z_SerialCpuLoader.add^   s    

4+&r/   c                      y r@   r.   rF   s    r0   rG   z_SerialCpuLoader.start_loadinga       r/   c              #     K   | j                   D ]y  \  }}| j                  |      j                         }|j                         }|j	                         j                         |j                         k7  r|j                         }||f { y wr@   )rO   rM   detachcpustorager=   numelclonerB   _r>   tensors       r0   rI   z_SerialCpuLoader.valuesd   su     jjFAs%%c*113FZZ\F~~$$&&,,.8  !s   B
BN)
r'   r(   r)   r   rP   r-   rJ   rC   rG   rI   r.   r/   r0   rL   rL   Y   s+    H ' '& '	r/   rL   c                       e Zd Z	 	 ddededej                  ej                  f   de	fdZ
ed        Zd Zd Zd	 Zd
e	defdZd Zd Zy)_OverlappingCpuLoaderNrM   streaminflight_threshholdc                    || _         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)rM   rO   ra   in_flight_datacollectionsdequecurrent_itemsidxstarteddevice_typetorchdevicetyper   device_modulecurrent_streamr`   wait_stream)rB   rM   r`   ra   s       r0   rP   z_OverlappingCpuLoader.__init__q   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 r@   )rh   lenrO   rF   s    r0   _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   ra   r`   synchronizerg   popleftrY   element_sizerR   )rB   drainedvals      r0   _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)N   rW   T)rl   non_blocking)rn   r`   rs   rd   ra   rO   rh   rM   rV   rl   rm   rj   tork   rX   r=   rY   rZ   rg   rR   rx   r[   s       r0   _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 ru   )rs   rr   rg   r`   rv   rF   s    r0   _finishz_OverlappingCpuLoader._finish   s=    zzzt!!"Q&KK##%!!!r/   r=   r>   c                 l    | j                   rt        d      | j                  j                  ||f       y )Nz&cannot add items after loading started)ri   RuntimeErrorrO   rR   rA   s      r0   rC   z_OverlappingCpuLoader.add   s+    <<GHH

4+&r/   c                     | j                   ry d| _         | j                  j                  d        | j                          y )NTc                     | d   S ru   r.   xs    r0   <lambda>z5_OverlappingCpuLoader.start_loading.<locals>.<lambda>   s    adr/   key)ri   rO   sortr   rF   s    r0   rG   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r@   )rG   rs   r{   r   r   )rB   ry   s     r0   rI   z_OverlappingCpuLoader.values   sY     **kkmGLLN **
 <<>!! !s*   AA3A/A3A3)A1*A31A3)Ni@B )r'   r(   r)   r   r   io	RawIOBaserk   Streamr-   rP   propertyrs   r{   r   r   rJ   rC   rG   rI   r.   r/   r0   r_   r_   p   s     ;?#,	II dBLL%,,67I !	I& + +N0"' '& '
"r/   r_   c                     d}| j                   J | j                   j                  D ]  }||z  }	 | j                   j                  j                  }|t        j
                  j                  |      z  S Nr}   )tensor_datar=   
propertiesdtyperk   _utils_element_size)r4   r=   sr   s       r0   
_item_sizer      sk    D'''""	 # ''--E%,,,,U333r/   binsrO   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    r0   r   z)_split_by_size_and_type.<locals>.<lambda>   s    1r/   r   )	rm   r   BYTE_IOranger   r   	enumeraterR   min)
r   rO   wibytes_wtensor_wr\   bucketsbucket_sizesirh   s
             r0   _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r`   data
write_itemstorage_keyc           	         | 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 )NrW   )tellrm   r   r   
isinstancer   BytesIOwrite	getbufferrk   r   rl   saver:   r#   )r`   r   r   r   r%   r&   s         r0   _write_itemr      s     [[]F-///$

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

4 [[]V#F"FLffE r/   
file_queueresult_queueplannerra   fsc                    	 	 | 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                  5  t        j                  |d      5 }|D ]0  }|j                  |      }|j!                  t#        ||||             2 |j%                         D ]0  \  }}|j&                  sJ |j!                  t#        ||||             2 	 d d d        d d d        |j)                  |       c c}	w c c}	w # 1 sw Y   .xY w# 1 sw Y   2xY w# t*        j,                  $ r Y y w xY w)Nr   )ra   wb)
get_nowaitrk   rc   is_availabler_   resolve_datarL   rm   r   r   rC   r   rG   transactionfsspecopenrR   r   rI   is_cpuputqueueEmpty)r   r   r   ra   r   	file_namer   write_itemsloaderr   r   r   r   write_resultsr`   r   r]   s                    r0   _write_files_from_queuer     s   *2<2G2G2I/I{K zz&&(-@1-D.(((;
 *((
 )(rBGG}7L7L,L[   '


:j1:> '  " )(rBGG}7L7L,L[   M[[D1V&-
&33J?%,,'j+N '. /5mmo*
%}},}%,,'
KP /> 2   ]+O  21   ;; sg   A)G +"F5F58G 
"F:-F:1G GA9F?G%G ?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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    a`  
    Basic implementation of StorageWriter using FFspec.

    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thread_countper_thread_copy_aheadr5   Nc                     t         |           || _        t        |      \  | _        }|| _        || _        || _        y)a  
        Initialize the writer pointing to `path`.

        Args:
            path: diretory where the checkpoint will be writen to.
            single_file_per_rank: Produce one file per rank instead of one file per tensor/blob. 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)superrP   r   r   r   r   r   r   )rB   r   r   r   r   r\   	__class__s         r0   rP   zFsspecWriter.__init__C  s>    " 		t_
$8!(%:"r/   is_coordinatorc                      y r@   r.   )rB   r   s     r0   set_up_storage_writerz"FsspecWriter.set_up_storage_writer[  rT   r/   planc                 T    | j                   j                  | j                  d       |S )NT)exist_ok)r   makedirsr   rB   r   s     r0   prepare_local_planzFsspecWriter.prepare_local_plan^  s"    T2r/   global_planc                     t        |      D cg c])  \  }}t        j                  |t        d| d            + }}}|S c c}}w )N__r\   r9   )r   dataclassesreplacer2   )rB   r   r   r   	new_planss        r0   prepare_global_planz FsspecWriter.prepare_global_planb  sT    
 %[1
14 >Bqc)3LM1 	 
 	
s   .Ar   c           	         |j                   dfd}t        j                         }| j                  rkt	        | j
                  |j                        D ]G  } |       }t        j                  j                  | j                  |      }|j                  |||f       I nW|j                  D ]H  } |       }t        j                  j                  | j                  |      }|j                  |||gf       J 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   )r3   DEFAULT_SUFFIX)r   
file_countstorage_plans    r0   gen_filez)FsspecWriter.write_data.<locals>.gen_files  s,    '../
|N;KLI!OJr/   r}   )targetargs)r   r   r   ra   r   )r9   r   Queuer   r   r   rO   osr   joinr   r   	threadingThreadr   r   r   startrR   r   r   r   
set_result)rB   r   r   r   r   bucketr   	file_pathr4   r   threadsr\   tresfutr   r   s                  @@r0   
write_datazFsspecWriter.write_datak  s   
 (,'8'8
	 #(++-
$$1!!4:: %J	GGLLI>		9f=> 

$J	GGLLI>		9tf=> #
 %*KKMq$++,A  . ..GG	A GGINN1 - 	 !% $ : :ww	
 AFFH  	|..00 {{ 	-3XCNN3J	s   =G 1HHmetadataresultsc                    t               }|D ]6  }|j                  |D ci c]  }|j                  |j                   c}       8 ||_        t        j
                  j                  | j
                  d      }| j                  j                  5  t        j                  |d      5 }t        j                  ||       d d d        d d d        y c c}w # 1 sw Y   xY w# 1 sw Y   y xY w)N	.metadatar   )dictupdater7   r9   r   r   r   r   r   r   r   pickledump)rB   r   r   
storage_mdwr_listwrmetadata_pathmetadata_files           r0   finishzFsspecWriter.finish  s     V
G7K7Rrxx87KL  *TYY<WW  ]D1]Hm4 2 ! 	 L
 21 ! s)   C
C$C;CC	CC&)Tr}   i )r'   r(   r)   r*   r   r+   r   PathLikeboolr-   rP   r   r   r   r	   r   r   r   r   r   r   r  __classcell__r   s   @r0   r    r    5  s      &*%/;C$%; #; 	;
  #; 
;0D T x H >	hAA A 
[!	"	AF5 5+/[0A+B5	5r/   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   r5   Nc                 t    t         |           || _        t        |      \  | _        }t               | _        y r@   )r   rP   r   r   r   r   r9   )rB   r   r\   r   s      r0   rP   zFsspecReader.__init__  s.    	t_
?Cvr/   sinfoc                 D    t        ||j                  |j                        S r@   )r   r%   r&   )rB   filer  s      r0   _slice_filezFsspecReader._slice_file  s     u||U\\BBr/   r   r   c                    t               }|j                  D ]H  }| j                  |j                     }|j                  }|j                  |g       j                  |       J |j                         D ]  \  }}t        j                  j                  | j                  |      }	t        j                  |	d      5 }
|D ]|  }| j                  |j                     }| j                  |
|      }|j                  t        j                  k(  rRt!        j"                  |j%                  |j&                              }|j)                  d       |j+                  ||       t-        t.        t1        j2                  |d            }t5        ||j6                  |j8                        }|j;                  |      j=                         }|j?                         |j?                         k(  s6J d|j                   d|j?                          d|j?                                 |jA                  |       |jC                  ||        	 d d d         tE               }|jG                  d        |S # 1 sw Y   xY w)Nrbr   rW   )map_locationzreq z mismatch sizes z vs )$r   rO   r9   storage_indexr$   
setdefaultrR   r   r   r   r   r   r  rm   r   r   r   r   readr&   seek
load_bytesr   r   rk   loadr   storage_offsetslengthsresolve_tensorrV   r=   copy_commit_tensorr   r   )rB   r   r   per_file	read_itemitem_mdr   r$   reqsabs_pathr  req
file_slicebytesr]   target_tensorr   s                    r0   	read_datazFsspecReader.read_data  s   .2fI''	(?(?@G((Db)00; $
 $,>>#3M4ww||DII}=HXt,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)   -, $44 ht
5 -,s   9FI%%I/	c                     t         j                  j                  | j                  d      }t        j                  |d      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nr   r  )r   r   r   r   r   r   r  )rB   r  r  s      r0   read_metadatazFsspecReader.read_metadata  sB    TYY<[[-;;}- .--s   A  A)r   r   c                 B    |j                   | _         | j                   J y r@   r   )rB   r   r   s      r0   set_up_storage_readerz"FsspecReader.set_up_storage_reader  s$     %11  ,,,r/   c                     |S r@   r.   r   s     r0   r   zFsspecReader.prepare_local_plan  s    r/   r   c                     |S r@   r.   )rB   r   s     r0   r   z FsspecReader.prepare_global_plan  s
     r/   )r'   r(   r)   r   r+   r   r  rP   r#   r  r   r   r   r(  r   r*  r  r,  r   r	   r   r	  r
  s   @r0   r!   r!     s    FU3#34 F FC| C$h $ $ $N.x .
- -26-	-x H >	hr/   )Dre   r   r   r   r   r   r   abcr   r   r   typingr   r   r   r	   r
   r   r   rk   r   fsspec.corer   r   torch._utilsr   torch.distributed._shard._utilsr   %torch.distributed.checkpoint.metadatar   r   $torch.distributed.checkpoint.plannerr   r   r   r   r   r   r   r   $torch.distributed.checkpoint.storager   r   r   "torch.distributed.checkpoint.utilsr   torch.futuresr   __all__r#   r2   r   r:   r<   rL   r_   r-   r   r   r   r   r   r+   r   r   r   r    r!   r.   r/   r0   <module>r:     s     	 	    # ! > >   % !  + B I	 	 	 
 A          
C } .S"M S"l4Y 43 4
9o	$y/4U2<<567


ELL(
)  	,11++1 1 	1
 	1hD5= D5NB= Br/   