o
    پi                     @   s   d dl mZmZ d dlmZ d dlZd dlZg ag ada	d a
daeG dd dZdedefd	d
Zdd Zdd ZdedefddZdefddZdeeejjejjf  fddZdeeeef  fddZdefddZdS )    )	dataclassfield)ListN   c                   @   sL   e Zd ZU dZeed< eedZe	e	e  ed< dZ
eed< dZeed< d	S )
PDMuxConfigr   sm_group_num)default_factorymanual_divisions   split_forward_token_budget$   decode_bs_divisorN)__name__
__module____qualname__r   int__annotations__r   listr	   r   r   r    r   r   V/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/multiplex/pdmux_context.pyr      s   
 r   config_pathreturnc                 C   s   | st  S t| d}t|}W d   n1 sw   Y  d|vr'td|d dk r1td|dg }|d d }|rQt||krQtd	| d
t| t |d ||dd|dddS )z9Load pdmux configuration from YAML file into a dataclass.rNr   z$Missing required field: sm_group_num   zsm_group_num must be >= 3r	      zmanual_divisions must have z entries, but got r   r
   r   r   )r   r	   r   r   )r   openyaml	safe_load
ValueErrorgetlen)r   frawr	   expectedr   r   r   load_pdmux_config   s.   

r$   c                 C   sT   | \}}|dkr
dS |dkrdS |dkrdS |dkr |dkr d	S t d
| d| )N   )   r&      )r   r   r   )   r   	   r   )r   r   z Unsupported compute capability: .)r   )compute_capabilitymajorminorr   r   r   get_arch_constraints7   s   r.   c                    s   t |\}} fddt| | d |D }|s'td  d| d| dt||krBtdt|| }|dd| d| }n|}g }|D ]}	 |	 }
||	|
f qH|  |S )	z
    :param total_sms: total sm count on a single GPU
    :param compute_capability: (major, minor)
    :return: SM partition group(prefill sm, decode sm)
    c                    s(   g | ]}| | kr | d kr|qS )   r   ).0x	total_smsr   r   
<listcomp>M   s
    zdivide_sm.<locals>.<listcomp>r&   z(No valid partitions found for total SMs z! with constraints (min per part: z, multiple: )N)r.   ranger   r    maxappendreverse)r3   r+   groupsmin_per_partmultiplepossible_valuesstepselected_values	divisionspart1part2r   r2   r   	divide_smF   s,   
rC   gpu_idconfigc                 C   s   ddl m} tj }|| }|jrdd |jD }nt|tj||j	d }g a
t
|df t
| t
d|f g attj| tj| f |D ]\}}t||||  qQttj| tj| f datt ad S )Nr   )spatialc                 S   s   g | ]	\}}}||fqS r   r   )r0   
prefill_sm	decode_sm_r   r   r   r4   q   s    z,initialize_stream_groups.<locals>.<listcomp>r   )
sgl_kernelrF   torchcudacurrent_deviceget_sm_availabler	   rC   get_device_capabilityr   	SM_COUNTSr8   extendSTREAM_GROUPSStreamcreate_greenctx_stream_by_valueCURRENT_STREAM_IDXCURRENT_STREAM_GROUP)rD   rE   rF   devicetotal_sm_countr@   rG   rH   r   r   r   initialize_stream_groupsh   s:   



rY   idxc                 C   s2   | dk s
| t tkrtd|  | att ad S )Nr   zInvalid stream index: )r    rR   r   rU   rV   )rZ   r   r   r   set_current_stream_idx   s   r[   c                   C      t S )zGet the stream groups.)rR   r   r   r   r   get_stream_groups      r]   c                   C   r\   )zGet the SM counts.)rP   r   r   r   r   get_sm_counts   r^   r_   c                   C   r\   )zGet the current stream index.)rU   r   r   r   r   get_current_stream_idx   r^   r`   )dataclassesr   r   typingr   rK   r   rR   rP   SM_GROUP_NUMrU   rV   r   strr$   r.   rC   r   rY   r[   r   tuplerL   rS   r]   r_   r`   r   r   r   r   <module>   s&    	"("