Следующий метод загрузчика данных факела при использовании нескольких рабочих процессовPython

Программы на Python
Anonymous
Следующий метод загрузчика данных факела при использовании нескольких рабочих процессов

Сообщение Anonymous »

У меня есть набор данных, основанный на IterableDataSet, который выглядит вот так

Код: Выделить всё

class MyDataSet(torch.utils.data.IterableDataset):
def __init__(self):
# doing init stuff here
def __iter__(self):
# infinite loop here, creating random pictures
# each worker using slightly different input
while True:
# search picture
yield picture
Поиск изображения может занять довольно много времени. Поэтому я хотел бы использовать несколько работников. Я создаю загрузчик данных, использующий набор данных следующим образом.

Код: Выделить всё

loader = torch.utils.data.Dataloader(mydataset_instance, num_workers=4)
my_iter = iter(loader)
Я предполагал, что загрузчик запускает в фоновом режиме несколько рабочих (демонов), каждый из которых выполняет свой собственный неопределенный цикл поиска и получения изображений. Каждый вызов next(my_iter) должен быстро возвращать следующий пакет. Насколько я понимаю, рабочие постоянно выдают изображения, а загрузчик данных создает пакеты и буферизует их.
Но, похоже, это не так. Вместо этого мне кажется, что только когда вызывается next(my_iter), загрузчик данных фактически начинает опрашивать данные из набора данных. Это занимает довольно много времени.
Почему я пришел к такому выводу?
Я рассчитал время создания данных загрузчиком с двумя рабочими процессами с помощью:

Код: Выделить всё

import time
for i in range(10):
tick = time.perf_counter()
next(my_iter)
tock = time.perf_counter()
print(tock-tick)
Он выдает такие тайминги:

Код: Выделить всё

iteration 1 - 3s
iteration 2 - 0.001s
iteration 3 - 3s
iteration 4 - 0.001s
iteration 5 - 3s
Он демонстрирует странное поведение в зависимости от количества рабочих.
Однако, если я напишу свой собственный загрузчик данных, используя несколько изображений опроса многопроцессорных процессов, буферизуя их и возвращая пакеты без какого-либо наследования факела, я получаю следующее время

Код: Выделить всё

iteration 1 - 0.2s
iteration 2 - 0.2s
iteration 3 - 0.2s
iteration 4 - 0.2s
iteration 5 - 0.2
Гораздо быстрее и всегда прибл. одинаковое потребление времени.
Может ли кто-нибудь объяснить такое поведение и указать на мое непонимание загрузчиков данных?

Подробнее здесь: https://stackoverflow.com/questions/798 ... le-workers

Вернуться в «Python»