
    ȅi)              	       D   S SK r S SKrS SKJr  S SKJr  S SKrS SKJr	  S SK
Jr  S SKJrJ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  S S	KJrJrJr  S S
KJr  S SK J!r!  S SK"J#r#  S SK$J%r%  S SK&J'r'  / SQr( " S S\%5      r) " S S\5      r*S\+\RX                  -  S\+\RX                  -  4S jr-S\+\RX                  -  S\+\RX                  -  4S jr.\/S:X  Ga   " S S\5      r0\ Rb                  " 5       r2\2Rg                  S\+S\0 V s/ s H  o Rh                  PM     sn \0Rj                  S9  \2Rg                  S\+SS 9  \2Rg                  S!\+S"S 9  \2Rm                  5       r7\8" S#\7Rr                   S$\7Rt                   S%\7Rv                   S&35        S'\7Rr                   S(3r<\7Rv                  \0Rj                  Rh                  :X  aQ  \Rz                  R}                  \7Rr                  5      (       a  \." \7Rr                  \7Rt                  5        g\8" \<5        g\7Rv                  \0R~                  Rh                  :X  aQ  \Rz                  R                  \7Rr                  5      (       a  \-" \7Rr                  \7Rt                  5        g\8" \<5        g\A" S)\7Rv                   35      egs  sn f )*    N)Enum)cast)narrow_tensor_by_index)FileSystemReaderFileSystemWriter)flatten_state_dict)_EmptyStateDictLoadPlannerDefaultLoadPlanner)MetadataSTATE_DICT_TYPESTORAGE_TYPESTensorPropertiesTensorStorageMetadata)LoadItemTypeLoadPlanLoadPlanner)_create_chunk_list)_load_state_dict)_save_state_dict)StorageReader)Future)dcp_to_torch_savetorch_save_to_dcpBroadcastingTorchSaveReaderDynamicMetaLoadPlannerc                   2   \ rS rSrSr  SS\\R                  -  S-  S\SS4S jjr	S\
4S jrS	\S
\S\S   4S jrS\
S\SS4S jrS	\S\4S jrS\\   S\\   4S jrSS\\R                  -  S-  SS4S jjr\S\\R                  -  S\4S j5       rSrg)r   '   a  
StorageReader for reading a Torch Save file. This reader will read the entire checkpoint
on the coordinator rank, and then broadcast and shard each tensor to all ranks.

. N.B. Intended to be used with DynamicMetaLoadPlanner

.. warning::
    Current implementation only supports loading Tensors.

