2
# Module caffe2.python.mint.app
10
# pyre-fixme[21]: Could not find module `tornado.httpserver`.
11
import tornado.httpserver
12
# pyre-fixme[21]: Could not find a module corresponding to import `tornado.wsgi`
15
__folder__ = os.path.abspath(os.path.dirname(__file__))
19
template_folder=os.path.join(__folder__, "templates"),
20
static_folder=os.path.join(__folder__, "static")
25
def jsonify_nvd3(chart):
27
# Note(Yangqing): python-nvd3 does not seem to separate the built HTML part
28
# and the script part. Luckily, it seems to be the case that the HTML part is
29
# only a <div>, which can be accessed by chart.container; the script part,
30
# while the script part occupies the rest of the html content, which we can
31
# then find by chart.htmlcontent.find['<script>'].
32
script_start = chart.htmlcontent.find('<script>') + 8
33
script_end = chart.htmlcontent.find('</script>')
35
result=chart.container,
36
script=chart.htmlcontent[script_start:script_end].strip()
40
def visualize_summary(filename):
42
data = np.loadtxt(filename)
43
except Exception as e:
44
return 'Cannot load file {}: {}'.format(filename, str(e))
45
chart_name = os.path.splitext(os.path.basename(filename))[0]
46
chart = nvd3.lineChart(
47
name=chart_name + '_summary_chart',
48
height=args.chart_height,
52
step = max(data.shape[0] / -args.sample, 1)
55
xdata = np.arange(0, data.shape[0], step)
56
# data should have 4 dimensions.
57
chart.add_serie(x=xdata, y=data[xdata, 0], name='min')
58
chart.add_serie(x=xdata, y=data[xdata, 1], name='max')
59
chart.add_serie(x=xdata, y=data[xdata, 2], name='mean')
60
chart.add_serie(x=xdata, y=data[xdata, 2] + data[xdata, 3], name='m+std')
61
chart.add_serie(x=xdata, y=data[xdata, 2] - data[xdata, 3], name='m-std')
62
return jsonify_nvd3(chart)
65
def visualize_print_log(filename):
67
data = np.loadtxt(filename)
69
data = data[:, np.newaxis]
70
except Exception as e:
71
return 'Cannot load file {}: {}'.format(filename, str(e))
72
chart_name = os.path.splitext(os.path.basename(filename))[0]
73
chart = nvd3.lineChart(
74
name=chart_name + '_log_chart',
75
height=args.chart_height,
79
step = max(data.shape[0] / -args.sample, 1)
82
xdata = np.arange(0, data.shape[0], step)
83
# if there is only one curve, we also show the running min and max
84
if data.shape[1] == 1:
85
# We also print the running min and max for the steps.
86
trunc_size = data.shape[0] / step
87
running_mat = data[:trunc_size * step].reshape((trunc_size, step))
90
y=running_mat.min(axis=1),
95
y=running_mat.max(axis=1),
98
chart.add_serie(x=xdata, y=data[xdata, 0], name=chart_name)
100
for i in range(0, min(data.shape[1], args.max_curves)):
101
# data should have 4 dimensions.
105
name='{}[{}]'.format(chart_name, i)
108
return jsonify_nvd3(chart)
111
def visualize_file(filename):
112
fullname = os.path.join(args.root, filename)
113
if filename.endswith('summary'):
114
return visualize_summary(fullname)
115
elif filename.endswith('log'):
116
return visualize_print_log(fullname)
118
return flask.jsonify(
119
result='Unsupport file: {}'.format(filename),
126
files = glob.glob(os.path.join(args.root, "*.*"))
128
names = [os.path.basename(f) for f in files]
129
return flask.render_template(
137
@app.route('/visualization/<string:name>')
138
def visualization(name):
139
ret = visualize_file(name)
144
parser = argparse.ArgumentParser("The mint visualizer.")
150
help="The flask port to use."
157
help="The root folder to read files for visualization."
163
help="The max number of curves to show in a dump tensor."
169
help="The chart height for nvd3."
176
help="Sample every given number of data points. A negative "
177
"number means the total points we will sample on the "
178
"whole curve. Default 100 points."
181
args = parser.parse_args(argv)
182
server = tornado.httpserver.HTTPServer(tornado.wsgi.WSGIContainer(app))
183
server.listen(args.port)
184
print("Tornado server starting on port {}.".format(args.port))
185
tornado.ioloop.IOLoop.instance().start()
188
if __name__ == '__main__':