diff --git a/paddlehub/commands/serving.py b/paddlehub/commands/serving.py index c2ad35520779cdaa59b3b1db2aaec860f3a21a0a..8dced0f13091d4380b274b4a2052cc238e59498c 100644 --- a/paddlehub/commands/serving.py +++ b/paddlehub/commands/serving.py @@ -18,13 +18,12 @@ from __future__ import division from __future__ import print_function import argparse -import subprocess -import shlex import os +import platform +import socket import json import paddlehub as hub from paddlehub.commands.base_command import BaseCommand, ENTRY -from paddlehub.serving import app class ServingCommand(BaseCommand): @@ -41,33 +40,56 @@ class ServingCommand(BaseCommand): usage='%(prog)s', add_help=True) self.parser.add_argument("command") + self.parser.add_argument("sub_command") self.sub_parse = self.parser.add_mutually_exclusive_group( required=False) - self.sub_parse.add_argument("--start", action="store_true") self.parser.add_argument( "--use_gpu", action="store_true", default=False) + self.parser.add_argument( + "--use_multiprocess", action="store_true", default=False) self.parser.add_argument("--modules", "-m", nargs="+") self.parser.add_argument("--config", "-c", nargs="+") - self.parser.add_argument("--port", "-p", nargs="+", default=[8888]) + self.parser.add_argument("--port", "-p", nargs="+", default=[8866]) + + @staticmethod + def is_port_occupied(ip, port): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect((ip, int(port))) + s.shutdown(2) + return True + except: + return False @staticmethod def preinstall_modules(modules): configs = [] + module_exist = {} if modules is not None: for module in modules: module_name = module if "==" not in module else \ module.split("==")[0] module_version = None if "==" not in module else \ module.split("==")[1] + if module_exist.get(module_name, "") != "": + print(module_name, "==", module_exist.get(module_name), + " will be ignored cause new version is specified.") + configs.pop() + module_exist.update({module_name: module_version}) try: m = hub.Module(name=module_name, version=module_version) + method_name = m.desc.attr.map.data['default_signature'].s + if method_name == "": + raise RuntimeError("{} cannot be use for " + "predicting".format(module_name)) configs.append({ "module": module_name, "version": m.version, "category": str(m.type).split("/")[0].upper() }) except Exception as err: - pass + print(err, ", start Hub-Serving unsuccessfully.") + exit(1) return configs @staticmethod @@ -78,8 +100,24 @@ class ServingCommand(BaseCommand): if os.path.exists(config_file): with open(config_file, "r") as fp: configs = json.load(fp) + use_multiprocess = configs.get("use_multiprocess", False) + if use_multiprocess is True: + if platform.system() == "Windows": + print( + "Warning: Windows cannot use multiprocess working " + "mode, Hub-Serving will switch to single process mode" + ) + from paddlehub.serving import app_single as app + else: + from paddlehub.serving import app + else: + from paddlehub.serving import app_single as app use_gpu = configs.get("use_gpu", False) - port = configs.get("port", 8888) + port = configs.get("port", 8866) + if ServingCommand.is_port_occupied("127.0.0.1", + port) is True: + print("Port %s is occupied, please change it." % (port)) + return False configs = configs.get("modules_info") module = [ str(i["module"]) + "==" + str(i["version"]) @@ -92,10 +130,23 @@ class ServingCommand(BaseCommand): else: print("config_file ", config_file, "not exists.") else: + if args.use_multiprocess is True: + if platform.system() == "Windows": + print( + "Warning: Windows cannot use multiprocess working " + "mode, Hub-Serving will switch to single process mode") + from paddlehub.serving import app_single as app + else: + from paddlehub.serving import app + else: + from paddlehub.serving import app_single as app module = args.modules if module is not None: use_gpu = args.use_gpu port = args.port[0] + if ServingCommand.is_port_occupied("127.0.0.1", port) is True: + print("Port %s is occupied, please change it." % (port)) + return False module_info = ServingCommand.preinstall_modules(module) [ item.update({ @@ -111,9 +162,10 @@ class ServingCommand(BaseCommand): def show_help(): str = "serving