当尝试使用CuDNNLSTM而不是keras.layers.LSTM时,我遇到了一个问题。
这是我得到的错误:
无法通过模型配置调用[Thennmode, 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] [[{{node bidirectional_1 / CudnnRNN_1}} = CudnnRNN [T = DT_FLOAT,_class = [“ loc:@train ... NNBackprop”], direction =“ unidirectional”,辍学= 0,input_mode =“ linear_input”, is_training = true,rnn_mode =“ lstm”,seed = 87654321,seed2 = 0, _device =“ / job:localhost / replica:0 / task:0 / device:GPU:0”](双向_1 / transpose_1, 双向_1 / ExpandDims_1,双向_1 / ExpandDims_1, bidirectional_1 / concat_1)]] [[{{node loss / mul / _75}} = _Recvclient_terminated = false,recv_device =“ / job:localhost /副本:0 / task:0 / device:CPU:0”, send_device =“ / job:localhost /副本:0 / task:0 / device:GPU:0”, send_device_incarnation = 1,tensor_name =“ edge_1209_loss / mul”, tensor_type = DT_FLOAT, _device =“ / job:localhost /副本:0 /任务:0 /设备:CPU:0”]]
此外,我在一次运行中遇到了此错误:
内部错误:GPU同步失败
每次运行后内核都会死掉。
当我尝试使用CuDNNLSTM在Google云上的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
_________________________________________________________________
答案 0 :(得分:6)
最近我的模型和 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 内存。
答案 1 :(得分:2)
可能是您的GPU内存不足。您的网络非常庞大,具有1100万个可训练的参数。您是否真的需要循环图层的512 * 2输出?
此外,您的embedding_dim也很大,而您的词汇量很小,只有5k个单词。我想您的网络太复杂了,无法解决您的问题。我建议尝试以32的嵌入大小和32的LSTM大小作为开始。如果准确性仍然很差,则可以增加复杂性。
EMBEDDING_DIM = 32
Bidirectional(LSTM(32, return_sequences=False))(embedding)