From 797d8e0e83ce87ef6ba7194d6ef936a6675c16ff Mon Sep 17 00:00:00 2001 From: Jonathan Esterhazy Date: Mon, 15 Jan 2018 18:53:09 -0800 Subject: [PATCH] fix importlib warning (#254) --- mms/export_model.py | 12 +++------- mms/model_service/model_service.py | 27 +++++++++++++++++++-- mms/model_service/mxnet_model_service.py | 2 +- mms/service_manager.py | 30 +++++++++--------------- setup.py | 8 ++++--- 5 files changed, 45 insertions(+), 34 deletions(-) diff --git a/mms/export_model.py b/mms/export_model.py index 4ebdb9392..8b4f04884 100644 --- a/mms/export_model.py +++ b/mms/export_model.py @@ -15,13 +15,13 @@ import glob import json import zipfile -import imp import mxnet as mx import inspect from mms.arg_parser import ArgParser import mms.model_service.mxnet_model_service as base_service import mms.model_service.mxnet_vision_service as vision_service from mms.model_service.mxnet_model_service import MXNetBaseService +from mms.model_service.model_service import load_service from mms.log import get_logger logger = get_logger() @@ -131,14 +131,8 @@ def validate_service(model_path, service_file, signature_file): service_file = service_file if os.path.isfile(service_file) \ else glob.glob(model_path + service_file)[0] - module = None - try: - module = imp.load_source( - os.path.splitext(os.path.basename(service_file))[0], - service_file) - except Exception as e: - raise Exception('Incorrect or missing service file: ' + service_file) - + module = load_service(service_file) + classes = [cls[1] for cls in inspect.getmembers(module, inspect.isclass)] # Check if subclass of MXNetBaseService service_classes = list(filter(lambda cls: issubclass(cls, MXNetBaseService), classes)) diff --git a/mms/model_service/model_service.py b/mms/model_service/model_service.py index f2eacfcb1..270484210 100644 --- a/mms/model_service/model_service.py +++ b/mms/model_service/model_service.py @@ -11,16 +11,18 @@ """`ModelService` defines an API for base model service. """ +import os +import sys import time - from abc import ABCMeta, abstractmethod, abstractproperty + from mms.log import get_logger from mms.metrics_manager import MetricsManager - logger = get_logger() URL_PREFIX = ('http://', 'https://', 's3://') + class ModelService(object): '''ModelService wraps up all preprocessing, inference and postprocessing functions used by model service. It is defined in a flexible manner to @@ -75,6 +77,7 @@ class SingleNodeService(ModelService): '''SingleNodeModel defines abstraction for model service which loads a single model. ''' + def inference(self, data): ''' Wrapper function to run preprocess, inference and postprocess functions. @@ -168,3 +171,23 @@ def _postprocess(self, data): class MultiNodesService(ModelService): pass + +def load_service(path, name=None): + try: + if not name: + name = os.path.splitext(os.path.basename(path))[0] + + module = None + if sys.version_info[0] > 2: + import importlib + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + else: + import imp + module = imp.load_source(name, path) + + return module + except Exception: + raise Exception('Incorrect or missing service file: ' + path) diff --git a/mms/model_service/mxnet_model_service.py b/mms/model_service/mxnet_model_service.py index 36823477e..b587d7ecc 100644 --- a/mms/model_service/mxnet_model_service.py +++ b/mms/model_service/mxnet_model_service.py @@ -91,7 +91,7 @@ def __init__(self, model_name, model_dir, manifest, gpu=None): param_filename = manifest['Model']['Parameters'] epoch = int(param_filename[len(model_name) + 1: -len('.params')]) except Exception as e: - logger.warn('Failed to parse epoch from param file, setting epoch to 0') + logger.warning('Failed to parse epoch from param file, setting epoch to 0') sym, arg_params, aux_params = mx.model.load_checkpoint('%s/%s' % (model_dir, manifest['Model']['Symbol'][:-12]), epoch) self.mx_model = mx.mod.Module(symbol=sym, context=self.ctx, diff --git a/mms/service_manager.py b/mms/service_manager.py index a148f2fe3..c245bd718 100644 --- a/mms/service_manager.py +++ b/mms/service_manager.py @@ -8,14 +8,12 @@ # express or implied. See the License for the specific language governing # permissions and limitations under the License. -import ast import inspect -import os -import imp -from mms.storage import KVStorage -from mms.model_service.mxnet_model_service import MXNetBaseService import mms.model_service.mxnet_model_service as mxnet_model_service +from mms.model_service.model_service import load_service +from mms.model_service.mxnet_model_service import MXNetBaseService +from mms.storage import KVStorage class ServiceManager(object): @@ -24,6 +22,7 @@ class ServiceManager(object): In later phase, ServiceManager will also be responsible for model versioning, prediction batching and caching. """ + def __init__(self): """ Initialize Service Manager. @@ -56,9 +55,9 @@ def get_modelservices_registry(self, modelservice_names=None): return self.modelservice_registry return { - modelservice_name: self.modelservice_registry[modelservice_name] - for modelservice_name in modelservice_names - } + modelservice_name: self.modelservice_registry[modelservice_name] + for modelservice_name in modelservice_names + } def add_modelservice_to_registry(self, modelservice_name, ModelServiceClassDef): """ @@ -93,9 +92,9 @@ def get_loaded_modelservices(self, modelservice_names=None): return self.loaded_modelservices return { - modelservice_name: self.loaded_modelservices[modelservice_name] - for modelservice_name in modelservice_names - } + modelservice_name: self.loaded_modelservices[modelservice_name] + for modelservice_name in modelservice_names + } def load_model(self, service_name, model_name, model_path, manifest, ModelServiceClassDef, gpu=None): """ @@ -134,14 +133,7 @@ def parse_modelservices_from_module(self, service_file): List of model service class definitions. Those parsed python class can be used to initialize model service. """ - try: - module = imp.load_source( - os.path.splitext(os.path.basename(service_file))[0], - service_file) if service_file \ - else mxnet_model_service - except Exception as e: - raise Exception('Incorrect or missing service file: ' + service_file) - + module = load_service(service_file) if service_file else mxnet_model_service # Parsing the module to get all defined classes classes = [cls[1] for cls in inspect.getmembers(module, inspect.isclass)] # Check if class is subclass of base ModelService class diff --git a/setup.py b/setup.py index 016702bb5..fbd172cde 100644 --- a/setup.py +++ b/setup.py @@ -29,10 +29,12 @@ url='https://github.com/awslabs/mxnet-model-server', keywords='MXNet Model Server Serving Deep Learning Inference AI', packages=pkgs, - install_requires=['mxnet>=1.0', 'Flask', 'Pillow', 'requests', 'flask-cors', 'psutil', 'jsonschema', 'onnx-mxnet>=0.2', 'boto3'], + install_requires=['mxnet>=1.0', 'Flask', 'Pillow', 'requests', 'flask-cors', 'psutil', 'jsonschema', + 'onnx-mxnet>=0.2', 'boto3', 'importlib2'], entry_points={ - 'console_scripts':['mxnet-model-server=mms.mxnet_model_server:start_serving', 'mxnet-model-export=mms.export_model:export'] + 'console_scripts': ['mxnet-model-server=mms.mxnet_model_server:start_serving', + 'mxnet-model-export=mms.export_model:export'] }, include_package_data=True, license='Apache License Version 2.0' -) \ No newline at end of file +)