o
     Õjôi  ã                   @   s   d Z ddlZg ZG dd„ dƒZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ	G dd„ dƒZ
dS )zDefinition of device workers.é    Nc                   @   s:   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ Zdd„ ZdS )ÚDeviceWorkerz×
    DeviceWorker is an abstract class, which generates worker desc.
    This class is an inner class that we do computation logics within
    the implementation. For example, execution of a program or a graph.
    c                 C   s   d| _ d| _dS ©zInit.N)Ú_programÚ_infer©Úself© r   úZ/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/base/device_worker.pyÚ__init__   s   
zDeviceWorker.__init__Fc                 C   ó
   || _ dS )z~
        set inference flag for current device worker

        Args:
            infer(bool): whether to do inference
        N)r   )r   Zinferr   r   r	   Ú
_set_infer    ó   
zDeviceWorker._set_inferc                 C   r   )zn
        Set fleet desc.

        Args:
            fleet_desc(PSParameter): pslib.PSParameter object
        N)Ú_fleet_desc)r   Ú
fleet_descr   r   r	   Ú_set_fleet_desc)   r   zDeviceWorker._set_fleet_descc                 C   r   )z\
        Set program.

        Args:
            program(Program): a Program object
        N)r   )r   Úprogramr   r   r	   Ú_set_program2   r   zDeviceWorker._set_programc                 C   s   t dƒ‚)zs
        Generator worker desc.

        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        zXDeviceWorker does not implement gen_worker_desc, please use Hogwild or DownpourSGD, etc.)ÚNotImplementedError)r   Útrainer_descr   r   r	   Ú_gen_worker_desc;   s   ÿzDeviceWorker._gen_worker_descN)F)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r   r   r	   r      s    
			r   c                       ó(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚHogwildz.
    Hogwild is a kind of SGD algorithm.

    c                    ó   t ƒ  ¡  dS r   ©Úsuperr
   r   ©Ú	__class__r   r	   r
   N   ó   zHogwild.__init__c                 C   sÖ  d|_ | jr|jj g d¢¡ tƒ }tt| jƒƒ}t	d|ƒ | jdu r,t	dƒ t
 d¡ | jj}|s4dS |j}|j}|d rS|d D ]}|j |g¡ |j |g¡ qBdd	lm} | ¡ rgd
|vrgd|vrgdS |d }	t	d|	ƒ |	D ]i}
t	d|
|ƒ |
|krÛ|j ¡ }||_t	d|	| d ƒ |	| d D ]	}|j |g¡ q•|	| d D ]}|j |g¡ | |¡ q¥|	| d D ]	}|j |g¡ qº|	| d D ]}|j |g¡ | |¡ qÊ nqrd|_ |j}|j|_| d¡du rø| d¡du røtdƒ‚| d¡dur¹|d }| |¡du rtd| ƒ‚|d | }| ¡ jD ]}|j |v r5|j ¡ }|j! |j"¡ |j |_ qt#| ¡ j$ƒ}t%|ƒD ]F}|j$ ¡ }| ¡ j$| j |_ |j& | ¡ j$| j'¡ |j( | ¡ j$| j)¡ |j* | ¡ j$| j+¡ | j,j-j.j/| j0j1|_1d|_2d|_3qB| ¡ jD ] }|j |v r­|j ¡ }|j |_ |j! |j"¡ |j4 |j5¡ qŽ|j | ¡ j6¡ n"| d¡}t	d|ƒ | 7¡ D ]\}}|j ¡ }|j! |¡ ||_ qÇ| jré|j g d¢¡ dS dS )z™
        Generator worker desc, which device worker is HogwildWorker.

        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        ZHogwildWorker©ÚfeedÚpush_sparseÚpush_sparse_v2Ú
