Skip to content

Commit 2f3665e

Browse files
committed
update reset script for benchmark
1 parent f8a6bda commit 2f3665e

File tree

2 files changed

+233
-15
lines changed

2 files changed

+233
-15
lines changed

benchmark/paddle/image/resnet.py

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
#!/usr/bin/env python
2+
from paddle.trainer_config_helpers import *
3+
4+
height = 224
5+
width = 224
6+
num_class = 1000
7+
batch_size = get_config_arg('batch_size', int, 64)
8+
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}
12+
define_py_data_sources2(
13+
"train.list", None, module="provider", obj="process", args=args)
14+
15+
settings(
16+
batch_size=batch_size,
17+
learning_rate=0.01 / batch_size,
18+
learning_method=MomentumOptimizer(0.9),
19+
regularization=L2Regularization(0.0005 * batch_size))
20+
21+
22+
#######################Network Configuration #############
23+
def conv_bn_layer(name,
24+
input,
25+
filter_size,
26+
num_filters,
27+
stride,
28+
padding,
29+
channels=None,
30+
active_type=ReluActivation()):
31+
"""
32+
A wrapper for conv layer with batch normalization layers.
33+
Note:
34+
conv layer has no activation.
35+
"""
36+
37+
tmp = img_conv_layer(
38+
name=name + "_conv",
39+
input=input,
40+
filter_size=filter_size,
41+
num_channels=channels,
42+
num_filters=num_filters,
43+
stride=stride,
44+
padding=padding,
45+
act=LinearActivation(),
46+
bias_attr=False)
47+
return batch_norm_layer(
48+
name=name + "_bn", input=tmp, act=active_type, use_global_stats=is_test)
49+
50+
51+
def bottleneck_block(name, input, num_filters1, num_filters2):
52+
"""
53+
A wrapper for bottlenect building block in ResNet.
54+
Last conv_bn_layer has no activation.
55+
Addto layer has activation of relu.
56+
"""
57+
last_name = conv_bn_layer(
58+
name=name + '_branch2a',
59+
input=input,
60+
filter_size=1,
61+
num_filters=num_filters1,
62+
stride=1,
63+
padding=0)
64+
last_name = conv_bn_layer(
65+
name=name + '_branch2b',
66+
input=last_name,
67+
filter_size=3,
68+
num_filters=num_filters1,
69+
stride=1,
70+
padding=1)
71+
last_name = conv_bn_layer(
72+
name=name + '_branch2c',
73+
input=last_name,
74+
filter_size=1,
75+
num_filters=num_filters2,
76+
stride=1,
77+
padding=0,
78+
active_type=LinearActivation())
79+
80+
return addto_layer(
81+
name=name + "_addto", input=[input, last_name], act=ReluActivation())
82+
83+
84+
def mid_projection(name, input, num_filters1, num_filters2, stride=2):
85+
"""
86+
A wrapper for middile projection in ResNet.
87+
projection shortcuts are used for increasing dimensions,
88+
and other shortcuts are identity
89+
branch1: projection shortcuts are used for increasing
90+
dimensions, has no activation.
91+
branch2x: bottleneck building block, shortcuts are identity.
92+
"""
93+
# stride = 2
94+
branch1 = conv_bn_layer(
95+
name=name + '_branch1',
96+
input=input,
97+
filter_size=1,
98+
num_filters=num_filters2,
99+
stride=stride,
100+
padding=0,
101+
active_type=LinearActivation())
102+
103+
last_name = conv_bn_layer(
104+
name=name + '_branch2a',
105+
input=input,
106+
filter_size=1,
107+
num_filters=num_filters1,
108+
stride=stride,
109+
padding=0)
110+
last_name = conv_bn_layer(
111+
name=name + '_branch2b',
112+
input=last_name,
113+
filter_size=3,
114+
num_filters=num_filters1,
115+
stride=1,
116+
padding=1)
117+
118+
last_name = conv_bn_layer(
119+
name=name + '_branch2c',
120+
input=last_name,
121+
filter_size=1,
122+
num_filters=num_filters2,
123+
stride=1,
124+
padding=0,
125+
active_type=LinearActivation())
126+
127+
return addto_layer(
128+
name=name + "_addto", input=[branch1, last_name], act=ReluActivation())
129+
130+
131+
img = data_layer(name='image', size=height * width * 3)
132+
133+
134+
def deep_res_net(res2_num=3, res3_num=4, res4_num=6, res5_num=3):
135+
"""
136+
A wrapper for 50,101,152 layers of ResNet.
137+
res2_num: number of blocks stacked in conv2_x
138+
res3_num: number of blocks stacked in conv3_x
139+
res4_num: number of blocks stacked in conv4_x
140+
res5_num: number of blocks stacked in conv5_x
141+
"""
142+
# For ImageNet
143+
# conv1: 112x112
144+
tmp = conv_bn_layer(
145+
"conv1",
146+
input=img,
147+
filter_size=7,
148+
channels=3,
149+
num_filters=64,
150+
stride=2,
151+
padding=3)
152+
tmp = img_pool_layer(name="pool1", input=tmp, pool_size=3, stride=2)
153+
154+
# conv2_x: 56x56
155+
tmp = mid_projection(
156+
name="res2_1", input=tmp, num_filters1=64, num_filters2=256, stride=1)
157+
for i in xrange(2, res2_num + 1, 1):
158+
tmp = bottleneck_block(
159+
name="res2_" + str(i), input=tmp, num_filters1=64, num_filters2=256)
160+
161+
# conv3_x: 28x28
162+
tmp = mid_projection(
163+
name="res3_1", input=tmp, num_filters1=128, num_filters2=512)
164+
for i in xrange(2, res3_num + 1, 1):
165+
tmp = bottleneck_block(
166+
name="res3_" + str(i),
167+
input=tmp,
168+
num_filters1=128,
169+
num_filters2=512)
170+
171+
# conv4_x: 14x14
172+
tmp = mid_projection(
173+
name="res4_1", input=tmp, num_filters1=256, num_filters2=1024)
174+
for i in xrange(2, res4_num + 1, 1):
175+
tmp = bottleneck_block(
176+
name="res4_" + str(i),
177+
input=tmp,
178+
num_filters1=256,
179+
num_filters2=1024)
180+
181+
# conv5_x: 7x7
182+
tmp = mid_projection(
183+
name="res5_1", input=tmp, num_filters1=512, num_filters2=2048)
184+
for i in xrange(2, res5_num + 1, 1):
185+
tmp = bottleneck_block(
186+
name="res5_" + str(i),
187+
input=tmp,
188+
num_filters1=512,
189+
num_filters2=2048)
190+
191+
tmp = img_pool_layer(
192+
name='avgpool',
193+
input=tmp,
194+
pool_size=7,
195+
stride=1,
196+
pool_type=AvgPooling())
197+
198+
return fc_layer(input=tmp, size=num_class, act=SoftmaxActivation())
199+
200+
201+
if layer_num == 50:
202+
resnet = deep_res_net(3, 4, 6, 3)
203+
elif layer_num == 101:
204+
resnet = deep_res_net(3, 4, 23, 3)
205+
elif layer_num == 152:
206+
resnet = deep_res_net(3, 8, 36, 3)
207+
else:
208+
print("Wrong layer number.")
209+
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)