>>> # xdoctest: +SKIP("undefined vars")
>>> sd = {"mode": model}
>>> dcp.load(
>>>    sd,
>>>    storage_reader=BroadcastingTorchSaveReader(),
>>>    planner=DynamicMetaLoadPlanner(),
>>>    checkpoint_id="path_to_model.pt"
>>> )
Ncheckpoint_idcoordinator_rankreturnc                     Xl         X l        g N)r   r   )selfr   r   s      c/home/james-whalen/.local/lib/python3.13/site-packages/torch/distributed/checkpoint/format_utils.py__init__$BroadcastingTorchSaveReader.__init__;   s    
 + 0    c                     [        0 S9$ )zGExtends the default StorageReader to support building the metadata filestate_dict_metadata)r   )r#   s    r$   read_metadata)BroadcastingTorchSaveReader.read_metadataD   s     B//r'   planplannerc           
         [        [        U5      nU R                  (       aW  U R                  c  [	        S5      e[
        R                  " U R                  SSS9nUR                  (       a  [        U5      u  p4OSnUR                   GH  nUR                  [        R                  :X  a9  [        SUR                  R                   S[        U 5      R                   S35      eU R                  (       aF  [         R"                  R%                  5       nX5R                  R                     R'                  U5      nO7[
        R(                  " UR*                  UR                  R                     5      n[         R,                  " XpR.                  SS	9  [1        XuR2                  UR4                  5      nUR7                  U5      R9                  5       nUR;                  5       UR;                  5       :X  d:  [	        S
UR                   SUR;                  5        SUR;                  5        35      eUR=                  U5        UR?                  XX5        GM     [A        5       n	U	RC                  S5        U	$ )z
Reads torch save data on the coordinator rank, and broadcast afterwards
this incurrs a communication cost, but avoids having to load
the entire checkpoint on each rank, hopefully preventing OOM issues
Nz-checkpoint_id must be set before reading datacpuF)map_locationweights_onlyNon-tensor value identified at . At this time  only supports loading Tensors.)srcasync_opzreq z mismatch sizes, z vs )"r   r
   is_coordinatorr   AssertionErrortorchloadr   itemstyper   BYTE_IORuntimeErrorstorage_indexfqn__name__distdistributed_c10d_get_pg_default_deviceto
empty_like
state_dict	broadcastr   r   storage_offsetslengthsresolve_tensordetachsizecopy_commit_tensorr   
set_result)
r#   r-   r.   torch_state_dict_req	pg_devicetensortarget_tensorfuts
             r$   	read_data%BroadcastingTorchSaveReader.read_dataJ   s    )73 !!)$%TUU$zz""U  ))&89I&J# #::Cxx<///"5c6G6G6K6K5L M$$(J$7$7#88WY  "" 11HHJ	)*;*;*?*?@CCIN))'*<*<S=N=N=R=R*STNN6'<'<uM+F4G4GUF#2237>>@M %%'6;;=8$3,,-->$))+,DA  '!!#53 6 ht
r'   metadatar8   c                    X l         U R                   (       aQ  [        R                  " 5       U R                  :X  d.  [	        SU R                   S[        R                  " 5        35      eU R
                  c  [	        S5      eg)*Implementation of the StorageReader methodz$Coordinator rank mismatch: expected z, got Nz:checkpoint_id must be set before setting up storage reader)r8   rC   get_rankr   r9   r   )r#   r[   r8   s      r$   set_up_storage_reader1BroadcastingTorchSaveReader.set_up_storage_reader   sz    ,==?d&;&;;$:4;P;P:Q R==?+- 
 % L  &r'   c                     U$ r]    )r#   r-   s     r$   prepare_local_plan.BroadcastingTorchSaveReader.prepare_local_plan   s    r'   global_planc                     U$ rb   rc   )r#   rf   s     r$   prepare_global_plan/BroadcastingTorchSaveReader.prepare_global_plan   s    r'   c                     Xl         g)r]   N)r   )r#   r   s     r$   reset!BroadcastingTorchSaveReader.reset   s    *r'   c                 @    [         R                  R                  U5      $ rb   )ospathisfile)clsr   s     r$   validate_checkpoint_id2BroadcastingTorchSaveReader.validate_checkpoint_id   s     ww~~m,,r'   )r   r   r8   )Nr   r"   )rB   