push_denseZdistributed_push_sparseÚsendúdevice worker program id:Nú2program of current device worker is not configuredéÿÿÿÿÚstat_var_namesr   ©Úversionr   Úprogram_configsúdevice worker program_configs:údevice workerúdevice worker pull dense:Ú
pull_denser$   r&   Úpull_sparseÚprogram_id_to_workerÚdense_table_configú=opt_info must have program_id_to_worker or dense_table_configú$%s not found in program_id_to_workerÚ ú!device worker dense_table_config:©r$   r%   r&   )8Údevice_worker_namer   Zhogwild_paramÚskip_opsÚextendÚsetÚstrÚidr   ÚprintÚsysÚexitÚ
_fleet_optÚdownpour_paramr+   Ú2paddle.incubate.distributed.fleet.parameter_serverr-   Úis_transpilerÚprogram_configÚaddÚ
program_idÚpush_sparse_table_idÚpush_dense_table_idÚpull_sparse_table_idÚpull_dense_table_idÚpull_dense_paramÚ
thread_numÚ
device_numÚgetÚ
ValueErrorÚget_descÚdense_tableÚtable_idÚdense_value_nameÚdense_variable_nameÚlenÚsparse_tableÚrangeÚsparse_key_nameÚslot_keyÚsparse_value_nameÚ
slot_valueÚsparse_grad_nameÚslot_gradientr   Úserver_paramÚdownpour_server_paramÚdownpour_table_paramÚaccessorÚfea_dimÚemb_dimÚlabel_var_nameÚdense_grad_nameÚdense_gradient_variable_nameÚskip_opÚitems)r   r   Údense_table_setrJ   Úopt_infoÚdownpourZhogwildÚir-   r.   ÚpidÚpcÚpull_threadÚprog_id_to_workerÚworkerrU   Ú
sparse_lenrZ   r5   rV   Úvarnamesr   r   r	   r   R   sà   ÿ


ÿ


þïÿÿ
€
ÿÿÿÿ
ÿþ

ÿ€



ÿÿzHogwild._gen_worker_desc©r   r   r   r   r
   r   Ú__classcell__r   r   r   r	   r   H   ó    r   c                       r   )ÚDownpourLitez3
    DownpourLite is a kind of SGD algorithm.

    c                    r   r   r   r   r   r   r	   r
   ã   r!   zDownpourLite.__init__c                 C   sÄ  t dƒ d|_| jr|jj g d¢¡ tƒ }tt| j	ƒƒ}t d|ƒ | j	du r0t dƒ t
 d¡ | j	j}|s8dS |j}|d rM|d D ]	}|j |g¡ qCd	d
lm} | ¡ rad|vrad|vradS |d }t d|ƒ |D ]i}	t d|	|ƒ |	|krÕ|j ¡ }
||
_t d|| d ƒ || d D ]	}|
j |g¡ q|| d D ]}|
j |g¡ | |¡ qŸ|| d D ]	}|
j |g¡ q´|| d D ]}|
j |g¡ | |¡ qÄ nql|j}|j|_| d¡du rï| d¡du rïtdƒ‚| d¡dur°|d }| |¡du r	td| ƒ‚|d | }| ¡ jD ]}|j|v r,|j ¡ }|j  |j!¡ |j|_qt"| ¡ j#ƒ}t$|ƒD ]F}|j# ¡ }| ¡ j#| j|_|j% | ¡ j#| j&¡ |j' | ¡ j#| j(¡ |j) | ¡ j#| j*¡ | j+j,j-j.| j/j0|_0d|_1d|_2q9| ¡ jD ] }|j|v r¤|j ¡ }|j|_|j  |j!¡ |j3 |j4¡ q…|j | ¡ j5¡ n"| d¡}t d|ƒ | 6¡ D ]\}}|j ¡ }|j  |¡ ||_q¾| jrà|j g d¢¡ dS dS )zž
        Generator worker desc, which device worker is DownpourLiteWorker.

        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        zcreate DownpourLiteWorkerZDownpourLiteWorkerr"   r(   Nr)   r*   r+   r   r,   r   r.   r/   r0   r1   r2   r$   r&   r3   r4   r5   r6   r7   r8   r9   r:   )7rA   r;   r   rE   r<   r=   r>   r?   r@   r   rB   rC   rD   r+   rF   r-   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   r   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   )r   r   rm   rJ   rn   ro   rp   r-   r.   rq   rr   rs   rt   ru   rU   rv   rZ   r5   rV   rw   r   r   r	   r   ç   sÜ   ÿ


ÿ


þïÿÿ
€
ÿÿÿÿ
ÿþ

ÿ€



