import os import argparse import logging import logging.config logging.config.dictConfig({ "version": 1, "formatters": { "standard": { "format": "[%(asctime)s] [%(levelname)s] [%(name)s::%(funcName)s::%(lineno)d] %(message)s" } }, "handlers": { "console": { "class": "logging.StreamHandler", "level": "DEBUG", "stream": "ext://sys.stdout", "formatter": "standard" } }, "root": { "level": "ERROR", "handlers": [ "console" ], "propagate": True } }) from label_studio_ml.api import init_app from sentiment_api import SentimentModel _DEFAULT_CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'config.json') def get_kwargs_from_config(config_path=_DEFAULT_CONFIG_PATH): if not os.path.exists(config_path): return dict() with open(config_path) as f: config = json.load(f) assert isinstance(config, dict) return config if __name__ == "__main__": parser = argparse.ArgumentParser(description='Label studio') parser.add_argument( '-p', '--port', dest='port', type=int, default=9090, help='Server port') parser.add_argument( '--host', dest='host', type=str, default='0.0.0.0', help='Server host') parser.add_argument( '--kwargs', '--with', dest='kwargs', metavar='KEY=VAL', nargs='+', type=lambda kv: kv.split('='), help='Additional LabelStudioMLBase model initialization kwargs') parser.add_argument( '-d', '--debug', dest='debug', action='store_true', help='Switch debug mode') parser.add_argument( '--log-level', dest='log_level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'], default=None, help='Logging level') parser.add_argument( '--model-dir', dest='model_dir', default=os.path.dirname(__file__), help='Directory where models are stored (relative to the project directory)') parser.add_argument( '--check', dest='check', action='store_true', help='Validate model instance before launching server') args = parser.parse_args() # setup logging level if args.log_level: logging.root.setLevel(args.log_level) def isfloat(value): try: float(value) return True except ValueError: return False def parse_kwargs(): param = dict() for k, v in args.kwargs: if v.isdigit(): param[k] = int(v) elif v == 'True' or v == 'true': param[k] = True elif v == 'False' or v == 'False': param[k] = False elif isfloat(v): param[k] = float(v) else: param[k] = v return param kwargs = get_kwargs_from_config() if args.kwargs: kwargs.update(parse_kwargs()) if args.check: print('Check "' + SentimentModel.__name__ + '" instance creation..') model = SentimentModel(**kwargs) app = init_app( model_class=SentimentModel, model_dir=os.environ.get('MODEL_DIR', args.model_dir), redis_queue=os.environ.get('RQ_QUEUE_NAME', 'default'), redis_host=os.environ.get('REDIS_HOST', 'localhost'), redis_port=os.environ.get('REDIS_PORT', 6379), **kwargs ) app.run(host=args.host, port=args.port, debug=args.debug) else: # for uWSGI use app = init_app( model_class=SentimentModel, model_dir=os.environ.get('MODEL_DIR', os.path.dirname(__file__)), redis_queue=os.environ.get('RQ_QUEUE_NAME', 'default'), redis_host=os.environ.get('REDIS_HOST', 'localhost'), redis_port=os.environ.get('REDIS_PORT', 6379) )