Skip to content

Commit e32f896

Browse files
committed
Move vllm serve code into vllm.cmd.serve
Signed-off-by: Russell Bryant <[email protected]>
1 parent 6d67c9c commit e32f896

File tree

3 files changed

+96
-40
lines changed

3 files changed

+96
-40
lines changed

vllm/cmd/main.py

+11-40
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@
77
import sys
88
from typing import List, Optional
99

10-
import uvloop
1110
from openai import OpenAI
1211
from openai.types.chat import ChatCompletionMessageParam
1312

13+
import vllm.cmd.serve
1414
import vllm.version
15-
from vllm.engine.arg_utils import EngineArgs
16-
from vllm.entrypoints.openai.api_server import run_server
17-
from vllm.entrypoints.openai.cli_args import (make_arg_parser,
18-
validate_parsed_serve_args)
1915
from vllm.logger import init_logger
2016
from vllm.utils import FlexibleArgumentParser
2117

@@ -31,19 +27,6 @@ def signal_handler(sig, frame):
3127
signal.signal(signal.SIGTSTP, signal_handler)
3228

3329

34-
def serve(args: argparse.Namespace) -> None:
35-
# The default value of `--model`
36-
if args.model != EngineArgs.model:
37-
raise ValueError(
38-
"With `vllm serve`, you should provide the model as a "
39-
"positional argument instead of via the `--model` option.")
40-
41-
# EngineArgs expects the model name to be passed as --model.
42-
args.model = args.model_tag
43-
44-
uvloop.run(run_server(args))
45-
46-
4730
def interactive_cli(args: argparse.Namespace) -> None:
4831
register_signal_handlers()
4932

@@ -150,28 +133,16 @@ def main():
150133
'--version',
151134
action='version',
152135
version=vllm.version.__version__)
153-
154136
subparsers = parser.add_subparsers(required=True, dest="subparser")
155137

156-
serve_parser = subparsers.add_parser(
157-
"serve",
158-
help="Start the vLLM OpenAI Compatible API server",
159-
usage="vllm serve <model_tag> [options]")
160-
serve_parser.add_argument("model_tag",
161-
type=str,
162-
help="The model tag to serve")
163-
serve_parser.add_argument(
164-
"--config",
165-
type=str,
166-
default='',
167-
required=False,
168-
help="Read CLI options from a config file."
169-
"Must be a YAML with the following options:"
170-
"https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html#cli-reference"
171-
)
172-
173-
serve_parser = make_arg_parser(serve_parser)
174-
serve_parser.set_defaults(dispatch_function=serve)
138+
cmd_modules = [
139+
vllm.cmd.serve,
140+
]
141+
cmds = {}
142+
for cmd_module in cmd_modules:
143+
cmd = cmd_module.cmd_init()
144+
cmd.subparser_init(subparsers).set_defaults(dispatch_function=cmd.cmd)
145+
cmds[cmd.name] = cmd
175146

176147
complete_parser = subparsers.add_parser(
177148
"complete",
@@ -196,8 +167,8 @@ def main():
196167
chat_parser.set_defaults(dispatch_function=interactive_cli, command="chat")
197168

198169
args = parser.parse_args()
199-
if args.subparser == "serve":
200-
validate_parsed_serve_args(args)
170+
if args.subparser in cmds:
171+
cmds[args.subparser].validate(args)
201172

202173
# One of the sub commands should be executed.
203174
if hasattr(args, "dispatch_function"):

vllm/cmd/serve.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
import argparse
4+
5+
import uvloop
6+
7+
from vllm.cmd.types import CLISubcommand
8+
from vllm.engine.arg_utils import EngineArgs
9+
from vllm.entrypoints.openai.api_server import run_server
10+
from vllm.entrypoints.openai.cli_args import (make_arg_parser,
11+
validate_parsed_serve_args)
12+
from vllm.utils import FlexibleArgumentParser
13+
14+
15+
class ServeSubcommand(CLISubcommand):
16+
"""The `serve` subcommand for the vLLM CLI. """
17+
18+
def __init__(self):
19+
self.name = "serve"
20+
21+
@staticmethod
22+
def cmd(args: argparse.Namespace) -> None:
23+
# The default value of `--model`
24+
if args.model != EngineArgs.model:
25+
raise ValueError(
26+
"With `vllm serve`, you should provide the model as a "
27+
"positional argument instead of via the `--model` option.")
28+
29+
# EngineArgs expects the model name to be passed as --model.
30+
args.model = args.model_tag
31+
32+
uvloop.run(run_server(args))
33+
34+
def validate(self, args: argparse.Namespace) -> None:
35+
validate_parsed_serve_args(args)
36+
37+
def subparser_init(
38+
self,
39+
subparsers: argparse._SubParsersAction) -> FlexibleArgumentParser:
40+
serve_parser = subparsers.add_parser(
41+
"serve",
42+
help="Start the vLLM OpenAI Compatible API server",
43+
usage="vllm serve <model_tag> [options]")
44+
serve_parser.add_argument("model_tag",
45+
type=str,
46+
help="The model tag to serve")
47+
serve_parser.add_argument(
48+
"--config",
49+
type=str,
50+
default='',
51+
required=False,
52+
help="Read CLI options from a config file."
53+
"Must be a YAML with the following options:"
54+
"https://docs.vllm.ai/en/latest/serving/openai_compatible_server.html#cli-reference"
55+
)
56+
57+
return make_arg_parser(serve_parser)
58+
59+
60+
def cmd_init() -> CLISubcommand:
61+
return ServeSubcommand()

vllm/cmd/types.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
import argparse
4+
5+
from vllm.utils import FlexibleArgumentParser
6+
7+
8+
class CLISubcommand:
9+
"""Base class for CLI argument handlers."""
10+
11+
name: str
12+
13+
@staticmethod
14+
def cmd(args: argparse.Namespace) -> None:
15+
raise NotImplementedError("Subclasses should implement this method")
16+
17+
def validate(self, args: argparse.Namespace) -> None:
18+
# No validation by deafult
19+
pass
20+
21+
def subparser_init(
22+
self,
23+
subparsers: argparse._SubParsersAction) -> FlexibleArgumentParser:
24+
raise NotImplementedError("Subclasses should implement this method")

0 commit comments

Comments
 (0)