
    8h2                     $   S SK r S SKrS SKrS SKJrJr  S SKrS SKJr  S SK	J
r
Jr  S SKJrJrJrJrJrJr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-  SS/r. " S S\5      r/ " S S\
5      r0g)    N)AnyOptional)narrow_tensor_by_index)FsspecReaderFsspecWriter)_gen_file_name
_get_dtype_get_safetensors_file_metadata_HFStorageInfo_metadata_fnCUSTOM_METADATA_KEYDATA_KEYDATA_OFFSETS_KEYDEFAULT_EXTRA_METADATA_KEY	DTYPE_KEYSAVED_OFFSETS_KEY	SHAPE_KEYSUFFIX)SerializationFormat)ChunkStorageMetadataMetadataMetadataIndexStorageMetaTensorPropertiesTensorStorageMetadata)LoadPlanLoadPlannerReadItemSavePlanSavePlanner	WriteItem)WriteResult)FutureHuggingFaceStorageWriterHuggingFaceStorageReaderc                      ^  \ rS rSrSr   SS\S\\\\4      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\\\\   4   4S jr\S\4S j5       rSrU =r$ )r$   1   z
A writer that writes to a huggingface repository in the huggingface format.
Uses Fsspec back-end to communicate with back-end storage.
Fsspec registration of the storage solution is required.
Npathfqn_to_index_mappingtokensave_shardedreturnc                    > Ub  [         TU ]  UU[        R                  S9  O[         TU ]  U[        R                  S9  X l        X@l        g)aw  
Initialize the huggingface writer pointing to path.

Args:
    path: hf directory where the checkpoint will be read from.
          Needs to have .safetensors files, but can be from any fsspec supported storage,
          including localFS and hf://.
    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.
    token: The token to use to authenticate with huggingface hub.
    save_sharded: If True, save the checkpoint as a sharded checkpoint where every rank saves its own shard.
                Default is False which assumes full tensors are being saved.

N)r(   r*   serialization_format)r(   r.   )super__init__r   SAFETENSORS_fqn_to_index_mapping_save_sharded)selfr(   r)   r*   r+   	__class__s        a/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/distributed/checkpoint/hf_storage.pyr0   !HuggingFaceStorageWriter.__init__8   s\    0 G%8%D%D   G%8%D%D   @T")    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)	enumerater2   r3   appenddataclassesreplace)r4   r9   	new_plansiplanr>   s         r6   prepare_global_plan,HuggingFaceStorageWriter.prepare_global_plan^   sn    	 a0GA+-L))57;7Q7Q34!!./]+[00QR 1 r8   rE   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=   r;   )lenitemsr#   
set_resultr>   _split_by_storage_planmaxvaluesqueueQueuer   putfsconcat_pathr(   r/   _write_data)r4   rE   rH   futr>   storage_planr=   bucketshighest_index
file_queue
file_indexwrite_items	file_namer5   s                r6   
write_data#HuggingFaceStorageWriter.write_datak   s    
 tzz?a (CNN2J (,'8'815%)!\1'(>?LL(&}5K--lJJG6B6NL//12TU"'++-
'.}}#J&z+NINN$$TYY	:IS (7 w"777r8   metadataresultsc                 T   U R                   (       a  g 0 n0 nSnU H  nUR                  U Vs0 s H-  owR                  R                  UR                  R
                  _M/     sn5        U[        U Vs/ s H  owR                  R                  PM     sn5      -  nM     SU0US'   XCS'   U R                  R                  U R                  [         5      nU R                  R                  US5       n	[        R                  " X9SS9  S S S 5        g s  snf s  snf ! , (       d  f       g = f)Nr   
total_sizer`   
weight_mapw   )indent)r3   updateindexfqnr>   relative_pathsumlengthrS   rT   r(   r   create_streamjsondump)
r4   r`   ra   metadata_to_write
storage_mdrc   wr_listwrmetadata_pathmetadata_files
             r6   finishHuggingFaceStorageWriter.finish   s    

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   4D
2D0D
D'rW   rK   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$ )Nr;   )ri   rj   r@   )r4   rW   rK   rX   itemkeyidxs          r6   rM   /HuggingFaceStorageWriter._split_by_storage_plan   s^     u:D**..C#C! $v##D)  r8   c                     [         $ N)r   )r4   s    r6   ru   &HuggingFaceStorageWriter.metadata_path   s    r8   )r2   r3   )NNF)__name__
__module____qualname____firstlineno____doc__strr   dictintboolr0   listr   rF   r    r#   r"   r^   r   rw   r!   rM   propertyru   __static_attributes____classcell__r5   s   @r6   r$   r$   1   s$    :>#"$*$* 'tCH~6$* }	$*
 $* 
$* $*Lh DN 88 8 
[!	"	8>Bx B$tK7H2I Bd B&$T#s(^4=A)_	c4	?"	#& s  r8   c                   p   ^  \ 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\4S jrSrU =r$ )r%      z
A reader that reads from a huggingface repository in the huggingface format.
Uses in Fsspec back-end to communicate with storage.
Fsspec registration of the storage solution is required.
Nr(   r*   r,   c                 B   > Ub  [         TU ]  XS9  g[         TU ]  US9  g)a1  
Initialize the huggingface reader pointing to path.

Args:
    path: hf directory where the checkpoint will be read from.
    Needs to have .safetensors file, but can be from any fsspec supported storage,
    including localFS and hf://.
    token: The token to use to authenticate with huggingface hub.
N)r(   r*   )r(   )r/   r0   )r4   r(   r*   r5   s      r6   r0   !HuggingFaceStorageReader.__init__   s+     G$4G$'r8   rE   rH   c                 x   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                  5        GH  u  pxU R                  R                  US5       n	U" U	R                  5       5      n
U
 Vs0 s H  oS   US   _M     nnU GH0  nU R                  UR                     nXR                  R                     [           n[        R                  " UUR                   S9nUR#                  UR$                  5      n['        XR(                  UR*                  5      nUR-                  U5      R/                  5       nUR1                  5       UR1                  5       :X  d6   SUR                   SUR1                  5        SUR1                  5        35       eUR3                  U5        UR5                  UU5        GM3     S S S 5        GM     [7        5       nUR9                  S 5        U$ s  snf ! , (       d  f       GM  = f)	Nr   )deserializerbr;   dtypezreq z mismatch sizes z vs )safetensorsr   rK   r>   storage_indexrk   
setdefaultr@   rS   rn   read
dest_indexrj   r   torch
frombufferr   reshapeshaper   storage_offsetslengthsresolve_tensordetachsizecopy_commit_tensorr#   rL   )r4   rE   rH   r   per_file	read_itemitem_mdr]   reqsstreamdeserializedtensor_infodeserialized_dictreqtensor_bytestensortarget_tensorrV   s                     r6   	read_data"HuggingFaceStorageReader.read_data   s   +.0I&*&7&7	8O8O&PG--I	2.55i@ $
  (~~/OI&&y$76  +6;;=9FR@FR{NKN2l " @  C"//0A0ABG#4^^5G5G#H#RL"--$%mmF $^^GMM:F3 3 3S[[F %,$:$:3$?$F$F$HM(--/6;;=@ s0011A-BTBTBVAWW[\b\g\g\i[jk@ "''/))#}=)   87  0> ht
9@	 87s   H)/H$D9H)$H))
H9	c                 6   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 R                   R                  US5       n[        U5      u  pxUR                  [        5      n	S n
U	(       aC  U	R                  [        5      (       a)  [        R                  " U	R                  [        5      5      n
UR                  5        GH+  u  pU[        :X  a  M  U
b  X   [           nOS/[        U[            5      -  nX;  a  [#        [%        ['        U[(           5      S9[*        R,                  " [/        U[            U5       VVs/ s H	  u  pX-   PM     snn5      [1        [*        R,                  " W5      [*        R,                  " U[            5      S9/S9X'   OX   R2                  R                  [1        [*        R,                  " U5      [*        R,                  " U[            5      S95        [5        X   R6                  5      n[9        [        U5      5       H%  n[;        UU   U[            U   UU   -   5      UU'   M'     [*        R,                  " U5      X   l        U
b  [=        XU   [           S9nO[=        US/[        U[            5      -  S9n[?        UU[@           S   U[@           S   U[@           S   -
  [*        R,                  " U[            5      ['        U[(           5      S	9UU'   GM.     S S S 5        GM     [C        UUS
9n[E        USS 5      c  [G        5       Ul$        U RJ                  URH                  l%        U$ s  snnf ! , (       d  f       GM6  = f)Nr   r   r   )offsetssizes)
propertiesr   chunks)r   )rj   offsetr;   )rk   r   rm   r   r   )state_dict_metadatar>   storage_meta)&rS   lsr(   endswithr   r@   rn   r
   getr   r   ro   loadsrK   r   rJ   r   r   r   r	   r   r   Sizezipr   r   r   r   rangerN   r   r   r   r   getattrr   r   load_id)r4   r   r>   safetensors_filesfilesafetensor_filefsafetensors_metadata_custom_metadatadcp_sharding_infor{   valr   savedr   rD   metadata_indexr`   s                      r6   read_metadata&HuggingFaceStorageReader.read_metadata   s;   @B<>GGJJtyy)D}}V$$!((. *  1O&&=*H*K'$"6":":;U"V$(!"':':;N'O'O(,

'++,?@)% !5 : : <HC88  )4!2!78I!J"#s3y>':!:53H'7&0Y&@( "' :=S^V9T!"9T %*N9T!"" !5,1JJv,>*/**S^*D!"$4+0$ ,077>>0 %

6 2%**S^:T
  $$7$<$A$AB!&s4y!1A&)$q'3y>!3Dvay3P&QDG "28=

48H+05 )4)6 #c,BCT,U* *7 #QC#c)n2E,E* 4B&5"#34Q7"#34Q7#>N:OPQ:RR#jjY8(Y84L0a != >=  1F  3%

 8^T2:$/MH!(,%c!"5 >=s    C>N NF!NN
N	 r   )r   r   r   r   r   r   r   r0   r   r   r#   r   r   r   r   r   r   s   @r6   r%   r%      s^    (S (# ($ ( ( +h + + +ZUx U Ur8   )1rA   ro   rP   typingr   r   r   torch.distributed._shard._utilsr   /torch.distributed.checkpoint._fsspec_filesystemr   r   &torch.distributed.checkpoint._hf_utilsr   r	   r
   r   r   r   r   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#   __all__r$   r%   r   r8   r6   <module>r      sz          B V    H   =   &'A
BA| AHY| Yr8   