keras 中的小型 LSTM 模型不适合我的 GPU

Posted

技术标签:

【中文标题】keras 中的小型 LSTM 模型不适合我的 GPU【英文标题】:Small LSTM model in keras does not fit my GPU 【发布时间】:2019-09-15 01:47:36 【问题描述】:

我正在 Google Collab 中编写一个相对较小的 LSTM 模型。

作为参考,我使用 TensorFlow 1.13 构建模型,使用 tensorflow.keras 作为 keras API。

seq_len = 20000; n_classes = 4
inputs = ll.Input(shape=(seq_len,))
x = ll.Embedding(len(word_index), 1000)(inputs)
x = ll.LSTM(units=100, activation='relu', return_sequences=True)(x)
outputs = ll.Dense(units = n_classes, activation='softmax')(x)
model = Model(inputs, outputs)
model.summary()

I have checked 我有 15 GB 的 GPU RAM 可用,根据 my estimations 的说法,批量大小为 32 的模型应该适合 3GB 的 RAM。

但是,每当我启动训练时,服务器都会耗尽内存。

公平地说,我使用的是极长的数据序列(20000 是最大序列长度),但我希望模型在内存中象征性地展开并刚好适合。

将批量大小减少到 1 也无济于事。

发生了什么事?我怎样才能使这个模型适合内存?

编辑:我尝试将序列长度减少到 2,这确实使它适合内存。但我需要序列长度保持高。如何告诉 Tensorflow 在任何时候都不要展开网络? (我怀疑这就是幕后发生的事情,我该如何检查是否确实如此?)

编辑:如果我删除 Softmax 层,那么内存使用会再次下降到正常范围。我认为 Softmax 层导致 Tensorflow 展开网络。虽然 TimeDistributing Softmax 并没有帮助。

【问题讨论】:

请包含model.summary()的输出,参数的数量可能很大。试验不同的序列长度,看看参数数量的变化。 @MatiasValdenegro 参数的数量在我通常使用的范围内:1,474,404 参数 【参考方案1】:

为 CuDNNLSTM 层更改 LSTM 层就成功了!

inputs = ll.Input(shape=(seq_len,))
x = ll.Embedding(len(word_index), 1024)(inputs)
x = ll.CuDNNLSTM(units=100, return_sequences=True)(x)
x = ll.Dense(units = n_classes, activation='softmax')(x)
outputs = x
model = Model(inputs, outputs)

【讨论】:

以上是关于keras 中的小型 LSTM 模型不适合我的 GPU的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Keras TimeDistributed CNN + LSTM 模型期望形状不完整

减小 Keras LSTM 模型的大小

Keras - 验证精度与 LSTM 中的自测精度不匹配?

向 Keras 中的 LSTM 提供训练任务

Keras 在训练分类 LSTM 序列到序列模型时给出 nan

Keras LSTM 模型过拟合