Skip to content

Commit 4039984

Browse files
committed
new benchmarking script
1 parent df61022 commit 4039984

File tree

3 files changed

+558
-713
lines changed

3 files changed

+558
-713
lines changed

benchmarks/benchmark_keras2c.py

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
import pickle
2+
import sys
3+
import os
4+
import numpy as np
5+
import keras
6+
import tensorflow as tf
7+
import keras.backend as K
8+
import subprocess
9+
import time
10+
from keras2c.keras2c_main import k2c
11+
12+
num_cores = 1
13+
config = tf.ConfigProto(intra_op_parallelism_threads=num_cores,
14+
inter_op_parallelism_threads=num_cores,
15+
allow_soft_placement=True,
16+
device_count={'CPU': 1,
17+
'GPU': 0})
18+
session = tf.Session(config=config)
19+
K.set_session(session)
20+
21+
22+
def build_and_run(name, return_output=False, cc='gcc'):
23+
24+
cwd = os.getcwd()
25+
os.chdir(os.path.abspath('./include/'))
26+
lib_code = subprocess.run(['make', 'CC={}'.format(cc)]).returncode
27+
os.chdir(os.path.abspath(cwd))
28+
if lib_code != 0:
29+
return 'lib build failed'
30+
31+
ccflags = ' -O3 -std=c99 -I./include/'
32+
if cc == 'gcc':
33+
ccflags += ' -march=native'
34+
elif cc == 'icc':
35+
ccflags += ' -xHost'
36+
37+
comp = cc + ccflags + ' -o ' + name + ' ' + name + '.c ' + \
38+
name + '_test_suite.c -L./include/ -l:libkeras2c.a -lm'
39+
build_code = subprocess.run(comp.split()).returncode
40+
if build_code != 0:
41+
return 'build failed'
42+
43+
if return_output:
44+
proc_output = subprocess.run(
45+
['./' + name], capture_output=True, text=True)
46+
else:
47+
proc_output = subprocess.run(['./' + name])
48+
rcode = proc_output.returncode
49+
if rcode == 0:
50+
if not os.environ.get('CI'):
51+
subprocess.run('rm ' + name + '*', shell=True)
52+
return (rcode, proc_output.stdout) if return_output else rcode
53+
return rcode
54+
55+
56+
def time_model(model, num_tests, num_runs):
57+
pytimes = np.zeros(num_runs)
58+
ctimes = np.zeros(num_runs)
59+
nparams = model.count_params()
60+
61+
k2c(model, 'foo', num_tests=num_tests, malloc=False, verbose=False)
62+
out = build_and_run('foo', True, 'icc')[1]
63+
64+
for j in range(num_runs):
65+
ctimes[j] = float(out.split('\n')[0].split(' ')[-3])
66+
67+
inp = np.random.random((num_tests, *model.input_shape[1:]))
68+
inp = np.expand_dims(inp, 1)
69+
for j in range(num_runs):
70+
t0 = time.time_ns()
71+
for i in range(num_tests):
72+
_ = model.predict(inp[i])
73+
t1 = time.time_ns()
74+
pytimes[j] = (t1-t0)/10**9/num_tests
75+
return nparams, ctimes, pytimes
76+
77+
78+
time_data = {}
79+
80+
81+
"""Dense Model"""
82+
size = []
83+
ctimes = []
84+
pytimes = []
85+
save_dims = []
86+
save_layers = []
87+
88+
num_tests = 10
89+
num_runs = 10
90+
nlayers = [1, 2, 4]
91+
dims = [8, 16, 32]
92+
93+
for nl in nlayers:
94+
for dim in dims:
95+
inshp = (dim,)
96+
model = keras.models.Sequential()
97+
model.add(keras.layers.Dense(
98+
dim, input_shape=inshp, activation='relu'))
99+
if nl > 1:
100+
for i in range(nl-1):
101+
model.add(keras.layers.Dense(dim, activation='relu'))
102+
model.build()
103+
nparams, ctime, pytime = time_model(model, num_tests, num_runs)
104+
size.append(nparams)
105+
ctimes.append(ctime)
106+
pytimes.append(pytime)
107+
save_dims.append(dim)
108+
save_layers.append(nl)
109+
110+
time_data['Fully Connected'] = {'size': size,
111+
'layers': save_layers,
112+
'dim': save_dims,
113+
'ctimes': ctimes,
114+
'pytimes': pytimes}
115+
116+
with open('k2c_benchmark_times.pkl', 'wb+') as f:
117+
pickle.dump(time_data, f)
118+
119+
120+
"""Conv1D Model"""
121+
size = []
122+
ctimes = []
123+
pytimes = []
124+
save_dims = []
125+
save_layers = []
126+
127+
num_tests = 10
128+
num_runs = 10
129+
nlayers = [1, 2, 4]
130+
dims = [8, 16, 32]
131+
132+
133+
for nl in nlayers:
134+
for dim in dims:
135+
inshp = (dim, 4)
136+
model = keras.models.Sequential()
137+
model.add(keras.layers.Conv1D(4, kernel_size=int(
138+
dim**.5), input_shape=inshp, padding='same'))
139+
if nl > 1:
140+
for i in range(nl-1):
141+
model.add(keras.layers.Conv1D(
142+
10 + 2*i, kernel_size=int(dim**.5), padding='same'))
143+
144+
model.build()
145+
nparams, ctime, pytime = time_model(model, num_tests, num_runs)
146+
size.append(nparams)
147+
ctimes.append(ctime)
148+
pytimes.append(pytime)
149+
save_dims.append(dim)
150+
save_layers.append(nl)
151+
152+
time_data['Conv1D'] = {'size': size,
153+
'layers': save_layers,
154+
'dim': save_dims,
155+
'ctimes': ctimes,
156+
'pytimes': pytimes}
157+
158+
159+
with open('k2c_benchmark_times.pkl', 'wb+') as f:
160+
pickle.dump(time_data, f)
161+
162+
163+
"""Conv2D Model"""
164+
size = []
165+
ctimes = []
166+
pytimes = []
167+
save_dims = []
168+
save_layers = []
169+
170+
num_tests = 10
171+
num_runs = 10
172+
nlayers = [1, 2, 4]
173+
dims = [8, 12, 16, 24, 32]
174+
175+
176+
for nl in nlayers:
177+
for dim in dims:
178+
inshp = (dim, dim, 3)
179+
model = keras.models.Sequential()
180+
model.add(keras.layers.Conv2D(5, kernel_size=int(
181+
np.log2(dim)), input_shape=inshp, padding='same'))
182+
if nl > 1:
183+
for i in range(nl-1):
184+
model.add(keras.layers.Conv2D(
185+
10+2*i**2, kernel_size=int(np.log2(dim)), padding='same'))
186+
187+
model.build()
188+
nparams, ctime, pytime = time_model(model, num_tests, num_runs)
189+
size.append(nparams)
190+
ctimes.append(ctime)
191+
pytimes.append(pytime)
192+
save_dims.append(dim)
193+
save_layers.append(nl)
194+
195+
time_data['Conv2D'] = {'size': size,
196+
'layers': save_layers,
197+
'dim': save_dims,
198+
'ctimes': ctimes,
199+
'pytimes': pytimes}
200+
201+
202+
with open('k2c_benchmark_times.pkl', 'wb+') as f:
203+
pickle.dump(time_data, f)
204+
205+
206+
"""LSTM Model"""
207+
size = []
208+
ctimes = []
209+
pytimes = []
210+
save_dims = []
211+
save_layers = []
212+
213+
num_tests = 10
214+
num_runs = 10
215+
nlayers = [1, 2, 4]
216+
dims = [8, 16, 32]
217+
218+
219+
for nl in nlayers:
220+
for dim in dims:
221+
inshp = (int(np.sqrt(dim)), dim)
222+
model = keras.models.Sequential()
223+
model.add(keras.layers.LSTM(
224+
dim, return_sequences=True, input_shape=inshp))
225+
if nl > 1:
226+
for i in range(nl-1):
227+
model.add(keras.layers.LSTM(
228+
dim, return_sequences=True, input_shape=inshp))
229+
230+
model.build()
231+
nparams, ctime, pytime = time_model(model, num_tests, num_runs)
232+
size.append(nparams)
233+
ctimes.append(ctime)
234+
pytimes.append(pytime)
235+
save_dims.append(dim)
236+
save_layers.append(nl)
237+
238+
time_data['LSTM'] = {'size': size,
239+
'layers': save_layers,
240+
'dim': save_dims,
241+
'ctimes': ctimes,
242+
'pytimes': pytimes}
243+
244+
245+
with open('k2c_benchmark_times.pkl', 'wb+') as f:
246+
pickle.dump(time_data, f)

0 commit comments

Comments
 (0)