示例#1
0
def export():
    """
    Export as MXNet model
    :return:
    """
    args = ArgParser.export_parser().parse_args()
    export_model(args.model_name, args.model_path, args.service_file_path)
    def __init__(self, app_name='mms', args=None):
        """Initialize mxnet model server application.

        Parameters
        ----------
        app_name : str
            App name to initialize mms service.
        args : List of str
            Arguments for starting service. By default it is None
            and commandline arguments will be used. It should follow
            the format recognized by python argparse parse_args method:
            https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args.
            An example for mms arguments:
            ['--models', 'resnet-18=path1', 'inception_v3=path2',
             '--gen-api', 'java', '--port', '8080']
        """
        # Initialize serving frontend and arg parser
        try:
            parser = ArgParser.mms_parser()
            self.args = parser.parse_args(args) if args else parser.parse_args()
            self.serving_frontend = ServingFrontend(app_name)
            self.gpu = self.args.gpu

            # Setup root logger handler and level.
            log_file = self.args.log_file
            log_level = self.args.log_level or "INFO"
            log_rotation_time = self.args.log_rotation_time or "1 H"
            _set_root_logger(log_file, log_level, log_rotation_time)

            logger.info('Initialized model serving.')
        except Exception as e:
            print ('Failed to initialize model serving: ' + str(e))
            exit(1)
    def __init__(self, app_name='mms', args=None):
        """Initialize mxnet model server application.

        Parameters
        ----------
        app_name : str
            App name to initialize mms service.
        args : List of str
            Arguments for starting service. By default it is None
            and commandline arguments will be used. It should follow
            the format recognized by python argparse parse_args method:
            https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args.
            An example for mms arguments:
            ['--models', 'resnet-18=path1', 'inception_v3=path2',
             '--gen-api', 'java', '--port', '8080']
        """
        # Initialize serving frontend and arg parser
        try:
            parser = ArgParser.mms_parser()
            self.args = parser.parse_args(
                args) if args else parser.parse_args()
            self.serving_frontend = ServingFrontend(app_name)
            self.gpu = self.args.gpu

            # Setup root logger handler and level.
            log_file = self.args.log_file
            log_level = self.args.log_level or "INFO"
            log_rotation_time = self.args.log_rotation_time or "1 H"
            _set_root_logger(log_file, log_level, log_rotation_time)

            logger.info('Initialized model serving.')
        except Exception as e:
            print('Failed to initialize model serving: ' + str(e))
            exit(1)
示例#4
0
    def __init__(self, app_name='mms'):
        # Initialize serving frontend and arg parser
        try:
            self.args = ArgParser.parse_args()
            self.serving_frontend = ServingFrontend(app_name)

            logger.info('Initialized model serving.')
        except Exception as e:
            logger.error('Failed to initialize model serving: ' + str(e))
            exit(1)
def start_serving(app_name='mms', args=None):
    """Start service routing.

    Parameters
    ----------
    app_name : str
        App name to initialize mms service.
    args : List of str
        Arguments for starting service. By default it is None
        and commandline arguments will be used. It should follow
        the format recognized by python argparse parse_args method:
        https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.parse_args.
        An example for mms arguments:
        ['--models', 'resnet-18=path1', 'inception_v3=path2',
         '--gen-api', 'java', '--port', '8080']
        """

    # Parse the given arguments
    arguments = ArgParser.extract_args(args)
    # Download and/or Extract the given model files
    models = ModelLoader.load(arguments.models)
    # Instantiate an MMS object and prepare to start serving
    mms = MMS(app_name, args=arguments, models=models)
    mms.start_model_serving()
