o
    "j0                     @   s   d dl Z d dlZ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 dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)deque   )
DeviceType)Graph)get_process_groupc                 C   s   g d}| j |v rdS dS )N)
Zc_allreduce_sumZc_allreduce_minZc_allreduce_maxZc_allreduce_prodZc_reduce_sumZc_reduce_minZc_reduce_maxZc_reduce_prodc_broadcastc_allgatherTFtypeopZ	comm_list r   o/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/auto_parallel/static/mapper.pyis_collective_comm_op   s   
r   c                 C   s   ddg}| j |v rdS dS )Nsend_v2recv_v2TFr	   r   r   r   r   is_p2p_comm_op.   s   
r   c                 C   s   d}| t jkrd}|S | t jkrd}|S | t jkrd}|S | t jkr&d}|S | t jkr/d}|S | t jkr8d}|S | t jkrAd}|S | t jkrJd}|S | t j	krSd}|S t
d|  d)Nr            r   zUnrecognized dtype .)paddleZfloat64Zfloat32Zfloat16Zbfloat16Zint64Zint32Zint16Zint8Zuint8
ValueError)dtypeZ	num_bytesr   r   r   get_dtype_bytes6   s:   





	


r   c                 C   sR  d }||kr|S | j }|dkr| jd }n| jd }| j|}|d us&J |j}g }|D ]}	|	dkr=td |d q-||	 q-t	t
j|d}
|
t|j }d|v r\d| }|S d|v rd|}|S d	|v rw| d
|krs|}|S d }|S d|v r| d|krd }|S |}|S d|v r| d|kr|}|S d }|S d|v rd }|S td)Nr   r   z Warning: -1 in the tensor shape.r   Zc_allreducer   r   r   rootZc_reduceZroot_idr   peerz$Unrecognized communication operator.)r
   Zinput_arg_namesZoutput_arg_namesblockZ_find_var_recursiveshapeprintappend	functoolsreduceoperatormulr   r   attrr   )Zcomm_opsrc_ranktgt_rankcomm_volumeZcomm_op_typeZtensor_nameZtensorZtensor_shapeZnew_tensor_shapevalZtensor_sizeZtensor_bytesr   r   r   get_comm_volumeO   s\   

r+   c                 C   s   i }t | r3| d}t||}||jvr|S |jD ]}t| ||}|d ur0i ||< ||| d< q|S t| rR| d}t| ||}|d urPi ||< ||| d< |S i }|S )NZring_idr)   r   )r   r&   r   ranksr+   r   )r   rankg_process_group_mapcomm_requirements_to_ranksZprocess_group_idprocess_groupr(   r)   r   r   r   !analyze_comm_requirements_from_op   s2   




r1   c                 C   s   | d }| d }i }i }t j|d< |jD ]4}|jD ].}t|||}| D ]!\}	}
|	|v r:||	 d  |
d 7  < q%i ||	< |
d ||	 d< q%qq||fS )Nr   r   device_typer)   )r   ZGPUblocksopsr1   items)src_infor-   programr.   resource_requirementsr/   r   r   Zcur_comm_requirements_to_ranksr(   Z	link_infor   r   r    analyze_requirements_for_program   s2   


r9   c                 C   sZ   t  }|  D ]#\}}t||\}}|j||d | D ]\}}|j|||d qq|S )N)r8   )comm_requirements)r   r5   r9   add_nodeadd_edge)distributed_programgraphr'   r6   r8   r/   r(   r:   r   r   r   build_process_graph   s   r?   c                 C   s   t  }td}g }|d ur|dkrdd |dD }| j D ]>}|j D ]"}|j|j|d |rB|j	|vrBd|j
|j d< q(d	|j
|j d< q(|j D ]}|j|jj|jj|d
 qPq!|S )NZCUDA_VISIBLE_DEVICES c                 S   s   g | ]}t | qS r   )intstrip).0dr   r   r   
<listcomp>   s    z'build_cluster_graph.<locals>.<listcomp>,)deviceToccupiedF)link)r   osgetenvsplitZmachinesvaluesZdevicesr;   Z	global_idlocal_idnodeslinksr<   sourcetarget)clusterr>   Zcuda_visible_devices_envZcuda_visible_devicesmachinerG   rI   r   r   r   build_cluster_graph   s*   

rU   c                 C   s|  t | }t|}|D ]}d|d< q
dd }dd }dd }t }|t|j }	|	d ur	||	 |r| }|d r>q3|d	 d
 }
d }|j D ]}|d j|
krj|d sjd|d< d|d< |d |d< |} nqK|sqJ dg }|j	|j
  D ]\}}|j|j
kr|j|ksJ ||j|  || q{|j|d g }|j	|j
  D ]}|| q|j|d |D ]?}|j|j d }|rq|d	 d
 }
|j|j }|D ]#}|j|j }|d j|
kr|d sd|d< d|d< |d |d<  nqq|s5|t|j }	|	d us.i }|j D ]\}}|d }|j}|j
|v rj|j||j
 d< |j||j
 d< |j||j
 d< |||j
 d vr[g ||j
 d |< ||j
 d | |j q||j
 d | |j qi ||j
< |j||j
 d< |j||j
 d< |j||j
 d< i ||j
 d< g ||j
 d |< ||j
 d | |j q| D ]}|d  D ]}|  qq|S )NFvisitedc                 S   s   | d d S )Nr:   r)   r   )Z	rank_edger   r   r   sort_by_comm_volume   s   z$mapping.<locals>.sort_by_comm_volumec                 S   s
   | d j S )NrI   )	bandwidth)Zdevice_edger   r   r   sort_by_comm_bandwidth   s   
z'mapping.<locals>.sort_by_comm_bandwidthc                 S   s"   d }| D ]
}|d du r|}q|S )NrV   Fr   )Zrank_node_listZselected_rank_node	rank_noder   r   r   select_unvisited_rank_node   s   z+mapping.<locals>.select_unvisited_rank_noder8   r2   rG   rH   Tz0Cannot find a device to satisfy the requirement.)keyhostnameaddrportr,   )r?   rU   r   listrO   rM   r!   popleftr
   Zadjsidr5   Zsrc_idZtgt_idsortrT   r]   r^   r_   rN   )r=   rS   Zprocess_graphZcluster_graphZcur_rank_noderW   rY   r[   queueZroot_rank_noder2   Zcur_device_nodeZdevice_nodeZnbr_rank_edgesZnbr_rank_node_idZnbr_rank_edgeZnbr_device_edgesZnbr_device_edgeZsrc_rank_nodeZnbr_rank_nodeZnbr_device_nodeZrank_mappingr-   rZ   rG   rT   Zmachine_mappingZrank_devicesr   r   r   mapping   s   




;A
re   )r"   r$   rJ   collectionsr   r   rS   r   r>   r   r0   r   r   r   r   r+   r1   r9   r?   rU   re   r   r   r   r   <module>   s"   0