|
|
|
@ -20,6 +20,10 @@ import six
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ReaderException(Exception):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestMultiprocessReaderException(unittest.TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.use_pipe = False
|
|
|
|
@ -31,10 +35,13 @@ class TestMultiprocessReaderException(unittest.TestCase):
|
|
|
|
|
else:
|
|
|
|
|
return [fluid.CPUPlace()]
|
|
|
|
|
|
|
|
|
|
def main_impl(self, place, iterable):
|
|
|
|
|
def main_impl(self, place, iterable, use_legacy_py_reader):
|
|
|
|
|
sample_num = 40
|
|
|
|
|
batch_size = 4
|
|
|
|
|
|
|
|
|
|
def fake_reader():
|
|
|
|
|
def __impl__():
|
|
|
|
|
for _ in range(40):
|
|
|
|
|
for _ in range(sample_num):
|
|
|
|
|
if not self.raise_exception:
|
|
|
|
|
yield list(
|
|
|
|
|
np.random.uniform(
|
|
|
|
@ -45,37 +52,54 @@ class TestMultiprocessReaderException(unittest.TestCase):
|
|
|
|
|
return __impl__
|
|
|
|
|
|
|
|
|
|
with fluid.program_guard(fluid.Program(), fluid.Program()):
|
|
|
|
|
image = fluid.layers.data(name='image', dtype='float32', shape=[10])
|
|
|
|
|
if not use_legacy_py_reader:
|
|
|
|
|
image = fluid.data(
|
|
|
|
|
name='image', dtype='float32', shape=[None, 10])
|
|
|
|
|
|
|
|
|
|
reader = fluid.io.PyReader(
|
|
|
|
|
feed_list=[image], capacity=2, iterable=iterable)
|
|
|
|
|
reader = fluid.io.PyReader(
|
|
|
|
|
feed_list=[image], capacity=2, iterable=iterable)
|
|
|
|
|
else:
|
|
|
|
|
reader = fluid.layers.py_reader(
|
|
|
|
|
capacity=2, shapes=[[-1, 10], ], dtypes=['float32', ])
|
|
|
|
|
image = fluid.layers.read_file(reader)
|
|
|
|
|
|
|
|
|
|
image_p_1 = image + 1
|
|
|
|
|
|
|
|
|
|
decorated_reader = multiprocess_reader(
|
|
|
|
|
[fake_reader(), fake_reader()], use_pipe=self.use_pipe)
|
|
|
|
|
|
|
|
|
|
if isinstance(place, fluid.CUDAPlace):
|
|
|
|
|
reader.decorate_sample_generator(
|
|
|
|
|
decorated_reader, batch_size=4, places=fluid.cuda_places())
|
|
|
|
|
if use_legacy_py_reader:
|
|
|
|
|
reader.decorate_paddle_reader(
|
|
|
|
|
fluid.io.batch(
|
|
|
|
|
decorated_reader, batch_size=batch_size))
|
|
|
|
|
else:
|
|
|
|
|
reader.decorate_sample_generator(
|
|
|
|
|
decorated_reader, batch_size=4, places=fluid.cpu_places())
|
|
|
|
|
if isinstance(place, fluid.CUDAPlace):
|
|
|
|
|
reader.decorate_sample_generator(
|
|
|
|
|
decorated_reader,
|
|
|
|
|
batch_size=batch_size,
|
|
|
|
|
places=fluid.cuda_places())
|
|
|
|
|
else:
|
|
|
|
|
reader.decorate_sample_generator(
|
|
|
|
|
decorated_reader,
|
|
|
|
|
batch_size=batch_size,
|
|
|
|
|
places=fluid.cpu_places())
|
|
|
|
|
|
|
|
|
|
exe = fluid.Executor(place)
|
|
|
|
|
exe.run(fluid.default_startup_program())
|
|
|
|
|
|
|
|
|
|
batch_num = int(sample_num * 2 / batch_size)
|
|
|
|
|
|
|
|
|
|
if iterable:
|
|
|
|
|
for _ in range(3):
|
|
|
|
|
num = 0
|
|
|
|
|
for data in reader():
|
|
|
|
|
exe.run(feed=data, fetch_list=[image_p_1])
|
|
|
|
|
num += 1
|
|
|
|
|
if not self.raise_exception:
|
|
|
|
|
self.assertEquals(num, 20)
|
|
|
|
|
else:
|
|
|
|
|
try:
|
|
|
|
|
for data in reader():
|
|
|
|
|
exe.run(feed=data, fetch_list=[image_p_1])
|
|
|
|
|
num += 1
|
|
|
|
|
self.assertEquals(num, batch_num)
|
|
|
|
|
except fluid.core.EnforceNotMet as ex:
|
|
|
|
|
self.assertEquals(num, 0)
|
|
|
|
|
raise ValueError('Reader raises exception')
|
|
|
|
|
raise ReaderException()
|
|
|
|
|
else:
|
|
|
|
|
for _ in range(3):
|
|
|
|
|
num = 0
|
|
|
|
@ -86,22 +110,26 @@ class TestMultiprocessReaderException(unittest.TestCase):
|
|
|
|
|
num += 1
|
|
|
|
|
except fluid.core.EOFException:
|
|
|
|
|
reader.reset()
|
|
|
|
|
if not self.raise_exception:
|
|
|
|
|
self.assertEquals(num, 20)
|
|
|
|
|
else:
|
|
|
|
|
self.assertEquals(num, 0)
|
|
|
|
|
raise ValueError('Reader raises exception')
|
|
|
|
|
self.assertFalse(self.raise_exception)
|
|
|
|
|
self.assertEquals(num, batch_num)
|
|
|
|
|
except fluid.core.EnforceNotMet as ex:
|
|
|
|
|
self.assertTrue(self.raise_exception)
|
|
|
|
|
self.assertEquals(num, 0)
|
|
|
|
|
raise ReaderException()
|
|
|
|
|
|
|
|
|
|
def test_main(self):
|
|
|
|
|
for p in self.places():
|
|
|
|
|
for iterable in [False, True]:
|
|
|
|
|
try:
|
|
|
|
|
with fluid.scope_guard(fluid.Scope()):
|
|
|
|
|
self.main_impl(p, iterable)
|
|
|
|
|
use_legacy_py_reader_range = [False
|
|
|
|
|
] if iterable else [False, True]
|
|
|
|
|
for use_legacy_py_reader in use_legacy_py_reader_range:
|
|
|
|
|
try:
|
|
|
|
|
with fluid.scope_guard(fluid.Scope()):
|
|
|
|
|
self.main_impl(p, iterable, use_legacy_py_reader)
|
|
|
|
|
|
|
|
|
|
self.assertTrue(not self.raise_exception)
|
|
|
|
|
except ValueError:
|
|
|
|
|
self.assertTrue(self.raise_exception)
|
|
|
|
|
self.assertTrue(not self.raise_exception)
|
|
|
|
|
except ReaderException:
|
|
|
|
|
self.assertTrue(self.raise_exception)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TestCase1(TestMultiprocessReaderException):
|
|
|
|
|