Как использовать два отдельных загрузчика данных вместе? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть два тензора формы (16384,3,224,224) каждый. Мне нужно умножить эти два вместе. Очевидно, что эти два тензора слишком велики, чтобы поместиться в ОЗУ графического процессора. Итак, я хочу знать, как я должен go об этом разделить их на более мелкие партии, используя нарезку, или я должен использовать два отдельных загрузчика данных? это? * * 1002

1 Ответ

1 голос
/ 03 мая 2020

Я все еще не уверен, что полностью понимаю проблему, но при условии, что у вас уже есть два больших тензора 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 и избегать отправки окончательного умноженного результата обратно в ЦП.

...