
    -`i4                     V   d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZ ddlmZmZ dd	lmZmZmZ dd
lmZ ddlmZmZ ddlmZ 	 d dlZn# e$ r  ed          ZY nw xY w	 d dl m!Z! n<# e$ r4  ed          "                    d          "                    d          Z!Y nw xY wdededefdZ#dedede$de%dz  fdZ&dede%dz  fdZ'dede$fdZ(deded ede$def
d!Z)d"edz  d#e*e$         dededed$e%d%e+fd&Z,ed'         Z- G d( d)e.e%e/f                   Z0ded*e*e.e$e1f                  fd+Z2dd,d-d"edz  d#e*e$         dedededed$e%d%e+de-d.e%d/e%fd0Z3d"edz  d#e*e$         dededede-ded$e%d%e+fd1Z4d2e*e$         d#e*e$         d3e*e$         d4e+d5ed6ed7ede-ded$e%d%e+fd8Z5e G d9 d:e                      Z6d;e6fd<Z7d;e j8        fd=Z9e:d>k    rJ e j;        e6j<        ?          Z=e6>                    e=            e9e=?                                           dS dS )@    N)asdict	dataclass)datetime)Path)ClassVarLiteralget_args)PlaceholderModule   )ParameterSweepParameterSweepItem)SweepServeArgsrun_benchmark
run_server)ServerProcess)SLASweepSLASweepItem)sanitize_filenamepandas)PchipInterpolatorscipyinterpolater   
output_dir
serve_comb
bench_combc                 2   t          t                               }|r+|                    d|                    d          f           |r+|                    d|                    d          f           | t	          d                    |                    z  S )NzSERVE--sepzBENCH-)liststrextendas_textr   join)r   r   r   partss       s/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/benchmarks/sweep/serve_sla.py_get_sla_base_pathr'   "   s    
 IKKE >h
 2 2s 2 ; ;<=== >h
 2 2s 2 ; ;<===)#((5//::::    	base_pathsla_combsla_variable	sla_valuec                 X    ||                     d          }| d| dz  S | | d| z  S )Nr   r   zSLA--.json=)r#   )r)   r*   r+   r,   prefixs        r&   _get_sla_iter_pathr1   0   sP     !!c!**0600000,444444r(   	iter_path
run_numberc                 "    || dz  S | d| dz  S )Nsummary.jsonzrun=r.    )r2   r3   s     r&   _get_sla_run_pathr7   =   s*    >))/j/////r(   c              #      K   |                      | d          D ]K}t          |j                            | d                    }|dz  }|                                r||fV  Ld S )Nz=*r/   r5   )globintnameremoveprefixexists)r)   r+   r2   r,   summary_paths        r&   _iter_sla_val_pathsr?   D   s      ^^|$7$7$788 * *		33|4F4F4FGGHH	 >1   	*\))))	* *r(   bench_combs	sla_combsc                     |D ]A}t          || |          }|D ]+}t          |||d                                           s  dS ,BdS )Nr,   TF)r'   r1   r=   )r   r@   rA   r+   r   r   r)   r*   s           r&   _sla_needs_serverrD   L   s}     " 	 	
&z:zJJ	! 	 	H%	  
 fhh ttt	 5r(   server	bench_cmdnum_runsdry_runc                   t          t          t          t          f                              }t	          |          D ]=}t          | ||||t          ||          |          }	|	|                    |	           >|rd S t          |d                               d          5 }
t          j
        ||
d           d d d            n# 1 swxY w Y   |S )N)serve_overridesbench_overridesr3   output_pathrH   )r3   w   indent)r    dictr!   objectranger   r7   appendopenjsondump)rE   rF   r   r   r2   rG   rH   	iter_datar3   run_datafs              r&   run_slar[   a   s!    T#v+&'))IHoo ' '
 &&!))Z@@
 
 
 X&&& t	9	6	6	6	;	;C	@	@ *A	)Qq))))* * * * * * * * * * * * * * * s   !CC	C	)request_ratemax_concurrencyc                   x     e Zd Zdededdf fdZdeee         ee         f         fdZdefdZ	defdZ
 xZS )	
SLAHistory	min_value	max_valuereturnNc                 d    t                                                       || _        || _        d S N)super__init__r`   ra   )selfr`   ra   	__class__s      r&   rf   zSLAHistory.__init__   s+    ""r(   c                    t          t                               }t          t                               }t          |                                           D ]/\  }}|                    |           |                    |           0||fS rd   )r    r:   floatsorteditemsrT   )rg   xsysxys        r&   get_xyzSLAHistory.get_xy   sh    #Y[[%[]]4::<<(( 	 	DAqIIaLLLIIaLLLL2vr(   c                 f    t          d |                                 D             | j                  S )Nc              3   ,   K   | ]\  }}|d k    |V  dS r   Nr6   .0valmargins      r&   	<genexpr>z-SLAHistory.get_max_passing.<locals>.<genexpr>   s*      @@[S&FaKKSKKKK@@r(   default)maxrl   r`   rg   s    r&   get_max_passingzSLAHistory.get_max_passing   s7    @@DJJLL@@@N
 
 
 	
