
    ȅi<                     \   % S SK r S SKrS SKrS SKrS SKrS SKJr  S SKrS SKJ	r	J
r
  S SKJr  S SKJrJrJrJrJrJrJr  S SKJr  S SKJrJrJrJrJrJr  S SKJrJ r J!r!J"r"J#r#J$r$  S S	K%J&r&  S S
K'J(r(  \RR                  " \*5      r+\RX                  \-S'   SS/r. " S S\
5      r/ " S S\	5      r0g)    N)Any)FileSystemReaderFileSystemWriter)consolidate_safetensors_files)_gen_file_name_HFStorageInfo_metadata_fnCUSTOM_METADATA_KEYSAVED_OFFSETS_KEYSHARDED_DIR_NAMESUFFIX)SerializationFormat)ChunkStorageMetadataMetadataMetadataIndexStorageMetaTensorPropertiesTensorStorageMetadata)LoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItem)WriteResult)FutureloggerHuggingFaceStorageWriterHuggingFaceStorageReaderc                   &  ^  \ rS rSrSr     SS\S\\\4   S-  S\S\S\S	\S
S4U 4S jjjr	S\
\   S
\
\   4S jrS\S\S
\\
\      4U 4S jjrS\S\
\
\      S
S4S jrS\\\4   S-  S\
\   S
\\\
\   4   4S jr\S
\4S j5       rSrU =r$ )r   1   zH
A writer that writes to storage in the huggingface safetensors format.
Npathfqn_to_index_mappingthread_countsave_distributedenable_consolidationthread_count_consolidationreturnc                 2  > [         TU ]  U[        R                  US9  X l        X@l        XPl        SU l        U R                  (       aI  [        U R                  5      U l        U R                  R                  U R                  [        5      U l	        X`l        g)a  
Initialize the huggingface writer pointing to path.

Args:
    path: directory where the checkpoint will be read from.
    fqn_to_index_mapping: A mapping from tensor FQN to the index of the file that the tensor should be written to.
                      Indices are from 1 to N, where N is the number of files. If not provided,
                      the tensors will be written to a single file. If none, then all the tensors on the
                      same rank will be written to the same file.
    thread_count: Number of threads to use to write distributed checkpoint. Default to 1.
    save_distributed: If True, save the checkpoint using distributed APIs where every rank saves its own shard.
                Default is False which assumes rank-0 checkpointing of the full state_dict.
    enable_consolidation: If True, consolidate the sharded checkpoint after saving. The sharded tensors will be
                        saved to path/sharded and the full tensors will be saved to path. Default to False.
    thread_count_consolidation: Number of threads to use for parallel processing of saving data
                        to consolidated output files. Default to 1.
)r"   serialization_formatr$   N)super__init__r   SAFETENSORSr#   r%   r&   consolidated_output_pathstrr"   fsconcat_pathr   r'   )selfr"   r#   r$   r%   r&   r'   	__class__s          a/home/james-whalen/.local/lib/python3.13/site-packages/torch/distributed/checkpoint/hf_storage.pyr,   !HuggingFaceStorageWriter.__init__6   s    6 	!4!@!@% 	 	

 <P!&6*>!48%$$,/		ND)++DII7GHDI*D'    plansc                     / n[        USS9 H[  u  p40 nU R                  b  U R                  US'   U R                  (       a  X5S'   UR                  [        R
                  " XES95        M]     U$ )N   )startr#   shard_index)storage_data)	enumerater#   r%   appenddataclassesreplace)r2   r7   	new_plansiplanr<   s         r4   prepare_global_plan,HuggingFaceStorageWriter.prepare_global_plan_   sn    	 a0GA+-L((47;7P7P34$$./]+[00QR 1 r6   rC   plannerc                 .  > [        UR                  5      S:X  a  [        5       nUR                  / 5        U$ UR                  nS nS nSU;   a  US   nSU;   a  US   nU R                  XQR                  5      nUb  [        UR                  5       5      OSn[        R                  " 5       n	UR                  5        HH  u  p[        XU5      nU	R                  U R                  R                  U R                  U5      X45        MJ     [        TU ]A  X)5      $ )Nr   r#   r;   r9   )lenitemsr   
set_resultr<   _split_by_storage_planmaxvaluesqueueQueuer   putr0   r1   r"   r+   _write_data)r2   rC   rF   futr<   storage_planr;   bucketshighest_index
file_queue
file_indexwrite_items	file_namer3   s                r4   
write_data#HuggingFaceStorageWriter.write_datal   s    
 tzz?a (CNN2J (,'8'8.2"&!\1'(>?LL(&}5K--lJJG6B6NL//12TU"'++-
'.}}#J&z+NINN$$TYY	:IS (7 w"777r6   metadataresultsc                    U R                   (       a'  U R                  (       d  [        R                  S5        g U R                   (       az  U R                  b  U R                  O-[
        R                  UR                  R                  5       S5      n[        [        U R                  5      U R                  U R                  US9$ 0 n0 nSnU H  nUR                  U Vs0 s H-  oR                  R                   UR"                  R$                  _M/     sn5        U['        U Vs/ s H  oR"                  R(                  PM     sn5      -  nM     SU0US'   XTS'   U R*                  R-                  U R                  [.         5      n	U R*                  R1                  U	S5       n
[2        R4                  " XJS	S
9  S S S 5        g s  snf s  snf ! , (       d  f       g = f)Nz4Not consolidating sharded checkpoint in finish step.r9   )	input_dir
output_dirnum_threadsr#   r   
total_sizer\   
weight_mapw   )indent)r%   r&   r   infor#   dictfromkeysstate_dict_metadatakeysr   r/   r"   r.   r'   updateindexfqnr<   relative_pathsumlengthr0   r1   r	   create_streamjsondump)r2   r\   r]   r#   metadata_to_write
storage_mdrb   wr_listwrmetadata_pathmetadata_files              r4   finishHuggingFaceStorageWriter.finish   s     )B)B
 KKNO   ,,8 ))]]8#?#?#D#D#FJ ! 1dii.88 ;;%9	  

GGNOwr<<<wO #H"55HIIJ	 
 *6z(B*%*4,'++DII,IWW""=#6-II'qA 76 PH
 76s   4G 
#G!G


GrS   rI   c                     Uc  SU0$ 0 nU H<  nUR                   R                  nX   nXc;  a  U/X6'   M)  X6   R                  U5        M>     U$ )Nr9   )rm   rn   r>   )r2   rS   rI   rT   itemkeyidxs          r4   rK   /HuggingFaceStorageWriter._split_by_storage_plan   s^     u:D**..C#C! $v##D)  r6   c                     [         $ N)r	   )r2   s    r4   ry   &HuggingFaceStorageWriter.metadata_path   s    r6   )r.   r&   r#   r"   r%   r'   )Nr9   FFr9   )__name__
__module____qualname____firstlineno____doc__r/   rh   intboolr,   listr   rD   r   r   r   rZ   r   r{   r   rK   propertyry   __static_attributes____classcell__r3   s   @r4   r   r   1   sD    7;!&%**+'E'E #38nt3'E 	'E
 'E #'E %('E 
'E 'ERh DN 88 8 
[!	"	8>%Bx %B$tK7H2I %Bd %BN cNT1:>y/	c4	?"	#& s  r6   c                      ^  \ rS rSrSrSS\S\SS4U 4S jjjrS\S	\	SS4S
 jr
S\R                  S\R                  S	\	SS4S jrS\S	\	S\S   4S jrS\4S jrSrU =r$ )r      zI
A reader that reads a checkpoint in the huggingface safetensors format.
r"   r$   r(   Nc                 ,   > [         TU ]  US9  X l        g)z
Initialize the huggingface reader pointing to path.

Args:
    path: directory where the checkpoint will be read from.
    thread_count: Number of threads to use to read distributed checkpoint. Default to 1.
)r"   N)r+   r,   r$   )r2   r"   r$   r3   s      r4   r,   !HuggingFaceStorageReader.__init__   s     	d#(r6   reqrF   c           	         [        S [        UR                  UR                  5       5       5      nUR	                  UR
                  R                  5      U   nUR                  U5      R                  5       nUR                  5       UR                  5       :w  a:  [        SUR
                   SUR                  5        SUR                  5        35      eUR                  U5        UR                  X&5        g)z1Helper function to process a single read request.c              3   B   #    U  H  u  p[        XU-   5      v   M     g 7fr   )slice).0offsetrq   s      r4   	<genexpr>AHuggingFaceStorageReader._process_read_request.<locals>.<genexpr>   s%      
"G &6/**"Gs   zreq z mismatch sizes z vs N)tuplezipstorage_offsetslengths	get_slicestorage_indexrn   resolve_tensordetachsizeAssertionErrorcopy_commit_tensor)r2   fr   rF   slicestensortarget_tensors          r4   _process_read_request.HuggingFaceStorageReader._process_read_request   s      
"%c&9&93;;"G
 
 S..223F;..s3::<6;;=0 s(())9-:L:L:N9OtTZT_T_TaSbc  	F#c1r6   rV   result_queuec                    SSK Jn    UR                  5       u  pVU" USS9 nU H  nU R                  XxU5        M     S S S 5        UR	                  S5        MP  ! , (       d  f       N!= f! [
        R                   a     g f = f)Nr   	safe_openTptfilename	framework)safetensorsr   
get_nowaitr   rP   rN   Empty)	r2   rV   r   rF   r   rY   reqsr   r   s	            r4   _read_files_from_queue/HuggingFaceStorageReader._read_files_from_queue   s~     	*	","7"7"9		TBa#2217C  $ C   & BB {{ 		s'   A* AA* 
A'#A* *B BrC   c                 r   SSK Jn  0 nUR                   HI  nU R                  UR                     nUR
                  nUR                  U/ 5      R                  U5        MK     U R                  S::  d  [        U5      S::  aE  UR                  5        H0  u  pxU" USS9 n	U H  n
U R                  XU5        M     S S S 5        M2     O[        R                  " 5       n[        R                  " 5       nUR                  5        H  u  pxUR                  Xx45        M     / n[        U R                  [        U5      5      n[        U5       HE  n[         R"                  " U R$                  XU4S9nUR'                  5         UR                  U5        MG     U H  nUR)                  5         M     Sn  UR+                  5         US-  nM  [1        5       nUR3                  S 5        U$ ! , (       d  f       GM`  = f! [        R,                   a     Of = fU[        U5      :w  d  M[  [/        SU S[        U5       35      e)	Nr   r   r9   r   r   )targetargszNot all files were processed: z out of )r   r   rI   r<   r   ro   
setdefaultr>   r$   rH   r   rN   rO   rP   minrange	threadingThreadr   r:   joinr   r   r   r   rJ   )r2   rC   rF   r   per_file	read_itemitem_mdrY   r   r   r   rV   r   threadsra   _tprocessed_countrR   s                      r4   	read_data"HuggingFaceStorageReader.read_data   s   ).0I&*&7&7	8O8O&PG--I	2.55i@ $
 !S]a%7#+>>#3		TBa#2217C  $ CB $4 ',kkmJ(-L $,>>#3		01 $4 Gd//X?K;'$$66$G< 	q! (    O ++-#q(O  ht
W CBB ;;  #h-/$4_4EXcRZm_] s   G!,G4 !
G1	4H
Hc                    SSK Jn  SSKJn  0 n0 n/ nU R                  R                  U R                  5       H0  nUR                  [        5      (       d  M  UR                  U5        M2     U GH{  nU" USS9 nUR                  5       n	UR                  5       n
S nU
(       aC  U
R                  [        5      (       a)  [        R                  " U
R                  [        5      5      nU	 GH  nUR!                  U5      R#                  5       nUR!                  U5      R%                  5       nUb  X   [&           nOS/[)        U5      -  nX;  a  [+        [-        U" U5      S9[.        R0                  " [3        X5       VVs/ s H  u  nnUU-   PM     snn5      [5        [.        R0                  " W5      [.        R0                  " U5      S9/S9X<'   OX<   R6                  R                  [5        [.        R0                  " U5      [.        R0                  " U5      S	95        [9        X<   R:                  5      n[=        [)        U5      5       H  n[?        UU   UU   UU   -   5      UU'   M      [.        R0                  " U5      X<   l        Ub  [A        XU   [&           S
9nO[A        US/[)        U5      -  S
9n[C        U[.        R0                  " U5      U" U5      S9UU'   GM     S S S 5        GM~     [E        UUS9n[G        USS 5      c  [I        5       Ul%        U RL                  URJ                  l&        U$ s  snnf ! , (       d  f       GM  = f)Nr   r   )	_getdtyper   )r   )dtype)offsetssizes)
propertiesr   chunks)r   )rn   r   )ro   shaper   )rj   r<   storage_meta)'r   r   safetensors.torchr   r0   lsr"   endswithr   r>   rk   r\   getr
   rs   loadsr   	get_shape	get_dtyper   rH   r   r   torchSizer   r   r   r   r   r   rL   r   r   r   getattrr   r   load_id)r2   r   r   rj   r<   safetensors_filesfilesafetensor_filer   rk   extra_metadatadcp_sharding_infor   r   r   r   savedr   rB   metadata_indexr\   s                        r4   read_metadata&HuggingFaceStorageReader.read_metadata9  s   )/@B<>GGJJtyy)D}}V$$!((. *  1O?d;qvvx!"$(!!n&8&89L&M&M(,

&**+>?)%  CKK,668EKK,668E(4!2!78I!J"#s5z!153H'7i>N'O!&EHEW XEWME6EW X" !5,1JJv,>*/**U*;!"$4+0 ,077>>0 %

6 2%**U:K
  $$7$<$A$AB!&s4y!1A&)$q'58fQi3G&HDG "28=

48H+05 )4)6 #c,BCT,U* *73sSQVZGW)X3A&5#jj/'.4L0Q   <;  1r  3%

 8^T2:$/MH!(,%U !Y/ <;s    9DL8>L2EL82L88
M	)r$   )r9   )r   r   r   r   r   r/   r   r,   r   r   r   rN   rO   r   r   r   r   r   r   r   r   r   s   @r4   r   r      s    
)S 
) 
)D 
) 
)2H 2{ 2t 2$KK kk 	
 
$7h 7 7 7tNx N Nr6   )1r?   rs   loggingrN   r   typingr   r   torch.distributed.checkpointr   r   8torch.distributed.checkpoint._consolidate_hf_safetensorsr   &torch.distributed.checkpoint._hf_utilsr   r   r	   r
   r   r   r   'torch.distributed.checkpoint.filesystemr   %torch.distributed.checkpoint.metadatar   r   r   r   r   r   $torch.distributed.checkpoint.plannerr   r   r   r   r   r   $torch.distributed.checkpoint.storager   torch.futuresr   	getLoggerr   r   Logger__annotations____all__r   r    r6   r4   <module>r      s           K   H   =   !**84 4%'A
BV/ Vr}/ }r6   