Я использую модуль multiprocessing
в Python для параллельного обучения нейронных сетей с keras
, используя объект Pool(processes = 4)
с imap
. Это неуклонно использует все больше и больше памяти после каждого «цикла», то есть каждые 4 процесса, пока, наконец, не произойдет сбой.
Я использовал модуль memory_profiler
для отслеживания использования памяти с течением времени, обучив 12 сетей. Здесь используется ванильный imap
:
Если я поставлю maxtasksperchild = 1
в Pool
:
Если я использую imap(chunksize = 3)
:
В последнем случае, когда все работает нормально, я отправляю только один пакет каждому процессу в пуле, поэтому кажется, что проблема в том, что процессы несут информацию о предыдущих пакетах. Если да, могу ли я заставить пул не делать этого?
Несмотря на то, что решение с кусками работает, я бы предпочел не использовать его, потому что
- Я хотел бы отслеживать прогресс с помощью модуля
tqdm
, и в случае блоков он будет обновляться только после каждого блока, что фактически означает, что он вообще ничего не будет отслеживать, так как все блоки заканчиваются одновременно (в этом пример) - В настоящее время для обучения всех сетей требуется одинаковое время, но я хотел бы включить возможность их отдельного времени обучения, когда решение для фрагментов потенциально может привести к тому, что один процесс получит все длительное время обучения.
Вот фрагмент кода в ванильном случае. В двух других случаях я просто изменил параметр maxtasksperchild
в Pool
и параметр chunksize
в imap
:
def train_network(network):
(...)
return score
pool = Pool(processes = 4)
scores = pool.imap(train_network, networks)
scores = tqdm(scores, total = networks.size)
for (network, score) in zip(networks, scores):
network.score = score
pool.close()
pool.join()
tensorflow-graph
после каждого цикла? Это известная ошибка, связанная с повторным обучениемkeras
-моделей (см., например, здесь< /а>). Однако я не знаю, так ли это в случае многопроцессорности. - person Markus   schedule 02.09.2019