o
    i/                     @   s  d dl Z d dlZd dl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
 d dlm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 zd dlZW n eya   edZY nw ed
ddee fddZdedee defddZ dedee dedefddZ!de"ee#f dedede$de"ee#f f
ddZ%d e&e d!e'ed"f de&e fd#d$Z(d e&e d%e
de&e fd&d'Z)d(e
d)ed*ede
fd+d,Z*d-e
de$dB de
fd.d/Z+d0e&e dedede$d%e
d1ed2ede"ee#f dB fd3d4Z,d0e&e d)ed*ed-e
d5e$d1ed2ede&e"ee#f  dB fd6d7Z-d0e&e d8ed9ed(e
d5e$d1ed2edd:fd;d<Z.eG d=d> d>Z/d?e/fd@dAZ0d?e j1fdBdCZ2e3dDkrce j4e/j5dEZ6e/e6 e2e67  dS dS )F    N)	dataclass)datetime)	lru_cache)Path)ClassVar)add_cli_args)FlexibleArgumentParser)PlaceholderModule   )ParameterSweepParameterSweepItem)sanitize_filenamepandas)maxsizereturnc                  C   st   t dd} t|  dh}| jD ](}|jr |jtjur ||j |jD ]}|dr6||	d
dd q#q|S )NF)add_helpconfigz---_)r   add_startup_cli_args_actionsdestargparseSUPPRESSaddoption_strings
startswithlstripreplace)parser	supportedactionoption r#   S/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/benchmarks/sweep/startup.py_get_supported_startup_keys   s   



r%   	param_keyr    c                 C   s0   | dkrdS |  ddd }|dd}||v S )N_benchmark_nameT.r
   r   r   r   )splitr   )r&   r    prefix
normalizedr#   r#   r$   _is_supported_param*   s
   r,   paramsstrictc                C   s   g }| D ]P}i }g }|  D ]\}}t||r|||< q|| q|rL|dp,| }	d|	r6dt|	 nd ddt| }
|rHt|
t	|
 |t
| qt|S )Nr'   z#Ignoring unsupported startup paramsz for  z: z, )itemsr,   appendgetas_textstrjoinsorted
ValueErrorprintr   from_recordr   )r-   r    r.   filtereditemkeptdroppedkeyvaluelabelmessager#   r#   r$   _filter_params2   s*   

rB   run_dataserve_overridesstartup_overrides
run_numberc                 C   s    || d< |  | |  | | S )NrF   )update)rC   rD   rE   rF   r#   r#   r$   _update_run_dataO   s   

rH   cmdkeys.c                    sP   g }d}| D ] |rd}q |v rd}qt  fdd|D r q|  q|S )NFTc                 3   s     | ]}  | d V  qdS )=N)r   ).0r>   argr#   r$   	<genexpr>e   s    z_strip_arg.<locals>.<genexpr>)anyr1   )rI   rJ   stripped	skip_nextr#   rM   r$   
_strip_arg[   s   rS   output_pathc                 C   s&   d}t | |} g | |d t|S )N)z--output-jsonz--output_jsonr   )rS   r4   )rI   rT   rJ   r#   r#   r$   _apply_output_jsonk   s   
rU   
output_dir
serve_combstartup_combc                 C   sD   t t  }|r|d|jf |r|d|jf | td| S )NzSERVE-zSTARTUP-r   )listr4   extendnamer   r5   )rV   rW   rX   partsr#   r#   r$   _get_comb_base_pathq   s   
r]   	base_pathc                 C   s    |d u r| d S | d| d S )Nzsummary.jsonzrun=z.jsonr#   )r^   rF   r#   r#   r$   _get_comb_run_path~   s   r_   startup_cmdshow_stdoutdry_runc          
      C   s  | | }| |}t||}td td|  td|  td|  td|  td|  | ratd |jdd	d
}t|}	t|	|||W  d    S 1 s\w   Y  |ritd d S |jj	ddd t
j||rxd nt
jdd |jdd	d
}t|}	W d    n1 sw   Y  t|	|||}	|jdd	d
}tj|	|dd W d    n1 sw   Y  td |	S )Nz[BEGIN BENCHMARK]zServe overrides: zStartup overrides: zRun Number: zBenchmark command: zOutput file: z!Found existing results. Skipping.rutf-8encodingz[END BENCHMARK]T)parentsexist_ok)stdoutcheckw   indent)apply_to_cmdrU   r8   existsopenjsonloadrH   parentmkdir
subprocessrunDEVNULLdump)
r`   rD   rE   rF   rT   ra   rb   rI   frC   r#   r#   r$   run_benchmark   sJ   




 r{   num_runsc             
   C   s   t tttf   }t|D ]}t| |||t||||d}	|	d ur&||	 q|r+d S t|d djddd}
t	j
||
dd W d    |S 1 sJw   Y  |S )N)rD   rE   rF   rT   ra   rb   )rF   rk   rd   re   rl   rm   )rY   dictr4   objectranger{   r_   r1   rq   rr   ry   )r`   rW   rX   r^   r|   ra   rb   	comb_datarF   rC   rz   r#   r#   r$   run_comb   s2   
	

