o
    -i[                 	   @   s(  U d dl Z d dlZ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m	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZ 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' d d
l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZBmCZCmDZDmEZE d dlFmGZG d dlHmIZImJZJmKZKmLZLmMZMmNZN d dlOmPZPmQZQ d dlRmSZS d dlTmUZUmVZV d dlWmXZX d dlYmZZZ d dl[m\Z\ d dl]m^Z^m_Z_ d dl`maZambZb d dlcmdZd d dlemfZfmgZg d dlhmiZimjZj d dlkmlZl d dlmmnZn d dlompZp d dlqmrZr d dlsmtZt d dlumvZv d dlwmxZx d d lymzZz d d!l{m|Z| erkd d"l}m~Z~ d d#lmZ d d$lmZ d d%lmZ neZeZ~eZeZe^eZed&Zee eB Zeed'< ee eB Zeed(< d)eegef d*eegef fd+d,Zd)eegef d*eegedB f fd-d.Zd/ed*eeeef B dB fd0d1Zd2ed3ed*e%e fd4d5Zd6ee d3ed*efd7d8Zd6ee d3ed*efd9d:Zd6ee d*eeef fd;d<Zd6ee d3ed*eeef fd=d>Zd2ed*efd?d@Zd2ed*ee fdAdBZedCdD ejD p=ejd   ZdEp=edFZejdGdHdIe,d*eeeeef f fdJdKZdIe,d*eeeeef f fdLdMZe	G dNdO dOZe	G dPdQ dQeZdRefdSdTZdUed*efdVdWZdUed*efdXdYZdS )Z    N)Callable)MISSING	dataclassfieldsis_dataclass)permutations)	UnionType)
TYPE_CHECKING	AnnotatedAnyLiteral	TypeAliasTypeVarUnioncastget_args
get_origin)TypeAdapterValidationError)	FieldInfo)TypeIs)AttentionConfigCacheConfigCompilationConfig
ConfigTypeDeviceConfigECTransferConfig
EPLBConfigKVEventsConfigKVTransferConfig
LoadConfig
LoRAConfigModelConfigMultiModalConfigObservabilityConfigParallelConfigPoolerConfigProfilerConfigSchedulerConfigSpeculativeConfigStructuredOutputsConfig
VllmConfigget_attr_docs)	BlockSize
CacheDTypeKVOffloadingBackendMambaCacheMode
MambaDTypePrefixCachingHashAlgo)Device)ConvertOptionHfOverridesLogprobsMode
ModelDTypeRunnerOptionTokenizerMode)MMCacheTypeMMEncoderTPMode)DetailedTraceModules)DistributedExecutorBackendExpertPlacementStrategy)SchedulerPolicy)	get_field)OptimizationLevel)init_loggersuppress_logging)CpuArchEnumcurrent_platformload_general_plugins)is_in_ray_actoris_ray_initialized)is_interleavedmaybe_override_with_speculators)is_gguf)get_model_path)is_cloud_storage)FlexibleArgumentParser)	GiB_bytes)get_ip)resolve_kv_cache_dtype_string)AttentionBackendEnum)LogitsProcessor)QuantizationMethods)LoadFormatsUsageContext)ExecutorTTypeHint	TypeHintTreturn_typereturnc                    s   dt dtf fdd}|S )Nvalr^   c              
      s>   z | W S  t y } ztd|  d  d|d }~ww )NzValue z cannot be converted to .)
ValueErrorargparseArgumentTypeError)r_   er]    R/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/engine/arg_utils.py_parse_typey   s   
zparse_type.<locals>._parse_typestrrZ   )r]   rh   rf   re   rg   
parse_typex   s   rk   c                    s   dt dtd B f fdd}|S )Nr_   r^   c                    s    | dks| dkr
d S t  | S )N None)rk   r_   re   rf   rg   _optional_type   s   z%optional_type.<locals>._optional_typeri   )r]   ro   rf   re   rg   optional_type   s   rp   r_   c                 C   s"   t d| s
t| S ttj| S )Nz(?s)^\s*{.*}\s*$)rematchrj   rp   jsonloadsrn   rf   rf   rg   union_dict_and_str   s   ru   	type_hinttypec                 C   s   | |u p	t | |u S )z*Check if the type hint is a specific type.)r   )rv   rw   rf   rf   rg   is_type   s   rx   
type_hintsc                    s   t  fdd| D S )z0Check if the type hints contain a specific type.c                 3       | ]}t | V  qd S Nrx   ).0rv   rw   rf   rg   	<genexpr>       z contains_type.<locals>.<genexpr>)anyry   rw   rf   r~   rg   contains_type   s   r   c                    s   t  fdd| D dS )z*Get the specific type from the type hints.c                 3   s    | ]
}t | r|V  qd S r{   r|   r}   thr~   rf   rg   r      s    zget_type.<locals>.<genexpr>N)nextr   rf   r~   rg   get_type   s   r   c                    st   t | t}t|}t|d  t fdd|D s)td| ddd |D  t| tr0dnd	}d
 |t|iS )zGet the `type` and `choices` from a `Literal` type hint in `type_hints`.

    If `type_hints` also contains `str`, we use `metavar` instead of `choices`.
    r   c                 3   rz   r{   )
isinstance)r}   optionoption_typerf   rg   r      r   z$literal_to_kwargs.<locals>.<genexpr>z*All options must be of the same type. Got z with types c                 S   s   g | ]}t |qS rf   r~   )r}   crf   rf   rg   
<listcomp>   s    z%literal_to_kwargs.<locals>.<listcomp>metavarchoicesrw   )	r   r   r   rw   allra   r   rj   sorted)ry   rv   optionskwargrf   r   rg   literal_to_kwargs   s   
r   c                    s   t | |}t|}|d  t fdd|D s J d| dt tthv r8tt v s6J d  dt  |tusAt|v rEddS t	|dS )	Nr   c                 3   s     | ]}|t ur| u V  qd S r{   )Ellipsis)r}   t	elem_typerf   rg   r      s    z'collection_to_kwargs.<locals>.<genexpr>z8All non-Ellipsis elements must be of the same type. Got r`   zTIf element can have multiple types, one must be 'str' (i.e. 'list[int | str]'). Got +)rw   nargs)
r   r   r   r   r   r   rj   tupler   len)ry   rw   rv   typesrf   r   rg   collection_to_kwargs   s$   

