Skip to content

Commit 000c1f7

Browse files
authored
Merge pull request #5933 from tensor-tang/inference
enable inference benchmark
2 parents ade6c83 + 79b1709 commit 000c1f7

File tree

6 files changed

+165
-29
lines changed

6 files changed

+165
-29
lines changed

benchmark/paddle/image/googlenet.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,21 @@
66
num_class = 1000
77
batch_size = get_config_arg('batch_size', int, 128)
88
use_gpu = get_config_arg('use_gpu', bool, True)
9-
10-
args = {'height': height, 'width': width, 'color': True, 'num_class': num_class}
9+
is_infer = get_config_arg("is_infer", bool, False)
10+
11+
args = {
12+
'height': height,
13+
'width': width,
14+
'color': True,
15+
'num_class': num_class,
16+
'is_infer': is_infer
17+
}
1118
define_py_data_sources2(
12-
"train.list", None, module="provider", obj="process", args=args)
19+
"train.list" if not is_infer else None,
20+
"test.list" if is_infer else None,
21+
module="provider",
22+
obj="process",
23+
args=args)
1324

1425
settings(
1526
batch_size=batch_size,
@@ -146,7 +157,6 @@ def inception(name, input, channels, \
146157
return cat
147158

148159

149-
lab = data_layer(name="label", size=1000)
150160
data = data_layer(name="input", size=3 * height * width)
151161

152162
# stage 1
@@ -224,6 +234,10 @@ def inception(name, input, channels, \
224234
dropout = dropout_layer(name="dropout", input=pool5, dropout_rate=0.4)
225235
out3 = fc_layer(
226236
name="output3", input=dropout, size=1000, act=SoftmaxActivation())
227-
loss3 = cross_entropy(name='loss3', input=out3, label=lab)
228237

229-
outputs(loss3)
238+
if is_infer:
239+
outputs(out3)
240+
else:
241+
lab = data_layer(name="label", size=num_class)
242+
loss3 = cross_entropy(name='loss3', input=out3, label=lab)
243+
outputs(loss3)

benchmark/paddle/image/provider.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,20 @@ def initHook(settings, height, width, color, num_class, **kwargs):
1313
settings.data_size = settings.height * settings.width * 3
1414
else:
1515
settings.data_size = settings.height * settings.width
16-
17-
settings.slots = [dense_vector(settings.data_size), integer_value(1)]
16+
settings.is_infer = kwargs.get('is_infer', False)
17+
if settings.is_infer:
18+
settings.slots = [dense_vector(settings.data_size)]
19+
else:
20+
settings.slots = [dense_vector(settings.data_size), integer_value(1)]
1821

1922

2023
@provider(
2124
init_hook=initHook, min_pool_size=-1, cache=CacheType.CACHE_PASS_IN_MEM)
2225
def process(settings, file_list):
23-
for i in xrange(1024):
26+
for i in xrange(2560 if settings.is_infer else 1024):
2427
img = np.random.rand(1, settings.data_size).reshape(-1, 1).flatten()
25-
lab = random.randint(0, settings.num_class - 1)
26-
yield img.astype('float32'), int(lab)
28+
if settings.is_infer:
29+
yield img.astype('float32')
30+
else:
31+
lab = random.randint(0, settings.num_class - 1)
32+
yield img.astype('float32'), int(lab)

benchmark/paddle/image/resnet.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,21 @@
66
num_class = 1000
77
batch_size = get_config_arg('batch_size', int, 64)
88
layer_num = get_config_arg("layer_num", int, 50)
9-
is_test = get_config_arg("is_test", bool, False)
10-
11-
args = {'height': height, 'width': width, 'color': True, 'num_class': num_class}
9+
is_infer = get_config_arg("is_infer", bool, False)
10+
11+
args = {
12+
'height': height,
13+
'width': width,
14+
'color': True,
15+
'num_class': num_class,
16+
'is_infer': is_infer
17+
}
1218
define_py_data_sources2(
13-
"train.list", None, module="provider", obj="process", args=args)
19+
"train.list" if not is_infer else None,
20+
"test.list" if is_infer else None,
21+
module="provider",
22+
obj="process",
23+
args=args)
1424

1525
settings(
1626
batch_size=batch_size,
@@ -45,7 +55,10 @@ def conv_bn_layer(name,
4555
act=LinearActivation(),
4656
bias_attr=False)
4757
return batch_norm_layer(
48-
name=name + "_bn", input=tmp, act=active_type, use_global_stats=is_test)
58+
name=name + "_bn",
59+
input=tmp,
60+
act=active_type,
61+
use_global_stats=is_infer)
4962

5063

5164
def bottleneck_block(name, input, num_filters1, num_filters2):
@@ -207,7 +220,9 @@ def deep_res_net(res2_num=3, res3_num=4, res4_num=6, res5_num=3):
207220
else:
208221
print("Wrong layer number.")
209222

210-
lbl = data_layer(name="label", size=num_class)
211-
loss = cross_entropy(name='loss', input=resnet, label=lbl)
212-
inputs(img, lbl)
213-
outputs(loss)
223+
if is_infer:
224+
outputs(resnet)
225+
else:
226+
lbl = data_layer(name="label", size=num_class)
227+
loss = cross_entropy(name='loss', input=resnet, label=lbl)
228+
outputs(loss)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
set -e
2+
3+
function clock_to_seconds() {
4+
hours=`echo $1 | awk -F ':' '{print $1}'`
5+
mins=`echo $1 | awk -F ':' '{print $2}'`
6+
secs=`echo $1 | awk -F ':' '{print $3}'`
7+
echo `bc -l <<< "$secs + $mins * 60 + $hours * 3600"`
8+
}
9+
10+
function infer() {
11+
unset OMP_NUM_THREADS MKL_NUM_THREADS OMP_DYNAMIC KMP_AFFINITY
12+
topology=$1
13+
layer_num=$2
14+
bs=$3
15+
use_mkldnn=$4
16+
if [ $4 == "True" ]; then
17+
thread=1
18+
log="logs/infer-${topology}-${layer_num}-mkldnn-${bs}.log"
19+
elif [ $4 == "False" ]; then
20+
thread=`nproc`
21+
if [ $thread -gt $bs ]; then
22+
thread=$bs
23+
fi
24+
log="logs/infer-${topology}-${layer_num}-${thread}mklml-${bs}.log"
25+
else
26+
echo "Wrong input $4, use True or False."
27+
exit 0
28+
fi
29+
30+
models_in="models/${topology}-${layer_num}/pass-00000/"
31+
if [ ! -d $models_in ]; then
32+
echo "Training model ${topology}_${layer_num}"
33+
paddle train --job=train \
34+
--config="${topology}.py" \
35+
--use_mkldnn=True \
36+
--use_gpu=False \
37+
--trainer_count=1 \
38+
--num_passes=1 \
39+
--save_dir="models/${topology}-${layer_num}" \
40+
--config_args="batch_size=128,layer_num=${layer_num}" \
41+
> /dev/null 2>&1
42+
echo "Done"
43+
fi
44+
log_period=$((256 / bs))
45+
paddle train --job=test \
46+
--config="${topology}.py" \
47+
--use_mkldnn=$use_mkldnn \
48+
--use_gpu=False \
49+
--trainer_count=$thread \
50+
--log_period=$log_period \
51+
--config_args="batch_size=${bs},layer_num=${layer_num},is_infer=True" \
52+
--init_model_path=$models_in \
53+
2>&1 | tee ${log}
54+
55+
# calculate the last 5 logs period time of 1280 samples,
56+
# the time before are burning time.
57+
start=`tail ${log} -n 7 | head -n 1 | awk -F ' ' '{print $2}' | xargs`
58+
end=`tail ${log} -n 2 | head -n 1 | awk -F ' ' '{print $2}' | xargs`
59+
start_sec=`clock_to_seconds $start`
60+
end_sec=`clock_to_seconds $end`
61+
fps=`bc <<< "scale = 2; 1280 / ($end_sec - $start_sec)"`
62+
echo "Last 1280 samples start: ${start}(${start_sec} sec), end: ${end}(${end_sec} sec;" >> ${log}
63+
echo "FPS: $fps images/sec" >> ${log}
64+
}
65+
66+
if [ ! -f "train.list" ]; then
67+
echo " " > train.list
68+
fi
69+
if [ ! -f "test.list" ]; then
70+
echo " " > test.list
71+
fi
72+
if [ ! -d "logs" ]; then
73+
mkdir logs
74+
fi
75+
if [ ! -d "models" ]; then
76+
mkdir -p models
77+
fi
78+
79+
# inference benchmark
80+
for use_mkldnn in True False; do
81+
for batchsize in 1 2 4 8 16; do
82+
infer googlenet v1 $batchsize $use_mkldnn
83+
infer resnet 50 $batchsize $use_mkldnn
84+
infer vgg 19 $batchsize $use_mkldnn
85+
done
86+
done

benchmark/paddle/image/run_mkldnn.sh renamed to benchmark/paddle/image/run_mkldnn_train.sh

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ function train() {
88
use_mkldnn=$4
99
if [ $4 == "True" ]; then
1010
thread=1
11-
log="logs/${topology}-${layer_num}-mkldnn-${bs}.log"
11+
log="logs/train-${topology}-${layer_num}-mkldnn-${bs}.log"
1212
elif [ $4 == "False" ]; then
1313
thread=`nproc`
1414
# each trainer_count use only 1 core to avoid conflict
15-
log="logs/${topology}-${layer_num}-${thread}mklml-${bs}.log"
15+
log="logs/train-${topology}-${layer_num}-${thread}mklml-${bs}.log"
1616
else
17-
echo "Wrong input $3, use True or False."
17+
echo "Wrong input $4, use True or False."
1818
exit 0
1919
fi
2020
args="batch_size=${bs},layer_num=${layer_num}"
@@ -30,13 +30,14 @@ function train() {
3030
2>&1 | tee ${log}
3131
}
3232

33-
if [ ! -d "train.list" ]; then
33+
if [ ! -f "train.list" ]; then
3434
echo " " > train.list
3535
fi
3636
if [ ! -d "logs" ]; then
3737
mkdir logs
3838
fi
3939

40+
# training benchmark
4041
for use_mkldnn in True False; do
4142
for batchsize in 64 128 256; do
4243
train vgg 19 $batchsize $use_mkldnn

benchmark/paddle/image/vgg.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,21 @@
66
num_class = 1000
77
batch_size = get_config_arg('batch_size', int, 64)
88
layer_num = get_config_arg('layer_num', int, 19)
9+
is_infer = get_config_arg("is_infer", bool, False)
910

10-
args = {'height': height, 'width': width, 'color': True, 'num_class': num_class}
11+
args = {
12+
'height': height,
13+
'width': width,
14+
'color': True,
15+
'num_class': num_class,
16+
'is_infer': is_infer
17+
}
1118
define_py_data_sources2(
12-
"train.list", None, module="provider", obj="process", args=args)
19+
"train.list" if not is_infer else None,
20+
"test.list" if is_infer else None,
21+
module="provider",
22+
obj="process",
23+
args=args)
1324

1425
settings(
1526
batch_size=batch_size,
@@ -98,6 +109,9 @@ def vgg_network(vgg_num=3):
98109
else:
99110
print("Wrong layer number.")
100111

101-
lab = data_layer('label', num_class)
102-
loss = cross_entropy(input=vgg, label=lab)
103-
outputs(loss)
112+
if is_infer:
113+
outputs(vgg)
114+
else:
115+
lab = data_layer('label', num_class)
116+
loss = cross_entropy(input=vgg, label=lab)
117+
outputs(loss)

0 commit comments

Comments
 (0)