Я все еще не уверен, что полностью понимаю проблему, но при условии, что у вас уже есть два больших тензора t1
и t2
формы [16384, 3, 224, 224]
, уже загруженных в ОЗУ, и вы хотите выполнить поэлементное умножение, затем самый простой подход -
result = t1 * t2
В качестве альтернативы вы можете разбить их на меньшие тензоры и умножить их таким образом. Есть много способов сделать это.
Один очень похожий на PyTorch способ - это использовать TensorDataset и работать с соответствующими мини-пакетами обоих тензоров. Если все, что вы хотите сделать, это поэлементное умножение, то затраты на перенос тензоров в и из графического процессора, вероятно, дороже, чем фактическое время, сэкономленное во время вычислений. Если вы хотите попробовать это, вы можете использовать что-то вроде этого
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)
Или вы можете просто сделать нарезку, которая, вероятно, будет быстрее и более эффективно использует память, поскольку позволяет избежать копирования данных на стороне процессора.
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)
Обратите внимание, что в обоих этих примерах большая часть времени уходит на копирование данных обратно в ЦП и объединение окончательных результатов. В идеале вы просто должны делать все, что вам нужно сделать с пакетом d12
внутри l oop и избегать отправки окончательного умноженного результата обратно в ЦП.