r   c                 C   s
   | j dkS )z*Check if the class is not a built-in type.builtins)
__module__)rv   rf   rf   rg   is_not_builtin   s   
r   c                 C   sj   t  }t| }t| }|tu r|t|d  |S |tthv r.|D ]	}|t| q"|S ||  |S )z6Extract type hints from Annotated or Union type hints.r   )	setr   r   r
   updateget_type_hintsr   r   add)rv   ry   originargsargrf   rf   rg   r      s   
r   c                 c   s    | ]}d |v V  qdS )--helpNrf   )r}   r   rf   rf   rg   r          r   mkdocszmkdocs/__main__.py   )maxsizeclsc              	   C   s  t rt| ni }i }t| D ]}t|j}dd |D }t|d }|jturP|j}t|t	rO|j
d u r8|j}n!t  |
 }W d    n1 sJw   Y  n	|j
turY|
 }|j}||d }	|	dd}	||	d||< d}
|d ur|fdtd	tfd
d}||| d< || d  d|
 7  < nt|trtj|| d< nt|tr|| t| nt|tr|| t|t nt|tr|| t|t nt|tr|| t|t nt|tr#|dkrt|| d< || d  dtj 7  < n|dv rt || d< || d  dt j 7  < npt|| d< nit|t!r0t!|| d< n\t|t"rMt|tsFt#dd |D rMt$|| d< n?t|t"rjt%t&j'|| d< || d  d|
 7  < n"t|tszt#dd |D rt|| d< nt(d| d| dt)|| dtu r|| t|| d h td |v rt|tst*|| d || d< || dr|| d +d q|S )Nc                 s   s    | ]	}t |r|V  qd S r{   )r   r   rf   rf   rg   r      s    z"_compute_kwargs.<locals>.<genexpr>rl   %z%%)defaulthelpzFShould either be a valid JSON string or JSON keys passed individually.r_   r^   c              
   S   s:   zt || W S  ty } ztt||d }~ww r{   )r   validate_jsonr   rb   rc   repr)r_   r   rd   rf   rf   rg   parse_dataclass  s   z(_compute_kwargs.<locals>.parse_dataclassrw   r   z

actionmax_model_len)max_num_batched_tokenskv_cache_memory_bytesc                 s       | ]}t |V  qd S r{   r   r   rf   rf   rg   r   5  r   c                 s   r   r{   r   r   rf   rf   rg   r   ;  s    
zUnsupported type z for argument r`   r   rm   ),
NEEDS_HELPr,   r   r   rw   r   r   r   r   r   default_factoryrC   namegetstripreplacerj   r   r   boolrb   BooleanOptionalActionr   r   r   r   r   listr   inthuman_readable_int_or_auto__doc__human_readable_intfloatdictr   ru   rk   rs   rt   ra   r   rp   append)r   cls_docskwargsfieldry   	generatordataclass_clsr   r   r   json_tipr   rf   rf   rg   _compute_kwargs   s   














r   c                 C   s   t t| S )a{  Return argparse kwargs for the given Config dataclass.

    If `--help` or `mkdocs` are not present in the command line command, the
    attribute documentation will not be included in the help output.

    The heavy computation is cached via functools.lru_cache, and a deep copy
    is returned so callers can mutate the dictionary without affecting the
    cached version.
    )copydeepcopyr   )r   rf   rf   rg   
get_kwargsP  s   
r   c                	   @   s^  e Zd ZU dZejZeed< ejZe	ed< ej
Z
eed< ejZeee B dB ed< ejZedB ed< ejZedB ed< ejZeed	< ejZeed
< ejZe	ed< ejZe	ed< ejZeeB ed< ejZe	ed< ejZeed< ejZee dB ed< ejZedB ed< ejZeed< ejZeeB ed< ejZeed< ej Z e!ed< e"j#Z$e%ed< ej&Z&e'ed< ej(Z(e'dB ed< e)j*Z*ee' dB ed< e+e)dZ,e'dB ed< e-j.Z.ee/B e0e1 B dB ed< e-j2Z2e'ed< e-j3Z3eed< e-j4Z4e'ed< e-j5Z5e'ed< e-j6Z6e'ed < e-j7Z7e'ed!< e-j8Z8e'ed"< e-j9Z9e'ed#< e-j:Z:e'ed$< e-j;Z;e'ed%< e-j<Z<e'ed&< dZ=e'dB ed'< dZ>e'dB ed(< dZ?e'dB ed)< dZ@edB ed*< dZAe'dB ed+< d,ZBe	ed-< d,ZCe	ed.< e-jDZDeed/< e-jEZEe	ed0< e-jFZFeed1< e-jGZGe	ed2< e-jHZHe'ed3< e-jIZIe'ed4< e-jJZJe'ed5< e-jKZKe	dB ed6< e+e-d7ZLeMed7< e-jNZNe	ed8< e-jOZOePed9< e-jQZQe'ed:< e-jRZRe'ed;< e-jSZSe'dB ed<< e"jTZTeUdB ed=< dZVe	dB ed>< e"jWZWeXed?< ejYZYe	ed@< ejZZZe	edA< e"j[Z[e\edB< e"j]Z]e\edC< e"j^Z^e\edD< e"j_Z_e'dB edE< dZ`e'dB edF< eajbZbe'edG< eajcZce'edH< eajdZde'edI< dZee'dB edJ< ejfZfe'edK< ejgZgehedL< d,Zie	edM< d,Zje	edN< ejkZkedB edO< ejlZledB edP< ejmZme	eB dB edQ< e+edRZneoedR< ejpZpedB edS< ejqZqerdB edT< ejsZse	edU< ejtZte	edV< e-juZue	edW< e+evdXZwexee'exee'f B f edY< evjyZye	edZ< evjzZze	ed[< e+evd\Z{exeexee|f f ed\< evj}Z}exee|f dB ed]< evj~Z~e\ed^< evjZedB ed_< evjZe'ed`< evjZe	eda< evjZeedb< evjZeeB dB edc< dZedB edd< evjZe	ede< evjZe\edf< d,Ze	edg< ejZe'edh< ejZe'edi< ejZexeef dB edj< ejZe	edk< ejZe'dB edl< ejZeej B dB edm< ejZe	edn< e-jZe	edo< e"jZe'dB edp< e+edqZexedq< e+edrZeee B edr< dZe	dB eds< eajZe	edt< eajZe	dB edu< e+edvZeedv< ejZeedw< dZedB edx< ejZedB edy< dZexee|f dB edz< ejZedB ed{< ejZedB ed|< ejZee dB ed}< ejZe	ed~< e+edZe\ed< ejZe	ed< ejZe	ed< ejZe	ed< ejZe	ed< ejZe	ed< eajZeed< eajZee0e B dB ed< ejZedB ed< e+edZe)ed< e+edZeed< e-jZeed< e-jZeed< e+edZeed< dZedB ed< dZedB ed< dZedB ed< ejZeed< ejZe	ed< e+edZexee|f ed< ejZeed< ejZeed< ejZedB ed< e"jZe	ed< e"jZeed< e"jZeed< e+e"dZe'dB ed< e"jZeed< e+edZexee|f ed< ejZe	ed< ejZeed< ejZeee0e B  dB ed< 	 eajZe	dB ed< eajZe'ed< e"jZe	ed< ejZeed< e"jZe\dB ed< e"jZeed< d,Ze	ed< dd ZededefddZedejfddZdefddZdd ZdefddZdede-dedB fddZ		,ddedB de	defddZdefddZede'deexedB e'f exedB e'f f fddZdeddfddĄZdedB defddƄZdS )
EngineArgszArguments for vLLM engine.modelenable_return_routed_expertsmodel_weightsNserved_model_name	tokenizerhf_config_pathrunnerconvertskip_tokenizer_initenable_prompt_embedstokenizer_modetrust_remote_codeallowed_local_media_pathallowed_media_domainsdownload_dirsafetensors_load_strategyload_formatconfig_formatdtypekv_cache_dtypeseedr   cudagraph_capture_sizesmax_cudagraph_capture_sizedistributed_executor_backendpipeline_parallel_sizemaster_addrmaster_portnnodes	node_ranktensor_parallel_sizeprefill_context_parallel_sizedecode_context_parallel_sizedcp_kv_cache_interleave_sizecp_kv_cache_interleave_sizedata_parallel_sizedata_parallel_rankdata_parallel_start_rankdata_parallel_size_localdata_parallel_addressdata_parallel_rpc_portFdata_parallel_hybrid_lbdata_parallel_external_lbdata_parallel_backendenable_expert_parallelall2all_backend
enable_dboubatch_sizedbo_decode_token_thresholddbo_prefill_token_threshold#disable_nccl_for_dp_synchronizationeplb_configenable_eplbexpert_placement_strategy_api_process_count_api_process_rankmax_parallel_loading_workers
block_sizeenable_prefix_cachingprefix_caching_hash_algodisable_sliding_windowdisable_cascade_attn
swap_spacecpu_offload_gbgpu_memory_utilizationr   r   max_num_partial_prefillsmax_long_partial_prefillslong_prefill_token_thresholdmax_num_seqsmax_logprobslogprobs_modedisable_log_statsaggregate_engine_loggingrevisioncode_revisionhf_tokenhf_overridestokenizer_revisionquantizationallow_deprecated_quantizationenforce_eagerdisable_custom_all_reducelimit_per_promptlimit_mm_per_promptenable_mm_embedsinterleave_mm_stringsmedia_io_kwargsmm_processor_kwargsmm_processor_cache_gbmm_processor_cache_typemm_shm_cache_max_object_size_mbmm_encoder_onlymm_encoder_tp_modemm_encoder_attn_backendio_processor_pluginskip_mm_profilingvideo_pruning_rateenable_lora	max_lorasmax_lora_rankdefault_mm_lorasfully_sharded_lorasmax_cpu_loras
lora_dtypeenable_tower_connector_loraray_workers_use_nsightnum_gpu_blocks_overridemodel_loader_extra_configignore_patternsenable_chunked_prefilldisable_chunked_mm_inputdisable_hybrid_kv_cache_managerstructured_outputs_configreasoning_parserreasoning_parser_pluginlogits_processor_patternspeculative_configshow_hidden_metrics_for_versionotlp_traces_endpointcollect_detailed_traceskv_cache_metricskv_cache_metrics_samplecudagraph_metricsenable_layerwise_nvtx_tracingenable_mfu_metrics enable_logging_iteration_detailsenable_mm_processor_statsscheduling_policyscheduler_clspooler_configcompilation_configattention_config
worker_clsworker_extension_clsprofiler_configkv_transfer_configkv_events_configec_transfer_configgeneration_configenable_sleep_modeoverride_generation_config
model_imploverride_attention_dtypeattention_backendcalculate_kv_scalesmamba_cache_dtypemamba_ssm_cache_dtypemamba_block_sizemamba_cache_modeadditional_configuse_tqdm_on_loadpt_load_map_locationlogits_processorsasync_schedulingstream_intervalkv_sharing_fast_prefilloptimization_levelkv_offloading_sizekv_offloading_backendtokens_onlyc                 C   s   t | jtrtdi | j| _t | jtrtdi | j| _t | jtr-tdi | j| _ddlm	} |  t
jjrq| j}t| j| j| _|| jurRtd|| j | jd urs| j}t| j| j| _|| jurutd|| j d S d S d S d S )Nr   rF   z@HF_HUB_OFFLINE is True, replace model_id [%s] to model_path [%s]zHHF_HUB_OFFLINE is True, replace tokenizer_id [%s] to tokenizer_path [%s]rf   )r   rW  r   r   rX  r   r  r   vllm.pluginsrG   huggingface_hub	constantsHF_HUB_OFFLINEr   rM   r  loggerinfor   r"  )selfrG   model_idtokenizer_idrf   rf   rg   __post_init__G  s:   


	zEngineArgs.__post_init__parserr^   c                 C   s  t t}| jdtjd}dtjdd v rdtjdd v s)|jdqi |d  |jdri |d
  |jdsi |d  |jdti |d  |jdui |d  |j	dvi |d  |jdwi |d  |jdxi |d  |jdyi |d  |j	dzi |d  |j	d{i |d  |jd|i |d  |jd}i |d   |j	!d~i |d"  |jdi |d$  |jdi |d'  |j	(di |d)  |jdi |d+  |j	,di |d-  |jdi |d/  |jdi |d1  |j	2di |d3  |j	4di |d5  |j	6di |d7  |j	8di |d9  |j	:di |d;  |jdi |d=  |jd>td?d@|dA dB |dA dC dD |jdi |dF  |jdi |dH  |j	Idi |dJ  |j	Kdi |dL  |j	Mdi |dN  |j	Odi |dP  |jdi |dR  |j	Sdi |dT  |j	Udi |dV  |j	Wdi |dX  t t}| jdYtjd}|jdi |d[  |jdi |d]  |j	^di |d_  |j	`di |da  |jdi |dc  |jdi |de  |j	fdi |dg  t t	}| jdht	jd}|j	idi |dj  t t
}| jdkt
jd}|j	ldi |dm  |j	ndi |do  t t}	| jdptjd}
|
j	qdi |	dr  |
j	s	tdi |	du  |
jdi |	dw  |
jdi |	dy  |
jdi |	d|  |
jdi |	d  |
j	di |	d  |
j		di |	d  |
j	di |	d  |
j	di |	d  |
j		di |	d  |
j	di |	d  |
jddtdd |
jddtdd |
jddtdd |
jddtdd |
jddtdd |
jddtddd |
j		di |	d  |
j		di |	d  |
j		di |	d  |
j	di |	d  |
jdi |	d  |
j	di |	d  |
j	di |	d  |
j	di |	d  |
j	di |	d  |
jdi |	d  |
jdi |	d  |
j	di |	d  |
j	di |	d  |
j	di |	d  |
j	Đdi |	d  |
jdi |	d  |
j	Ȑdi |	d  t t}| jdtjd}|jdi |d  |j	͐di |d  |j	ϐdi |d  |jdi |d  |jdi |d  |j	Րdi |d  |j	אdi i |d dBdi |j	ِdi |d  |jdi |d  |j	ݐdi |d  |j	ߐdi |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  t t}| jdtjd}|j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	di |d  |j	 di |d  |j	di |d  |j	di |d  |j	di |d  t t}| jdtjd}|jd	tjd
d |jdi |d  |jdi |d  |j	di |d  |j	di |d  |jdi |d  |j	di |d  |jdi |d  t t}| jdtjd}|j	di |d  |j	di |d  |d d  }d!d"| d#}||d d$< |d d   d%d& tttd'd(D 7  < |j	)di |d  |j	*di |d+  |j	,di |d-  |j	.di |d/  |j	0di |d1  |j	2di |d3  |j	4di |d5  t t}| jd6tjd}|j	7di i |d8 dBdi |j	9di i |d: dBdi |j	;di |d<  |j	=di |d>  |j	?di |d@  |j	Adi |dB  |j	Cdi i |dD dBdi |j	Edi |dF  |j	Gdi |dH  |j	Idi |dJ  |j	Kdi |dL  |j	Mdi |dN  t t}| jdOtjd}|j	Pdi |dQ  |j	Rdi |dS  t t}| jdTtjd}ttj|dU dV< |j	Wdi |dU  |j	Xdi |dY  |jdi |d[  |j	\di |d]  |j	_di |d`  |j	bdi |dc  |j	ddi |de  |j	fd i |dg  |jdi |di  |j	jdi |dk  | jdldmdnd | jdodmdpd | S (  z%Shared CLI arguments for vLLM engine.r"   )titledescriptionserve   Nr   --modelr   --runnerr   	--convertr   --tokenizerr   --tokenizer-moder   --trust-remote-coder   --dtyper   --seedr   --hf-config-pathr   --allowed-local-media-pathr   --allowed-media-domainsr   
--revisionr  --code-revisionr  --tokenizer-revisionr"  --max-model-lenr   --quantization-qr#  --allow-deprecated-quantizationr$  --enforce-eagerr%  --enable-return-routed-expertsr   --max-logprobsr  --logprobs-moder  --disable-sliding-windowr  --disable-cascade-attnr  --skip-tokenizer-initr   --enable-prompt-embedsr   --served-model-namer   --config-formatr   z
--hf-token?Tr   r   r   )rw   r   constr   r   --hf-overridesr!  --pooler-configrV  --logits-processor-patternrH  --generation-configr_  --override-generation-configra  --enable-sleep-moder`  --model-implrb  --override-attention-dtyperc  --logits-processorsrm  --io-processor-pluginr3  r    --load-formatr   --download-dirr   --safetensors-load-strategyr   --model-loader-extra-configr@  --ignore-patternsrA  --use-tqdm-on-loadrk  --pt-load-map-locationrl  r   --attention-backendbackendr*   --reasoning-parserrF  --reasoning-parser-pluginrG  r%   --distributed-executor-backendr   --pipeline-parallel-size-ppr   --master-addrr   --master-portr   --nnodes-nr   --node-rank-rr   --tensor-parallel-size-tpr   --decode-context-parallel-size-dcpr   --dcp-kv-cache-interleave-sizer   --cp-kv-cache-interleave-sizer   --prefill-context-parallel-size-pcpr   --data-parallel-size-dpr   z--data-parallel-rankz-dpnzSData parallel rank of this instance. When set, enables external load balancer mode.)rw   r   z--data-parallel-start-rankz-dprz0Starting data parallel rank for secondary nodes.z--data-parallel-size-localz-dplz5Number of data parallel replicas to run on this node.z--data-parallel-addressz-dpaz+Address of data parallel cluster head-node.z--data-parallel-rpc-portz-dppz)Port for data parallel RPC communication.z--data-parallel-backendz-dpbmpz0Backend for data parallel, either "mp" or "ray".)rw   r   r   --data-parallel-hybrid-lb-dphr   --data-parallel-external-lb-dper   --enable-expert-parallel-epr  --all2all-backendr  --enable-dbor  --ubatch-sizer  --dbo-decode-token-thresholdr  --dbo-prefill-token-thresholdr  %--disable-nccl-for-dp-synchronizationr  --enable-eplbr	  --eplb-configr  --expert-placement-strategyr
  --max-parallel-loading-workersr  --ray-workers-use-nsightr>  --disable-custom-all-reducer&  --worker-clsrY  --worker-extension-clsrZ  r   --block-sizer  --gpu-memory-utilizationr  --kv-cache-memory-bytesr   --swap-spacer  --kv-cache-dtypecache_dtype--num-gpu-blocks-overrider?  --enable-prefix-cachingr  --prefix-caching-hash-algor  --cpu-offload-gbr  --calculate-kv-scalesre  --kv-sharing-fast-prefillrp  --mamba-cache-dtyperf  --mamba-ssm-cache-dtyperg  --mamba-block-sizerh  --mamba-cache-moderi  --kv-offloading-sizerr  --kv-offloading-backendrs  r#   --limit-mm-per-promptr'  --enable-mm-embedsr)  --media-io-kwargsr+  --mm-processor-kwargsr,  --mm-processor-cache-gbr-  --mm-processor-cache-typer.  !--mm-shm-cache-max-object-size-mbr/  --mm-encoder-onlyr0  --mm-encoder-tp-moder1  --mm-encoder-attn-backendr2  --interleave-mm-stringsr*  --skip-mm-profilingr4  --video-pruning-rater5  r!   z--enable-loraz*If True, enable handling of LoRA adapters.)r   r   --max-lorasr7  --max-lora-rankr8  --lora-dtyper<  --enable-tower-connector-lorar=  --max-cpu-lorasr;  --fully-sharded-lorasr:  --default-mm-lorasr9  r$   !--show-hidden-metrics-for-versionrJ  --otlp-traces-endpointrK  rL  r   {,}r   c                 S   s   g | ]}d  |qS )r  )join)r}   prf   rf   rg   r     s    
z+EngineArgs.add_cli_args.<locals>.<listcomp>   )r--collect-detailed-traces--kv-cache-metricsrM  --kv-cache-metrics-samplerN  --cudagraph-metricsrO  --enable-layerwise-nvtx-tracingrP  --enable-mfu-metricsrQ  "--enable-logging-iteration-detailsrR  r(   --max-num-batched-tokensr   --max-num-seqsr  --max-num-partial-prefillsr  --max-long-partial-prefillsr  --long-prefill-token-thresholdr  --scheduling-policypolicy--enable-chunked-prefillrB  --disable-chunked-mm-inputrC  --scheduler-clsrU  !--disable-hybrid-kv-cache-managerrD  --async-schedulingrn  --stream-intervalro  r   --cudagraph-capture-sizesr   --max-cudagraph-capture-sizer   r+   rI  rw   --speculative-config--kv-transfer-configr\  --kv-events-configr]  --ec-transfer-configr^  --compilation-config-ccrW  --attention-config-acrX  --additional-configrj  --structured-outputs-configrE  --profiler-configr[  --optimization-levelrq  z--disable-log-stats
store_truezDisable logging statistics.z--aggregate-engine-loggingzLLog aggregate rather than per-engine statistics when using data parallelism.)r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  r  )r  )r  )r  r  )r  r  )r  r  )r  r  )r  )r  )r  r  )r  r  )r  r  )r  r  )r  r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r   )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r  )r   )r!  )r"  )r#  )r$  )r%  )r&  )r'  )r(  r)  )r*  r+  )r,  )r-  )r.  )r/  )r   r"   add_argument_groupr   sysargvadd_argumentrj   r    r   r*   r%   r   r   r#   r!   rb   r   r$   r
  r   r   r<   r(   r   r+   rp   rs   rt   )r  model_kwargsmodel_groupload_kwargs
load_groupattention_kwargsattention_groupstructured_outputs_kwargsstructured_outputs_groupparallel_kwargsparallel_groupcache_kwargscache_groupmultimodal_kwargsmultimodal_grouplora_kwargs
lora_groupobservability_kwargsobservability_groupr   r   scheduler_kwargsscheduler_groupcompilation_kwargscompilation_groupvllm_kwargs
vllm_grouprf   rf   rg   add_cli_argsj  s  $


zEngineArgs.add_cli_argsr   c                    s4   dd t | D }| di  fdd|D }|S )Nc                 S   s   g | ]}|j qS rf   )r   r}   attrrf   rf   rg   r     s    z,EngineArgs.from_cli_args.<locals>.<listcomp>c                    s"   i | ]}t  |r|t |qS rf   )hasattrgetattrrN  r   rf   rg   
<dictcomp>  s   " z,EngineArgs.from_cli_args.<locals>.<dictcomp>rf   )dataclassesr   )r   r   attrsengine_argsrf   rR  rg   from_cli_args  s
   zEngineArgs.from_cli_argsc                 C   s  t | jrd | _| _tjstd| j t	d7i d| jd| j
d| jd| jd| jd| jd	| jd
| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| jd| j d| j!d| j"d| j#d | j$d!| j%d"| j&d#| j'd$| j(d%| j)d&| j*d'| j+d(| j,d)| j-d*| j.d+| j/d,| j0d-| j1d.| j2d/| j3d0| j4d1| j5d2| j6d3| j7d4| j8d5| j9d6| j:S )8NggufzThe global random seed is set to %d. Since VLLM_ENABLE_V1_MULTIPROCESSING is set to False, this may affect the random state of the Python process that launched vLLM.r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r!  r"  r   r#  r$  r%  r   r  r  r  r  r   r   r   r(  r)  r*  r+  r4  r   r,  r-  r.  r/  r0  r1  r2  rV  rH  r_  ra  r`  rb  rc  rm  r5  r3  rf   );rL   r   r#  r   envsVLLM_ENABLE_V1_MULTIPROCESSINGry  warningr   r"   r   r   r   r   r   r   r   r   r   r   r  r  r   r!  r"  r   r$  r%  r   r  r  r  r  r   r   r   r(  r)  r*  r+  r4  r   r,  r-  r.  r/  r0  r1  r2  rV  rH  r_  ra  r`  rb  rc  rm  r5  r3  r{  rf   rf   rg   create_model_config  s   
	
 !"#$%&'()*+,-./01234zEngineArgs.create_model_configc                 C   s:   ddl m} | jD ]}||jv r| j| | jd |< q	d S )Nr   )TensorizerConfigtensorizer_config)+vllm.model_executor.model_loader.tensorizerr^  r@  _fields)r{  r^  keyrf   rf   rg   validate_tensorizer_args  s   

