o
    Mek                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlZeG dd deZeG dd deZG dd	 d	ZG d
d dZ	G dd dZ
G dd dZG dd dZdd ZdS )    N)IntEnum)uniquec                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	
DeviceTyper                     N)
__name__
__module____qualname__UNKNOWNCPUGPUXPUNPUDCUNIC r   r   XD:\Projects\ConvertPro\env\Lib\site-packages\paddle/distributed/auto_parallel/cluster.pyr      s    r   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )LinkTyper   r   r   r   r   r	   r
         N)r   r   r   r   ZLOCZSYSPHBZPIXZPIBNVLZNVBNETr   r   r   r   r   !   s    r   c                   @   s  e Zd ZejejejgZdd Ze	dd Z
e
jdd Z
e	dd Zejdd Ze	d	d
 Zejdd
 Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Ze	dd Zejdd Zdd Zdd ZdS ) Devicec                 C   s4   || _ || _|| _d | _d | _d | _d | _d | _d S N)
_global_id	_local_id_machine_type_model
_dp_gflops
_sp_gflops_memory)self	global_idlocal_idmachiner   r   r   __init__1   s   
zDevice.__init__c                 C      | j S r   r   r'   r   r   r   r(   @      zDevice.global_idc                 C   
   || _ d S r   r-   r'   valuer   r   r   r(   D      
c                 C   r,   r   r    r.   r   r   r   r)   H   r/   zDevice.local_idc                 C   r0   r   r4   r1   r   r   r   r)   L   r3   c                 C   r,   r   r!   r.   r   r   r   r*   P   r/   zDevice.machinec                 C   r0   r   r5   r1   r   r   r   r*   T   r3   c                 C   r,   r   r"   r.   r   r   r   typeX   r/   zDevice.typec                 C   r0   r   r6   r1   r   r   r   r7   \   r3   c                 C   r,   r   r#   r.   r   r   r   model`   r/   zDevice.modelc                 C   r0   r   r8   r1   r   r   r   r9   d   r3   c                 C   r,   r   r$   r.   r   r   r   	dp_gflopsh   r/   zDevice.dp_gflopsc                 C   r0   r   r:   r1   r   r   r   r;   l   r3   c                 C   r,   r   r%   r.   r   r   r   	sp_gflopsp   r/   zDevice.sp_gflopsc                 C   r0   r   r<   r1   r   r   r   r=   t   r3   c                 C   r,   r   r&   r.   r   r   r   memoryx   r/   zDevice.memoryc                 C   r0   r   r>   r1   r   r   r   r?   |   r3   c                 C   s8   d}|d | j| j| jj| jj| j| j| j	| j
7 }|S )N zhglobal_id: {}, local_id: {}, machine_id: {}, type: {}, model: {}, dp_flops: {}, sp_flops: {}, memory: {})formatr(   r)   r*   idr7   namer9   r;   r=   r?   r'   strr   r   r   __str__   s   zDevice.__str__c                 C      |   S r   rF   r.   r   r   r   __repr__      zDevice.__repr__N)r   r   r   r   r   r   r   NON_ACCELERATOR_TYPEr+   propertyr(   setterr)   r*   r7   r9   r;   r=   r?   rF   rI   r   r   r   r   r   .   sJ    















