【发布时间】:2021-07-14 18:27:58
【问题描述】:
在 PyTorch/Numpy 中有一个 bug,当与 DataLoader 并行加载批次时(即设置 num_workers > 1),每个工作人员使用相同的 NumPy 随机种子,导致应用的任何随机函数都是在并行批次中相同。
小例子:
import numpy as np
from torch.utils.data import Dataset, DataLoader
class RandomDataset(Dataset):
def __getitem__(self, index):
return np.random.randint(0, 1000, 2)
def __len__(self):
return 9
dataset = RandomDataset()
dataloader = DataLoader(dataset, batch_size=1, num_workers=3)
for batch in dataloader:
print(batch)
如您所见,对于每个并行化的批次集 (3),结果是相同的:
# First 3 batches
tensor([[891, 674]])
tensor([[891, 674]])
tensor([[891, 674]])
# Second 3 batches
tensor([[545, 977]])
tensor([[545, 977]])
tensor([[545, 977]])
# Third 3 batches
tensor([[880, 688]])
tensor([[880, 688]])
tensor([[880, 688]])
解决此问题的推荐/最优雅的方法是什么?即让每批产生不同的随机化,而不管工人的数量。
【问题讨论】:
标签: python numpy parallel-processing pytorch dataloader