diff --git a/modelscope/cli/server.py b/modelscope/cli/server.py index 0f8b8132..17d6ca4d 100644 --- a/modelscope/cli/server.py +++ b/modelscope/cli/server.py @@ -4,10 +4,8 @@ import os from argparse import ArgumentParser from string import Template -import uvicorn - from modelscope.cli.base import CLICommand -from modelscope.server.api_server import add_server_args, get_app +from modelscope.server.api_server import add_server_args, run_server from modelscope.utils.logger import get_logger logger = get_logger(log_level=logging.WARNING) @@ -37,5 +35,4 @@ class ServerCMD(CLICommand): parser.set_defaults(func=subparser_func) def execute(self): - app = get_app(self.args) - uvicorn.run(app, host=self.args.host, port=self.args.port) + run_server(self.args) diff --git a/modelscope/server/__init__.py b/modelscope/server/__init__.py index e69de29b..587aa148 100644 --- a/modelscope/server/__init__.py +++ b/modelscope/server/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) Alibaba, Inc. and its affiliates. +from typing import TYPE_CHECKING + +from modelscope.utils.import_utils import LazyImportModule + +if TYPE_CHECKING: + from .api_server import run_server, add_server_args +else: + _import_structure = {'api_server': ['run_server', 'add_server_arg']} + import sys + sys.modules[__name__] = LazyImportModule( + __name__, + globals()['__file__'], + _import_structure, + module_spec=__spec__, + extra_objects={}, + ) diff --git a/modelscope/server/api/routers/router.py b/modelscope/server/api/routers/router.py index df1a1868..3f35edf1 100644 --- a/modelscope/server/api/routers/router.py +++ b/modelscope/server/api/routers/router.py @@ -1,5 +1,4 @@ from fastapi import APIRouter -from starlette.routing import Route, WebSocketRoute from modelscope.server.api.routers import health, model_router diff --git a/modelscope/server/api_server.py b/modelscope/server/api_server.py index 99d20275..a329b8a2 100644 --- a/modelscope/server/api_server.py +++ b/modelscope/server/api_server.py @@ -1,28 +1,11 @@ import argparse -import uvicorn -from fastapi import FastAPI - from modelscope.server.api.routers.router import api_router from modelscope.server.core.event_handlers import (start_app_handler, stop_app_handler) -def get_app(args) -> FastAPI: - app = FastAPI( - title='modelscope_server', - version='0.1', - debug=True, - swagger_ui_parameters={'tryItOutEnabled': True}) - app.state.args = args - app.include_router(api_router) - - app.add_event_handler('startup', start_app_handler(app)) - app.add_event_handler('shutdown', stop_app_handler(app)) - return app - - -def add_server_args(parser): +def add_server_args(parser: argparse.ArgumentParser): parser.add_argument( '--model_id', required=True, type=str, help='The target model id') parser.add_argument( @@ -37,7 +20,29 @@ def add_server_args(parser): help='Use LLMPipeline first for llm models.') +def run_server(args): + import uvicorn + app = get_app(args) + uvicorn.run(app, host=args.host, port=args.port) + + +def get_app(args): + from fastapi import FastAPI + app = FastAPI( + title='modelscope_server', + version='0.1', + debug=True, + swagger_ui_parameters={'tryItOutEnabled': True}) + app.state.args = args + app.include_router(api_router) + + app.add_event_handler('startup', start_app_handler(app)) + app.add_event_handler('shutdown', stop_app_handler(app)) + return app + + if __name__ == '__main__': + import uvicorn parser = argparse.ArgumentParser('modelscope_server') add_server_args(parser) args = parser.parse_args() diff --git a/modelscope/utils/constant.py b/modelscope/utils/constant.py index 08850e5e..11be17fb 100644 --- a/modelscope/utils/constant.py +++ b/modelscope/utils/constant.py @@ -5,11 +5,13 @@ import enum class Fields(object): """ Names for different application fields """ + framework = 'framework' cv = 'cv' nlp = 'nlp' audio = 'audio' multi_modal = 'multi-modal' science = 'science' + server = 'server' class CVTasks(object): diff --git a/requirements.txt b/requirements.txt index 0832e6ab..daa2b59c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ --r requirements/framework.txt +-r requirements/hub.txt diff --git a/requirements/hub.txt b/requirements/hub.txt new file mode 100644 index 00000000..9a7f1f85 --- /dev/null +++ b/requirements/hub.txt @@ -0,0 +1,4 @@ +datasets +requests>=2.25 +setuptools +tqdm diff --git a/requirements/svr.txt b/requirements/server.txt similarity index 76% rename from requirements/svr.txt rename to requirements/server.txt index ea439c66..ffe131c0 100644 --- a/requirements/svr.txt +++ b/requirements/server.txt @@ -1,4 +1,3 @@ fastapi -requests sse-starlette uvicorn diff --git a/setup.py b/setup.py index dbac6e77..84babf11 100644 --- a/setup.py +++ b/setup.py @@ -192,6 +192,12 @@ if __name__ == '__main__': filed_name = f'audio_{subfiled}' extra_requires[filed_name], _ = parse_requirements( f'requirements/audio/{filed_name}.txt') + framework_requires = extra_requires['framework'] + del extra_requires['framework'] + # add framework dependencies to every field + for field, requires in extra_requires.items(): + if field != 'server': # server need install model's field dependencies before. + extra_requires[field] = framework_requires + extra_requires[field] extra_requires['all'] = all_requires setup(