r   c                   @   s   e Zd ZdZdZdd Zedd Zejdd Zedd	 Z	e	jd
d	 Z	edd Z
e
jdd Z
edd Zejdd Zedd Zejdd Zedd Zejdd Zdd Zdd ZdS )Linkr      c                 C   s(   || _ || _d | _d | _d | _d | _d S r   )_src_tgtr"   
_bandwidth_latency_hop)r'   sourcetargetr   r   r   r+      s   
zLink.__init__c                 C   r,   r   )rP   r.   r   r   r   rU      r/   zLink.sourcec                 C   r0   r   )_sourcer1   r   r   r   rU      r3   c                 C   r,   r   )rQ   r.   r   r   r   rV      r/   zLink.targetc                 C   r0   r   )_targetr1   r   r   r   rV      r3   c                 C   r,   r   r6   r.   r   r   r   r7      r/   z	Link.typec                 C   r0   r   r6   r1   r   r   r   r7      r3   c                 C   r,   r   rR   r.   r   r   r   	bandwidth   r/   zLink.bandwidthc                 C   r0   r   rY   r1   r   r   r   rZ      r3   c                 C   r,   r   rS   r.   r   r   r   latency   r/   zLink.latencyc                 C   r0   r   r[   r1   r   r   r   r\      r3   c                 C   r,   r   rT   r.   r   r   r   hop   r/   zLink.hopc                 C   r0   r   r]   r1   r   r   r   r^      r3   c                 C   s,   d}|d | jj| jj| j| j| j7 }|S )Nr@   zPsource_global_id: {}, target_global_id: {}, type: {}, bandwidth: {}, latency: {})rA   rU   r(   rV   r7   rZ   r\   rD   r   r   r   rF      s   zLink.__str__c                 C   rG   r   rH   r.   r   r   r   rI      rJ   zLink.__repr__N)r   r   r   default_hopdefault_nic_bandwidthr+   rL   rU   rM   rV   r7   rZ   r\   r^   rF   rI   r   r   r   r   rN      s<    












rN   c                   @   s   e Zd Zdd Zedd Zejdd Zedd Zejdd Zed	d
 Zejdd
 Zedd Z	e	jdd Z	edd Z
edd Zedd Zdd Zdd Zdd Zdd Zdd ZdS ) Machinec                 C   s4   || _ d | _d | _d | _i | _i | _i | _d| _d S Nr   )_id	_hostname_addr_port_devices_links_accelerators!_non_accelerator_cumulative_count)r'   rB   r   r   r   r+      s   
zMachine.__init__c                 C   r,   r   rc   r.   r   r   r   rB      r/   z
Machine.idc                 C   r0   r   rk   r1   r   r   r   rB      r3   c                 C   r,   r   rd   r.   r   r   r   hostname   r/   zMachine.hostnamec                 C   r0   r   rl   r1   r   r   r   rm      r3   c                 C   r,   r   re   r.   r   r   r   addr   r/   zMachine.addrc                 C   r0   r   rn   r1   r   r   r   ro      r3   c                 C   r,   r   rf   r.   r   r   r   port   r/   zMachine.portc                 C   r0   r   rp   r1   r   r   r   rq      r3   c                 C   r,   r   )rg   r.   r   r   r   devices  r/   zMachine.devicesc                 C   r,   r   )rh   r.   r   r   r   links  r/   zMachine.linksc                 C   r,   r   )ri   r.   r   r   r   accelerators	  r/   zMachine.acceleratorsc                 C   s,   || j |j< |jtjvr|| j|j< d S d S r   )rg   r(   r7   r   rK   ri   r'   devicer   r   r   
add_device  s   zMachine.add_devicec                 C   s   || j |jj|jjf< d S r   )rh   rU   r(   rV   r'   linkr   r   r   add_link  s   zMachine.add_linkc                 C   s   | j ||fd S r   )rh   get)r'   source_global_idtarget_global_idr   r   r   get_link  s   zMachine.get_linkc                 C   sD   d}| j  D ]	}|d|7 }q| j D ]	}|d|7 }q|S )Nr@   z, device: {}z
, link: {})rr   valuesrA   rs   )r'   rE   rv   ry   r   r   r   rF     s   zMachine.__str__c                 C   rG   r   rH   r.   r   r   r   rI   "  rJ   zMachine.__repr__N)r   r   r   r+   rL   rB   rM   rm   ro   rq   rr   rs   rt   rw   rz   r~   rF   rI   r   r   r   r   ra      s:    











