Как поместить наборы данных, созданные torchvision.datasets в GPU, в одну операцию?

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

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

2 ответа

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 вот что я получил:

И если мы попробуем параллельную загрузку (num_workers = 8) становится еще понятнее

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

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

Другие вопросы по тегам