Ошибка Tensorflow-GPU: внезапная ошибка OOM с Tensorflow после нескольких успешно обученных пакетов - PullRequest
0 голосов
/ 13 февраля 2020

Описание: Я использую архитектуру Encoder-Decoder для создания субтитров к видео. Для этого я создал три класса на основе keras.Model. Первая модель имеет несколько трехмерных сверточных слоев, слоев нормализации и трехмерного макс пула, и я использую его для описания видео, оно инициализируется и вызывается внутри модели кодировщика. Эта модель кодера вызывается один раз для каждого видео и передает информацию в модель декодера, которая вызывается несколько раз (столько, сколько слов в заголовке).

Форма ввода: Размеры входного видео: (128,224,224,3), где 128 обозначает количество кадров, а размеры предложений равны (1,55), где 55 обозначает количество токенов.

Проблема: Я использую партию 1 (видео), и модель хорошо тренируется до определенного количества видео, а затем выдает ошибку OOM, как показано на рисунке. Я попытался уменьшить количество кадров до 64 и 32, но появляется одна и та же ошибка, но, что интересно, эта ошибка занимает больше времени, когда я опускаю кадры, это заставляет меня думать, что в определенном месте память используется накопительным образом. Из ошибки я могу сделать вывод, что она появляется при обратном распространении первого слоя maxpoling3d. Тем не менее, я не понимаю, почему модель работает хорошо для некоторых видео, а затем выдает ошибку, если она была по памяти, она должна сломаться в первом видео, верно? Я присоединяю используемую обучающую функцию и генератор данных.

def train_step(encoder, decoder, inputs, target, vocab, params):
    with tf.device('/CPU:0'):
        loss = 0
        predictions = list()
    with tf.device('/GPU:0'):
        with tf.GradientTape() as tape:
            enc_outputs, rnn1_states, rnn2_states, reduceFeatures, _ = encoder(inputs)
            states = [rnn1_states, rnn2_states]
            word = tf.expand_dims([vocab['<s>']] * params.batchSize, 1)
            # Teacher forcing - feeding the target as the next input
            # dim == (1,len(sentence))
            for t in range(1, target.shape[1]):
                # passing enc_output to the decoder
                prediction, states, _, _ = decoder(word, enc_outputs, reduceFeatures, states)
                predictions.append(np.argmax(prediction))
                if params.loss == 'SparseCategoricalCrossentropy_mask':
                    loss += SparseCategoricalCrossentropy_mask(target[:, t], prediction)
                # using teacher forcing
                word = tf.expand_dims(target[:, t], 1)

        #batch_loss = (loss / int(target.shape[1]))
        variables = encoder.trainable_variables + decoder.trainable_variables
        gradients = tape.gradient(loss, variables)
        optimizer.apply_gradients(zip(gradients, variables))

    with tf.device('/GPU:0'):
        train_loss(loss)
        accuracy(target[:,1:], np.array(predictions))

        return loss

class Generator(object):
def __init__(self, list_IDs, padded_sentences, dim=[32,227,227]):
    'Initialization'
    self.dim = dim
    self.list_IDs =  np.random.permutation(list_IDs) # numpy array
    self.padded_sentences = padded_sentences
    self.idx = 0

def read_images_and_process(self, path_video):
    frames = [resize(pimage.imread(path_video+i),(self.dim[1],self.dim[2])) for i in sorted(os.listdir(path_video))]
    frames_sampled = frame_sampling(frames, nTempo = self.dim[0]) 
    index = np.random.choice(range(len(frames_sampled)), size=1)[0]
    # return a sample of the clips obtained from the video.
    return frames_sampled[index]     

def get_next_triplet(self):
    while True:
        if self.idx == len(self.list_IDs)-1:
            break
        else:    
            self.idx+=1
            path_video = self.list_IDs[self.idx]
            index = np.argwhere(self.list_IDs==path_video)[0]
            padded_sentence = self.padded_sentences[index,:]
            video = self.read_images_and_process(path_video)

        yield video, padded_sentence

Error screenshot

Системная информация
- Платформа ОС и дистрибутив: Ubuntu 18.04.3 LTS
- TensorFlow установлен из: тензор потока установлен из docker image
- Версия TensorFlow: v2.1.0
- Python версия: 3.6.9
- Версия GCC / компилятора: 8.3.0
- Версия CUDA / cuDNN: V10.1.243
- Модель и память графического процессора: NVIDIA Corporation GM200 [GeForce GTX TITAN X] [10de: 1132] и 12 ГБ памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...