diff --git a/vllm/entrypoints/llm.py b/vllm/entrypoints/llm.py index 2c961156bc84..2faee57633e9 100644 --- a/vllm/entrypoints/llm.py +++ b/vllm/entrypoints/llm.py @@ -34,7 +34,8 @@ _cosine_similarity, _validate_score_input_lens, get_score_prompt) -from vllm.entrypoints.utils import _validate_truncation_size +from vllm.entrypoints.utils import (_validate_truncation_size, + log_non_default_args) from vllm.inputs import PromptType, SingletonPrompt, TextPrompt, TokensPrompt from vllm.inputs.parse import parse_and_batch_prompt from vllm.logger import init_logger @@ -271,6 +272,8 @@ def __init__( **kwargs, ) + log_non_default_args(engine_args) + # Create the Engine (autoselects V0 vs V1) self.llm_engine = LLMEngine.from_engine_args( engine_args=engine_args, usage_context=UsageContext.LLM_CLASS) diff --git a/vllm/entrypoints/openai/api_server.py b/vllm/entrypoints/openai/api_server.py index 5b87aed06e9b..98260f09968a 100644 --- a/vllm/entrypoints/openai/api_server.py +++ b/vllm/entrypoints/openai/api_server.py @@ -48,8 +48,7 @@ resolve_mistral_chat_template) from vllm.entrypoints.launcher import serve_http from vllm.entrypoints.logger import RequestLogger -from vllm.entrypoints.openai.cli_args import (log_non_default_args, - make_arg_parser, +from vllm.entrypoints.openai.cli_args import (make_arg_parser, validate_parsed_serve_args) # yapf conflicts with isort for this block # yapf: disable @@ -94,7 +93,7 @@ OpenAIServingTranscription, OpenAIServingTranslation) from vllm.entrypoints.openai.tool_parsers import ToolParserManager from vllm.entrypoints.utils import (cli_env_setup, load_aware_call, - with_cancellation) + log_non_default_args, with_cancellation) from vllm.logger import init_logger from vllm.reasoning import ReasoningParserManager from vllm.transformers_utils.config import ( diff --git a/vllm/entrypoints/openai/cli_args.py b/vllm/entrypoints/openai/cli_args.py index 7f60fe713027..2d19e16883aa 100644 --- a/vllm/entrypoints/openai/cli_args.py +++ b/vllm/entrypoints/openai/cli_args.py @@ -255,15 +255,6 @@ def validate_parsed_serve_args(args: argparse.Namespace): "--tool-call-parser") -def log_non_default_args(args: argparse.Namespace): - non_default_args = {} - parser = make_arg_parser(FlexibleArgumentParser()) - for arg, default in vars(parser.parse_args([])).items(): - if default != getattr(args, arg): - non_default_args[arg] = getattr(args, arg) - logger.info("non-default args: %s", non_default_args) - - def create_parser_for_docs() -> FlexibleArgumentParser: parser_for_docs = FlexibleArgumentParser( prog="-m vllm.entrypoints.openai.api_server") diff --git a/vllm/entrypoints/utils.py b/vllm/entrypoints/utils.py index 87334f458fee..d8905fc14124 100644 --- a/vllm/entrypoints/utils.py +++ b/vllm/entrypoints/utils.py @@ -3,6 +3,7 @@ import argparse import asyncio +import dataclasses import functools import os import subprocess @@ -13,10 +14,13 @@ from fastapi.responses import JSONResponse, StreamingResponse from starlette.background import BackgroundTask, BackgroundTasks +from vllm.engine.arg_utils import EngineArgs +from vllm.entrypoints.openai.cli_args import make_arg_parser from vllm.entrypoints.openai.protocol import (ChatCompletionRequest, CompletionRequest) from vllm.logger import init_logger from vllm.platforms import current_platform +from vllm.utils import FlexibleArgumentParser logger = init_logger(__name__) @@ -295,3 +299,28 @@ def get_max_tokens(max_model_len: int, request: Union[ChatCompletionRequest, for val in (default_max_tokens, max_tokens, max_output_tokens, default_sampling_params.get("max_tokens")) if val is not None) + + +def log_non_default_args(args: Union[argparse.Namespace, EngineArgs]): + non_default_args = {} + + # Handle argparse.Namespace + if isinstance(args, argparse.Namespace): + parser = make_arg_parser(FlexibleArgumentParser()) + for arg, default in vars(parser.parse_args([])).items(): + if default != getattr(args, arg): + non_default_args[arg] = getattr(args, arg) + + # Handle EngineArgs instance + elif isinstance(args, EngineArgs): + default_args = EngineArgs() # Create default instance + for field in dataclasses.fields(args): + current_val = getattr(args, field.name) + default_val = getattr(default_args, field.name) + if current_val != default_val: + non_default_args[field.name] = current_val + else: + raise TypeError("Unsupported argument type. " \ + "Must be argparse.Namespace or EngineArgs instance.") + + logger.info("non-default args: %s", non_default_args)