Код: Выделить всё
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), загрузчик данных фактически начинает опрашивать данные из набора данных. Это занимает довольно много времени.
Почему я пришел к такому выводу?
Я рассчитал время создания данных загрузчиком с двумя рабочими процессами с помощью:
Код: Выделить всё
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
Мобильная версия