Skip to content

Commit 2106f66

Browse files
fix the bug that _DataLoaderIterMultiProcess use time to generate the seed (#43318)
* fix the bug that _DataLoaderIterMultiProcess use time to generate the seed * use np.random.randint to generate a base seed
1 parent 403b127 commit 2106f66

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

python/paddle/fluid/dataloader/dataloader_iter.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ def __init__(self, loader):
374374
# see _try_put_indices
375375
self._thread_lock = threading.Lock()
376376

377+
self._base_seed = np.random.randint(low=0, high=sys.maxsize)
378+
377379
# init workers and indices queues and put 2 indices in each indices queue
378380
self._init_workers()
379381
for _ in range(self._outstanding_capacity):
@@ -406,7 +408,8 @@ def _init_workers(self):
406408
self._data_queue, self._workers_done_event,
407409
self._auto_collate_batch, self._collate_fn,
408410
self._drop_last, self._worker_init_fn, i,
409-
self._num_workers, self._use_shared_memory))
411+
self._num_workers, self._use_shared_memory,
412+
self._base_seed))
410413
worker.daemon = True
411414
worker.start()
412415
self._workers.append(worker)

python/paddle/fluid/dataloader/worker.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ def mix(x, y):
257257

258258
def _worker_loop(dataset, dataset_kind, indices_queue, out_queue, done_event,
259259
auto_collate_batch, collate_fn, drop_last, init_fn, worker_id,
260-
num_workers, use_shared_memory):
260+
num_workers, use_shared_memory, base_seed):
261261
try:
262262
# NOTE: [ mmap files clear ] When the child process exits unexpectedly,
263263
# some shared memory objects may have been applied for but have not yet
@@ -272,15 +272,20 @@ def _worker_loop(dataset, dataset_kind, indices_queue, out_queue, done_event,
272272
try:
273273
import numpy as np
274274
import time
275+
import random
275276
except ImportError:
276277
pass
277278
else:
278-
np.random.seed(_generate_states(int(time.time()), worker_id))
279+
seed = base_seed + worker_id
280+
random.seed(seed)
281+
paddle.seed(seed)
282+
np.random.seed(_generate_states(base_seed, worker_id))
279283

280284
global _worker_info
281285
_worker_info = WorkerInfo(id=worker_id,
282286
num_workers=num_workers,
283-
dataset=dataset)
287+
dataset=dataset,
288+
seed=base_seed)
284289

285290
init_exception = None
286291
try:

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,11 @@ def _collate_fn(sample_list):
181181
for i in range(10):
182182
indices_queue.put([i, i + 10])
183183
indices_queue.put(None)
184+
base_seed = 1234
184185
_worker_loop(loader._dataset, 0, indices_queue,
185186
loader._data_queue, loader._workers_done_event,
186187
True, _collate_fn, True, _init_fn, 0, 1,
187-
loader._use_shared_memory)
188+
loader._use_shared_memory, base_seed)
188189
self.assertTrue(False)
189190
except AssertionError:
190191
pass
@@ -223,10 +224,11 @@ def _collate_fn(sample_list):
223224
indices_queue.put([i, i + 10])
224225
indices_queue.put(None)
225226
loader._workers_done_event.set()
227+
base_seed = 1234
226228
_worker_loop(loader._dataset, 0, indices_queue,
227229
loader._data_queue, loader._workers_done_event,
228230
True, _collate_fn, True, _init_fn, 0, 1,
229-
loader._use_shared_memory)
231+
loader._use_shared_memory, base_seed)
230232
self.assertTrue(True)
231233
except AssertionError:
232234
pass

0 commit comments

Comments
 (0)