ra   c                   @   sh   e Zd Zdd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd ZdS )AlphaLatencyc                 C   s  t |tsJ |dd | _|dd | _|dd | _|dd | _| jd ur8zt| j| _W n   td| jd urD| jdd nd | _	| jd urS| jdd nd | _
| jd urb| jdd nd | _| j	d urzzt| j	| _	W n   td| j
d urzt| j
| _
W n   td| jdd | _| jdd | _| jdd | _| jdd | _| jd urt | jtr| jd	v sJ t| j | _nzt| j| _W n   td
| jd urt | jtr| jd	v sJ t| j | _nzt| j| _W n   td| jd ur.t | jtr| jdv sJ t| j | _nzt| j| _W n   td| jd ur\t | jtrK| jdv sCJ t| j | _d S z	t| j| _W d S    tdd S )NbaseinterZintraswitchz The switch latency must be floatringtreez$The base ring latency must be float.)r   z%The inter ring latency must be float.z%The inter tree latency must be float.)r   r   z%The intra ring latency must be float.z%The intra tree latency must be float.)
isinstancedictr{   _baseZ_interZ_intra_switchfloat	TypeError
_base_ring
_base_treeZ_base_inter_inter_ring_inter_tree_intra_ring_intra_treerE   r   )r'   alpha_latencyr   r   r   r+   (  s   






zAlphaLatency.__init__c                 C   r,   r   )r   r.   r   r   r   	base_ringq  r/   zAlphaLatency.base_ringc                 C   r,   r   )r   r.   r   r   r   	base_treeu  r/   zAlphaLatency.base_treec                 C   r,   r   )r   r.   r   r   r   r   y  r/   zAlphaLatency.switchc                 C   r,   r   )r   r.   r   r   r   
inter_ring}  r/   zAlphaLatency.inter_ringc                 C   r,   r   )r   r.   r   r   r   
inter_tree  r/   zAlphaLatency.inter_treec                 C   r,   r   )r   r.   r   r   r   
intra_ring  r/   zAlphaLatency.intra_ringc                 C   r,   r   )r   r.   r   r   r   
intra_tree  r/   zAlphaLatency.intra_treeN)r   r   r   r+   rL   r   r   r   r   r   r   r   r   r   r   r   r   &  s     I





r   c                   @   s   e Zd ZdZdd Z									
				d<ddZedd Zedd Zedd Z	dd Z
e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+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;S )=Clusterz
    The cluster is an abstract of the hardware resource for training, which contains the cluster topology and
    related hardware information. It will serve the task mapping, cost model and auto searching.
    c                 C   s.   d| _ i | _d | _d | _i | _i | _d | _d S rb   )_num_machines	_machinesZ	_topology_alpha_latency_rank_to_device_id_device_id_to_rank_num_devices_per_machiner.   r   r   r   r+     s   
zCluster.__init__V1006271Cr         rO      x  T=  K      c           -         s"  g ddgdgdg     }||v sJ || _  fdd}dd }d	d
 }i }g |d< d}i }i }t|D ]}i }dt| |d< d|d< d|d< g |d< g }d}t|D ]N}i }|dkrm|dkrm|n|d }|d7 }||}|||}|	}|	}|}||d< ||d< ||d< ||d< ||d< ||d< ||d< |||< |||< || q_i } ||\}!}"}|}|}|d7 }d}|}d}|!| d< |"| d< || d< || d< || d< || d< || d< || d< || d< |||< |||< ||  i }#|d7 }d}d }$d}%d}||#d< ||#d< ||#d< |||< |||< ||# ||d!< |d | q?td|d D ]Y}td|d D ]N}||krBq9|| }&|| }'|| }(|| })i }*|}+|},|+|*d"< |,|*d#< |&|'krs|(|)krsd$|*d< ||*d%< nd&|*d< ||*d%< |d |& d |* q9q0| | d'S )(z#Generate cluster by default config.)r   ZA100ZH100A2ZA10ZA16ZA30ZA40r   r   r   c                    sJ   d }| v r	d}n| v rd}n| v rd}n|  v rd}|d us#J |S )Nr   r   r   r   r   )	gpu_modelr7   Z
