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

Simultaneous reads of the same PyTorch torchvision.datasets object

考虑以下代码,从 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 假设种子不同,则每个进程都会对数据进行不同的改组。这是真的吗?

My main concern is whether the above code can change the data folders or files in ./mnist_data such that if ran by multiple processes it can potentially lead to unexpected behavior or other issues.

你会没事的,因为进程只读取数据,而不是修改(在 MNIST 的情况下将 tensors 和数据加载到 RAM 中)。请注意进程 共享内存地址,因此 tensor 数据将被加载多次(在 MNIST 的情况下这应该不是大问题) .

Also, given that shuffle=True I would expect that if 2 or more processes try to create the DataLoader each of them will get a different shuffling of the data assuming that the seeds are different.

shuffle=True与数据本身无关。它的作用是从提供的 dataset 中获取 __len__(),生成一个范围 [0, __len__()) 并且这个范围被打乱并用于索引 dataset__getitem__。查看 this section 了解有关 Samplers.

的更多信息