o
    Ti                     @   sL   d dl Z d dlZd dlZd dlZdd Zdd Zdd Zdd	 Zd
d ZdS )    Nc                  C   s   g } zt ddgd}W n   g  Y S |d}|D ]}|dr/t|dd } nqt|D ]#}|D ]}|d| d	rV|dd
d  }| dd |D  q8q4| S )Nnumactlz
--hardwarezutf-8
z
available:    znode z cpus:   c                 S   s   g | ]}t |qS  )int).0corer   r   H/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/utils/numa.py
<listcomp>'   s    z"get_numa_cores.<locals>.<listcomp>)
subprocesscheck_outputdecodesplit
startswithr   rangeappend)retoutputlinesline	num_numasnumacoresr   r   r   get_numa_cores   s&   

r   c            
      C   s   t g dg dg dd} d}|  D ]9\}}|\}}}t|}|d urL|||g}tj|tjtjd}	|	 dkr?d} |S td	| d
|   |S q|S )N)z-lr   apt)z-Qr   pacman)z-qr   yum)dpkgr   rpmF)stdoutstderrr   Tzplease install the z package with )	dictitemsshutilwhichr   PopenPIPEwaitprint)
libsfoundpkgmgrdataflaglibtoolpathcmdresultr   r   r   check_for_numactl_pkg+   s*   


r5   c                 C   s   zt | }t||d W S  tyE   | d}t|dkr%td| f t |d }t |d }||kr<td| f t||d  Y S w )Nr   -   zNBad range: '%s', range must be either a number or two number separated by dashr   z=Bad range: '%s', range end must larger than or equal to start)r   r   
ValueErrorr   len)rngvaluepartsstartendr   r   r   parse_rangeA   s   
r?   c                 C   sT   g }d}|  d}|D ]}t|}|d |krtd| f |d }|| q|S )N,r   zZBad range: '%s', sub ranges must not overlap with each other and should be in ascend order)r   r?   r8   extend)	range_strnumber_listlast
range_list	sub_rangesub_number_listr   r   r   parse_range_listY   s   
rI   c              	   C   s$  g }t   dtj v rtd| d urt| }t|}n
tjdd}t	|}|| }|dks3J d||| ||d   }|
d t }t|}	d}
g }g }g }g }g }t	|	D ]9}|| g kri|
| n'|
| || |kr|g kr|
|d  |
| n|g kr|
| g }|| }q[|g kr|
| |g krt|t|krd	}
tt||}n|g krd
}
|
dkrt	|	D ]}t|t|| kr|
d |
|   nqna|
d	krt	|	D ]}t|t|| kr|
d |
||    nqn:|
d
kr>t	|	D ]0}t|t|| kr<|D ]}||v r6|
d |
dtt|   nqq nq|
d |d }|}| }|dd  D ])}||d kr_|}qR||krl| d| }n
| d| d| }|}|}qR||kr| d| }|
|  ||fS )NKMP_AFFINITYzEnvironment variable KMP_AFFINITY conflicts with numactl because it interfere with how many CPU cores numactl can set. Unset KMP_AFFINITY before launching deepspeed.

	$ unset KMP_AFFINITY
	$ deepspeed <deepspeed command parameters>F)logicalr   z3At least one core needs to be assigned to each rankr   normalflat_hbmfakez-mz-prA   z-Cr   r6   )r5   osenvironkeysr8   rI   r9   psutil	cpu_countr   r   r   r#   zipsetjoinmapstr)bind_core_listnum_local_procs
local_ranknumactl_cmd	core_listtotal_corescores_per_rankcore_list_for_rank
numa_coresr   	numa_modenon_empty_numa_listempty_numa_listprevious_numa_coresnuma_node_listnuma_node_list_listi	numa_dictnodes	last_core
first_corecore_list_strcore_idr   r   r   get_numactl_cmdh   s   














ro   )	rO   rR   r%   r   r   r5   r?   rI   ro   r   r   r   r   <module>   s   	