同时读取同一个 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
.
的更多信息
考虑以下代码,从 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
.