z#EngineArgs.validate_tensorizer_argsc              	   C   sx   | j dkrd| _| jdkr*t| jdr| j | _i | jd< | j| jd d< |   t| j| j| j	| j| j
| j| jdS )Nbitsandbytes
tensorizerto_serializabler_  tensorizer_dir)r   r   r   r@  rA  rk  rl  )r#  r   rP  r@  rf  r   rc  r    r   r   rA  rk  rl  r\  rf   rf   rg   create_load_config  s&   


zEngineArgs.create_load_configtarget_model_configtarget_parallel_configc                 C   s0   | j du rdS | j ||d tdi | j S )a[  Initializes and returns a SpeculativeConfig object based on
        `speculative_config`.

        This function utilizes `speculative_config` to create a
        SpeculativeConfig object. The `speculative_config` can either be
        provided as a JSON string input via CLI arguments or directly as a
        dictionary from the engine.
        Nri  rj  rf   )rI  r   r)   )r{  ri  rj  rf   rf   rg   create_speculative_config%  s   
z$EngineArgs.create_speculative_configusage_contextheadlessc                 C   s  t   tttt jd}t| js&t| j| j	| j
| j| jd\| _| _	| _|  }|j| _|j| _|j	| _	| | | | | || d}t|jsQ| }| j| j dksfJ d| j d| j dt| j|}tdi d| jd	| jd
| jd| jd|d|jd| jd|d| j d| j!d| j"d| j#d| j$d| j%d| j&d| j'd| j(d| j)d| j*}d}t+ rddl,}	|	- j.}|r|/ ni }
d|
v rdd |
d D |
d< t01d|
 d}t2 rddl,}	|	j34 }|r| j5rJ d| j5r	| j6r	J d | j7d!ks| j8d"ksJ d#d}| j8d"kr| j9| j: | j }| j:| j }|| j8 }|| j8 dksIJ d$| d%| j8 d| j;| j8k s]J d&| j; d'| j8 d| j;| | }| j9d"kr{| j6r{|| _<t01d(| j<| j; n| j=du rt>|| d"| _=| j6p| j<du}|r| j<dusJ d)| j=d*v sJ d+d"}d,| _5n`| j=dur| j=}| j?r|sd-| _5| j5r|d"krt0@d. d-}d,| _5|| j9krd,| _5| j?p|| _<| j8d"krt01d/| j<| j; n| j5rJ d0| j7d1krtAjBd2krd"}n| j9}| jCdu r<| j7d1kr'tD }t01d3| |}n| j7d!ks4J d4| j7f| jEp:tFjG}n| jC}| jHdurH| jHntFjH}| jIr[|jJs[d-|_Jt01d5 tFdi d6| j:d7| jd8| jKd9| j9d:| j<ptdd;|d<|d=| jEd>| jLd?| j8d@| j;dA|dB|dC| j7dD| j5dE|jMdF| jNdG| jOdH| jPdI| jQdJ| jRdK| jSdL| jTdM| jUdN| jVdO| jWdP| jXdQ| jYdR| jZdS|dT|dU| j[dV| j\dW| j]dX| jdY| j^dZ| j_d[| j`d\| ja}| jb||d]}tcdi d^|jdd_| jed`| jfda|jgdb| jhdc| jidd|jjde|jkdf| jldg| jmdh| jndi| jodj| jpdk| jqdl| jrdm| js}|jjsQ| jtrQtudn| jvrstw| jx| jy| jt| jz| j{| j|| j}ro| j}dkro| j}nddond}|dur|dur|je|jf|j~d"  k rtudp|jdqkrdq | _| _t| j}| jdur|jdurtudrt| jtrt| j  |_n| j|_|  }| jr| j| j_| jr| j| j_t| j| j| j| j| j| j| j| j| j| jds
}t| j}| jdur|jdur	tudt| j|_| jdur!|jdurtudu| j|_tdi dv|dw|dx|dy|dz|d{|d||d}|d~|d| jd|d|d| jd| jd| jd| jd| jd| j}|S )zi
        Create the VllmConfig.

        NOTE: If VllmConfig is incompatible, we raise an error.
        )device)r   r   r  r   vllm_speculative_configNr   ztp_size=z must be divisible bydcp_size=r`   r  r  r   r  r  is_attention_freer?  sliding_windowr  r  r  re  rp  rf  rg  rh  ri  rr  rs  env_varsc                 S   s   i | ]}|d qS )z***rf   )r}   krf   rf   rg   rS    s    z3EngineArgs.create_engine_config.<locals>.<dictcomp>z-Using ray runtime env (env vars redacted): %sz:data_parallel_hybrid_lb is not applicable in headless modezJdata_parallel_hybrid_lb and data_parallel_external_lb cannot both be True.r  r  z:nnodes > 1 is only supported with data_parallel_backend=mpzworld_size=z must be divisible by nnodes=z
node_rank=z must be less than nnodes=z@Inferred data_parallel_rank %d from node_rank %d for external lbzYdata_parallel_rank or node_rank must be specified if data_parallel_external_lb is enable.)r  NzIdata_parallel_size_local must be 1 or None when data_parallel_rank is setFTzsdata_parallel_hybrid_lb is not eligible when data_parallel_size_local = 1, autoswitch to data_parallel_external_lb.z0Inferred data_parallel_rank %d from node_rank %dzDdata_parallel_size_local must be set to use data_parallel_hybrid_lb.rayspanz3Using host IP %s as ray-based data parallel addressz3data_parallel_backend can only be ray or mp, got %sz7Skipping tokenizer initialization for tokens-only mode.r   r   r   r   r   r   r   r   r   r   r   data_parallel_master_ipr   r   r   is_moe_modelr  r  r  r  r  r  r  r	  r  r
  r  r&  r>  ray_runtime_envplacement_groupr   rY  rZ  r   r   r   r  r  rk  runner_typer   r  r   rB  rC  is_multimodal_modelis_encoder_decoderr  rU  r  r  r  rD  rn  ro  zJDefault modality-specific LoRA(s) were provided for a non multimodal model)r8  r7  r9  r:  r<  r=  r;  zOConsider increasing max_num_batched_tokens or decreasing num_speculative_tokensrd  zEattention_backend and attention_config.backend are mutually exclusive)
rJ  rK  rL  rM  rN  rO  rP  rQ  rS  rR  z]cudagraph_capture_sizes and compilation_config.cudagraph_capture_sizes are mutually exclusivezcmax_cudagraph_capture_size and compilation_config.max_cudagraph_capture_size are mutually exclusivemodel_configcache_configparallel_configscheduler_configdevice_configload_configrX  lora_configrI  rE  observability_configrW  r\  r]  r^  r[  rj  rq  rf   )rE   pre_register_and_updater   r   r3   device_typerN   r   rK   r   r  r   rI  r]  r   _check_feature_supported4_set_default_chunked_prefill_and_prefix_caching_args1_set_default_max_num_seqs_and_batched_tokens_argsrJ   hf_text_configget_sliding_windowr   r   rR   r   r   r  r  r   r  rq  r?  r  r  r  re  rp  rf  rg  rh  ri  rr  rs  rI   ru  get_runtime_contextruntime_envto_dictry  rz  rH   utilget_current_placement_groupr   r   r   r   r   r   r   r   r   maxr   r[  rY  VLLM_RAY_DP_PACK_STRATEGYr   rQ   r   r%   rw  r   rt  r   r   r   is_moer  r  r  r  r  r  r  r	  r  r
  r  r&  r>  r   rY  rZ  r   r   r  r  rl  r(   r{  r   r  r   rB  rC  r|  r}  rT  rU  r  r  r  rD  rn  ro  r9  ra   r6  r!   r8  r7  r:  r<  r=  r;  num_speculative_tokensr#  r   r   r   rX  rd  r  r   rj   rS   upperrh  rF  rE  rG  r$   rJ  rK  rL  rM  rN  rO  rP  rQ  rS  rR  rW  r   r   r+   r\  r]  r^  r[  rj  rq  )r{  rm  rn  r  r~  rr  resolved_cache_dtyper  ry  ru  sanitized_envrz  inferred_data_parallel_rank
world_sizeworld_size_within_dplocal_world_sizer   r   host_ipr   r   r  rI  r  r  rX  r  r  rW  configrf   rf   rg   create_engine_config@  s<  






	









	
 !"#$%&'*	



	
zEngineArgs.create_engine_configr~  c                 C   s   | j tj krtdd | jtjks| jtjkrtdd | jdkr=t| jdd}|s?| jt	jddd	fvrAd
}t|d dS dS dS dS )z/Raise an error if the feature is not supported.r  )feature_namezConcurrent Partial Prefillr  supports_ppFru  r  external_launcherzfPipeline Parallelism without Ray distributed executor or multiprocessing executor or external launcherN)
rH  r   _raise_unsupported_errorr  r(   r  r   rQ  r   r%   )r{  r~  r  r   rf   rf   rg   r    s,   


z#EngineArgs._check_feature_supportedr  c                 C   s2  ddl m} zt }t  }W n ty   d}d}Y nw |dt kr;d|vr;|jd|j	di}|jd|j	di}n|jd|j	d	i}|jd
|j	d
i}t
 ryt }|dkr`|jd	|j	di}n|dkrm|jd|j	di}n|dkry|jd|j	d
