o
    
۾i!                     @   s   d dl Z d dlZd dlm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lmZmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ eeZG dd deZdS )    N)Callable)Any)envs)
VllmConfig)init_logger)CpuArchEnumcurrent_platform)CpuPlatformLogicalCPUInfo)TorchProfilerWrapper)set_random_seed)CPUModelRunner)Worker#init_worker_distributed_environmentc                       s   e Zd Z	ddededededef
 fddZd	d
 Zd deddfddZ	d!de
e dB ddfddZdefddZd"ddZdee
e ge
e f defddZd#defddZ  ZS )$	CPUWorkerFvllm_config
local_rankrankdistributed_init_methodis_driver_workerc                    sd   t  j|||||d d| j_d | _|j}|jdkr0|j d| j }t||| j	dgd| _d S d S )N)r   Ttorchz-rank-CPU)worker_namer   
activities)
super__init__parallel_configdisable_custom_all_reduceprofilerprofiler_configinstance_idr   r   r   )selfr   r   r   r   r   r   r   	__class__ M/home/ubuntu/.local/lib/python3.10/site-packages/vllm/v1/worker/cpu_worker.pyr      s&   
zCPUWorker.__init__c                 C   sV  t j}|dkrBt dkrBt }|tjtjfv r"| 	dd | _
nK|tjkr0| 	dd | _
n=|tjkr>| 	dd | _
n/d| _
n+|dkrJd| _
n#| jj}|d}|d urg| jj}||| |d	 |  }|| j | _
| j
dkrtjj| j
}|rt| | jd
d tjd< t| j| j| j| jtj t| j j! t"| jt#d| _$d S )NautoLinuxc                 S   s   dd | D S )Nc                 S   s   g | ]}|j d  dk r|qS )      id).0cpur$   r$   r%   
<listcomp>>   s    z;CPUWorker.init_device.<locals>.<lambda>.<locals>.<listcomp>r$   cpusr$   r$   r%   <lambda>>   s    z'CPUWorker.init_device.<locals>.<lambda>c                 S   s   | dd  S )Nr$   r/   r$   r$   r%   r1   C   s    c                 S   s   | S Nr$   r/   r$   r$   r%   r1   G   s    nobind|   :r2   VLLM_DIST_IDENTr-   )%r   VLLM_CPU_OMP_THREADS_BINDplatformsystemr   get_cpu_architecturer   POWERPCS390X_get_autobind_cpu_idslocal_omp_cpuidX86ARMr   data_parallel_rank_localsplit
world_sizer   r   ops_C_utilsinit_cpu_threads_envloggerinfor   osenvironr   r   r   dist_backendr   model_configseedr   devicemodel_runner)r!   
omp_cpuidscpu_archlocal_dp_rankomp_cpuids_listrE   retr$   r$   r%   init_device6   sP   





zCPUWorker.init_devicer6   levelreturnNc                 C      t d d S Nz.sleep mode is not supported on CPU, ignore it.rI   warning)r!   rX   r$   r$   r%   sleepm      
zCPUWorker.sleeptagsc                 C   rZ   r[   r\   )r!   r`   r$   r$   r%   wake_upq   r_   zCPUWorker.wake_upc                 C   s   | j jpdS )Nr   )cache_configcpu_kvcache_space_bytesr!   r$   r$   r%   determine_available_memoryu   s   z$CPUWorker.determine_available_memoryc                 C   s   t | jj | j  d S r3   )r   rN   rO   rQ   warming_up_modelrd   r$   r$   r%   compile_or_warm_up_modelx   s   z"CPUWorker.compile_or_warm_up_modelcpu_selectorc                    s  t jdddk}t \}}t|| jjks&|s&J d| jj d| d|s7|| j   fdd|D }n't|| jjksAJ t	|dd	 d
}t|| jj }| j| }||||  }i }|D ]}|j
|vrng ||j
< ||j
 | qbg }| D ]}	t	|	dd	 d
}	|||	 q}t	|dd	 d
}tj}
|
du r| jjdkp| jjdk}|rdnd}
t||
ksJ d|
 dt| d|
dkr|d|
  }tddd |D  ddd |D S )a  
        Return CPU ids to bind based on NUMA nodes.
        Currently for rank N, only CPU ids on the N-th node in available NUMA
        node list will be selected.
        Args:
            cpu_selector: a callable object to select CPUs from a CPU list
            of a physical core. The input is a LogicalCPUInfo list, sorted by
            the LogicalCPUInfo.id. A selected LogicalCPUInfo list should be
            returned.
        VLLM_CPU_SIM_MULTI_NUMA0z1Not enough allowed NUMA nodes to bind threads of z$ CPUWorkers. Allowed NUMA nodes are z&. Please try to bind threads manually.c                    s   g | ]	}|j  kr|qS r$   	numa_noder,   xselected_numa_noder$   r%   r.      s    z3CPUWorker._get_autobind_cpu_ids.<locals>.<listcomp>c                 S      | j S r3   rk   rn   r$   r$   r%   r1          z1CPUWorker._get_autobind_cpu_ids.<locals>.<lambda>)keyc                 S   rq   r3   r*   rr   r$   r$   r%   r1      rs   c                 S   rq   r3   r*   rr   r$   r$   r%   r1      rs   Nr6   r   zVLLM_CPU_NUM_OF_RESERVED_CPU (z) should less than .z0auto thread-binding list (id, physical core): %sc                 S   s   g | ]}|j |jfqS r$   )r+   physical_corerm   r$   r$   r%   r.      s    ,c                 S   s   g | ]}t |jqS r$   )strr+   rm   r$   r$   r%   r.      s    )rK   rL   getr	   get_allowed_cpu_core_node_listlenr   rE   r   sortedrv   appendvaluesextendr   VLLM_CPU_NUM_OF_RESERVED_CPUdata_parallel_size_localrI   rJ   join)r!   rh   sim_multi_numa_nodesallowed_numa_nodeslogical_cpu_listsim_cpu_num_per_node	start_idxcore_to_cpuscpu_infocpu_listreserve_cpu_numneed_reserver$   ro   r%   r?   ~   sj   	






zCPUWorker._get_autobind_cpu_idsTis_startc                 C   s2   | j d u r	td|r| j   d S | j   d S )NzProfiler is not enabled.)r   RuntimeErrorstartstop)r!   r   r$   r$   r%   profile   s
   
zCPUWorker.profile)F)r6   r3   )rY   N)T)__name__
__module____qualname__r   intrx   boolr   rW   r^   listra   re   rg   r   r
   r?   r   __classcell__r$   r$   r"   r%   r      s0    7

Or   )rK   r:   collections.abcr   typingr   r   vllmr   vllm.configr   vllm.loggerr   vllm.platformsr   r   vllm.platforms.cpur	   r
   vllm.profiler.wrapperr   vllm.utils.torch_utilsr   vllm.v1.worker.cpu_model_runnerr   vllm.v1.worker.gpu_workerr   r   r   rI   r   r$   r$   r$   r%   <module>   s    