Следующий метод загрузчика данных факела при использовании нескольких рабочих процессов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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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