В Keras
API есть возможность использовать Sequence
для создания мини-пакетов в многопроцессорном режиме.Тем не менее, генерация одной мини-партии остается единым процессом: то есть необходимо циклически проходить по фиксированному набору примеров (размером BATCH_SIZE
) по одному, выполнять при необходимости увеличение данных и заполнять входные и выходные тензоры.последовательно.Я пытаюсь сделать этот шаг, используя несколько работников, где: каждый работник загружает изображение и выполняет увеличение.На игрушечном примере (здесь не показан), многопроцессный подход занимает около половины времени циклического подхода для создания одной мини-партии.
Я хочу найти лучший подход, чем глобальная переменная, дляобмениваться данными между различными процессами.Ниже приведен пример с игрушкой:
from pathos.multiprocessing import ProcessingPool as Pool
import time
VALUES = range(10000)
class BlockingMap:
def __init__(self):
pass
def square(self, idx):
item = VALUES[idx]
return item * item
def run(self, list_ids):
pool = Pool()
result = pool.map(self.square, list_ids)
pool.close()
return result
if __name__ == '__main__':
BATCH_SZ = 32
batch_id = 0
list_ids = VALUES[batch_id * BATCH_SZ:(batch_id + 1) * BATCH_SZ]
mm = BlockingMap()
init = time.time()
res = mm.run(list_ids)
print("Elapsed Time Blocking Map ", time.time() - init)
print("Examples {} | Valid {}".format(BATCH_SZ, res))