CuDNNLSTM:UnknownError:找不到 dnn 实现

Posted

技术标签:

【中文标题】CuDNNLSTM:UnknownError:找不到 dnn 实现【英文标题】:CuDNNLSTM: UnknownError: Fail to find the dnn implementation 【发布时间】:2019-06-25 15:53:23 【问题描述】:

我已经成功运行了以 LSTM 作为第一层的模型。但出于好奇,我将 LSTM 替换为 CuDNNLSTM。 但是在model.fit之后,它回复了以下错误信息:

UnknownError: Fail to find the dnn implementation.
    [[node cu_dnnlstm_5/CudnnRNN = CudnnRNN[T=DT_FLOAT, _class=["loc:@training_2/Adam/gradients/cu_dnnlstm_5/CudnnRNN_grad/CudnnRNNBackprop"], direction="unidirectional", dropout=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"](cu_dnnlstm_5/transpose, cu_dnnlstm_5/ExpandDims_1, cu_dnnlstm_5/ExpandDims_1, cu_dnnlstm_5/concat_1)]]
    [[node metrics_3/mean_squared_error/Mean_1/_1877 = _Recv[client_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_4852_metrics_3/mean_squared_error/Mean_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

我已经在这个discussion 上尝试过TestCudnnLSTM() 并成功通过了测试:

Keras 版本:2.2.4 张量流版本:1.12.0 创建模型 _________________________________________________________________ 层(类型)输出形状参数# ==================================================== ================ cu_dnnlstm_1 (CuDNNLSTM) (无, 1000, 1) 16 ==================================================== ================ 总参数:16 可训练参数:16 不可训练参数:0 _________________________________________________________________ 没有 模型编译

问题似乎是在模型拟合过程中出现的。但我不知道到底是什么问题?

【问题讨论】:

我在 tf 1.13 和 CuDNN 7.5 中也经常遇到这个问题。然而,它随机发生的几率只有大约 10%。通常我可以重新启动程序,它工作正常。 【参考方案1】:

对于 TensorFlow v2,一种解决方案是 -

import tensorflow as tf
physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], enable=True)

那么你也可以使用keras模型了-

from tensorflow.keras.models import Model

Documentation

这个解决方案对我有用,它只支持一个 GPU 的内存增长。

【讨论】:

谢谢,但对我来说是physical_devices = tf.config.experimental.list_physical_devices('GPU') 谢谢,它现在甚至可以在我的 Windows 机器上运行!你知道为什么会这样吗?我不会猜测UnknownError: Fail to find the dnn implementation. 与内存增长有某种关系。默认情况下(不允许内存增长)我认为 tf 会分配尽可能多的内存。那么为什么它默认不工作呢? 如果您查看文档,您会发现他们说 - “如果为 PhysicalDevice 启用了内存增长,则运行时初始化将不会分配设备上的所有内存。内存增长无法在 PhysicalDevice 上配置已配置虚拟设备。”这意味着默认情况下,TensorFlow 会尝试一次为模型分配所有内存,并且由于内存不足,它会显示错误。尽管如此,它仍然基于该文档。但即使是小型模型,我也发现了错误。 哇,没想到会解决,非常感谢【参考方案2】:

如果您在安装 Keras NN 时遇到此错误,请将此代码放在您的导入中

from keras.backend.tensorflow_backend import set_session
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
set_session(sess)

credit

【讨论】:

ModuleNotFoundError: No module named 'keras.backend.tensorflow_backend'; 'keras.backend' 不是一个包。我猜这个答案对旧版本的 keras/tf 有效【参考方案3】:

当我将 tensorflow 更新到 1.12 时,我遇到了同样的问题。将我的 CuDNN 版本从 7 更新到 7.5 后错误得到解决。我按照以下 url 中提到的步骤更新 CuDNN 版本(注意:链接中提到的步骤用于安装 CUDNN,但同样适用于更新)

https://jhui.github.io/2017/09/07/AWS-P2-CUDA-CuDNN-TensorFlow/

【讨论】:

【参考方案4】:

在 tensorflow 2.0 中,我在运行 RNN LSTM 模型时遇到了同样的错误。原因是由于我的 cuDNN 版本较低。在 tensorflow gpu 要求页面中,建议使用

cuDNN SDK >= 7.4.1.

更多详情可以参考https://www.tensorflow.org/install/gpu

在 Tensorflow Reddit 论坛中提问

https://www.reddit.com/r/tensorflow/comments/dxnnq2/i_am_getting_an_error_while_running_the_rnn_lstm/?utm_source=share&utm_medium=web2x

【讨论】:

【参考方案5】:

确保您的 Nvidia 驱动程序版本适用于您使用的 CUDA 版本。你可以在这里查看。 https://docs.nvidia.com/deploy/cuda-compatibility/index.html#binary-compatibility

我使用的是 CUDA 9.0,但使用的 Nvidia 驱动程序低于 384.81。将 Nvidia 驱动程序更新到较新的驱动程序为我解决了这个问题。

【讨论】:

【参考方案6】:

我在虚拟环境中使用 conda 安装了 tensorflow 和 keras,这解决了它。

conda install tensorflow
conda install keras

【讨论】:

【参考方案7】:

我建议检查是否有任何其他内核已导入 tensorflow 或 keras。如果是,请关闭该内核 - 即使它不忙。它解决了我的问题。

【讨论】:

【参考方案8】:

还要检查您的应用程序使用的 CUDA 版本是否存在 cuDNN。

升级 tensorflow 可能会导致它使用另一个 CUDA 版本

例如 tensorflow-2.3 使用 CUDA 10.1,但 tensorflow-2.5 使用 11.2

我在 Windows 中遇到了同样的错误,我不得不将最新的 cuDNN DLL 复制到“c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2”文件夹中

【讨论】:

以上是关于CuDNNLSTM:UnknownError:找不到 dnn 实现的主要内容,如果未能解决你的问题,请参考以下文章

CuDNNLSTM:调用 ThenRnnForward 失败

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

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

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

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

Colab: UnknownError: 使用 TF 2.5 时获取卷积算法失败