dcu_modelsZ
gpu_modelsZ
npu_modelsZ
xpu_modelsr   r   _convert_to_type  s   z<Cluster.gen_default_config_cluster.<locals>._convert_to_typec                 S   s,   d }| dkrdt | d }|d usJ |S )Nr   zTesla V100-SXM2-GB)rE   )r   
gpu_memoryr9   r   r   r   _convert_to_model  s
   z=Cluster.gen_default_config_cluster.<locals>._convert_to_modelc                 S   sb   d\}}}| dkrd}d}d}n
| dkrd}d}d}|d us J |d us&J |d us,J |||fS )N)NNNr   x86_64ZGenuineIntelz'Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GZ6148z&Intel(R) Xeon(R) Gold 6148 CPU @ 2.40Gr   )	cpu_modelarchvendorr9   r   r   r   _convert_to_cpu_info  s   

z@Cluster.gen_default_config_cluster.<locals>._convert_to_cpu_infomachinesr   Zhost_rm   z	127.0.0.1ro   ii  rq   rs   r   r(   r)   r7   r9   r?   r=   r;   r   r   r   r   g      )@rr   r|   r}   r   rZ   r   N)r   rangerE   append_build_from_dict)-r'   r   r   
node_countdevice_countr   Z
cpu_memoryZinter_bandwidthZintra_bandwidthZgpu_dp_gflopsZgpu_sp_gflopsZcpu_dp_gflopsZcpu_sp_gflopsZall_gpu_modelsr   r   r   cluster_infor(   Zglobal_id_to_device_typeZglobal_id_to_nodeir*   rr   r)   jrv   r7   r9   r;   r=   r?   Z
cpu_devicer   r   Z
nic_devicewidthipZ	node_id_iZ	node_id_jZdevice_type_iZdevice_type_jry   r|   r}   r   r   r   gen_default_config_cluster  s   




z"Cluster.gen_default_config_clusterc                 C   r,   r   )r   r.   r   r   r   rank_to_device_idH  r/   zCluster.rank_to_device_idc                 C   r,   r   )r   r.   r   r   r   device_id_to_rankL  r/   zCluster.device_id_to_rankc                 C   r,   r   )r   r.   r   r   r   r   P  r/   zCluster.machinesc                 C   s   t |tsJ || j|j< |jdkrJ| j|jd  }|j}|jD ]}|j| jtjvr9|| }|| j	|< || j
|< q t|jt|j |j |_d S |jD ]}|j| jtjvrl|}|| j	|< || j
|< |j| |j|< qMt|jt|j |_d S )Nr   r   )r   ra   r   rB   rj   rr   r7   r   rK   r   r   lenrt   )r'   r*   Zprev_machineoffsetr(   Zrank_idr   r   r   add_machineT  sP   








zCluster.add_machinec                 C   r,   r   )r   r.   r   r   r   r   q  r/   zCluster.alpha_latencyc                 C   s   t |tsJ |j| d S r   )r   r   r*   rw   ru   r   r   r   rw   u  s   zCluster.add_devicec                 C   s    t |tsJ |jj| d S r   )r   rN   rU   r*   rz   rx   r   r   r   rz   y  s   zCluster.add_linkc                 C   s0   d }| j  D ]}||j v r|j| }q|S r   )r   r   rr   keys)r'   device_global_idrv   r*   r   r   r   
get_device~  s   
zCluster.get_devicec                 C   s  |d }|D ]x}|   }t|}|d|_|d|_|d|_|dg }|D ]N}|d}|d}	t||	|}
|dd }|d urKt| }ntj}||
_	|d	d |
_
t|d
d|
_t|dd|
_t|dd|
_| |
 q*| | q|D ]r}|dg }|D ]g}|d}|d}| |}| |}t||}|dd }|d urt| }ntj}||_	t|dd|_t|dd|_|dd |_|jd u r|j}|j}|j|jkrd|_ntj|_| | qqd|v rt|d| _d S d | _d S )Nr   rm   ro   rq   rr   r(   r)   r7   r9   r;   r   r=   r?   rs   r|   r}   rZ   r\   r^   r   )_generate_machine_idra   r{   rm   ro   rq   r   r   r   r7   r9   r   r;   r=   r?   rw   r   r   rN   r   rZ   r\   r^   r*   rB   r_   rz   r   r   Z_alpha_latecy)r'   r   Zmachines_infoZmachine_info
