如何将两个独立的数据加载器一起使用



我有两个形状为(16384,3,224,224)的张量。我需要把这两者相乘。显然,这两个张量太大了,无法放入GPU ram。所以我想知道,我应该如何进行,使用切片将它们分成更小的批次,还是应该使用两个单独的数据加载器?(我很困惑,如何将两个不同的数据加载器一起使用(最好的方法是什么?

我仍然不确定我是否完全理解这个问题,但假设RAM中已经加载了两个形状为[16384, 3, 224, 224]的大张量t1t2,并且想要执行元素乘法,那么最简单的方法是

result = t1 * t2

或者,你可以把它们分解成更小的张量,然后用这种方式相乘。有很多方法可以做到这一点。

一种非常类似PyTorch的方法是使用张量数据集并对两个张量的相应小批量进行操作。如果你只想做元素乘法,那么在GPU之间传输张量的开销可能比计算过程中节省的实际时间更昂贵。如果你想尝试一下,你可以使用类似的东西

import torch
from torch.utils import data
batch_size = 100
device = 'cuda:0'
dataset = data.TensorDataset(t1, t2)
dataloader = data.DataLoader(dataset, num_workers=1, batch_size=batch_size)
result = []
for d1, d2 in dataloader:
d1, d2 = d1.to(device=device), d2.to(device=device)
d12 = d1 * d2
result.append(d12.cpu())
result = torch.cat(result, dim=0)

或者你可以只做一些切片,这可能会更快、更高效,因为它避免了CPU端的数据复制。

import torch
batch_size = 100
device = 'cuda:0'
index = 0
result = []
while index < t1.shape[0]:
d1 = t1[index:index + batch_size].to(device=device)
d2 = t2[index:index + batch_size].to(device=device)
d12 = d1 * d2
result.append(d12.cpu())
index += batch_size
result = torch.cat(result, dim=0)

请注意,对于这两个示例,大部分时间都用于将数据复制回CPU并连接最终结果。理想情况下,您只需要在循环中对d12批处理执行任何需要执行的操作,并避免将最终的相乘结果发送回CPU。

最新更新