我正在处理 CIFAR10,我使用 torchvision.datasets 来创建它。我需要 GPU 来加速计算,但我找不到将整个数据集一次性放入 GPU 的方法。我的模型需要使用小批量,单独处理每个批次确实非常耗时。
我尝试将每个 mini-batch 分别放入 GPU 中,但这似乎非常耗时。
我正在处理 CIFAR10,我使用 torchvision.datasets 来创建它。我需要 GPU 来加速计算,但我找不到将整个数据集一次性放入 GPU 的方法。我的模型需要使用小批量,单独处理每个批次确实非常耗时。
我尝试将每个 mini-batch 分别放入 GPU 中,但这似乎非常耗时。
一次移动整个数据集不会节省时间。
即使您有 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
我有答案,我稍后会尝试。看起来很有希望。
您可以编写一个数据集类,在init函数中,您将整个数据集变红并应用您需要的所有转换,并将它们转换为张量格式。然后,将此张量发送到 GPU(假设有足够的内存)。然后,在getitem函数中,您可以简单地使用索引来检索已经在 GPU 上的该张量的元素。