r(   c                 f    t          d |                                 D             | j                  S )Nc              3   ,   K   | ]\  }}|d k    |V  dS rt   r6   ru   s      r&   ry   z-SLAHistory.get_min_failing.<locals>.<genexpr>   s*      ??[S&FQJJSJJJJ??r(   rz   )minrl   ra   r}   s    r&   get_min_failingzSLAHistory.get_min_failing   s7    ??DJJLL???N
 
 
 	
r(   )__name__
__module____qualname__r:   rf   tupler    rj   rq   r~   r   __classcell__rh   s   @r&   r_   r_      s        ## ## #$ # # # # # #d3ie45    
 
 
 
 

 
 
 
 
 
 
 
 
r(   r_   rX   c                     s
J d            fd| D             fd|                                  D             }t          |          S )NzSummary should not be emptyc                 j    i | ].t          fd D                       t                    z  /S )c              3   B   K   | ]}t          |                   V  d S rd   )rj   )rv   rY   ks     r&   ry   z-_compute_margin.<locals>.<dictcomp>.<genexpr>   s/      <<huXa[!!<<<<<<r(   )sumlen)rv   r   rX   s    @r&   
<dictcomp>z#_compute_margin.<locals>.<dictcomp>   sT        	
3<<<<)<<<<<s9~~M  r(   c                 B    g | ]\  }}|                     |          S r6   )print_and_compute_margin)rv   r   	criterioniter_data_means      r&   
<listcomp>z#_compute_margin.<locals>.<listcomp>   s=       Ay 	**>1==  r(   )rl   r|   )r*   rX   sla_marginsr   s    ` @r&   _compute_marginr      s     333339     N
   $NN,,  K
 {r(   i    )sla_min_valuesla_max_valuer   r   c       	             t          t          t          t          f                              }t	          |	|
          }t          ||          D ]Y\  }}|                    d          5 }t          j        |          }d d d            n# 1 swxY w Y   t          ||          ||<   Z|
                                dz   |                                k     rt          ||	          |
k     r|
}nt          ||
          |	k    r|	}nt          |                                ddi}|                                }t#          |          dk    r:t%          |
                                |                                z   dz            }nt%          |d                   }||v r|dz  }t          |	t          ||
                    }t'          d	| d
