ResourceExhaustedError:OOM при выделении тензора с shape []

def RNN(X, weights, biases):
    X = tf.reshape(X, [-1, n_inputs])
    X_in = tf.matmul(X, weights['in']) + biases['in']
    X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units])
    lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=0.0, state_is_tuple=True)
    init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
    outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)

    outputs = tf.unpack(tf.transpose(outputs, [1, 0, 2]))    # states is the last outputs
    results = tf.matmul(outputs[-1], weights['out']) + biases['out']
    del outputs,final_state,lstm_cell,init_state,X,X_in
    return results

def while_loop(s,e,step):
    while s+batch_size<ran:
        batch_id=file_id[s:e]
        batch_col=label_matrix[s:e]                                             

        batch_label = csc_matrix((data, (batch_row, batch_col)), shape=(batch_size, n_classes))
        batch_label = batch_label.toarray()
        batch_xs1=tf.nn.embedding_lookup(embedding_matrix,batch_id)
        batch_xs=sess.run(batch_xs1)
        del batch_xs1
        sess.run([train_op], feed_dict={x: batch_xs,
                                        y: batch_label})

        print(step,':',sess.run(accuracy, feed_dict={x: batch_xs,y: batch_label}),sess.run(cost,feed_dict={x: batch_xs,y: batch_label}))
        if step!=0 and step % 20 == 0:
            save_path = saver.save(sess, './model/lstm_classification.ckpt',write_meta_graph=False)
            print('Save to path', save_path)

        step += 1
        s+=batch_size
        e+=batch_size
        del batch_label,batch_xs,batch_id,batch_col
        print(hp.heap())
        print(hp.heap().more)

Это мой код. Это повторяет ошибку 'ResourceExhaustedError:OOM при выделении тензора с формой', я использовал guppy. Затем я получил это. результат гуппи

Почему переменная тензорного потока занимает так много места.

1 ответ

Решение

Проблема была вызвана этой строкой в ​​цикле обучения:

while s + batch_size < ran:
    # ...
    batch_xs1 = tf.nn.embedding_lookup(embedding_matrix, batch_id)

Вызов tf.nn.embedding_lookup() Функция добавляет узлы к графу TensorFlow, и - поскольку они никогда не собираются сборщиком мусора - выполнение этого в цикле вызывает утечку памяти.

Фактическая причина утечки памяти, вероятно, embedding_matrix Массив NumPy в аргументе tf.nn.embedding_lookup(), TensorFlow пытается быть полезным и преобразовывает все массивы NumPy в аргументах в функцию в tf.constant() узлы в графе TensorFlow. Однако в цикле это приведет к нескольким отдельным копиям embedding_matrix скопировать в TensorFlow, а затем в дефицитную память графического процессора.

Самое простое решение - переместить tf.nn.embedding_lookup() Звоните вне цикла обучения. Например:

def while_loop(s,e,step):
  batch_id_placeholder = tf.placeholder(tf.int32)
  batch_xs1 = tf.nn.embedding_lookup(embedding_matrix, batch_id_placeholder)

  while s+batch_size<ran:
    batch_id=file_id[s:e]
    batch_col=label_matrix[s:e]                                             

    batch_label = csc_matrix((data, (batch_row, batch_col)), shape=(batch_size, n_classes))
    batch_label = batch_label.toarray()

    batch_xs=sess.run(batch_xs1, feed_dict={batch_id_placeholder: batch_id})

У меня недавно была эта проблема с TF + Keras и ранее с Darknet с yolo v3. Мой набор данных содержал очень большие изображения для памяти моих двух GTX 1050. Мне пришлось изменить размер изображения, чтобы быть меньше. В среднем для изображения 1024x1024 требуется 6 ГБ на каждый графический процессор.

Другие вопросы по тегам