3

我正在处理 CIFAR10,我使用 torchvision.datasets 来创建它。我需要 GPU 来加速计算,但我找不到将整个数据集一次性放入 GPU 的方法。我的模型需要使用小批量,单独处理每个批次确实非常耗时。

我尝试将每个 mini-batch 分别放入 GPU 中,但这似乎非常耗时。

4

2 回答 2

1

TL;博士

一次移动整个数据集不会节省时间。


即使您有 GPU 内存来处理整个数据集,我认为您不一定要这样做(当然,按照今天的标准,CIFAR10 很小)。

我尝试了各种批量大小,并将传输到 GPU 的时间安排如下:

num_workers = 1 # Set this as needed

def time_gpu_cast(batch_size=1):
    start_time = time()
    for x, y in DataLoader(dataset, batch_size, num_workers=num_workers):
        x.cuda(); y.cuda()
    return time() - start_time

# Try various batch sizes
cast_times = [(2 ** bs, time_gpu_cast(2 ** bs)) for bs in range(15)]
# Try the entire dataset like you want to do
cast_times.append((len(dataset), time_gpu_cast(len(dataset))))

plot(*zip(*cast_times)) # Plot the time taken

对于num_workers = 1,这就是我得到的: 串行处理投射时间

如果我们尝试并行加载(num_workers = 8),它会变得更加清晰: 在此处输入图像描述

于 2019-01-14T12:34:59.477 回答
0

我有答案,我稍后会尝试。看起来很有希望。

您可以编写一个数据集类,在init函数中,您将整个数据集变红并应用您需要的所有转换,并将它们转换为张量格式。然后,将此张量发送到 GPU(假设有足够的内存)。然后,在getitem函数中,您可以简单地使用索引来检索已经在 GPU 上的该张量的元素。

于 2019-01-14T01:50:46.140 回答