| d           t)          | |||||iz  t+          ||||          ||          }|d S t          ||          }|dk    rt'          d|dd           nt'          d|dd           |                    |           |||<   |
                                dz   |                                k     ||fS )N)r`   ra   rbr   rz   extrapolateFr      zTesting z: z req/s)r   r   r2   rG   rH   zSLA criteria are met. (margin=z.2f)z"SLA criteria are not met. (margin=)r    rQ   r!   rR   r_   r?   rU   rV   loadr   r~   r   r|   r   r   rq   solver   r:   printr[   r1   r"   )rE   rF   r   r   r*   r)   rG   rH   r+   r   r   sla_datahistorypast_sla_valuepathrZ   past_iter_datarw   spl	spl_rootsrX   rx   s                         r&   	solve_slar      s    Df%&((H=MJJJG !4I| L L L LYYt__ 	*!Yq\\N	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* #2(N"K"K 
!
!
#
#a
''*A*A*C*C
C
Cw...>>CC-000=@@CC#W^^%5%5I5IIC		I9~~""72244w7N7N7P7PPTUUVV)A,''g~~ q-S-!8!899444444555!!\3$77(HlCPP
 
 
	 4 955Q;;:F::::;;;;>>>>>???	"""S 
!
!
#
#a
''*A*A*C*C
C
CV Ws   'BB	B	c                   t          d           t          d|                                            t          | ||||||||	  	        }	|	$|sJ t          d           t          d           d S |	\  }
}|                                }t          d| d| d           t	          |||d 	                              d
          5 }t          j        |
|d           d d d            n# 1 swxY w Y   t          d           |
S )Nz[SLA START]zSLA criteria: )r   r   r*   r)   rG   rH   r+   zOmitting SLA search.z	[SLA END]zMaximum z
 for SLA: z req/s.rC   rM   rN   rO   )r   r#   r   r~   r1   rU   rV   rW   )rE   rF   r   r   r*   r+   r)   rG   rH   resultr   sla_historyr,   rZ   s                 r&   
search_slar      s    
-	
/8++--
/
/000!
 
 
F ~w$%%%k"Hk++--I	
?\
?
?Y
?
?
?@@@		
 
 

 d3ii)
 	(Aa(((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) 
+Os   C++C/2C/	serve_cmdafter_bench_cmdshow_stdoutserve_paramsbench_params
sla_paramsc                t   t          fd|D                       rt          d d          t          t          t          t
          f                              }|D ]}t          ||||          rt          | ||||
          nt          j	                    5 }|D ]G}|D ]B}t          |||          }t          |||||||	|
	  	        }||                    |           CH	 d d d            n# 1 swxY w Y   |
rd S t          j                            |          }|                    |dz             |S )Nc              3   B   K   | ]}|                               V  d S rd   )	has_param)rv   r   r+   s     r&   ry   zrun_slas.<locals>.<genexpr>=  s1      
M
M*:--
M
M
M
M
M
Mr(   zYou should not override `zU` in `bench_params` in SLA mode, since it is supposed to be determined automatically.)r   rJ   rH   )r   r   r*   r+   r)   rG   rH   zsummary.csv)any
ValueErrorr    rQ   r!   rR   rD   r   
contextlibnullcontextr'   r   r"   pd	DataFramefrom_recordsto_csv)r   rF   r   r   r   r   r   r+   r   rG   rH   all_datar   rE   r   r*   r)   	comb_datacombined_dfs          `           r&   run_slasr   /  s    
M
M
M
M
M
M
MMM 
C C C C
 
 	

 Df%&((H" #3 #3
 ! *J' *    '))"	3  * 3 3
 * 3 3H 2:z: V VI *!#-#-!)%1"+!) '
! 
! 
!I !, 	222!33#"	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3 "	3H  t,++H55KzM1222s   AC11C5	8C5	c                        e Zd ZU eed<   eed<   dZee         ed<   dZ	ee         ed<   e
dej        fd            Ze
d	ej        d
ej        f fd            Z xZS )SweepServeSLAArgsr   r+   	serve_slaparser_namez5Tune a variable to meet SLAs under multiple settings.parser_helpargsc                     t          j        |          }|j        rt          j        |j                  }nt          j        g           } | di t          |          ||j        dS )N)r   r+   r6   )r   from_cli_argsr   r   	read_jsonr   r   r+   )clsr   	base_argsr   s       r&   r   zSweepServeSLAArgs.from_cli_argsz  s     #066	? 	3!+DO<<JJ!.r22Js 
 
