Модель с несколькими графическими процессорами ( LSTM с Stateful) на Keras не работает
Я работаю над моделью LSTM с сохранением состояния с использованием keras (Tensorflow backend); Я не могу распараллелить его на платформе с несколькими графическими процессорами. вот ссылка на код Я получаю следующую ошибку.
tenorflow.python.framework.errors_impl.InvalidArgumentError: Несовместимые формы: [256,75,39] против [512,75,39]
[[Узел: обучение / cna / градиенты / потеря /concatenate_1_loss/mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _class=["loc:@loss/concatenate_1_loss/mul"], _device="/job:localhost/replica:0/task:0/gpu:0"](обучение / cna / градиенты / потеря /concatenate_1_loss/mul_grad/Shape, обучение / cna / градиенты / потеря / concatenate_1_loss / mul_grad / Shape_1)]]
[[Узел: replica_1/sequential_1/ плотность_1/truediv/_473 = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/ задача: 0 / gpu: 1 ", send_device_incarnation = 1, тензор_имя ="edge_3032_replica_1/sequential_1/ плотность_1 / truediv ", тензор_тип =DT_FLOAT, _device="/job:localhost/ реплика: 0 / задача: 0 / процессор:0"]]
Я использую 2 GPU с размером пакета 256. Пожалуйста, помогите.
Заранее спасибо.
2 ответа
Эта ошибка, по-видимому, возникает просто потому, что вы делите исходную партию размером 512 на две меньшие партии размером 256.
Слои с сохранением состояния требуют фиксированного размера пакета (см. Параметр batch_shape
или же batch_input_shape
в начале модели).
Вы можете попытаться воссоздать модель, изменив batch_shape
(или же batch_input_shape
) до 256 (если это в настоящее время 512). Или наоборот, если я ошибаюсь по поводу текущего значения.
Если у вас уже есть обученная модель с весами, которые вы хотите сохранить, вы можете создать другую модель с такими же типами слоев и одинаковыми формами, изменяя только входную форму. Тогда ты можешь newModel.set_weights(oldModel.get_weights())
Тем не менее, я не думаю, что безопасно распараллеливать модель с состоянием. В моделях с состоянием "batch2" является продолжением "batch1". Обе партии представляют "одинаковую" последовательность, и порядок абсолютно важен. Если batch2 обрабатывается до batch1, вы будете вводить инвертированную последовательность, и ваша модель выучит ее неправильно.
Если вы не найдете в документации Keras явного заявления о том, что вы можете безопасно распараллелить модель с сохранением состояния, вам может потребоваться тщательная проверка (после множества попыток), если распараллеленная модель всегда дает тот же результат, что и модель с одним графическим процессором.
В настоящее время я работаю над stateful_multi_gpu, экспериментальной утилитой для построения моделей RNN с сохранением состояния для обучения нескольких графических процессоров.
Вопреки ответу Даниэля Мёллера, я думаю, что вы можете четко указать порядок: какая подпакет обрабатывается на каком графическом процессоре и как результаты возвращаются вместе.
Мне все еще нужно проверить, правильно ли он работает на нескольких графических процессорах, и может ли он распараллелить любую произвольную модель с состоянием. Таким образом, меня интересует любой опыт использования этой утилиты!