同时读取同一PyTorch torchvision.datasets对象

问题描述

请考虑以下代码,以从torchvision.datasets获取用于训练的数据集并为其创建一个DataLoader

import torch
from torchvision import datasets,transforms

training_set_mnist = datasets.MNIST('./mnist_data',train=True,download=True)
train_loader_mnist = torch.utils.data.DataLoader(training_set_mnist,batch_size=128,shuffle=True)

假设有几个Python进程可以访问文件./mnist_data并同时执行上述代码;在我的情况下,每个进程都是群集上的不同机器,数据集存储在每个人都可以访问的NFS位置。您可能还假设数据已经下载到此文件夹中,因此download=True应该无效。而且,每个过程都可以使用torch.manual_seed()设置的不同种子。

我想知道PyTorch是否允许这种情况。我主要关心的是上面的代码是否可以更改./mnist_data中的数据文件夹或文件,以便如果由多个进程运行,则可能导致意外行为或其他问题。同样,考虑到shuffle=True,我希望如果2个或更多进程尝试创建DataLoader,则假定种子是不同的,则每个进程都会得到不同的数据改组。这是真的吗?

解决方法

我主要关心的是上面的代码是否可以更改数据文件夹 或./mnist_data中的文件,以便如果由多个进程运行,则可以 可能导致意外行为或其他问题。

您会很好的,因为进程仅读取数据,而不进行修改(对于tensors,将数据MNIST加载到RAM中)。请注意,进程不共享内存地址,因此带有数据的tensor将被加载多次(对于MNIST来说这不是一个大问题)。>

此外,考虑到shuffle=True,如果大于等于2, 进程尝试创建DataLoader,每个进程都会获得一个 假设种子不同,数据的改组也不同。

shuffle=True 与数据本身无关。它的作用是得到所提供的__len__()中的dataset,形成一个范围[0,__len__()),并且此范围被改组并用于索引dataset的{​​{1}}。请查看this section,以获取有关__getitem__的更多信息。