Skip to content

Commit bd0f8f8

Browse files
author
Yancey
authored
Merge pull request #11054 from velconia/update_simple_distranspiler
Merge simple_dist_transpiler.py into distribute_transpiler.py
2 parents d3e99ae + 0ed461d commit bd0f8f8

File tree

8 files changed

+207
-333
lines changed

8 files changed

+207
-333
lines changed

python/paddle/fluid/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
from param_attr import ParamAttr, WeightNormParamAttr
4545
from data_feeder import DataFeeder
4646
from core import LoDTensor, CPUPlace, CUDAPlace, CUDAPinnedPlace
47-
from transpiler import DistributeTranspiler, SimpleDistributeTranspiler, \
48-
InferenceTranspiler, memory_optimize, release_memory
47+
from transpiler import DistributeTranspiler, InferenceTranspiler, \
48+
memory_optimize, release_memory
4949
from concurrency import (Go, make_channel, channel_send, channel_recv,
5050
channel_close, Select)
5151
from lod_tensor import create_lod_tensor, create_random_int_lodtensor

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

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

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

2320

24-
class TestDistTranspiler(unittest.TestCase):
21+
class TestDistTranspiler(TranspilerTest):
2522
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"
3023
self.current_pserver_ep = "127.0.0.1:6174"
3124

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-
4925
def test_transpiler(self):
5026
trainer = self.get_trainer()
5127
pserver, startup = self.get_pserver(self.current_pserver_ep)
@@ -70,14 +46,6 @@ def test_transpiler(self):
7046
fc_w_var = startup.global_block().var("fc_w.block1")
7147
self.assertEqual(fc_w_var.shape, (500, 1000))
7248

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-
8149
def get_expect_trainer_ops(self):
8250
trainer = fluid.Program()
8351

@@ -92,25 +60,6 @@ def get_expect_trainer_ops(self):
9260
ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars")
9361
return ops
9462

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-
11463

11564
if __name__ == "__main__":
11665
unittest.main()
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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 numpy as np
16+
17+
import paddle.fluid as fluid
18+
from paddle.fluid.transpiler.distribute_transpiler import delete_ops
19+
20+
from transpiler_test import TranspilerTest
21+
22+
23+
class TestSimpleDistTranspiler(TranspilerTest):
24+
def setUp(self):
25+
self.current_pserver_ep = "127.0.0.1:6175"
26+
27+
def test_simple_transpiler(self):
28+
np.random.seed(1)
29+
30+
trainer = self.get_trainer()
31+
pserver, startup = self.get_pserver(self.current_pserver_ep)
32+
self.assertEqual([op.type for op in trainer.global_block().ops],
33+
self.get_expect_trainer_ops())
34+
35+
self.assertEqual(len(pserver.blocks), 2)
36+
# block0: listen_and_serv
37+
self.assertEqual([op.type for op in pserver.blocks[0].ops],
38+
["listen_and_serv"])
39+
# block1: optimize pass
40+
self.assertEqual([op.type for op in pserver.blocks[1].ops],
41+
["sum", "scale", "sgd"])
42+
43+
# confirm startup program
44+
self.assertEqual([op.type for op in startup.global_block().ops],
45+
["fill_constant", "uniform_random", "uniform_random"])
46+
47+
# the variable #fc_w will NOT be splited
48+
fc_w_var = startup.global_block().var("fc_w@GRAD")
49+
self.assertEqual(fc_w_var.shape, (1000, 1000))
50+
51+
fc_w_var = startup.global_block().var("[email protected]_0")
52+
self.assertEqual(fc_w_var.shape, (1000, 1000))
53+
54+
def get_expect_trainer_ops(self):
55+
trainer = fluid.Program()
56+
57+
with fluid.program_guard(trainer):
58+
optimize_ops, params_grads = self.net_conf()
59+
60+
delete_ops(trainer.global_block(), optimize_ops)
61+
ops = [op.type for op in trainer.global_block().ops] + [
62+
"send_vars", "send_barrier", "recv", "recv", "fetch_barrier"
63+
]
64+
ops.insert(ops.index("elementwise_add_grad") + 1, "send_vars")
65+
return ops
66+
67+
def _transpiler_instance(self):
68+
main = self.get_main_program()
69+
t = fluid.DistributeTranspiler()
70+
t.transpile(
71+
self.trainer_id,
72+
program=main,
73+
pservers=self.pserver_eps,
74+
trainers=self.trainers,
75+
slice_var_up=False)
76+
return t
77+
78+
79+
if __name__ == "__main__":
80+
unittest.main()

python/paddle/fluid/tests/unittests/test_split_var.py renamed to python/paddle/fluid/tests/unittests/test_slice_var.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414

1515
import math
1616
import unittest
17-
from paddle.fluid.transpiler.distribute_transpiler import split_variable
17+
from paddle.fluid.transpiler.distribute_transpiler import slice_variable
1818
import paddle.fluid as fluid
1919
import paddle.fluid.core as core
2020
import random
2121

2222

23-
class TestSplitVar(unittest.TestCase):
24-
def check_split_output(self, shapes, expected_sizes, min_size):
23+
class TestSliceVar(unittest.TestCase):
24+
def check_slice_output(self, shapes, expected_sizes, min_size):
2525
var_list = []
2626
program = fluid.Program()
2727
for shape in shapes:
@@ -31,7 +31,7 @@ def check_split_output(self, shapes, expected_sizes, min_size):
3131
# dtype=core.VarDesc.VarType.LOD_TENSOR,
3232
shape=shape)
3333
var_list.append(var)
34-
blocks = split_variable(var_list, 10, min_size)
34+
blocks = slice_variable(var_list, 10, min_size)
3535
all_sizes = []
3636
for s in expected_sizes:
3737
for s2 in s:
@@ -49,15 +49,15 @@ def test_1k(self):
4949
[1150, 1150, 1150, 1150, 1150, 1150, 1100]
5050
]
5151

52-
self.check_split_output(shapes, expected_sizes, 1024)
52+
self.check_slice_output(shapes, expected_sizes, 1024)
5353

5454
def test_check_output_8k(self):
5555
shapes = [[3, 5], [1024], [28, 784], [8, 1020], [800, 10],
5656
[6, 33, 33, 33]]
5757
expected_sizes = [[15], [1024], [10976, 10976], [8160], [8000],
5858
[35937, 35937, 35937, 35937, 35937, 35937]]
5959

60-
self.check_split_output(shapes, expected_sizes, 8192)
60+
self.check_slice_output(shapes, expected_sizes, 8192)
6161

6262

6363
if __name__ == '__main__':
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/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@
1515
from distribute_transpiler import DistributeTranspiler
1616
from inference_transpiler import InferenceTranspiler
1717
from memory_optimization_transpiler import memory_optimize, release_memory
18-
from distribute_transpiler_simple import SimpleDistributeTranspiler
1918
from ps_dispatcher import HashName, RoundRobin
2019

2120
__all__ = [
22-
"DistributeTranspiler", "InferenceTranspiler", "SimpleDistributeTranspiler",
23-
"memory_optimize", "release_memory", "HashName", "RoundRobin"
21+
"DistributeTranspiler", "InferenceTranspiler", "memory_optimize",
22+
"release_memory", "HashName", "RoundRobin"
2423
]

0 commit comments

Comments
 (0)