o
    :/i;4                     @   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 ddlmZmZ ddlmZ zd dlZW n eyg   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/d0Z-d1e(e dedede&d&ed2e!d3e!de$ee%f dB fd4d5Z.d1e(e d*ed+ed.ed6e&d2e!d3e!de(e$ee%f  dB fd7d8Z/d1e(e d9ed:ed)ed6e&d2e!d3e!dd;fd<d=Z0eG d>d? d?Z1d@e1fdAdBZ2d@e j3fdCdDZ4e5dEkrie j6e1j7dFZ8e1e8 e4e89  dS dS )G    N)contextmanager)	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$   j/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/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_params3   s*   

rC   run_dataserve_overridesstartup_overrides
run_numberc                 C   s    || d< |  | |  | | S )NrG   )update)rD   rE   rF   rG   r$   r$   r%   _update_run_dataP   s   

rI   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>f   s    z_strip_arg.<locals>.<genexpr>)anyr2   )rJ   rK   stripped	skip_nextr$   rN   r%   
_strip_arg\   s   rT   output_pathc                 C   s&   d}t | |} g | |d t|S )N)z--output-jsonz--output_jsonr   )rT   r5   )rJ   rU   rK   r$   r$   r%   _apply_output_jsonl   s   
rV   experiment_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   )listr5   extendnamer   r6   )rW   rX   rY   partsr$   r$   r%   _get_comb_base_pathr   s   
r^   	base_pathc                 C   s    |d u r| d S | d| d S )Nzsummary.jsonzrun=z.jsonr$   )r_   rG   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|  | retd td |jd	d
d}t|}	t|	|||W  d    S 1 s`w   Y  |rmtd d S |jj	ddd t
j||r|d 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.z[SKIPPED BENCHMARK]rutf-8encodingz[END BENCHMARK]T)parentsexist_ok)stdoutcheckw   indent)apply_to_cmdrV   r9   existsopenjsonloadrI   parentmkdir
subprocessrunDEVNULLdump)
ra   rE   rF   rG   rU   rb   rc   rJ   frD   r$   r$   r%   run_benchmark   sL   




 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)rE   rF   rG   rU   rb   rc   )rG   rl   re   rf   rm   rn   )rZ   dictr5   objectranger|   r`   r2   rr   rs   rz   )ra   rX   rY   r_   r}   rb   rc   	comb_datarG   rD   r{   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)rX   rY   r_   r}   rb   rc   zsummary.csv)rZ   r~   r5   r   r^   r   r[   pd	DataFramefrom_recordsto_csv)ra   r   r   rW   r}   rb   rc   all_datarX   rY   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	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efddZedefddZdS )SweepStartupArgsra   r   r   
output_direxperiment_namer}   rb   rc   resume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 }|j	}t
|||d}t
|||d}|jrA|j}nt d}|jdk rQtd| |||t|j||j|j|j|jd	S )N)r!   r/   z%Y%m%d_%H%M%Sr   z `num_runs` should be at least 1.)	ra   r   r   r   r   r}   rb   rc   r   )shlexr*   ra   r   r   	read_jsonr   r   r&   strict_paramsrC   r   r   nowstrftimer}   r8   r   r   rb   rc   r   )clsr   ra   r   r   r!   r   r   r$   r$   r%   from_cli_args  s>   
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
dd |j d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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--strict-params
store_truezRIf set, unknown parameters in sweep files raise an error instead of being ignored.)r"   r   z-oz--output-dirresultsz0The main directory to which results are written.z-ez--experiment-namezwThe name of this experiment (defaults to current timestamp). Results will be stored under `output_dir/experiment_name`.z
--num-runsr   z)Number of runs per parameter combination.z--show-stdoutz0If set, logs the standard output of subcommands.z	--dry-runzFIf set, prints the commands to run, then exits without executing them.z--resumezResume a previous execution of this script, i.e., only run parameter combinations for which there are still no output files under `output_dir/experiment_name`.)add_argumentr5   int)r   r    r$   r$   r%   r   ?  sv   zSweepStartupArgs.add_cli_argsc                 C   sF   | j | j }| jr| std||S | r!td||S )Nz/Cannot resume from non-existent experiment_dir=z)Cannot overwrite existing experiment_dir=)r   r   r   rq   r8   )selfrW   r$   r$   r%   resolve_experiment_dir  s   z'SweepStartupArgs.resolve_experiment_dirrW   c              
   c   s^    | j rd V  td|  d S zd V  td|  W d S  ty. } ztd|d }~ww )NzExperiment will be saved at: zExperiment has been saved at: z`The script was terminated early. Use `--resume` to continue the script from its last checkpoint.)rc   r9   BaseExceptionRuntimeError)r   rW   excr$   r$   r%   run_ctx  s    zSweepStartupArgs.run_ctxN)__name__
__module____qualname__rZ   r5   __annotations__r   r   r   boolr   r   r   classmethodr   	Namespacer   ArgumentParserr   r   r   r   r$   r$   r$   r%   r     s(   
 *Hr   r   c              
   C   sX   |   }| | t| j| j| j|| j| j| jdW  d    S 1 s%w   Y  d S )N)ra   r   r   rW   r}   rb   rc   )	r   r   r   ra   r   r   r}   rb   rc   )r   rW   r$   r$   r%   run_main  s   $r   c                 C   s   t t|  d S )N)r   r   r   )r   r$   r$   r%   main  s   r   __main__)description):r   rs   r   rw   
contextlibr   dataclassesr   r   	functoolsr   pathlibr   typingr   vllm.benchmarks.startupr   r   vllm.utils.argparse_utilsr	   vllm.utils.import_utilsr
   param_sweepr   r   utilsr   r   r   ImportErrorsetr5   r&   r   r-   rC   r~   r   r   rI   rZ   tuplerT   rV   r^   r`   r|   r   r   r   r   r   r   r   r   r   r    
parse_argsr$   r$   r$   r%   <module>   s   



&
	
8	
#	
" "