i}t r|jd| |j	d	| i}|jd
| |j	d| i}||fS )Nr   rW   rl   F   a100i @  i       i      V6EV5Ei   V5Pi      )vllm.usage.usage_librX   rE   get_device_total_memoryget_device_namelower	ExceptionrP   	LLM_CLASSOPENAI_API_SERVERis_tpuis_cpu)r   r  rX   device_memorydevice_namedefault_max_num_batched_tokensdefault_max_num_seqs	chip_namerf   rf   rg   get_batch_defaults  sV   



zEngineArgs.get_batch_defaultsc                 C   s  |j }|j}| jd u r|| _td|rdnd n#|jdkr+| js+|r+tjddd n|jdkr<| jr<|s<tjd	dd | jd u rO|| _td
|rKdnd n|jdkr`| jr`|s`tjddd t	 rt
 tjtjtjfv rtd d| _td d| _d S d S d S )Nz%s chunked prefill by defaultEnabling	DisablinggeneratezThis model does not officially support disabling chunked prefill. Disabling this manually may cause the engine to crash or produce incorrect outputs.local)scopepoolingzThis model does not officially support chunked prefill. Enabling this manually may cause the engine to crash or produce incorrect outputs.z%s prefix caching by defaultzThis model does not officially support prefix caching. Enabling this manually may cause the engine to crash or produce incorrect outputs.zgChunked prefill is not supported for ARM and POWER, S390X and RISC-V CPUs; disabling it for V1 backend.FzfPrefix caching is not supported for ARM and POWER, S390X and RISC-V CPUs; disabling it for V1 backend.)is_chunked_prefill_supportedis_prefix_caching_supportedrB  ry  debugr{  warning_oncer  rE   r  get_cpu_architecturerD   POWERPCS390XRISCVrz  )r{  r~  default_chunked_prefilldefault_prefix_cachingrf   rf   rg   r  c  sn   






	
z?EngineArgs._set_default_chunked_prefill_and_prefix_caching_argsc                 C   s   | j | j }| |\}}| j}| j}| jd u r ||tj| _| jd u r-||tj| _|d u rT| j	s<t
|j| j| _t| j|j | j| _td| j|rQ|jnd  |d u rv| jd us_J t| j| j| _td| j|rq|jnd  d S d S )Nz=Defaulting max_num_batched_tokens to %d for %s usage context.z3Defaulting max_num_seqs to %d for %s usage context.)r   r   r  r   r  r   r(   DEFAULT_MAX_NUM_BATCHED_TOKENSDEFAULT_MAX_NUM_SEQSrB  r  r   minry  r  value)r{  rm  r~  r  r  r  orig_max_num_batched_tokensorig_max_num_seqsrf   rf   rg   r    sR   


z<EngineArgs._set_default_max_num_seqs_and_batched_tokens_args)NF)__name__r   __qualname__r   r"   r   rj   __annotations__r   r   r   r   r   r   r   r   r8   r   r4   r   r   r   r9   r   r   r   r    r   r   r   rV   r   r   r7   r   r  r   r.   r   r   r   r   r   r@   r   r%   r   r=   rw   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r   r	  r
  r>   r  r  r  r  r-   r  r  r2   r  r  r  r   r  r  r   r   r(   r  r  r  r  r  r  r6   r  r  r  r  r   r!  r5   r"  r#  rU   r$  r%  r&  r#   r(  r   r)  r*  r+  r   r,  r-  r.  r:   r/  r0  r1  r;   r2  rS   r3  r4  r5  r6  r!   r7  r8  r9  r:  r;  r<  torchr=  r>  r?  r@  rA  rB  rC  rD  r+   rE  r*   rF  rG  rH  rI  r$   rJ  rK  rL  r<   rM  rN  rO  rP  rQ  rR  rS  r  rT  r?   rU  objectrV  r&   rW  rX  r   rY  rZ  r[  r'   r\  r   r]  r   r^  r   r_  r`  ra  rb  rc  r  rd  re  rf  r1   rg  rh  ri  r0   rj  rk  rl  rm  rT   rn  ro  rp  rq  rA   rr  rs  r/   rt  r~  staticmethodrO   rM  classmethodrb   	NamespacerW  r]  rc  rh  r)   rl  rX   r  r  r   r  r  r  rf   rf   rf   rg   r   ]  s  
 

 


