提交 2412f2f4 编写于 作者: Y Yang Yu

Polish Unittest for ParallelFor

上级 52ed1038
...@@ -12,9 +12,34 @@ class BaseParallelForTest(unittest.TestCase): ...@@ -12,9 +12,34 @@ class BaseParallelForTest(unittest.TestCase):
fetch=fetch, fetch=fetch,
place=cpu, place=cpu,
use_parallel=False) use_parallel=False)
print result_cpu result_cpu_parallel = self._main_impl_(
callback=callback,
feed=feed,
fetch=fetch,
place=cpu,
use_parallel=True)
if fluid.core.is_compile_gpu():
gpu = fluid.CUDAPlace(0)
result_gpu = self._main_impl_(
callback=callback,
feed=feed,
fetch=fetch,
place=gpu,
use_parallel=False)
result_gpu_parallel = self._main_impl_(
callback=callback,
feed=feed,
fetch=fetch,
place=gpu,
use_parallel=True)
self._assert_same_(fetch, result_cpu, result_cpu_parallel,
result_gpu, result_gpu_parallel)
else:
self._assert_same_(fetch, result_cpu, result_cpu_parallel)
def _main_impl_(self, callback, feed, fetch, place, use_parallel=False): def _main_impl_(self, callback, feed, fetch, place, use_parallel=False):
if isinstance(fetch, basestring):
fetch = [fetch]
main = fluid.Program() main = fluid.Program()
startup = fluid.Program() startup = fluid.Program()
# Fix seed # Fix seed
...@@ -31,20 +56,19 @@ class BaseParallelForTest(unittest.TestCase): ...@@ -31,20 +56,19 @@ class BaseParallelForTest(unittest.TestCase):
if isinstance(data, fluid.Variable): if isinstance(data, fluid.Variable):
data = [data] data = [data]
with pd.do(): with pd.do():
ins = map(pd.read_input, data) ins = map(pd.read_input, data)
if len(ins) == 1: if len(ins) == 1:
ins = ins[0] ins = ins[0]
generator.send(ins) # patch input loss = generator.send(ins) # patch input
loss = next(generator)
pd.write_output(loss) pd.write_output(loss)
loss = pd() loss = pd()
else: else:
data = next(generator) data = next(generator)
generator.send(data) loss = generator.send(data)
loss = next(generator) self.assertIsNotNone(loss)
avg_loss = fluid.layers.mean(x=loss) avg_loss = fluid.layers.mean(x=loss)
fluid.backward.append_backward(loss=avg_loss) fluid.backward.append_backward(loss=avg_loss)
...@@ -52,11 +76,25 @@ class BaseParallelForTest(unittest.TestCase): ...@@ -52,11 +76,25 @@ class BaseParallelForTest(unittest.TestCase):
exe.run(startup) exe.run(startup)
return exe.run(main, feed=feed, fetch_list=fetch) return exe.run(main, feed=feed, fetch_list=fetch)
def _assert_same_(self, fetch, *args):
def _impl_(a, b, fetch_id, item_id):
item_str = ['CPU', 'ParallelCPU', 'GPU', 'ParallelGPU']
flag = numpy.allclose(a, b, rtol=0.1)
self.assertTrue(flag, "The {0} are different in {1}".format(
fetch[fetch_id], item_str[item_id]))
for i, items in enumerate(zip(*args)):
self.assertGreater(len(items), 0)
for j in range(1, len(items)):
_impl_(items[0], items[j], fetch_id=i, item_id=j)
class ParallelOpTest(BaseParallelForTest): class ParallelOpTest(BaseParallelForTest):
def test_simple_fc(self): def test_simple_fc(self):
def __network__(): def __network__():
x = fluid.layers.data(shape=[784], dtype='float32', name='img') x = fluid.layers.data(shape=[784], dtype='float32', name='img')
# FIXME: This is a bug of parallel.do
x.stop_gradient = False
x = yield x x = yield x
hidden = fluid.layers.fc(input=x, size=200, param_attr='fc1.w') hidden = fluid.layers.fc(input=x, size=200, param_attr='fc1.w')
loss = fluid.layers.mean(x=hidden) loss = fluid.layers.mean(x=hidden)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册