我仍然不确定我是否完全理解这个问题,但假设你有两个大张量 t1 和 t2 形状 [16384, 3, 224, 224] 已经加载到 RAM 中,然后想要执行逐元素乘法最简单的方法是
result = t1 * t2
或者,您可以将它们分解为更小的张量并以这种方式相乘。有很多方法可以做到这一点。
一种非常类似于 PyTorch 的方式是使用 TensorDataset 并对两个张量的相应小批量进行操作。如果您要做的只是逐元素乘法,那么将张量传入和传出 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。