示例#6
0
def start():
    """
    This is the entry point for model server
    :return:
    """
    args = ArgParser.mms_parser().parse_args()
    pid_file = os.path.join(tempfile.gettempdir(), ".model_server.pid")
    pid = None
    if os.path.isfile(pid_file):
        with open(pid_file, "r") as f:
            pid = int(f.readline())

    # pylint: disable=too-many-nested-blocks
    if args.stop:
        if pid is None:
            print("Model server is not currently running.")
        else:
            try:
                parent = psutil.Process(pid)
                for child in parent.children(recursive=True):
                    child.kill()
                parent.kill()
                print("Model server stopped.")
            except (OSError, psutil.Error):
                print("Model server already stopped.")
            os.remove(pid_file)
    else:
        if pid is not None:
            try:
                psutil.Process(pid)
                print(
                    "Model server is already running, please use mxnet-model-server --stop to stop MMS."
                )
                exit(1)
            except psutil.Error:
                print("Removing orphan pid file.")
                os.remove(pid_file)

        java_home = os.environ.get("JAVA_HOME")
        java = "java" if not java_home else "{}/bin/java".format(java_home)

        mms_home = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
        cmd = [java, "-Dmodel_server_home={}".format(mms_home)]
        if args.log_config:
            log_config = os.path.realpath(args.log_config)
            if not os.path.isfile(log_config):
                print("--log-config file not found: {}".format(log_config))
                exit(1)

            cmd.append("-Dlog4j.configuration=file://{}".format(log_config))

        tmp_dir = os.environ.get("TEMP")
        if tmp_dir:
            if not os.path.isdir(tmp_dir):
                print(
                    "Invalid temp directory: {}, please check TEMP environment variable."
                    .format(tmp_dir))
                exit(1)

            cmd.append("-Djava.io.tmpdir={}".format(tmp_dir))

        if args.mms_config:
            if not os.path.isfile(args.mms_config):
                print("--mms-config file not found: {}".format(
                    args.mms_config))
                exit(1)
            mms_conf_file = args.mms_config
        else:
            mms_conf_file = "config.properties"

        class_path = \
            ".:{}".format(os.path.join(mms_home, "mms/frontend/*"))

        if os.path.isfile(mms_conf_file):
            props = load_properties(mms_conf_file)
            vm_args = props.get("vmargs")
            if vm_args:
                arg_list = vm_args.split()
                if args.log_config:
                    for word in arg_list[:]:
                        if word.startswith("-Dlog4j.configuration="):
                            arg_list.remove(word)
                cmd.extend(arg_list)
            plugins = props.get("plugins_path", None)
            if plugins:
                class_path += ":" + plugins + "/*" if "*" not in plugins else ":" + plugins

        cmd.append("-cp")
        cmd.append(class_path)

        cmd.append("com.amazonaws.ml.mms.ModelServer")

        # model-server.jar command line parameters
        cmd.append("--python")
        cmd.append(sys.executable)

        if args.mms_config:
            cmd.append("-f")
            cmd.append(args.mms_config)

        if args.model_store:
            if not os.path.isdir(args.model_store):
                print("--model-store directory not found: {}".format(
                    args.model_store))
                exit(1)

            cmd.append("-s")
            cmd.append(args.model_store)

        if args.models:
            cmd.append("-m")
            cmd.extend(args.models)
            if not args.model_store:
                pattern = re.compile(r"(.+=)?http(s)?://.+", re.IGNORECASE)
                for model_url in args.models:
                    if not pattern.match(model_url) and model_url != "ALL":
                        print(
                            "--model-store is required to load model locally.")
                        exit(1)

        try:
            process = subprocess.Popen(cmd)
            pid = process.pid
            with open(pid_file, "w") as pf:
                pf.write(str(pid))
            if args.foreground:
                process.wait()
        except OSError as e:
            if e.errno == 2:
                print(
                    "java not found, please make sure JAVA_HOME is set properly."
                )
            else:
                print("start java frontend failed:", sys.exc_info())
示例#7
0
def export():
    args = ArgParser.export_parser().parse_args()
    export_model(args.model_name, args.model_path, args.service_file_path)
示例#8
0
if __name__ == "__main__":
    # Remove mms dir from python path to avoid module name conflict.
    mms_path = os.path.dirname(os.path.realpath(__file__))
    while mms_path in sys.path:
        sys.path.remove(mms_path)

    sock_type = None
    socket_name = None

    # noinspection PyBroadException
    try:
        logging.basicConfig(stream=sys.stdout,
                            format="%(message)s",
                            level=logging.INFO)
        args = ArgParser.model_service_worker_args().parse_args()
        socket_name = args.sock_name
        sock_type = args.sock_type
        host = args.host
        port = args.port

        worker = MXNetModelServiceWorker(sock_type, socket_name, host, port)
        worker.run_server()
    except socket.timeout:
        logging.error("Backend worker did not receive connection in: %d",
                      SOCKET_ACCEPT_TIMEOUT)
    except Exception:  # pylint: disable=broad-except
        logging.error("Backend worker process die.", exc_info=True)
    finally:
        if sock_type == 'unix' and os.path.exists(socket_name):
            os.remove(socket_name)
