Как поместить наборы данных, созданные torchvision.datasets в GPU, в одну операцию? - PullRequest
0 голосов
/ 14 января 2019

Я имею дело с CIFAR10 и использую torchvision.datasets для его создания. Мне нужен графический процессор для ускорения вычислений, но я не могу найти способ поместить весь набор данных в графический процессор за один раз. В моей модели нужно использовать мини-партии, и на каждую партию уходит много времени.

Я пытался поместить каждую мини-серию в графический процессор отдельно, но это кажется очень трудоемким.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

TL; DR

Вы не сэкономите время, перемещая весь набор данных одновременно.


Не думаю, что вы обязательно захотите это сделать, даже если у вас есть память 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

Для num_workers = 1 вот что я получил: Serial Processing Cast Times

И если мы попробуем параллельную загрузку (num_workers = 8), это станет еще понятнее: enter image description here

0 голосов
/ 14 января 2019

У меня есть ответ, и я попробую его позже. Это выглядит многообещающе.

Вы можете написать класс набора данных, в котором в функции init вы красите весь набор данных и применяете все необходимые преобразования и преобразуете их в тензорный формат. Затем отправьте этот тензор в GPU (при условии, что памяти достаточно). Затем в функции getitem вы можете просто использовать индекс для извлечения элементов этого тензора, который уже находится в графическом процессоре.

...