ÿÿzDownpourLite._gen_worker_descrx   r   r   r   r	   r{   Ý   rz   r{   c                       r   )ÚDownpourSGDz=
    DownpourSGD is a kind of distributed SGD algorithm.
    c                    r   )zD
        Init.
        initialize downpourSGD device worker
        Nr   r   r   r   r	   r
   u  ó   zDownpourSGD.__init__c                 C   sj  t ƒ }tt| jƒƒ}| jdu rtdƒ t d¡ | jj}|d }|j}|D ]z}||krŸ|j	 
¡ }||_|| d D ]	}	|j |	g¡ q9|| d D ]}	|j |	g¡ | 
|	¡ qI|| d D ]	}	|j |	g¡ q^|| d D ]}	|j |	g¡ | 
|	¡ qnd	|| v r|| d	 }
|
 ¡ D ]\}}|j 
¡ }||_||_q nq%| d
d¡|_|j}|j|_| d¡du r¹tdƒ‚|d }| |¡du rÊtd| ƒ‚|d | }| ¡ jD ]}	|	j|v rì|j 
¡ }|j |	j¡ |	j|_qÕt | ¡ j!ƒ}t"|ƒD ]k}	|j! 
¡ }| ¡ j!|	 j|_|j# | ¡ j!|	 j$¡ |j% | ¡ j!|	 j&¡ |j' | ¡ j!|	 j(¡ |d s=d|v rM|d du rM| j)j*j+j,|	 j-j.|_/|j/|_.n| j)j*j+j,|	 j-j.d |_/|j/d |_.d|_0qø|d rx|d D ]
}	|j1 |	g¡ qm| ¡ jD ] }	|	j|v rœ|j 
¡ }|	j|_|j |	j¡ |j2 |	j3¡ q}|j4 | ¡ j5¡ | j6r³d|_7d|_8dS dS )úš
        Generator worker desc, which device worker is DownpourWorker.

        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        Nr)   r*   r.   r$   r&   r3   r2   Úcond2denseidZworker_classZDownpourWorkerr4   ú'opt_info must have program_id_to_workerr7   Úuse_cvmÚno_cvmTé   Úclickr+   F)9r>   r?   r@   r   rA   rB   rC   rD   rE   rH   rI   rJ   rK   r=   rL   rM   rN   rl   Zpartial_pushdense_condtable_mapÚkeyÚvaluerR   r;   rO   rP   rQ   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   r   rb   rc   rd   re   rf   rg   rh   r+   ri   rj   r<   rk   r   r&   r$   )r   r   rm   rJ   rn   r.   ro   rq   rr   rp   r   r…   r†   Zmc_maprs   rt   ru   rU   rv   rZ   r   r   r	   r   |  sÄ   



ìÿÿ

€
ÿÿÿÿ

ÿþ

ÿýÿ

ÿ€
þzDownpourSGD._gen_worker_descrx   r   r   r   r	   r|   p  ó    r|   c                       r   )ÚDownpourSGDOPTz@
    DownpourSGDOPT is a kind of distributed SGD algorithm.
    c                    r   )zG
        Init.
        initialize downpourSGDOPT device worker
        Nr   r   r   r   r	   r
   ì  r}   zDownpourSGDOPT.__init__c                 C   sb  t ƒ }tt| jƒƒ}| jdu rtdƒ t d¡ | jj}|d }|j}|D ]Z}||kr|j	 
¡ }||_|| d D ]	}	|j |	g¡ q9|| d D ]}	|j |	g¡ | 
|	¡ qI|| d D ]	}	|j |	g¡ q^|| d D ]}	|j |	g¡ | 
|	¡ qn nq%d	|_|j}
|j|
_| d
¡du r•tdƒ‚|d
 }| |¡du r¦td| ƒ‚|d
 | }| ¡ jD ]}	|	j|v rÈ|
