
    sh'              	       \   S SK r S SKrS SKJr  S SKJrJr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\\-\R\                  4   S\\-\R\                  4   4S jr/S\\-\R\                  4   S\\-\R\                  4   4S jr0\1S:X  Ga   " S S\5      r2\ Rf                  " 5       r4\4Rk                  S\-S\2 V s/ s H  o Rl                  PM     sn \2Rn                  S9  \4Rk                  S\-SS 9  \4Rk                  S!\-S"S 9  \4Rq                  5       r9\:" S#\9Rv                   S$\9Rx                   S%\9Rz                   S&35        S'\9Rv                   S(3r>\9Rz                  \2Rn                  Rl                  :X  aQ  \R~                  R                  \9Rv                  5      (       a  \0" \9Rv                  \9Rx                  5        g\:" \>5        g\9Rz                  \2R                  Rl                  :X  aQ  \R~                  R                  \9Rv                  5      (       a  \/" \9Rv                  \9Rx                  5        g\:" \>5        g\C" S)\9Rz                   35      egs  sn f )*    N)Enum)castOptionalUnion)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                   :   \ rS rSrSr  SS\\\\R                  4      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4   SS4S jjr\S\\\R                  4   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      }/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/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_metadataC   s     B//r)   planplannerc           	         [        [        U5      nU R                  (       aN  U R                  c   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  [/        XuR0                  UR2                  5      nUR5                  U5      R7                  5       nUR9                  5       UR9                  5       :X  d6   S	UR                   S
UR9                  5        SUR9                  5        35       eUR;                  U5        UR=                  XX5        GM     [?        5       n	U	RA                  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
N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    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/   r0   torch_state_dict_req	pg_devicetensortarget_tensorfuts
             r&   	read_data%BroadcastingTorchSaveReader.read_dataI   s     )73 %%111$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 s(()): %%'(V[[]O=8 '!!#5/ 2 ht
r)   metadatar:   c                     X l         U R                   (       a%  [        R                  " 5       U R                  :X  d   eU R                  c   eg*Implementation of the StorageReader methodN)r:   rD   get_rankr!   r    )r%   r\   r:   s      r&   set_up_storage_reader1BroadcastingTorchSaveReader.set_up_storage_reader|   s=    ,==?d&;&;;;;!!---r)   c                     U$ r_    )r%   r/   s     r&   prepare_local_plan.BroadcastingTorchSaveReader.prepare_local_plan   s    r)   global_planc                     U$ rd   re   )r%   rh   s     r&   prepare_global_plan/BroadcastingTorchSaveReader.prepare_global_plan   s    r)   c                     Xl         gr^   )r    )r%   r    s     r&   reset!BroadcastingTorchSaveReader.reset   s    *r)   c                 @    [         R                  R                  U5      $ rd   )ospathisfile)clsr    s     r&   validate_checkpoint_id2BroadcastingTorchSaveReader.validate_checkpoint_id   s     ww~~m,,r)   )r    r!   r:   )Nr   r$   )rC   
__module____qualname____firstlineno____doc__r   r   strrp   PathLikeintr'   r   r-   r   r   r   rZ   boolra   rf   listrj   rm   classmethodrt   __static_attributes__re   r)   r&   r   r   '   s   * <@ !1c2;;&6 781 1 
	10x 01h 1 1 1f.h . .QU .x H tH~ $x. +5bkk4)?#@ +D + -5bkk9I3J -t - -r)   r   c            	       N   ^  \ rS rSrSr  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"
>>> )
NrI   r\   r:   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 dictr5   r6   r7   )dtyper+   N)superset_up_plannerrI   r=   r;   	is_tensorr@   r>   rC   r   r   r   rO   r   r   r\   )r%   rI   r\   r:   r,   keyrW   	__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)rC   rv   rw   rx   ry   r   r   r   r}   r   r   __classcell__)r   s   @r&   r   r      sK    . (,$	J#J 8$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_readerr0   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)r4   T)storage_writerr   N)r;   r<   r   r	   )r   r   rI   s      r&   r   r      s-     O%@J #34F#GQUr)   __main__c                       \ rS rSrSrSrSrg)
FormatMode   torch_to_dcpdcp_to_torchre   N)rC   rv   rw   rx   TORCH_TO_DCPDCP_TO_TORCHr   re   r)   r&   r   r      s    %%r)   r   modezConversion mode)r>   helpchoicesdefaultr8   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: )Dargparserp   enumr   typingr   r   r   r;   torch.distributeddistributedrD   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   rz   r{   r   r   rC   r   ArgumentParserparseradd_argumentvaluer   
parse_argsargsprintr8   r   r   checkpoint_missing_warningrq   rr   r   isdir
ValueError)ms   0r&   <module>r      sk    	  ( (    B K H  U T K K J >  l-- l-^+J/ +J\$c2;;./$3+,$23+,c2;;./. 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)