Skip to content

Commit e90bfd5

Browse files
committed
1. Make a base unittest class for dist transpiler unittest
2. Merge the develop repo
1 parent b31647c commit e90bfd5

File tree

4 files changed

+87
-106
lines changed

4 files changed

+87
-106
lines changed

python/paddle/fluid/tests/unittests/test_dist_transpiler.py

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,15 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import unittest
16-
17-
import paddle.fluid as fluid
18-
import paddle.fluid.core as core
19-
import paddle.fluid.layers as layers
2015
from paddle.fluid.transpiler.distribute_transpiler import delete_ops
21-
import numpy
16+
17+
from transpiler_test import TranspilerTest
2218

2319

24-
class TestDistTranspiler(unittest.TestCase):
20+
class TestDistTranspiler(TranspilerTest):
2521
def setUp(self):
26-
self.trainer_id = 0
27-
self.trainers = 2
28-
self.pservers = 2
29-
self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175"
3022
self.current_pserver_ep = "127.0.0.1:6174"
3123

32-
def net_conf(self):
33-
x = fluid.layers.data(name='x', shape=[1000], dtype='float32')
34-
35-
y_predict = fluid.layers.fc(input=x,
36-
size=1000,
37-
act=None,
38-
param_attr=fluid.ParamAttr(name='fc_w'))
39-
40-
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
41-
42-
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
43-
avg_cost = fluid.layers.mean(cost)
44-
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1)
45-
46-
optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost)
47-
return optimize_ops, params_grads
48-
4924
def test_transpiler(self):
5025
trainer = self.get_trainer()
5126
pserver, startup = self.get_pserver(self.current_pserver_ep)
@@ -70,14 +45,6 @@ def test_transpiler(self):
7045
fc_w_var = startup.global_block().var("fc_w.block1")
7146
self.assertEqual(fc_w_var.shape, (500, 1000))
7247

73-
def get_main_program(self):
74-
main = fluid.Program()
75-
76-
with fluid.program_guard(main):
77-
self.net_conf()
78-
79-
return main
80-
8148
def get_expect_trainer_ops(self):
8249
trainer = fluid.Program()
8350

@@ -92,25 +59,6 @@ def get_expect_trainer_ops(self):
9259
ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars")
9360
return ops
9461

95-
def get_trainer(self):
96-
return self._transpiler_instance().get_trainer_program()
97-
98-
def get_pserver(self, ep):
99-
t = self._transpiler_instance()
100-
pserver = t.get_pserver_program(ep)
101-
startup = t.get_startup_program(ep, pserver)
102-
return pserver, startup
103-
104-
def _transpiler_instance(self):
105-
main = self.get_main_program()
106-
t = fluid.DistributeTranspiler()
107-
t.transpile(
108-
self.trainer_id,
109-
program=main,
110-
pservers=self.pserver_eps,
111-
trainers=self.trainers)
112-
return t
113-
11462

11563
if __name__ == "__main__":
11664
unittest.main()

python/paddle/fluid/tests/unittests/test_simple_dist_transpiler.py

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,18 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
import unittest
15+
import numpy as np
1616

1717
import paddle.fluid as fluid
18-
import paddle.fluid.core as core
19-
import paddle.fluid.layers as layers
2018
from paddle.fluid.transpiler.distribute_transpiler import delete_ops
21-
import numpy as np
2219

20+
from transpiler_test import TranspilerTest
2321

24-
class TestSimpleDistTranspiler(unittest.TestCase):
22+
23+
class TestSimpleDistTranspiler(TranspilerTest):
2524
def setUp(self):
26-
self.trainer_id = 0
27-
self.trainers = 2
28-
self.pservers = 2
29-
self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175"
3025
self.current_pserver_ep = "127.0.0.1:6175"
3126

32-
def net_conf(self):
33-
x = fluid.layers.data(name='x', shape=[1000], dtype='float32')
34-
35-
y_predict = fluid.layers.fc(input=x,
36-
size=1000,
37-
act=None,
38-
param_attr=fluid.ParamAttr(name='fc_w'))
39-
40-
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
41-
42-
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
43-
avg_cost = fluid.layers.mean(cost)
44-
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1)
45-
46-
optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost)
47-
return optimize_ops, params_grads
48-
4927
def test_simple_transpiler(self):
5028
np.random.seed(1)
5129

@@ -73,14 +51,6 @@ def test_simple_transpiler(self):
7351
fc_w_var = startup.global_block().var("[email protected]_0")
7452
self.assertEqual(fc_w_var.shape, (1000, 1000))
7553

