o
    "j[%                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 ddl
mZ ddlmZ ddlmZ dd	 Zd
d ZG dd dZdS )    N)core   )
get_logger   )_g_process_group_map)get_dist_attrc                 C   s   t | |rdS dS )NTF)research)Zre_expfilename r   s/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/auto_parallel/static/dist_saver.pycheck_filename   s   r   c              
   C   sv   t j| }|dkrtdzt j| }t | W ||fS  ty: } z|jtjkr- W Y d }~||fS d }~ww )N Rpath should be of 'dirname/filename' format, but received filename is empty string)	ospathbasename
ValueErrordirnamemakedirsOSErrorerrnoEEXIST)r   r
   r   er   r   r   _process_path&   s    
r   c                   @   s6   e Zd Zdd Zdd ZdddZdd	 Zd
d ZdS )DistributedSaverc                 C   s   t tj| _d S )N)r   loggingINFO_logger)selfr   r   r   __init__6   s   zDistributedSaver.__init__c                 C   s  ddd}t |\}}tj }|dkrA| | |d }	tj||	}
t|
d}|	|j
  W d    n1 s<w   Y  |d t| d }tj||}t|d}|	|j
  W d    n1 sjw   Y  |d t| d	 }tj||}t||}t|d}t|| W d    n1 sw   Y  |d t| d
 }tj||}||| |d t| d }tj||}|||d d S )Nparamc                 S   sT   dd |  | D }t|d}t|| W d    d S 1 s#w   Y  d S )Nc                 S   s   i | ]
\}}|t |qS r   )nparray).0kvr   r   r   
<dictcomp>;   s    z>DistributedSaver.save.<locals>._save_state.<locals>.<dictcomp>wb)
state_dictitemsopenpickledump)programr   modestatefr   r   r   _save_state:   s   "z*DistributedSaver.save.<locals>._save_stater   z_serial.pdmodelr(   _distz.pdmodelz.pdattrz	.pdparamsz.pdoptopt)r!   )r   paddledistributedget_rank_save_rank_mappingr   r   joinr+   writedescZserialize_to_stringstrr   r,   r-   )r   r   Zserial_programZdist_main_programZdist_contextr2   r   r
   rank_idZserial_model_filenameZserial_model_pathr1   Zdist_model_filenameZdist_model_pathZdist_attr_filenameZdist_attr_pathZ
dist_attrsZdist_param_filenameZdist_param_pathZdist_opt_filenameZdist_opt_pathr   r   r   save9   s6   




zDistributedSaver.saveTc              	      s   ddd d fdd	}t j|}|dkrtdt j|}|||}|r.|||dni }t|fi |} ||d	}	jd
|	  i }
|	D ]/}t|d}t	j
|dd}W d    n1 sdw   Y  | D ]\}}||
vry||
|< qmqK||
fS )Npdparamsc                 S   sH   g }t |D ]}t|  d| |r|t j|| q|  |S )Nz(.*)_dist(.*).)r   listdirr   appendr   r9   sort)r
   r   suffix	file_listfiler   r   r   
_load_fileg   s   z)DistributedSaver.load.<locals>._load_filec           
   	      s    | ||}i }|D ]>}t |d}tj|dd}W d    n1 s#w   Y  | D ]\}}	||v r?|| t|	 q,t|	g||< q,q
jd|  |S )Nrblatin1encodingzLoad param file: )	r+   r,   loadr*   rA   r"   r#   r   info)
r
   r   rC   rD   r)   rE   r1   Zstate_dict_infonamevaluerF   r   r   r   _load_stateo   s   z*DistributedSaver.load.<locals>._load_stater   r   ZpdoptZpdattrz!Load distributed attribute file: rG   rH   rI   )r?   )r   r   r   r   r   dictr   rL   r+   r,   rK   r*   )r   r   Zload_optimizerrP   r
   r   Zparam_state_dictZopt_state_dictr)   Zdist_attr_file_listZ	dist_attrZdist_attr_filer1   Zdist_attr_inforM   attrr   rO   r   rK   e   s6   

zDistributedSaver.loadc                    s.  t |\}}tj }|dkr| | tj }	ttjj	j
}
|dd }|s-tj }|   j}dd |D }dd |D }d}t|D ]B\}}||	|
krTqH|jdksc|jdksc|jd	krj||d
7 }|jdkr{||d7 }t||}|jD ]}||v rt||}q~qHg g t|D ]\}}||kr n|j7 |j7 qti | }ti  ti | }ti  fdd|D }fdd|D }tt fdd|D } fdd|D }|d t| }tj||}|dd}tjj ||||||d d S )Nr   r.   c                 S      g | ]}|j qS r   rM   r$   xr   r   r   
<listcomp>       z9DistributedSaver.save_inference_model.<locals>.<listcomp>c                 S   rS   r   rT   rU   r   r   r   rW      rX   readfeedZrecv_v2ZOutZsend_v2Xc                       g | ]}| v r|qS r   r   r$   var_name)used_inputsr   r   rW      s    c                    r]   r   r   r^   )used_outputsr   r   rW      s
    c                       g | ]} j | qS r   varsr$   rM   global_blockr   r   rW      s    c                    rb   r   rc   re   rf   r   r   rW      s    
r3   legacy_formatF)r.   rh   )!r   r5   r6   r7   r8   r   Zop_proto_and_checker_makerZkOpRoleAttrNameintZOpRoleZForwardgetZstaticZdefault_main_programrg   ops	enumeraterR   typeoutputinputmaxZoutput_arg_namesZinput_arg_nameslistfromkeyskeysreversedr<   r   r   r9   save_inference_model)r   r   Z	feed_varsZ
fetch_varsexekwargsr   r
   r=   Zop_role_keyZop_role_forwardZdist_main_progrk   Zfeed_vars_namesZfetch_vars_namesZlast_idxidxopZout_nameZdist_feed_vars_namesZdist_fetch_vars_namesZdist_feed_varsZdist_fetch_varsZdist_filenameZ	dist_pathrh   r   )rg   r`   ra   r   ru      sz   












z%DistributedSaver.save_inference_modelc                 C   s  t j|d}t|d}|d t D ]!}|j}dd |jD }t	|d d| d }|| d}q|d	 i }t D ] }|j}|jD ]}	|	|v rZ||	 
t	| qJt	|g||	< qJqBd}
| D ]\}}|
t	|d 7 }
|
d|d 7 }
||
 d}
qi|  d S )
Nzrank_mapping.csvwz[ring_id -> ranks]
c                 S   s   g | ]}t |qS r   )r<   )r$   rankr   r   r   rW      s    z7DistributedSaver._save_rank_mapping.<locals>.<listcomp>,
r   z[rank -> ring_ids]
)r   r   r9   r+   r:   r   valuesZ	_group_idZ_ranksr<   rA   r*   close)r   r   r   r1   process_groupZring_idZranksZ
id_to_rankZrank_to_id_dictr{   Z
rank_to_iditemvalr   r   r   r8      s2   





z#DistributedSaver._save_rank_mappingN)T)__name__
__module____qualname__r    r>   rK   ru   r8   r   r   r   r   r   5   s    
,5Jr   )r   r   r   r,   r   numpyr"   r5   Zpaddle.frameworkr   Zutils.log_utilsr   r   r   utilsr   r   r   r   r   r   r   r   <module>   s   