【问题标题】:RAM-memory usage while training a RNN with LSTM units使用 LSTM 单元训练 RNN 时的 RAM 内存使用情况
【发布时间】:2020-01-22 10:40:38
【问题描述】:

我正在学习关于循环神经网络的教程,并且我正在训练一个 RNN 来学习如何在给定字母序列的情况下预测字母表中的下一个字母。问题是,在我训练网络的每个时期,我的 RAM 使用率都在缓慢上升。我无法完成对这个网络的训练,因为我“只有”8192MB 的 RAM 内存,并且在 +- 100 个 epoch 之后就耗尽了。 为什么会这样?我认为这与 LSTM 的工作方式有关,因为它们确实在内存中保留了一些信息,但如果有人可以向我解释更多细节,那就太好了。

我使用的代码比较简单,完全独立(您可以复制/粘贴并运行它,不需要外部数据集,因为数据集只是字母表)。因此,我将其全部包含在内,因此问题很容易重现。

我使用的 tensorflow 版本是 1.14。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.utils import np_utils
from keras_preprocessing.sequence import pad_sequences
np.random.seed(7)

# define the raw dataset
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# create mapping of characters to integers (0-25) and the reverse
char_to_int = dict((c, i) for i, c in enumerate(alphabet))
int_to_char = dict((i, c) for i, c in enumerate(alphabet))

num_inputs = 1000
max_len = 5
dataX = []
dataY = []
for i in range(num_inputs):
    start = np.random.randint(len(alphabet)-2)
    end = np.random.randint(start, min(start+max_len,len(alphabet)-1))
    sequence_in = alphabet[start:end+1]
    sequence_out = alphabet[end + 1]
    dataX.append([char_to_int[char] for char in sequence_in])
    dataY.append(char_to_int[sequence_out])
    print(sequence_in, "->" , sequence_out)

#Pad sequences with 0's, reshape X, then normalize data
X = pad_sequences(dataX, maxlen=max_len, dtype= "float32" )
X = np.reshape(X, (X.shape[0], max_len, 1))
X = X / float(len(alphabet))
print(X.shape)

#OHE the output variable.
y = np_utils.to_categorical(dataY)

#Create & fit the model
batch_size=1
model = Sequential()
model.add(LSTM(32, input_shape=(X.shape[1], 1)))
model.add(Dense(y.shape[1], activation= "softmax" ))
model.compile(loss= "categorical_crossentropy" , optimizer= "adam" , metrics=[ "accuracy" ])
model.fit(X, y, epochs=500, batch_size=batch_size, verbose=2)

【问题讨论】:

  • 这是哪个TF版本?
  • 版本为1.14.0
  • 我也想问一下版本。这段代码看起来一点也不差。
  • 我在 TF 1.10 中遇到了完全相同的问题,使用的是估算器 API。在我打开一个问题并且无法解决它之后,我就放弃了,再也没有遇到过这个问题......我会在另一个环境中再次尝试同样的方法 - TensorFlow 的回复确实提到了检查 TF 版本是否正在运行正确的 CUDA。 1.14是CUDA 10,你在用吗? tensorflow.org/install/source#gpu
  • nicholas-leonard 在本期 (github.com/Element-Research/rnn/issues/5) 中建议“内存限制可能位于 LSTM 代码中,因为它为每个步”。还请查看 Marcin Możejko 的回答 (stackoverflow.com/questions/41731743/…),其中有两条建议可以用来减少内存量。

标签: python keras lstm recurrent-neural-network


【解决方案1】:

问题在于您的序列相当长(1000 个连续输入)。由于 LSTM 单元确实在 epoch 上保持某种状态,并且您正试图训练它 500 个 epoch(这是很多),特别是当您在 CPU 上进行训练时,您的 RAM 会随着时间的推移而被淹没。我建议你尝试在 GPU 上进行训练,它有自己的专用内存。另请查看此问题:https://github.com/Element-Research/rnn/issues/5

【讨论】:

  • 您可以在 CPU 上投入尽可能多的内存,在最坏的情况下,使用交换将您的 SSD 作为可怜的人 RAM 插入。 GPU 几乎没有超过 8GB(人们买得起的最新怪物有 12GB),如果询问者没有,不妨建议购买更多的 RAM,而不是在 GPU 上浪费钱。
  • 感谢您的回答。我授予你赏金,因为你是唯一一个发布答案的人,我不想让赏金白白浪费。我确实有一个 GPU,当我在那里训练模型时,我的 RAM 内存没有被淹没并且训练成功完成。我一直在寻找关于为什么在 CPU 上训练模型会淹没我的 RAM 的具体解释,即使 github 链接没有给我那个确切的答案(因此我不会接受它),它确实给了我一个很好的方向从哪里开始寻找。如果有人能给我一个完整的答案,我会确保我接受它。
猜你喜欢
  • 1970-01-01
  • 2020-03-08
  • 2021-08-16
  • 2016-06-27
  • 1970-01-01
  • 2018-02-16
  • 2017-12-30
  • 2021-01-21
  • 1970-01-01
相关资源
最近更新 更多