From 1f9a5d8f92d8e9c385dd4b95b4981424370c77d0 Mon Sep 17 00:00:00 2001 From: Aganlengzi Date: Thu, 9 Dec 2021 15:47:43 +0800 Subject: [PATCH] fix LoDTensorArray crash in Debug mode build (#37954) --- paddle/fluid/pybind/reader_py.cc | 3 +++ python/paddle/fluid/dataloader/dataloader_iter.py | 4 ++++ python/paddle/fluid/reader.py | 5 ++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/paddle/fluid/pybind/reader_py.cc b/paddle/fluid/pybind/reader_py.cc index 60b99a964a5..d4fa1b2c89a 100644 --- a/paddle/fluid/pybind/reader_py.cc +++ b/paddle/fluid/pybind/reader_py.cc @@ -37,6 +37,9 @@ PADDLE_DEFINE_EXPORTED_bool( "If set true, the queue.pop will only get data from queue but not " "remove the data from queue for speed testing"); +// disable auto conversion to list in Python +PYBIND11_MAKE_OPAQUE(paddle::framework::LoDTensorArray); + namespace paddle { namespace pybind { diff --git a/python/paddle/fluid/dataloader/dataloader_iter.py b/python/paddle/fluid/dataloader/dataloader_iter.py index d8cb3e0918d..10a93586129 100644 --- a/python/paddle/fluid/dataloader/dataloader_iter.py +++ b/python/paddle/fluid/dataloader/dataloader_iter.py @@ -273,6 +273,8 @@ class _DataLoaderIterSingleProcess(_DataLoaderIterBase): else: if self._return_list: data = self._reader.read_next_list() + for i in range(len(data)): + data[i] = data[i]._move_to_list() data = [ _restore_batch(d, s) for d, s in zip(data, self._structure_infos[:len( @@ -718,6 +720,8 @@ class _DataLoaderIterMultiProcess(_DataLoaderIterBase): else: if self._return_list: data = self._reader.read_next_list() + for i in range(len(data)): + data[i] = data[i]._move_to_list() data = [ _restore_batch(d, s) for d, s in zip(data, self._structure_infos[:len( diff --git a/python/paddle/fluid/reader.py b/python/paddle/fluid/reader.py index dfc887292e7..83ccd1051bb 100644 --- a/python/paddle/fluid/reader.py +++ b/python/paddle/fluid/reader.py @@ -1254,7 +1254,10 @@ class GeneratorLoader(DataLoaderBase): def __next__(self): try: if self._return_list: - return self._reader.read_next_list() + data = self._reader.read_next_list() + for i in range(len(data)): + data[i] = data[i]._move_to_list() + return data else: return self._reader.read_next() except StopIteration: -- GitLab