o
    "jm                     @   s   d dl Z d dlmZ d dlZd dlmZ d dlmZ ddlm	Z	m
Z
mZ ddlmZmZ dd	 Zd
d Zdd Zdd Z		 d	dddZdS )    N)List)is_initialized)logger   )LocalTensorIndexLocalTensorMetadataMetadata)%compute_local_shape_and_global_offsetflatten_state_dictc                 C   sZ   t |  }g }tj||| |dd  D ]}||d ks*J d| d|d  qd S )Nr   r   zkeys:z != first_keys: )listkeyspaddledistributedall_gather_object)
state_dictprocess_groupZ
local_keysZgloabl_keysr    r   n/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/checkpoint/save_state_dict.pycheck_state_dict   s   r   c                 C   sf   g }t | dd dd }tj||| |dd  D ]}||d ks0J d| d|  qd S )N.r   _r   zid:z !=  all_unique_id[0]:)intsplitr   r   r   )	file_namer   Zall_unique_id	unique_ididr   r   r   check_file_name'   s   r   c                 C   sf   t | ts	J di }| D ]#}| D ]\}}||v r*||| v r"q|| | q|g||< qq|S )Nz'The global_state_dict should be a list.)
isinstancer   itemsappend)global_state_dict_metadataoutr   keyvalr   r   r   merge_state_dict_metadata3   s   r$   c                 C   s6   i }| D ]}|  D ]\}}||v rq
|||< q
q|S )N)r   )global_storage_metadatar!   storage_metadatar"   r#   r   r   r   dedup_storage_metadataC   s   
r'   returnc              	   C   s  t jj X t| tsJ dt| } t| dkr,|  D ]}t|t j	s+J dqt
j|s9t
j|dd t j dkrBdnd}|rR|du rRt sRt j  d}d	}	 t j  d
| d}t
jt
j||snn|d7 }qWtd|  |rt|| t| | t }i }	i }
i }|  D ]e\}}t|t j	r| sq| rt|jdkrt|j|jj|jj nd\}}|du s|du rq|! }nt"|j}t|jdkrt"dgt|j nd}|}||	|< t#|||
|< ||t$|t"|< qg }g }|rt j%||
| t j%||| n
|&|
 |&| t'||_(t)||_*|t j krDtd|  t +|t
j|| d td|	  t +|	t
j|| W d   dS 1 scw   Y  dS )a  
    Save the state_dict of model to path.

    Args:
        state_dict(Dict[str, paddle.Tensor]): The state_dict to save.
        path(str): The directory to save state_dict.
        process_group(paddle.distributed.collective.Group): ProcessGroup to be used for cross-rank synchronization. Use the default process group which contains all cards.
        coordinator_rank(int): The rank used to save non distributed values. Rank0 is used by default.

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('run in distributed mode')
            >>> import paddle
            >>> import paddle.distributed as dist
            >>> w1 = paddle.arange(32).reshape([4, 8])
            >>> mesh = dist.ProcessMesh([0, 1])
            >>> sharded_w1 = dist.shard_tensor(w1, mesh, [dist.Shard(0), dist.Replicate()])
            >>> state_dict = {"w1": sharded_w1}
            >>> dist.save_state_dict(state_dict, "./checkpoint")
            >>> # doctest: -SKIP

    z&The state_dict should be a dictionary.r   zGOnly support dygraph Tensor now, support static DistributedTensor laterT)exist_okr   FN r   z.distcpz
file_name:)r   r   r   z	metadata:z	.metadatazlocal_state_dict:),r   baseZdygraphguardr   dictr
   lenvaluesZTensorospathexistsmakedirsr   Zget_world_sizer   Zinit_parallel_envZget_rankjoinr   debugr   r   r   r   Z_is_initializedZis_distshaper	   Z	dist_attrZprocess_meshZdims_mappingZ_local_valuetupler   r   r   r   r$   Zstate_dict_metadatar'   r&   save)r   r1   r   Zcoordinator_rankr#   Zuse_distr   r   metadataZlocal_state_dictZlocal_state_dict_metadataZlocal_storage_metadatar"   Zlocal_shapeZglobal_offsetZlocal_tensorr    r%   r   r   r   save_state_dictM   s   







$r:   )Nr   )r(   N)r0   typingr   r   Z&paddle.distributed.communication.groupr   Z'paddle.distributed.fleet.utils.log_utilr   r9   r   r   r   utilsr	   r
   r   r   r$   r'   r:   r   r   r   r   <module>   s    