benchmark/paddle/image/run_mkldnn.sh

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,26 @@ set -e
33
function train() {
44
unset OMP_NUM_THREADS MKL_NUM_THREADS
55
export OMP_DYNAMIC="FALSE"
6+
# TODO(TJ): auto 1.0 or 0,0 for HT on or off
67
export KMP_AFFINITY="granularity=fine,compact,0,0"
78
topology=$1
8-
bs=$2
9-
use_mkldnn=$3
10-
if [ $3 == "True" ]; then
9+
layer_num=$2
10+
bs=$3
11+
use_mkldnn=$4
12+
if [ $4 == "True" ]; then
1113
thread=1
12-
log="logs/${topology}-mkldnn-${bs}.log"
13-
elif [ $3 == "False" ]; then
14+
log="logs/${topology}-${layer_num}-mkldnn-${bs}.log"
15+
elif [ $4 == "False" ]; then
1416
thread=`nproc`
1517
# each trainer_count use only 1 core to avoid conflict
1618
export OMP_NUM_THREADS=1
1719
export MKL_NUM_THREADS=1
18-
log="logs/${topology}-${thread}mklml-${bs}.log"
20+
log="logs/${topology}-${layer_num}-${thread}mklml-${bs}.log"
1921
else
2022
echo "Wrong input $3, use True or False."
2123
exit 0
2224
fi
23-
args="batch_size=${bs}"
25+
args="batch_size=${bs},layer_num=${layer_num}"
2426
config="${topology}.py"
2527
paddle train --job=time \
2628
--config=$config \
@@ -40,12 +42,15 @@ if [ ! -d "logs" ]; then
4042
mkdir logs
4143
fi
4244

43-
#========== mkldnn ==========#
44-
train vgg 64 True
45-
train vgg 128 True
46-
train vgg 256 True
45+
for use_mkldnn in True False; do
46+
for batchsize in 64 128 256; do
47+
# vgg-19 and vgg-16
48+
train vgg 19 $batchsize $use_mkldnn
49+
train vgg 16 $batchsize $use_mkldnn
4750

48-
#========== mklml ===========#
49-
train vgg 64 False
50-
train vgg 128 False
51-
train vgg 256 False
51+
# resnet-50, 101 and 152
52+
train resnet 50 $batchsize $use_mkldnn
53+
train resnet 101 $batchsize $use_mkldnn
54+
train resnet 152 $batchsize $use_mkldnn
55+
done
56+
done

0 commit comments

Comments
 (0)