#    M	E	

   4"S
Kr   c                   @   s<   e Zd ZU dZdZeed< e	d
dededefddZ	d	S )AsyncEngineArgsz'Arguments for asynchronous vLLM engine.Fenable_log_requestsr  async_args_onlyr^   c                 C   sR   t   |s
t| } | jdtjtjdd | jdtjtj ddd t	|  | S )Nz--enable-log-requestszEnable logging requests.)r   r   r   z--disable-log-requestsz&[DEPRECATED] Disable logging requests.T)r   r   r   
deprecated)
rG   r   rM  r4  rb   r   r  r  rE   r  )r  r  rf   rf   rg   rM    s$   

zAsyncEngineArgs.add_cli_argsN)F)
r  r   r  r   r  r   r  r  rO   rM  rf   rf   rf   rg   r    s   
 r  r  c                 C   s   |  d|  d}t |)Nz* is not supported. We recommend to remove z from your config.)NotImplementedError)r  msgrf   rf   rg   r  
  s
   r  r  c                 C   s   |   } td| }|r]ddddd}ddd	d
d}| \}}||v r0|| }tt|| S ||v r]|| }zt|| W S  ty\ } ztd| d| |	  d|d}~ww t| S )zParse human-readable integers like '1k', '2M', etc.
    Including decimal values with decimal multipliers.

    Examples:
    - '1k' -> 1,000
    - '1K' -> 1,024
    - '25.6k' -> 25,600
    z(\d+(?:\.\d+)?)([kKmMgGtT])i  i@B i ʚ;l    J))rt  mgr   r  i   i   @l        )KMGrZ   z3Decimals are not allowed with binary suffixes like z. Did you mean to use z	 instead?N)
