o
    "jX)                     @   s   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
mZmZmZmZmZ d dlmZ ddlmZ G dd	 d	eZdS )
    N)PassContext)PsProgramBuilderFactory)TrainerRuntimeConfigbuild_var_distributeddtype_to_sizeget_dist_envget_var_mem_sizelogger)core   )MetaOptimizerBasec                       s|   e Zd Z fddZ fddZdd Zdd Zd	d
 Zdd Z	dddZ				dddZ
dd Zdd Zdd Z  ZS )ParameterServerOptimizerc                    s    t  | || _g d| _d S )N)ZRecomputeOptimizerZAMPOptimizerZLarsOptimizerZLambOptimizerZASPOptimizer)super__init__	inner_optZmeta_optimizers_white_list)self	optimizer	__class__ v/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/fleet/meta_optimizers/ps_optimizer.pyr   $   s   z!ParameterServerOptimizer.__init__c                    s   t  |||| d S N)r   _set_basic_info)r   loss
role_makerZuser_defined_optimizeruser_defined_strategyr   r   r   r   0   s   z(ParameterServerOptimizer._set_basic_infoc                 C   s$   g | _ |D ]
}| j |jj qd S r   )origin_main_programsappendblockprogram)r   lossesr   r   r   r   _set_origin_programs7   s   z-ParameterServerOptimizer._set_origin_programsc                 C   s  t  | _i }t |d< ||d< d|d< |jj|d< ||d< | j|d< |d  |d< |d  |d	< | j|d
< | j|d< t| j|d< |d j	|d< t
d|d  | j|d< | jj|d< | j |d< | j |d< | j |d< t
d|d  | jjd |d< | jjd |d< |d
 jd |d< |d
 jd |d< | jj|d< | jj|d< | jjd |d< | jjd |d< ttdd|d< t| tj |d < tj |d!< i |d"< || j_d S )#Nenvr   i @ Zmin_block_sizeorigin_main_programZorigin_startup_programr   Zcloned_maincloned_startupr   Zvalid_strategyZtrainerZps_modezps_mode: {}r   Zis_heter_ps_modeZ	is_workerZ	is_serverZis_heter_workerzthis process is heter? {}Z
use_ps_gpuZlr_decay_stepsZlocal_sparseZremote_sparseis_fl_ps_modeZwith_coordinatork_stepsZlaunch_barrierZFLAGS_LAUNCH_BARRIER1Zlaunch_barrier_flagZ_main_serverZ_startup_serverZtensor_table)r   pass_ctxr   r   r   r   cloner   r   moder	   infoformatr   Z_is_heter_parameter_server_modeZ
_is_workerZ
_is_serverZ_is_heter_workera_sync_configsZtrainer_desc_configsr%   Zis_with_coordinatorintosgetenvr   paddlestaticZProgram_attrs)r   r   startup_programattrsr   r   r   _init_ps_pass_context<   sv   





z.ParameterServerOptimizer._init_ps_pass_contextc                 C   s   dS )NFr   )r   r   r   r   _is_graph_out   s   z&ParameterServerOptimizer._is_graph_outc                 C   s(   | j jrdS | jjd }|dkrdS dS )NFr&   r   T)r   Z_is_collectiver   r-   )r   r&   r   r   r   
_can_apply   s   z#ParameterServerOptimizer._can_applyNc                 C   s^   | j ||||\}}|d u rtj }| |g | || t | j	}|
  ||fS r   )r   minimizer1   r2   Zdefault_startup_programr!   r6   r   _create_ps_program_builderr(   _build_programs)r   r   r4   parameter_listno_grad_setZoptimize_opsZparams_grads
ps_builderr   r   r   minimize_impl   s   
z&ParameterServerOptimizer.minimize_implc           
      C   s   |d u rd gt | }t|D ]\}}|| }|| }| j|||| q| | t|D ]'\}}td|| || }| || t | j	}	|	
  | j	jd ||< q.dS )Nzps_optimizer idx loss:r$   )NN)len	enumerater   r9   r!   printr6   r   r:   r(   r;   r3   )
r   r    r4   r<   r=   idxr   Zstartup_prog
parametersr>   r   r   r   minimize_losses_impl   s"   
z-ParameterServerOptimizer.minimize_losses_implc                 C   s  dd }t | jtjjsdS | }dh}d}| jD ]"}| j| }|jr1|j	 t
jjjkr2q|t|7 }|| q|d }i }	d}
| jD ]T}|jD ]N}||v rWqP|| | j| }|j	 t
jjjkrnqPd}d}|jD ]}|dk r|dkrtd	| |d7 }|| 9 }qu||9 }qu||t|j f|	|< qPqK|	D ]}|	| \}}}|dkr||
9 }|| }||7 }q||k rd
S dS )Nc                  S   s  t  } t  dkrMtjdgtjd d }|d}td}i }t	dt
|d D ]}||  }||}t|d d	d
 ||d < q,|d S t  dkri }tdd}	|	D ]}
|
 }t|d d ||d < q]W d    n1 szw   Y  |d }|S tdt   )NDarwinZvm_stat)stdoutr   
z:[\s]+r      z\.i   z
Pages freeLinuxz/proc/meminforb   s   MemFree:z8%s platform is unsupported is parameter server optimizer)platformsystem
subprocessPopenPIPEcommunicatesplitrecompileranger@   stripr.   open
ValueError)platvmZvmLinessepZvmStatsrowZrowTextZrowElementsZmemsflinefieldsfreer   r   r   get_sys_free_mem   s>   


zAParameterServerOptimizer._can_apply_geo.<locals>.get_sys_free_memFz@EMPTY@r   g      @rL   r   z&Var %s has more than one negative dim.T)
isinstancer   r1   r   ZSGDZglobal_blockvarsZpersistabledesctyper
   ZVarDescZVarTypeZ
LOD_TENSORr   addopsZoutput_arg_namesshaperY   r   Zdtype)r   r   rb   ra   Zprocessed_var_namesZparam_memory_sizevarnamevarZupper_mem_useZprogram_tmp_varsZeval_batch_sizeopvar_nameZ
data_countZneg_dim_countxZ	type_sizeZ
var_memoryr   r   r   _can_apply_geo   sh   





z'ParameterServerOptimizer._can_apply_geoc                 C   sL   |j }|j d dkrd S d|_|j }| |d }|rdnd|d< ||_ d S )Nr&   r   Tr#   i   )r-   a_syncro   )r   dist_strategycontextr-   Zis_geor   r   r   _enable_strategy  s   
z)ParameterServerOptimizer._enable_strategyc                 C   s    d|_ |j}d|jd< ||_d S )NFr&   )rp   r-   )r   rq   r-   r   r   r   _disable_strategy  s   

z*ParameterServerOptimizer._disable_strategy)NNN)__name__
__module____qualname__r   r   r!   r6   r7   r8   r?   rE   ro   rs   ru   __classcell__r   r   r   r   r   #   s     C

]r   )r/   rM   rT   rO   Zpaddle.distributed.passesr1   r   Z&paddle.distributed.ps.utils.ps_factoryr   Z"paddle.distributed.ps.utils.publicr   r   r   r   r   r	   Zpaddle.frameworkr
   Zmeta_optimizer_baser   r   r   r   r   r   <module>   s    