CuDNNLSTM:调用 ThenRnnForward 失败

Posted

技术标签:

【中文标题】CuDNNLSTM:调用 ThenRnnForward 失败【英文标题】:CuDNNLSTM: Failed to call ThenRnnForward 【发布时间】:2019-05-27 02:55:59 【问题描述】:

我在尝试使用 CuDNNLSTM 而不是 keras.layers.LSTM 时遇到问题。

这是我得到的错误:

使用模型配置调用 ThenRnnForward 失败:[rnn_mode, rnn_input_mode, rnn_direction_mode]: 2, 0, 0, [num_layers, input_size, num_units, dir_count, seq_length, batch_size]: [1, 300, 512, 1, 5521, 128] [[节点双向_1/CudnnRNN_1 = CudnnRNN[T=DT_FLOAT, _class=["loc:@train...NNBackprop"], 方向=“单向”,辍学= 0,输入模式=“线性输入”, is_training=true,rnn_mode="lstm",种子=87654321,种子2=0, _device="/job:localhost/replica:0/task:0/device:GPU:0"](bidirectional_1/transpose_1, 双向_1/ExpandDims_1,双向_1/ExpandDims_1, bidirectional_1/concat_1)]] [[节点损失/mul/_75 = _Recvclient_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_1209_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

另外,我在其中一次运行中遇到了这个错误:

内部错误:GPU 同步失败

每次运行后内核都会死机。

当我尝试使用 CuDNNLSTM 在谷歌云上的 VM 实例上运行它时,我才开始收到此错误。

我的代码是:

MAX_LEN = max(len(article) for article in X_train_tokens)
EMBEDDING_DIM=300
vocab_size = len(word_to_id)
classes = 2 
# Text input
text_input = Input(shape=(MAX_LEN,))
embedding = Embedding(vocab_size, EMBEDDING_DIM, input_length=MAX_LEN)(text_input)
x = Bidirectional(LSTM(512, return_sequences=False))(embedding)
pred = Dense(2, activation='softmax')(x)
model = Model(inputs=[text_input],outputs=pred)
model.compile(loss='categorical_crossentropy', optimizer='RMSprop',     metrics=['accuracy'])
batch_size = 128
generator = text_training_generator(batch_size)
steps = len(X_train)/ batch_size 

model.fit_generator(generator, steps_per_epoch=steps, verbose=True, epochs=10)

模型总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 5521)              0         
_________________________________________________________________
embedding_1 (Embedding)      (None, 5521, 300)         8099100   
_________________________________________________________________
bidirectional_1 (Bidirection (None, 1024)              3330048   
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 2050      
=================================================================
Total params: 11,431,198
Trainable params: 11,431,198
Non-trainable params: 0
_________________________________________________________________

【问题讨论】:

【参考方案1】:

最近我的模型和 Tensorflow 2.4.1 也遇到了这个问题;我还发现它是可重现的,例如教程Text generation with an RNN中的模型。在 CPU 上运行(并消耗约 3 GB RAM),在具有 8 GB 内存的 GPU 上训练失败并出现错误

2021-02-12 18:45:48.482327: E tensorflow/stream_executor/dnn.cc:616] CUDNN_STATUS_EXECUTION_FAILED
in tensorflow/stream_executor/cuda/cuda_dnn.cc(1859): 'cudnnRNNForwardTraining( cudnn.handle(), rnn_desc.handle(), model_dims.max_seq_length, input_desc.handles(), input_data.opaque(), input_h_desc.handle(), input_h_data.opaque(), input_c_desc.handle(), input_c_data.opaque(), rnn_desc.params_handle(), params.opaque(), output_desc.handles(), output_data->opaque(), output_h_desc.handle(), output_h_data->opaque(), output_c_desc.handle(), output_c_data->opaque(), workspace.opaque(), workspace.size(), reserve_space.opaque(), reserve_space.size())'
2021-02-12 18:45:48.482405: W tensorflow/core/framework/op_kernel.cc:1763] OP_REQUIRES failed at cudnn_rnn_ops.cc:1521 : Internal: Failed to call ThenRnnForward with model config: [rnn_mode, rnn_input_mode, rnn_direction_mode]: 3, 0, 0 , [num_layers, input_size, num_units, dir_count, max_seq_length, batch_size, cell_num_units]: [1, 256, 1024, 1, 100, 32, 0] 

我还观察到 GPU 内存在出现错误之前已达到model.compile() 调用的限制。

我通过添加禁止完整的 GPU 内存分配解决了这个问题

gpu_devices = tf.config.experimental.list_physical_devices("GPU")
for device in gpu_devices:
    tf.config.experimental.set_memory_growth(device, True)

在脚本中足够早(例如在import tensorflow as tf 之后)。这指示 TensorFlow 按需分配 GPU 内存。这样,训练在 GPU 上运行,仅消耗约 2.2 GB 内存。

【讨论】:

【参考方案2】:

可能您的 gpu 内存不足。您的网络非常大,有 1100 万个可训练参数。你真的需要循环层的 512*2 输出吗?

此外,您的 embedding_dim 也很大,而您的词汇量很小,只有 5k 个单词。我猜你的网络对于你的问题来说太复杂了。我建议尝试使用 32 的嵌入大小和 32 的 LSTM 大小作为开始。如果您的准确性仍然很差,您可以增加复杂性。

EMBEDDING_DIM = 32
Bidirectional(LSTM(32, return_sequences=False))(embedding)

【讨论】:

我遇到了同样的错误,但仅限于predict。对于培训,它工作正常。这怎么可能? 是重新加载模型还是使用内存中已经加载的模型? 由于其他问题***.com/questions/59724821/…,我使用已加载到内存中的模型,但我确实使用load_weights 重新加载了权重。 我猜是重装权重,但听起来有点奇怪 将单元数减少到 64 对我来说效果很好。

以上是关于CuDNNLSTM:调用 ThenRnnForward 失败的主要内容,如果未能解决你的问题,请参考以下文章

Keras - ImportError:无法导入名称'CuDNNLSTM'

CuDNNLSTM:UnknownError:找不到 dnn 实现

tensorflow.keras.layers:ImportError:无法导入名称“CuDNNLSTM”

使用 Keras,如何将 CuDNNLSTM 生成的权重加载到 LSTM 模型中?

TensorFlow:如何使用具有可变输入长度的 CudnnLSTM(如 dynamic_rnn)?

TensorFlow 1.9 正式发布!