r   rq   	fullmatchgroupsr   r   ra   rb   rc   r  )r  rr   decimal_multiplierbinary_multipliernumbersuffixmultrd   rf   rf   rg   r     sH   	r   c                 C   s(   |   } | dks|  dkrdS t| S )aA  Parse human-readable integers like '1k', '2M', etc.
    Including decimal values with decimal multipliers.
    Also accepts -1 or 'auto' as a special value for auto-detection.

    Examples:
    - '1k' -> 1,000
    - '1K' -> 1,024
    - '25.6k' -> 25,600
    - '-1' or 'auto' -> -1 (special value for auto-detection)
    z-1auto)r   r  r   )r  rf   rf   rg   r   @  s   r   )rb   r   rT  	functoolsrs   r2  collections.abcr   r   r   r   r   	itertoolsr   r   r   typingr	   r
   r   r   r   r   r   r   r   r   rv  regexrq   r  pydanticr   r   pydantic.fieldsr   typing_extensionsr   	vllm.envsrY  vllm.configr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   vllm.config.cacher-   r.   r/   r0   r1   r2   vllm.config.devicer3   vllm.config.modelr4   r5   r6   r7   r8   r9   vllm.config.multimodalr:   r;   vllm.config.observabilityr<   vllm.config.parallelr=   r>   vllm.config.schedulerr?   vllm.config.utilsr@   vllm.config.vllmrA   vllm.loggerrB   rC   vllm.platformsrD   rE   ru  rG   vllm.ray.lazy_utilsrH   rI   vllm.transformers_utils.configrJ   rK   "vllm.transformers_utils.gguf_utilsrL   "vllm.transformers_utils.repo_utilsrM   vllm.transformers_utils.utilsrN   vllm.utils.argparse_utilsrO   vllm.utils.mem_constantsrP   vllm.utils.network_utilsrQ   vllm.utils.torch_utilsrR   #vllm.v1.attention.backends.registryrS   vllm.v1.sample.logits_processorrT   'vllm.model_executor.layers.quantizationrU    vllm.model_executor.model_loaderrV   r  rX   vllm.v1.executorrY   r  ry  rZ   rw   r  r[   r  r\   rj   rk   rp   r   ru   rx   r   r   r   r   r   r   r   r   r   r3  argv0endswithr   	lru_cacher   r   r   r  r  r   r   r   rf   rf   rf   rg   <module>   s   
0`  &*"	"
$"e              .