Как решить проблемы OOM при обучении нейронной сети на GPU? - PullRequest
0 голосов
/ 15 февраля 2019

Я тренирую нейронную сеть с TensorFlow на NVIDIA GEFORCE GTX 1080 Ti.Мой процессор имеет 32 ГБ оперативной памяти.Сеть имеет только 1 скрытый слой с весами фигур [16788,10000] и [10000, 1478] соответственно.Размер мини-пакета = 256.

for epo in range(self.epochs):
    loss_sum = 0        
    for mini_count in (range(len(mini_batches_x1_train))):
        batch_x1 = tf.one_hot(mini_batches_x1_train[mini_count], self.voc_size).eval()
        batch_x2 = mini_batches_x2_train[mini_count][0].toarray() 
        batch_x = np.concatenate((batch_x1, batch_x2), axis = 1)

        batch_y = mini_batches_y_train[mini_count]
        batch_y = np.array(batch_y).reshape(len(batch_y),1)  #for tf.nce_loss()
        _, mini_loss = sess.run([optimizer,loss], feed_dict={X: batch_x, Y: batch_y})
        loss_sum += mini_loss

    avg_loss = loss_sum/len(mini_batches_x1_train)
    print("\nEpoch", epo+1, " completed at ",time.ctime(time.time()), " | Epoch Loss = ", avg_loss)

После успешного завершения 3 эпох появляется следующая ошибка:

ResourceExhaustedError: OOM when allocating tensor with shape[16788,10000] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc

Требуется ли больше эпох для большего количества памяти?Где я могу быть не прав?Просьба предложить возможные решения для преодоления этого.

1 Ответ

0 голосов
/ 15 февраля 2019

При обучении на графическом процессоре Tensorflow старается загружать столько, сколько может, в GPAM VRAM, поэтому он работает быстро и не является узким местом при слишком частом доступе к данным ОЗУ из графического процессора.Таким образом, если сеть не соответствует VRAM, у вас есть в основном несколько вариантов.

  1. Наиболее широко используемый вариант - уменьшить размер пакета.Попробуйте 128 или 64 (рекомендуется, чтобы размер пакета составлял 2, см. этот вопрос SO ).Некоторые современные архитектуры настолько велики, что вы можете иметь только размер пакета = 1 даже для GTX 1080Ti.
  2. Изменить архитектуру и уменьшить ее.
  3. Запуск модели на процессоре (что вы, вероятно, не хотите из-за производительности).
  4. Измените оптимизатор на тот, который использует меньше памяти.Например, оптимизатор ADAM, который используется для получения производительности SOTA, добавляет свои собственные переменные к каждому слою, и, таким образом, вся модель потребляет больше памяти, чем некоторые более простые оптимизаторы.Хотя обычно не хотят менять оптимизатор и просто уменьшают размер пакета.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...