r   serve_paramsstartup_paramszpd.DataFrame | Nonec                C   s   t tttf   }|D ]!}|D ]}	t|||	}
t| ||	|
|||d}|d ur+|| qq|r1d S tj	|}|
|d  |S )N)rW   rX   r^   r|   ra   rb   zsummary.csv)rY   r}   r4   r~   r]   r   rZ   pd	DataFramefrom_recordsto_csv)r`   r   r   rV   r|   ra   rb   all_datarW   rX   r^   r   combined_dfr#   r#   r$   	run_combs   s,   
	
r   c                   @   s   e Zd ZU ee ed< eed< eed< eed< eed< e	ed< e	ed< edB ed	< e	ed
< dZ
ee ed< dZee ed< edejfddZedejdejfddZdS )SweepStartupArgsr`   r   r   rV   r|   ra   rb   Nresumestrict_paramsstartupparser_namez8Benchmark vLLM startup time over parameter combinations.parser_helpargsc                 C   s   t |j}|jrt|j}nti g}|jr t|j}nti g}t }t	|||j
d}t	|||j
d}|jdk rBtd| |||t|j|j|j|j|j|j
d	S )N)r    r.   r
   z `num_runs` should be at least 1.)	r`   r   r   rV   r|   ra   rb   r   r   )shlexr)   r`   r   r   	read_jsonr   r   r%   rB   r   r|   r7   r   rV   ra   rb   r   )clsr   r`   r   r   r    r#   r#   r$   from_cli_args  s6   
zSweepStartupArgs.from_cli_argsr   r   c                 C   s   |j dtddd |j dtd dd |j dtd dd |j d	d
tddd |j dtddd |j dddd |j dddd |j dtd dd |j dddd |S )Nz--startup-cmdzvllm bench startupz.The command used to run the startup benchmark.)typedefaulthelpz--serve-paramszPath to JSON file containing parameter combinations for the `vllm serve` command. Only parameters supported by `vllm bench startup` will be applied.z--startup-paramszYPath to JSON file containing parameter combinations for the `vllm bench startup` command.z-oz--output-dirresultsz+The directory to which results are written.z
--num-runsr
   z)Number of runs per parameter combination.z--show-stdout
store_truez0If set, logs the standard output of subcommands.)r!   r   z	--dry-runzFIf set, prints the commands to run, then exits without executing them.z--resumezSet this to the name of a directory under `output_dir` (which is a timestamp) to resume a previous execution of this script, i.e., only run parameter combinations for which there are still no output files.z--strict-paramszRIf set, unknown parameters in sweep files raise an error instead of being ignored.)add_argumentr4   int)r   r   r#   r#   r$   r   6  sj   zSweepStartupArgs.add_cli_args)__name__
__module____qualname__rY   r4   __annotations__r   r   r   boolr   r   r   classmethodr   	Namespacer   ArgumentParserr   r#   r#   r#   r$   r      s"   
 $r   r   c              
   C   s   | j p	t d}| j| }| j r| std| dzt| j| j	| j
|| j| j| jdW S  tyE } z	td| d|d }~ww )Nz%Y%m%d_%H%M%Sz+Cannot resume from non-existent directory ())r`   r   r   rV   r|   ra   rb   z/The script was terminated early. Use `--resume z2` to continue the script from its last checkpoint.)r   r   nowstrftimerV   rp   r7   r   r`   r   r   r|   ra   rb   BaseExceptionRuntimeError)r   	timestamprV   excr#   r#   r$   run_mainv  s,   
	
r   c                 C   s   t t|  d S )N)r   r   r   )r   r#   r#   r$   main  s   r   __main__)description)8r   rr   r   rv   dataclassesr   r   	functoolsr   pathlibr   typingr   vllm.benchmarks.startupr   r   vllm.utils.argparse_utilsr   vllm.utils.import_utilsr	   param_sweepr   r   utilsr   r   r   ImportErrorsetr4   r%   r   r,   rB   r}   r~   r   rH   rY   tuplerS   rU   r]   r_   r{   r   r   r   r   r   r   r   r   r   r   
parse_argsr#   r#   r#   r$   <module>   s   



&
	
7	
#	
"u