76-
def get_main_program(self):
77-
main = fluid.Program()
78-
79-
with fluid.program_guard(main):
80-
self.net_conf()
81-
82-
return main
83-
8454
def get_expect_trainer_ops(self):
8555
trainer = fluid.Program()
8656

@@ -94,15 +64,6 @@ def get_expect_trainer_ops(self):
9464
ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars")
9565
return ops
9666

97-
def get_trainer(self):
98-
return self._transpiler_instance().get_trainer_program()
99-
100-
def get_pserver(self, ep):
101-
t = self._transpiler_instance()
102-
pserver = t.get_pserver_program(ep)
103-
startup = t.get_startup_program(ep, pserver)
104-
return pserver, startup
105-
10667
def _transpiler_instance(self):
10768
main = self.get_main_program()
10869
t = fluid.DistributeTranspiler()
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
import unittest
16+
import numpy as np
17+
18+
import paddle.fluid as fluid
19+
import paddle.fluid.core as core
20+
import paddle.fluid.layers as layers
21+
22+
23+
class TranspilerTest(unittest.TestCase):
24+
@classmethod
25+
def setUpClass(self):
26+
self.trainer_id = 0
27+
self.trainers = 2
28+
self.pservers = 2
29+
self.pserver_eps = "127.0.0.1:6174,127.0.0.1:6175"
30+
31+
def net_conf(self):
32+
x = fluid.layers.data(name='x', shape=[1000], dtype='float32')
33+
34+
y_predict = fluid.layers.fc(input=x,
35+
size=1000,
36+
act=None,
37+
param_attr=fluid.ParamAttr(name='fc_w'))
38+
39+
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
40+
41+
cost = fluid.layers.square_error_cost(input=y_predict, label=y)
42+
avg_cost = fluid.layers.mean(cost)
43+
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.1)
44+
45+
optimize_ops, params_grads = sgd_optimizer.minimize(avg_cost)
46+
return optimize_ops, params_grads
47+
48+
def get_main_program(self):
49+
main = fluid.Program()
50+
51+
with fluid.program_guard(main):
52+
self.net_conf()
53+
54+
return main
55+
56+
def get_trainer(self):
57+
return self._transpiler_instance().get_trainer_program()
58+
59+
def get_pserver(self, ep):
60+
t = self._transpiler_instance()
61+
pserver = t.get_pserver_program(ep)
62+
startup = t.get_startup_program(ep, pserver)
63+
return pserver, startup
64+
65+
def _transpiler_instance(self):
66+
main = self.get_main_program()
67+
t = fluid.DistributeTranspiler()
68+
t.transpile(
69+
self.trainer_id,
70+
program=main,
71+
pservers=self.pserver_eps,
72+
trainers=self.trainers)
73+
return t

python/paddle/fluid/transpiler/distribute_transpiler.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def _update_dist_lookup_table_vars(self, param_list, grad_list,
178178
for index in range(len(self.pserver_endpoints))
179179
]
180180

181-
def _init_splited_vars(self, split_method):
181+
def _init_splited_vars(self, split_method, align_var_to_block=True):
182182
# update these mappings for further transpile:
183183
# 1. param_var_mapping: param var name -> [splited params vars]
184184
# 2. grad_var_mapping: grad var name -> [splited grads vars]
@@ -198,15 +198,14 @@ def _init_splited_vars(self, split_method):
198198
self.params_grads)
199199

200200
if align_var_to_block:
201-
grad_blocks = split_dense_variable(grad_list,
202-
len(pserver_endpoints))
203-
param_blocks = split_dense_variable(param_list,
204-
len(pserver_endpoints))
201+
grad_blocks = split_variable(grad_list, len(self.pserver_endpoints))
202+
param_blocks = split_variable(param_list,
203+
len(self.pserver_endpoints))
205204
else:
206205
# when we do NOT align var to block, we will always split params
207206
# grads into one block.
208-
grad_blocks = split_dense_variable(grad_list, 1)
209-
param_blocks = split_dense_variable(param_list, 1)
207+
grad_blocks = split_variable(grad_list, 1)
208+
param_blocks = split_variable(param_list, 1)
210209
assert (len(grad_blocks) == len(param_blocks))
211210
# origin_varname -> [splited_var]
212211
self.param_var_mapping = self._create_vars_from_blocklist(
@@ -272,7 +271,7 @@ def transpile(self,
272271
self.has_distributed_lookup_table = self._has_distributed_lookup_table()
273272

274273
# split and create vars, then put splited vars in dicts for later use.
275-
self._init_splited_vars(split_method)
274+
self._init_splited_vars(split_method, align_var_to_block)
276275

277276
# step 3.1: insert send op to send gradient vars to parameter servers
278277
ps_dispatcher.reset()

0 commit comments

Comments
 (0)