Я пытаюсь обучить сеть с использованием Keras, и у меня проблема с fit_generator
и чрезмерным использованием памяти.
В настоящее время у меня 128 ГБ ОЗУ, и мой набор данных занимает 20 ГБ (сжато). Я загружаю сжатый набор данных в ОЗУ, а затем использую генератор Sequence
, чтобы распаковать пакеты данных для подачи в сеть. Каждый из моих образцов имеет размер 100x100x100 пикселей и хранится как float32
, я использую batch_size
из 64, queue_size
из 5 и 27 рабочих с multiprocessing=True
. По идее у меня должно быть всего 100 * 100 * 100 * 4 * 64 * 5 * 27 = ~ 35 ГБ. Однако, когда я запускаю свой сценарий, он отключается системой очередей из-за чрезмерного использования памяти:
slurmstepd: error: Job XXXX exceeded memory limit (1192359452 > 131072000), being killed
Я даже пытался использовать max_queue_size
всего за 2, и процесс все еще превышает максимальный объем памяти. Чтобы сделать вещи еще более трудными для понимания, иногда , совершенно случайно, процесс выполняется должным образом (даже с max_queue_size
из 30!).
Я проверяю перед запуском моего скрипта, что память фактически свободна, используя free -m
, и все выглядит нормально. Я также попытался профилировать свой скрипт с memory-profiler
, хотя результаты довольно странные:

Похоже, мой сценарий производит 54 (?) Разных детей и использует 1200 ГБ (!) Оперативной памяти. Это явно не имеет никакого смысла ...
Я неправильно вычисляю использование памяти fit_generator
? Из того, что я понимаю из документации, похоже, что данные должны быть разделены между рабочими, поэтому большая часть памяти должна использоваться пакетами в очереди. Я что-то пропустил?