未验证 提交 23252a34 编写于 作者: Q Qiao Longfei 提交者: GitHub

Merge pull request #12463 from jacquesqiao/remove-duplicated-init-op

avoid duplicated init op for one parameter
...@@ -1038,7 +1038,26 @@ class Block(object): ...@@ -1038,7 +1038,26 @@ class Block(object):
global_block = self.program.global_block() global_block = self.program.global_block()
param = Parameter(global_block, *args, **kwargs) param = Parameter(global_block, *args, **kwargs)
if 'initializer' in kwargs: if 'initializer' in kwargs:
kwargs['initializer'](param, self)
def _is_inited_by(block, var):
init_ops = []
for op in block.ops:
if var.name in op.output_arg_names:
init_ops.append(op)
return init_ops
initializer = kwargs['initializer']
init_ops = _is_inited_by(global_block, param)
init_ops_len = len(init_ops)
if init_ops_len > 1:
raise RuntimeError("param " + param.name +
" is inited by multiple init ops " + str(
init_ops))
elif init_ops_len == 1:
#TODO already inited, do nothing, should log a warning
pass
else:
initializer(param, self)
return param return param
def append_op(self, *args, **kwargs): def append_op(self, *args, **kwargs):
......
...@@ -73,9 +73,18 @@ class TranspilerTest(unittest.TestCase): ...@@ -73,9 +73,18 @@ class TranspilerTest(unittest.TestCase):
return self.transpiler return self.transpiler
def transpiler_test_impl(self):
pass
class TestBasicModel(TranspilerTest):
def test_transpiler(self): def test_transpiler(self):
main = fluid.Program()
startup = fluid.Program()
with fluid.program_guard(main, startup):
self.transpiler_test_impl()
class TestBasicModel(TranspilerTest):
def transpiler_test_impl(self):
pserver, startup = self.get_pserver(self.pserver1_ep) pserver, startup = self.get_pserver(self.pserver1_ep)
pserver2, startup2 = self.get_pserver(self.pserver2_ep) pserver2, startup2 = self.get_pserver(self.pserver2_ep)
...@@ -123,7 +132,7 @@ class TestBasicModel(TranspilerTest): ...@@ -123,7 +132,7 @@ class TestBasicModel(TranspilerTest):
class TestBasicModelWithLargeBlockSize(TranspilerTest): class TestBasicModelWithLargeBlockSize(TranspilerTest):
def test_transpiler(self): def transpiler_test_impl(self):
config = fluid.DistributeTranspilerConfig() config = fluid.DistributeTranspilerConfig()
config.min_block_size = 1048576 config.min_block_size = 1048576
...@@ -148,7 +157,7 @@ class TestBasicModelWithLargeBlockSize(TranspilerTest): ...@@ -148,7 +157,7 @@ class TestBasicModelWithLargeBlockSize(TranspilerTest):
["sum", "scale", "sgd"]) ["sum", "scale", "sgd"])
# confirm startup program # confirm startup program
self.assertEqual([op.type for op in startup.global_block().ops], self.assertEqual([op.type for op in startup.global_block().ops],
["fill_constant", "fill_constant", "fill_constant"]) ["fill_constant", "fill_constant"])
# the variable #fc_w will be split into two blocks # the variable #fc_w will be split into two blocks
fc_w_var = startup2.global_block().var("fc_w") fc_w_var = startup2.global_block().var("fc_w")
self.assertEqual(fc_w_var.shape, (1000L, 1000L)) self.assertEqual(fc_w_var.shape, (1000L, 1000L))
...@@ -177,7 +186,7 @@ class TestNoSliceVar(TranspilerTest): ...@@ -177,7 +186,7 @@ class TestNoSliceVar(TranspilerTest):
def setUp(self): def setUp(self):
super(TestNoSliceVar, self).setUp() super(TestNoSliceVar, self).setUp()
def test_transpiler(self): def transpiler_test_impl(self):
config = fluid.DistributeTranspilerConfig() config = fluid.DistributeTranspilerConfig()
config.slice_var_up = False config.slice_var_up = False
...@@ -212,7 +221,7 @@ class TestLRDecay(TranspilerTest): ...@@ -212,7 +221,7 @@ class TestLRDecay(TranspilerTest):
sgd_optimizer.minimize(avg_cost) sgd_optimizer.minimize(avg_cost)
return return
def test_transpiler(self): def transpiler_test_impl(self):
pserver, startup = self.get_pserver(self.pserver1_ep) pserver, startup = self.get_pserver(self.pserver1_ep)
trainer = self.get_trainer() trainer = self.get_trainer()
...@@ -242,7 +251,7 @@ class TestLRDecayConditional(TranspilerTest): ...@@ -242,7 +251,7 @@ class TestLRDecayConditional(TranspilerTest):
sgd_optimizer.minimize(avg_cost) sgd_optimizer.minimize(avg_cost)
return return
def test_transpiler(self): def transpiler_test_impl(self):
pserver, startup = self.get_pserver(self.pserver1_ep) pserver, startup = self.get_pserver(self.pserver1_ep)
trainer = self.get_trainer() trainer = self.get_trainer()
...@@ -291,7 +300,7 @@ class TestL2Decay(TranspilerTest): ...@@ -291,7 +300,7 @@ class TestL2Decay(TranspilerTest):
sgd_optimizer.minimize(avg_cost) sgd_optimizer.minimize(avg_cost)
return return
def test_transpiler(self): def transpiler_test_impl(self):
pserver, startup = self.get_pserver(self.pserver1_ep) pserver, startup = self.get_pserver(self.pserver1_ep)
trainer = self.get_trainer() trainer = self.get_trainer()
...@@ -326,7 +335,7 @@ class TestL2DecayWithPiecewise(TranspilerTest): ...@@ -326,7 +335,7 @@ class TestL2DecayWithPiecewise(TranspilerTest):
sgd_optimizer.minimize(avg_cost) sgd_optimizer.minimize(avg_cost)
return return
def test_transpiler(self): def transpiler_test_impl(self):
pserver, startup = self.get_pserver(self.pserver1_ep) pserver, startup = self.get_pserver(self.pserver1_ep)
trainer = self.get_trainer() trainer = self.get_trainer()
......
...@@ -27,12 +27,13 @@ class TestConstantInitializer(unittest.TestCase): ...@@ -27,12 +27,13 @@ class TestConstantInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.ConstantInitializer()) name="param",
initializer=initializer.ConstantInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'fill_constant') self.assertEqual(init_op.type, 'fill_constant')
...@@ -43,12 +44,13 @@ class TestConstantInitializer(unittest.TestCase): ...@@ -43,12 +44,13 @@ class TestConstantInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.ConstantInitializer(2.3)) name="param",
initializer=initializer.ConstantInitializer(2.3))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'fill_constant') self.assertEqual(init_op.type, 'fill_constant')
...@@ -61,12 +63,13 @@ class TestUniformInitializer(unittest.TestCase): ...@@ -61,12 +63,13 @@ class TestUniformInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.UniformInitializer()) name="param",
initializer=initializer.UniformInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -80,18 +83,19 @@ class TestUniformInitializer(unittest.TestCase): ...@@ -80,18 +83,19 @@ class TestUniformInitializer(unittest.TestCase):
program = framework.Program() program = framework.Program()
program.random_seed = 123 program.random_seed = 123
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.UniformInitializer()) name="param1",
block.create_parameter( initializer=initializer.UniformInitializer())
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.UniformInitializer(seed=456)) name="param2",
initializer=initializer.UniformInitializer(seed=456))
init_op = block.ops[1] init_op = block.ops[1]
self.assertEqual(init_op.attr("seed"), 123) self.assertEqual(init_op.attr("seed"), 123)
init_op1 = block.ops[0] init_op1 = block.ops[0]
...@@ -102,12 +106,13 @@ class TestUniformInitializer(unittest.TestCase): ...@@ -102,12 +106,13 @@ class TestUniformInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.UniformInitializer(-4.2, 3.1, 123)) name="param",
initializer=initializer.UniformInitializer(-4.2, 3.1, 123))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -115,6 +120,25 @@ class TestUniformInitializer(unittest.TestCase): ...@@ -115,6 +120,25 @@ class TestUniformInitializer(unittest.TestCase):
self.assertAlmostEqual(init_op.attr('max'), 3.1, delta=DELTA) self.assertAlmostEqual(init_op.attr('max'), 3.1, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 123) self.assertEqual(init_op.attr('seed'), 123)
def test_uniform_initializer_two_op(self):
"""Test uniform initializer with supplied attributes
"""
program = framework.Program()
block = program.global_block()
for i in range(2):
block.create_parameter(
dtype="float32",
shape=[5, 10],
lod_level=0,
name="param",
initializer=initializer.UniformInitializer(-4.2, float(i), 123))
self.assertEqual(len(block.ops), 1)
init_op0 = block.ops[0]
self.assertEqual(init_op0.type, 'uniform_random')
self.assertAlmostEqual(init_op0.attr('min'), -4.2, delta=DELTA)
self.assertAlmostEqual(init_op0.attr('max'), 0.0, delta=DELTA)
self.assertEqual(init_op0.attr('seed'), 123)
class TestNormalInitializer(unittest.TestCase): class TestNormalInitializer(unittest.TestCase):
def test_normal_initializer_default_value(self): def test_normal_initializer_default_value(self):
...@@ -122,12 +146,13 @@ class TestNormalInitializer(unittest.TestCase): ...@@ -122,12 +146,13 @@ class TestNormalInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.NormalInitializer()) name="param",
initializer=initializer.NormalInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -140,12 +165,13 @@ class TestNormalInitializer(unittest.TestCase): ...@@ -140,12 +165,13 @@ class TestNormalInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.NormalInitializer(2.3, 1.9, 123)) name="param",
initializer=initializer.NormalInitializer(2.3, 1.9, 123))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -161,12 +187,13 @@ class TestXavierInitializer(unittest.TestCase): ...@@ -161,12 +187,13 @@ class TestXavierInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.XavierInitializer()) name="param",
initializer=initializer.XavierInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -181,12 +208,13 @@ class TestXavierInitializer(unittest.TestCase): ...@@ -181,12 +208,13 @@ class TestXavierInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10, 15, 20], dtype="float32",
lod_level=0, shape=[5, 10, 15, 20],
name="param", lod_level=0,
initializer=initializer.XavierInitializer()) name="param",
initializer=initializer.XavierInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -203,12 +231,13 @@ class TestXavierInitializer(unittest.TestCase): ...@@ -203,12 +231,13 @@ class TestXavierInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.XavierInitializer(uniform=False)) name="param",
initializer=initializer.XavierInitializer(uniform=False))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -223,12 +252,13 @@ class TestXavierInitializer(unittest.TestCase): ...@@ -223,12 +252,13 @@ class TestXavierInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10, 15, 20], dtype="float32",
lod_level=0, shape=[5, 10, 15, 20],
name="param", lod_level=0,
initializer=initializer.XavierInitializer(uniform=False)) name="param",
initializer=initializer.XavierInitializer(uniform=False))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -244,13 +274,14 @@ class TestXavierInitializer(unittest.TestCase): ...@@ -244,13 +274,14 @@ class TestXavierInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.XavierInitializer( name="param",
fan_in=12, fan_out=23, seed=134)) initializer=initializer.XavierInitializer(
fan_in=12, fan_out=23, seed=134))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -267,12 +298,13 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -267,12 +298,13 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.MSRAInitializer()) name="param",
initializer=initializer.MSRAInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -287,12 +319,13 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -287,12 +319,13 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10, 15, 20], dtype="float32",
lod_level=0, shape=[5, 10, 15, 20],
name="param", lod_level=0,
initializer=initializer.MSRAInitializer()) name="param",
initializer=initializer.MSRAInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -308,12 +341,13 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -308,12 +341,13 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.MSRAInitializer(uniform=False)) name="param",
initializer=initializer.MSRAInitializer(uniform=False))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -328,12 +362,13 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -328,12 +362,13 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
param = block.create_parameter( for _ in range(2):
dtype="float32", param = block.create_parameter(
shape=[5, 10, 15, 20], dtype="float32",
lod_level=0, shape=[5, 10, 15, 20],
name="param", lod_level=0,
initializer=initializer.MSRAInitializer(uniform=False)) name="param",
initializer=initializer.MSRAInitializer(uniform=False))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random') self.assertEqual(init_op.type, 'gaussian_random')
...@@ -348,13 +383,14 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -348,13 +383,14 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[5, 10], dtype="float32",
lod_level=0, shape=[5, 10],
name="param", lod_level=0,
initializer=initializer.MSRAInitializer( name="param",
fan_in=12, seed=134)) initializer=initializer.MSRAInitializer(
fan_in=12, seed=134))
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random') self.assertEqual(init_op.type, 'uniform_random')
...@@ -370,12 +406,13 @@ class TestMSRAInitializer(unittest.TestCase): ...@@ -370,12 +406,13 @@ class TestMSRAInitializer(unittest.TestCase):
""" """
program = framework.Program() program = framework.Program()
block = program.global_block() block = program.global_block()
block.create_parameter( for _ in range(2):
dtype="float32", block.create_parameter(
shape=[8, 1, 3, 3], dtype="float32",
lod_level=0, shape=[8, 1, 3, 3],
name="param", lod_level=0,
initializer=initializer.BilinearInitializer()) name="param",
initializer=initializer.BilinearInitializer())
self.assertEqual(len(block.ops), 1) self.assertEqual(len(block.ops), 1)
init_op = block.ops[0] init_op = block.ops[0]
self.assertEqual(init_op.type, 'assign_value') self.assertEqual(init_op.type, 'assign_value')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册