-
Notifications
You must be signed in to change notification settings - Fork 57
/
dragnn_dm.py
178 lines (145 loc) · 5.13 KB
/
dragnn_dm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os.path
import logging
from logging.handlers import RotatingFileHandler
import signal
import time
import math
import tornado.web
import tornado.ioloop
import tornado.autoreload
import tornado.web
import tornado.httpserver
import tornado.process
import tornado.autoreload as autoreload
from tornado.options import define, options
from handlers.index import IndexHandler, HCheckHandler, DragnnHandler, DragnnTestHandler
# dragnn
sys.path.append(os.path.abspath('../'))
import model_dragnn as model
define('port', default=8897, help='run on the given port', type=int)
define('debug', default=True, help='run on debug mode', type=bool)
define('process', default=3, help='number of process for service mode', type=int)
define('enable_konlpy', default=False, help='to use konlpy', type=bool)
define('dragnn_spec', default='', help='path to the spec defining the model', type=str)
define('resource_path', default='', help='path to constructed resources', type=str)
define('checkpoint_filename', default='', help='filename to save the best checkpoint to', type=str)
define('enable_tracing', default=False, help='whether tracing annotations', type=bool)
define('tf_master', default='', help='tensorFlow execution engine to connect to', type=str)
log = logging.getLogger('tornado.application')
def setupAppLogger():
fmtStr = '%(asctime)s - %(levelname)s - %(module)s - %(message)s'
formatter = logging.Formatter(fmt=fmtStr)
cdir = os.path.dirname(os.path.abspath(options.log_file_prefix))
logfile = cdir + '/' + 'application.log'
rotatingHandler = RotatingFileHandler(logfile, 'a', options.log_file_max_size, options.log_file_num_backups)
rotatingHandler.setFormatter(formatter)
if options.logging != 'none':
log.setLevel(getattr(logging, options.logging.upper()))
else:
log.setLevel(logging.ERROR)
log.propagate = False
log.addHandler(rotatingHandler)
return log
class Application(tornado.web.Application):
def __init__(self):
settings = dict(
static_path = os.path.join(os.path.dirname(__file__), 'static'),
template_path = os.path.join(os.path.dirname(__file__), 'templates'),
autoescape = None,
debug = options.debug,
gzip = True
)
handlers = [
(r'/', IndexHandler),
(r'/_hcheck.hdn', HCheckHandler),
(r'/dragnn', DragnnHandler),
(r'/dragnntest', DragnnTestHandler),
]
tornado.web.Application.__init__(self, handlers, **settings)
autoreload.add_reload_hook(self.finalize)
self.log = setupAppLogger()
ppid = os.getpid()
self.log.info('initialize parent process[%s] ...' % (ppid))
self.ppid = ppid
self.enable_tracing = options.enable_tracing
# import konlpy if enabled
self.enable_konlpy = options.enable_konlpy
self.komoran = None
if options.enable_konlpy :
from konlpy.tag import Komoran
komoran = Komoran()
self.komoran = komoran
self.log.info('initialize parent process[%s] ... done' % (ppid))
log.info('start http start...')
def initialize(self) :
pid = os.getpid()
self.log.info('initialize per process[%s] ...' % (pid))
# Loading model
self.dragnn = {}
m = model.load_model(options.dragnn_spec,
options.resource_path,
options.checkpoint_filename,
enable_tracing=options.enable_tracing,
tf_master=options.tf_master)
self.dragnn[pid] = m
self.log.info('initialize per process[%s] ... done' % (pid))
def finalize(self):
# finalize resources
self.log.info('finalize resources...')
## finalize something....
for pid, m in self.dragnn.iteritems() :
model.unload_model(m)
log.info('Close logger...')
x = list(log.handlers)
for i in x:
log.removeHandler(i)
i.flush()
i.close()
def main():
tornado.options.parse_command_line()
application = Application()
application.initialize()
httpServer = tornado.httpserver.HTTPServer(application, no_keep_alive=True)
if options.debug == True :
httpServer.listen(options.port)
else :
httpServer.bind(options.port)
if options.process == 0 :
httpServer.start(0) # Forks multiple sub-processes, maximum to number of cores
if pid != application.ppid :
application.initialize()
else :
if options.process < 0 :
options.process = 1
httpServer.start(options.process) # Forks multiple sub-processes, given number
pid = os.getpid()
if pid != application.ppid :
application.initialize()
MAX_WAIT_SECONDS_BEFORE_SHUTDOWN = 3
def sig_handler(sig, frame):
log.warning('Caught signal: %s', sig)
tornado.ioloop.IOLoop.instance().add_callback(shutdown)
def shutdown():
log.info('Stopping http server')
httpServer.stop()
log.info('Will shutdown in %s seconds ...', MAX_WAIT_SECONDS_BEFORE_SHUTDOWN)
io_loop = tornado.ioloop.IOLoop.instance()
deadline = time.time() + MAX_WAIT_SECONDS_BEFORE_SHUTDOWN
def stop_loop():
now = time.time()
if now < deadline and (io_loop._callbacks or io_loop._timeouts):
io_loop.add_timeout(now + 1, stop_loop)
else:
io_loop.stop()
log.info('Shutdown')
stop_loop()
signal.signal(signal.SIGTERM, sig_handler)
signal.signal(signal.SIGINT, sig_handler)
tornado.ioloop.IOLoop.instance().start()
log.info('Exit...')
if __name__ == '__main__':
main()