Skip to content

Commit

Permalink
fix importlib warning (#254)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonathan Esterhazy committed Jan 16, 2018
1 parent f622cb1 commit 797d8e0
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 34 deletions.
12 changes: 3 additions & 9 deletions mms/export_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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))
Expand Down
27 changes: 25 additions & 2 deletions mms/model_service/model_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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)
2 changes: 1 addition & 1 deletion mms/model_service/mxnet_model_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
30 changes: 11 additions & 19 deletions mms/service_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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.
Expand Down Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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
Expand Down
8 changes: 5 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
)
)

0 comments on commit 797d8e0

Please sign in to comment.