示例#9
0
def start():
    """
    This is the entry point for model server
    :return:
    """
    args = ArgParser.mms_parser().parse_args()
    pid_file = os.path.join(tempfile.gettempdir(), ".model_server.pid")
    pid = None
    if os.path.isfile(pid_file):
        with open(pid_file, "r") as f:
            pid = int(f.readline())

    if args.stop:
        if pid is None:
            print("Model server is not currently running.")
        else:
            try:
                parent = psutil.Process(pid)
                for child in parent.children(recursive=True):
                    child.kill()
                parent.kill()
                print("Model server stopped.")
            except (OSError, psutil.Error):
                print("Model server already stopped.")
            os.remove(pid_file)
    else:
        if pid is not None:
            try:
                psutil.Process(pid)
                print("Model server is already running, please use mxnet-model-server --stop to stop MMS.")
                exit(1)
            except psutil.Error:
                print("Removing orphan pid file.")
                os.remove(pid_file)

        java_home = os.environ.get("JAVA_HOME")
        java = "java" if not java_home else "{}/bin/java".format(java_home)

        mms_home = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
        cmd = [java, "-Dmodel_server_home={}".format(mms_home)]
        if args.log_config:
            log_config = os.path.realpath(args.log_config)
            if not os.path.isfile(log_config):
                print("--log-config file not found: {}".format(log_config))
                exit(1)

            cmd.append("-Dlog4j.configuration=file://{}".format(log_config))

        tmp_dir = os.environ.get("TEMP")
        if tmp_dir:
            if not os.path.isdir(tmp_dir):
                print("Invalid temp directory: {}, please check TEMP environment variable.".format(tmp_dir))
                exit(1)

            cmd.append("-Djava.io.tmpdir={}".format(tmp_dir))

        if args.mms_config:
            if not os.path.isfile(args.mms_config):
                print("--mms-config file not found: {}".format(args.mms_config))
                exit(1)

            props = load_properties(args.mms_config)
            vm_args = props.get("vmargs")
            if vm_args:
                cmd.extend(vm_args.split())

        cmd.append("-jar")
        cmd.append("{}/mms/frontend/model-server.jar".format(mms_home))

        # model-server.jar command line parameters
        cmd.append("--python")
        cmd.append(sys.executable)

        if args.mms_config:
            cmd.append("-f")
            cmd.append(args.mms_config)

        if args.model_store:
            if not os.path.isdir(args.model_store):
                print("--model-store directory not found: {}".format(args.model_store))
                exit(1)

            cmd.append("-s")
            cmd.append(args.model_store)

        if args.models:
            cmd.append("-m")
            cmd.extend(args.models)

        try:
            process = subprocess.Popen(cmd)
            pid = process.pid
            with open(pid_file, "w") as pf:
                pf.write(str(pid))
        except OSError as e:
            if e.errno == 2:
                print("java not found, please make sure JAVA_HOME is set properly.")
            else:
                print("start java frontend failed:", sys.exc_info())
def export():
    args = ArgParser.export_parser().parse_args()
    export_model(args.model_name, args.model_path, args.service_file_path)
示例#11
0
            content = [line.rstrip() for line in content]

            for i, line in enumerate(content):
                line = line.lstrip()
                if line.startswith('#') or line.startswith('$'):
                    continue
                if line.startswith('['):
                    found_mms_args = 1 if mms_arg_header.lower() in line.lower() else 0
                if found_mms_args is 1:
                    if line.startswith('--') and content[i+1] != 'optional':
                        args.append(line)
                        if line.startswith('--model'):
                            args += content[i + 1].split(' ')
                        else:
                            args.append(content[i + 1])
        except Exception as e:
            sys.exit("ERROR: Cannot read the open file.")

if is_gpu_image == 1:
    args.append('--gpu')
    args.append(int(os.environ['gpu_id']))
    os.environ['gpu_id'] = str(int(os.environ['gpu_id']) + 1)

# Extract the model's metadata from the file
models = read_models_from_file()
# Parse the arguments
arguments = ArgParser.extract_args(args)
# Instantiate the MMS object to start the MMS app
server = mxnet_model_server.MMS(args=arguments, models=models)
application = server.create_app()
示例#12
0
def export():
    args = ArgParser.parse_export_args()
    _export_model(args)