machine_idr*   Zdevices_infoZdevice_infor   Zdevice_local_idrv   device_typeZ
links_infoZ	link_infor|   r}   rU   rV   ry   Z	link_typeZsource_machineZtarget_machiner   r   r   r     sh   












zCluster._build_from_dictc                 C   s@   t |}t|}W d    n1 sw   Y  | | d S r   )openjsonloadr   )r'   Zjson_file_pathZ	json_filer   r   r   r   build_from_file  s   
zCluster.build_from_filec                 C   s   | j }|  j d7  _ |S )Nr   )r   )r'   Zcur_machine_idr   r   r   r     s   zCluster._generate_machine_idc                 C   s@   g }| j  D ]}|j D ]}|jt| kr|| qq|S r   )r   r   rr   r7   r   r   )r'   r   rr   r*   rv   r   r   r   get_all_devices  s   
zCluster.get_all_devicesc           	      C   sf   d }d}|  |}|j}|||}d }|d u rtj}n|j}|dkr'd}|S d||d d   }|S )Ni  g        r   r   r   i@B )r   r*   r~   rN   r`   rZ   )	r'   source_device_idtarget_device_idbetaZconvert_baserv   r*   ry   rZ   r   r   r   get_beta  s   
zCluster.get_betac                 C   s@   d }d }|  |}|j}|||}|d ur|j}|S tj}|S r   )r   r*   r~   r^   rN   r_   )r'   r   r   r   r^   rv   r*   ry   r   r   r   get_hop  s   
zCluster.get_hopc                 C   s@   t  }|D ]}| |}|jj}|| qt|dkrdS dS )Nr   FTsetr   r*   rB   addr   )r'   
device_idsmachine_ids	device_idrv   r   r   r   r   cross_machine  s   
zCluster.cross_machinec                 C   s"   g }|D ]
}| | j|  q|S r   )r   r   )r'   Zgroup_ranksr   Zrankr   r   r   convert_rank_to_device_id  s   z!Cluster.convert_rank_to_device_idc                 C   sD   t  }|D ]}| |}|jj}|| qt|}|dks J |S rb   r   )r'   r   r   r   rv   r   countr   r   r   get_involved_machine_count  s   
z"Cluster.get_involved_machine_countc                 C   s
   t | jS r   )r   r   r.   r   r   r   get_num_machines  s   
zCluster.get_num_machinesc                 C   s   | j sJ | j S r   )r   r.   r   r   r   get_num_devices_per_machine  s   
z#Cluster.get_num_devices_per_machinec                 C   s&   d}| j  D ]	}|d|7 }q|S )Nr@   zmachine: {}
)r   r   rA   )r'   rE   r*   r   r   r   rF     s   zCluster.__str__c                 C   rG   r   rH   r.   r   r   r   rI     rJ   zCluster.__repr__N)r   r   r   r   r   r   rO   r   r   r   r   r   )r   r   r   __doc__r+   r   rL   r   r   r   r   r   rw   rz   r   r   r   r   r   r   r   r   r   r   r   r   rF   rI   r   r   r   r   r     sT    
 &



:
r   c               	   C   s   t  } td}|d u rd}nt|}td}|d u rd}nt|}|| dks+J t|| }td|d|dtj dd	 | j||d
 | S )NZPADDLE_LOCAL_SIZEr   ZPADDLE_GLOBAL_SIZEr   zNode Count: zLocal Device Size: zWorld size: T)flush)r   r   )	r   osgetenvintprintpaddledistributedZget_world_sizer   )ZclusterZlocal_device_countZglobal_device_countr   r   r   r   get_default_cluster"  s.   

r   )r   r   enumr   r   r   r   r   r   rN   ra   r   r   r   r   r   r   r   <module>   s$   
]JQh   