__module____qualname____firstlineno____doc__strrn   PathLikeintr%   r   r+   r   r   r   rY   boolr_   rd   listrh   rk   classmethodrr   __static_attributes__rc   r'   r$   r   r   '   s    * 37 !1R[[(4/1 1 
	10x 04h 4 4 4nh  QU x H tH~ $x. +3#4t#; +t + -33D - - -r'   r   c            	       N   ^  \ rS rSrSr  S
S\S\S-  S\SS4U 4S jjjrS	r	U =r
$ )r      a`  
Extension of DefaultLoadPlanner, which creates a new Metadata object based on the passed in state dict,
avoiding the need to read metadata from disk. This is useful when reading formats which don't have a
metadata file, like Torch Save files.

. N.B. Intended to be used with BroadcastingTorchSaveReader

.. warning::
    Current implementation only supports loading Tensors.

>>> # xdoctest: +SKIP("undefined vars")
>>> sd = {"mode": model}
>>> dcp.load(
>>>    sd,
>>>    storage_reader=BroadcastingTorchSaveReader(),
>>>    planner=DynamicMetaLoadPlanner(),
>>>    checkpoint_id="path_to_model.pt"
>>> )
NrH   r[   r8   r    c           	      z  > [         TU ]  XU5        0 nU R                  R                  5        H|  u  pV[        R
                  " U5      (       d%  [        SU S[        U 5      R                   S35      e[        [        UR                  S9UR                  5       [        U5      5      XE'   M~     [        US9U l        g)zdSetups of the planner, extnding default behavior by creating the Metadata object from the state dictr3   r4   r5   )dtyper)   N)superset_up_plannerrH   r<   r:   	is_tensorr?   r=   rB   r   r   r   rN   r   r   r[   )r#   rH   r[   r8   r*   keyrV   	__class__s          r$   r   %DynamicMetaLoadPlanner.set_up_planner   s     	z^D8:??002KC??6**"5cU ;$$(J$7$7#88WY 
 (= v||4"6*($ 3 !5HIr'   )r[   )NF)rB   rt   ru   rv   rw   r   r   r{   r   r~   __classcell__)r   s   @r$   r   r      sJ    . %)$	J#J T/J 	J
 
J Jr'   r   dcp_checkpoint_dirtorch_save_pathc                 n    0 n[        U[        U 5      [        5       SS9  [        R                  " X!5        g)aQ  
Given a directory containing a DCP checkpoint, this function will convert it into a
Torch save file.

Args:
    dcp_checkpoint_dir: Directory containing the DCP checkpoint.
    torch_save_path: Filename to store the converted Torch save file.

.. warning::
    To avoid OOM, it's recommended to only run this function on a single rank.
T)storage_readerr.   no_distN)r   r   r	   r:   save)r   r   sds      r$   r   r      s4     B
'(:;*,	 
JJr#r'   c                 V    [         R                  " U SS9n[        U[        U5      SS9  g)a&  
Given the location of a torch save file, converts it into a DCP checkpoint.

Args:
    torch_save_path: Filename of the Torch save file.
    dcp_checkpoint_dir: Directory to store the DCP checkpoint.

.. warning::
    To avoid OOM, it's recommended to only run this function on a single rank.
F)r2   T)storage_writerr   N)r:   r;   r   r   )r   r   rH   s      r$   r   r      s-     O%@J #34F#GQUr'   __main__c                       \ rS rSrSrSrSrg)
FormatModei  torch_to_dcpdcp_to_torchrc   N)rB   rt   ru   rv   TORCH_TO_DCPDCP_TO_TORCHr~   rc   r'   r$   r   r     s    %%r'   r   modezConversion mode)r=   helpchoicesdefaultr6   zPath to the source model)r=   r   dstzPath to the destination modelzConverting checkpoint from z to z using method: ''zNo checkpoint found at z. Skipping conversion.zUnknown conversion mode: )Bargparsern   enumr   typingr   r:   torch.distributeddistributedrC   torch.distributed._shard._utilsr   torch.distributed.checkpointr   r   )torch.distributed.checkpoint._nested_dictr   ,torch.distributed.checkpoint.default_plannerr	   r
   %torch.distributed.checkpoint.metadatar   r   r   r   r   $torch.distributed.checkpoint.plannerr   r   r   ,torch.distributed.checkpoint.planner_helpersr   .torch.distributed.checkpoint.state_dict_loaderr   -torch.distributed.checkpoint.state_dict_saverr   $torch.distributed.checkpoint.storager   torch.futuresr   __all__r   r   rx   ry   r   r   rB   r   ArgumentParserparseradd_argumentvaluer   
parse_argsargsprintr6   r   r   checkpoint_missing_warningro   rp   r   isdir
ValueError)ms   0r$   <module>r      sT    	      B K H  U T K K J >  x-- x-v+J/ +J\$bkk)$2;;&$22;;&bkk). z&T &
 $$&F
",-*Q*-''   C.HI
C.MND	
%dhhZtDHH:=Mdii[XYZ "$((+AB  yyJ++11177>>$((##dhh1,-	j--33	377==""dhh1,-4TYYK@AAI  .s   J