j 
¡ }|j |	j¡ |	j|_q±t| ¡ jƒ}t|ƒD ]k}	|j 
¡ }| ¡ j|	 j|_|j | ¡ j|	 j ¡ |j! | ¡ j|	 j"¡ |j# | ¡ j|	 j$¡ |d sd|v r)|d du r)| j%j&j'j(|	 j)j*|_+|j+|_*n| j%j&j'j(|	 j)j*d |_+|j+d |_*d|_,qÔd|v rP|j|d v rPd|_-d|v r`|j|d v r`d|_.|d rt|d D ]
}	|j/ |	g¡ qi| ¡ jD ] }	|	j|v r˜|j 
¡ }|	j|_|j |	j¡ |j0 |	j1¡ qy|j2 | ¡ j3¡ | j4r¯d|_5d|_6dS dS )r~   Nr)   r*   r.   r$   r&   r3   r2   ZDownpourWorkerOptr4   r€   r7   r   r‚   Trƒ   r„   Zlocal_tablesZasync_tablesr+   F)7r>   r?   r@   r   rA   rB   rC   rD   rE   rH   rI   rJ   rK   r=   rL   rM   rN   r;   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   r   rb   rc   rd   re   rf   rg   rh   Úis_localÚis_asyncr+   ri   rj   r<   rk   r   r&   r$   )r   r   rm   rJ   rn   r.   ro   rq   rr   rp   rs   rt   ru   rU   rv   rZ   r   r   r	   r   ó  sÀ   


óÿ

€
ÿÿÿÿ

ÿþ

ÿýÿ



ÿ€
þzDownpourSGDOPT._gen_worker_descrx   r   r   r   r	   rˆ   ç  r‡   rˆ   c                       r   )ÚSectionzSectionWorker.c                    r   r   r   r   r   r   r	   r
   b  r!   zSection.__init__c                 C   sÒ   ddl m} d|_| jj}|j}|d |_|d |_|d |_|d |_	|d }|d	v s0J d
ƒ‚|dkr6dnd}||_
|j}|d }|j | ¡  ¡ ¡ |d }	|d }
| ¡ r`t|	|jƒs`J ‚|j|_|
|_dS )z˜
        Generator worker desc, which device worker is SectionWorker.
        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        é   )ÚcoreZSectionWorkerÚnum_microbatchesÚstart_cpu_core_idÚpipeline_stageÚnum_pipeline_stagesÚschedule_mode)úF-then-BZ1F1Bz>The schedule mode for pipeline must be one of F-then-B or 1F1Br“   r   Úsection_programÚplaceÚplace_idN)r8   r   r;   r   Z_pipeline_optÚsection_paramrŽ   r   r   r‘   r’   Úsection_configÚprogram_descÚParseFromStringÚ	_get_descÚserialize_to_stringZis_compiled_with_cudaÚ
isinstanceZ	CUDAPlacer•   r–   )r   r   r   Zpipeline_optr—   Zschedule_mode_strr’   Úcfgr   r•   r–   r   r   r	   r   f  s2   




ÿ
ÿ
zSection._gen_worker_descrx   r   r   r   r	   r‹   _  ó    r‹   c                       r   )ÚHeterSectionzHeterSectionWorker.c                    r   r   r   r   r   r   r	   r
   ‘  r!   zHeterSection.__init__c                 C   sX   d|_ | jj}|j}|d |_|d |_|d |_|j}|d }|j 	| 
¡  ¡ ¡ dS )z
        Generator worker desc, which device worker is HeterSectionWorker.
        Args:
            trainer_desc(TrainerDesc): a TrainerDesc object
        ZHeterSectionWorkerrŽ   r   r‘   r”   N)r;   r   Z_heter_pipeline_optÚheter_section_paramrŽ   r   r‘   r˜   r™   rš   r›   rœ   )r   r   Zheter_pipeline_optr¡   rž   r   r   r   r	   r   •  s"   ÿÿÿ
ÿzHeterSection._gen_worker_descrx   r   r   r   r	   r    Ž  rŸ   r    c                   @   s   e Zd Zdd„ ZdS )ÚDeviceWorkerFactoryc                 C   s   |  ¡ }tƒ | ƒ S )N)Ú
capitalizeÚglobals)r   Zworker_typeÚ	classnamer   r   r	   Ú_create_device_worker°  s   z)DeviceWorkerFactory._create_device_workerN)r   r   r   r¦   r   r   r   r	   r¢   ¯  s    r¢   )r   rB   Ú__all__r   r   r{   r|   rˆ   r‹   r    r¢   r   r   r   r	   Ú<module>   s   4  wx/!