Y
!*
 
 
 
 	
r(   parserrb   c                    t                                          |          }|                    d          }|                    dt          dd           |                    dt          t          t                    dd	           |S )
Nzsla optionsz--sla-paramsTa  Path to JSON file containing a list of SLA constraints to satisfy. Each constraint is expressed in `{"<KEY>": "<OP><VALUE>"}` format, e.g.: `{"p99_e2el_ms": "<=500"}` means that the E2E latency should be less than 500ms 99%% of the time. Setting this option runs this script in SLA mode, which searches for the maximum `sla_variable` that satisfies the constraints for each combination of `serve_params`, `bench_params`, and `sla_params`.)typerequiredhelpz--sla-variabler\   zSWhether to tune request rate or maximum concurrency to satisfy the SLA constraints.)r   choicesr{   r   )re   add_cli_argsadd_argument_groupadd_argumentr!   r	   SLAVariable)r   r   	sla_grouprh   s      r&   r   zSweepServeSLAArgs.add_cli_args  s    %%f----m<<	T	 	 	
 	
 	
 	[))"# 	 	
 	
 	
 r(   )r   r   r   r   __annotations__r   r   r   r!   r   classmethodargparse	Namespacer   ArgumentParserr   r   r   s   @r&   r   r   r  s         !,K#,,,!XK#XXX
!3 
 
 
 [
 ("9 h>U      [    r(   r   r   c                    | j         p%t          j                                        d          }| j        |z  }| j         r'|                                st          d| d          	 t          | j        | j	        | j
        | j        | j        | j        | j        | j        || j        | j                  S # t$          $ r}t'          d| d          |d }~ww xY w)Nz%Y%m%d_%H%M%Sz+Cannot resume from non-existent directory (r   )r   rF   r   r   r   r   r   r+   r   rG   rH   z/The script was terminated early. Use `--resume z2` to continue the script from its last checkpoint.)resumer   nowstrftimer   r=   r   r   r   rF   r   r   r   r   r   r+   rG   rH   BaseExceptionRuntimeError)r   	timestampr   excs       r&   run_mainr     s   Gx|~~66GGI9,J{ V:,,.. VTzTTTUUUnn 0(***!]L
 
 
 	
    @i @ @ @
 
 	s   'AB3 3
C=CCc                 T    t          t                              |                      d S rd   )r   r   r   )r   s    r&   mainr     s%    ,,T2233333r(   __main__)description)@r   r   rV   dataclassesr   r   r   pathlibr   typingr   r   r	   vllm.utils.import_utilsr
   param_sweepr   r   server   r   r   rE   r   	sla_sweepr   r   utilsr   r   r   ImportErrorscipy.interpolater   placeholder_attrr'   r!   r:   r1   r7   r?   rD   r    boolr[   r   rQ   rj   r_   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   
parse_argsr6   r(   r&   <module>r      s         ) ) ) ) ) ) ) )             . . . . . . . . . . 5 5 5 5 5 5 ; ; ; ; ; ; ; ; < < < < < < < < < < ! ! ! ! ! ! - - - - - - - - $ $ $ $ $ $% % % %		8	$	$BBB%3333333   '""		-	(	(		-	.	. ;;"; #; ; ; ;
5
5
5 
5 Tz	
5 
5 
5 
50 03: 0 0 0 0*4 *s * * * *"  	
    * D  Cy  #	 
 #             F 78
 
 
 
 
c5j! 
 
 
:Df%&   < D D DD DCyD #	D
 #D D D D D D D D D D DN.D .Cy. #	.
 #. . . . . . . . .b@Cy@Cy@ #Y@
 @ !@ !@ @ @ @ @ @ @ @ @F 1 1 1 1 1 1 1 1h$    84x! 4 4 4 4 z$X$1B1NOOOF""6***D					 s$   A A0/A04A; ;6B43B4