o
    * iG                     @   s   d dl Z d dlZd dlZd dlZd dlmZ eddZd Z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d ZdS )    N)
get_loggerINFOroot   c           	   
   C   s   dd }z5d}dg}t |dtj}d|  }|D ]}||dkr6|  d }||} |W S q|W S  tyT } zt	
d	|  W Y d}~dS d}~ww )
z!
    get cpu info from lscpu
    c                 S   sZ   g }|  d}|D ]!}t| dd t| dd }}|tt||d  q	|S )N,-r   r   )splitintextendlistrange)iZprocessed_cpu_infoZ
cpu_rangesZ	cpu_rangestartend r   r/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/distributed/utils/process_utils.py_process_raw_cpu_info!   s   
z,_get_cpu_info.<locals>._process_raw_cpu_infoNZlscpuutf-8noder      _get_cpu_info failed, reason:)
subprocesscheck_outputdecoder   oslinesepfindstrip	Exceptionloggerwarning)	numa_idr   ZcpuscmdoutputZnuma_keylineZraw_cpu_infoer   r   r   _get_cpu_info   s&   
r&   c                   C   
   t dS )z*
    check if nvidia-smi is available
    
nvidia-smishutilwhichr   r   r   r   _has_nvidia_smi<      
r,   c                   C   r'   )z'
    check if xpu-smi is available
    xpu-smir)   r   r   r   r   _has_xpu_smiC   r-   r/   c                 C   s6   t |  dkr
d S | d}t ||krd S || S )Nr   r   )lenr   r   )Zstr_device_list
local_rankZvisible_devicesr   r   r   _get_xpu_device_from_envJ   s   
r2   c                 C   s\   t d}|durt|| S t d}|durt|| S t d}|dur*t|| S t| S )z3
    get currently used xpu physical device id
    ZXPULINK_VISIBLE_DEVICESNZXPU_VISIBLE_DEVICESCUDA_VISIBLE_DEVICES)r   getenvr2   str)r1   Zxpulink_visible_devicesZxpu_visible_devicescuda_visible_devicesr   r   r   _get_xpu_deviceS   s   





r7   c                 C   sD   t d}|du s|dkrt| S |d}t|| krdS ||  S )z3
    get currently used gpu physical device id
    r3   N r   )r   r4   r5   r   r0   )r1   r6   r   r   r   _get_gpu_deviceh   s   

r9   c              
   C   sp   zdddd| g}t j|ddd}|  d }|W S  ty7 } ztd	|  W Y d
}~d
S d
}~ww )z+
    get gpu numa info from nvidia-smi
    r(   topoz-Cz-ir   timeoutr   r   N)r   r   r   r   r   r   r   r    )Zgpu_idr"   r#   r!   r%   r   r   r   _get_gpu_numa_infou   s   r>   c                 C   s   t | } g d}tddkrg d}tj|ddd}| | d   d	 }g }|d
D ]}|d\}}|t	t |t |d  q0|S )N)r.   r:   z-mZCUDA_DEVICE_ORDERZOAM_ID)r.   r:   z-mo   r;   r   r   r   r   )
r	   r   r4   r   r   r   
splitlinesr   r
   r   )Zxpu_idr"   r#   Zcpu_affinityaffinity_maskZaffinity_ranger   r   r   r   r   _get_xpu_affinity_mask   s   rC   c                  C   s   t  s
td tS tttddd} t| }|du r$td tS t	|}|du r3td tS |dkr>td	 tS t
|}|du rMtd
 tS td}td|  td| td}td|  tS )z
    set affinity for gpu
    zQnvidia-smi is not available, set_affinity is aborted, plz check your environment.PADDLE_LOCAL_RANK0r   NzgFailed to get device id from cuda_visible_devices, set_affinity is aborted, plz check your environment.zMFailed to get numa info, set_affinity is aborted, plz check your environment.zN/Aznvidia-smi topo return numa id as N/A, set_affinity is aborted, plz check your environment. (Notice: This is expected behavior when executed on single numa node environment)zLFailed to get cpu info, set_affinity is aborted, plz check your environment.Check affinity before setting: zcheck affinity after setting: )r,   r   r    	FAIL_CODEmaxr	   r   r4   r9   r>   r&   sched_getaffinityinfosched_setaffinitySUCCESS_CODE)r1   	device_idr!   rB   affinityr   r   r   set_affinity_gpu   sF   

rO   c                  C   s   t  s
td tS tttddd} t| }|du r$td tS t	|}t
d}td|  td| t
d}td|  tS )	z
    set affinity for xpu
    zNxpu-smi is not available, set_affinity is aborted, plz check your environment.rD   rE   r   NzMFailed to get device id, set_affinity is aborted, plz check your environment.rF   zCheck affinity after setting: )r/   r   r    rG   rH   r	   r   r4   r7   rC   rI   rJ   rK   rL   )r1   rM   rB   rN   r   r   r   set_affinity_xpu   s&   

rP   c                   C   s.   t j rt S t j rt S td tS )Nz-Currently set_affinity only supports gpu env.)	paddleZdeviceZis_compiled_with_cudarO   Zis_compiled_with_xpurP   r   r    rG   r   r   r   r   set_affinity   s   


rR   )r   r*   r   rQ   Z"paddle.distributed.utils.log_utilsr   r   rL   rG   r&   r,   r/   r2   r7   r9   r>   rC   rO   rP   rR   r   r   r   r   <module>   s&   
 	)