在Keras,CuDNNLSTM和LSTM有什么区别?

kri*_*ath 32 lstm keras tensorflow

Keras高级深度学习库中,有多种类型的循环层; 这些包括LSTM(长期短期记忆)和CuDNNLSTM.根据Keras文档,a CuDNNLSTM是:

由CuDNN支持的快速LSTM实现.只能在带有TensorFlow后端的GPU上运行.

据我所知,Keras会尽可能自动使用GPU.根据TensorFlow构建说明,要有一个工作的TensorFlow GPU后端,您将需要CuDNN:

必须在您的系统上安装以下NVIDIA软件:

  • NVIDIA的Cuda Toolkit(> = 7.0).我们建议使用9.0版.有关详细信息,请参阅NVIDIA的文档.确保您的相关Cuda的路径名追加到PATH环境变量作为NVIDIA文档中的描述.
  • 与NVIDIA的Cuda Toolkit相关的NVIDIA驱动程序.
  • cuDNN(> = v3).我们建议使用6.0版.有关详细信息,请参阅NVIDIA的文档,特别是将适当的路径名附加到LD_LIBRARY_PATH环境变量的说明.

因此,使用TensorFlow GPU后端CuDNNLSTM与正常情况LSTM有何不同?当找到可用的TensorFlow GPU后端时,会CuDNNLSTM自动选择并替换正常LSTM吗?

cry*_*bhu 21

你为什么不亲自试试看?就我而言,训练一个模型需要LSTM花费10分30秒.只需将呼叫切换LSTM()CuDNNLSTM()不到一分钟.

我也注意到转换CuDNNLSTM()速度model.evaluate()model.predict()大大加快了.

  • CuDNNLSTM速度更快(它使用GPU支持),但它的选择选项少于LSTM(例如,辍学) (5认同)
  • 我为什么只发现这个,真是太神奇了!过去,我花了3小时来评估大型数据集上的模型,而现在只需要20分钟左右。 (2认同)

小智 11

TL; 博士; 不同之处在于模型训练时间加快了 15 倍!

设置步骤

依赖关系

性能基准:标准测试机器的比较。
对 612235 个样本进行 1 次训练迭代。

keras.layers.LSTM Intel i5-4690 CPU only: 612235/612235 [==============================] - 3755s 6ms/step - loss: 2.7339 - acc: 0.5067 - val_loss: 2.1149 - val_acc: 0.6175

GTX:950 & Intel i5-4690: 612235/612235 [==============================] - 1417s 2ms/step - loss: 2.7007 - acc: 0.5137 - val_loss: 2.0983 - val_acc: 0.6199

使用 GPU 获得 2.5 倍增益。

GTX:970 & Intel i5-4690: 612235/612235 [==============================] - 1322s 2ms/step - loss: 1.9214 - acc: 0.6442 - val_loss: 1.8808 - val_acc: 0.6461

强大的 GPU 带来的增益可忽略不计。

RTX 2070 & Intel i7-9700K: 612235/612235 [==============================] - 1012s 2ms/step - loss: 2.7268 - acc: 0.5111 - val_loss: 2.1162 - val_acc: 0.6234

即使有很棒的硬件升级,收益也非常小!!!

keras.layers.CuDNNLSTM RTX 2070 & Intel i7-9700K: 612235/612235 [==============================] - 69s 112us/step - loss: 1.9139 - acc: 0.6437 - val_loss: 1.8668 - val_acc: 0.6469

比 CPU 高 54 倍!
比传统(非 Cuda)LSTM 实现提高 15 倍!

  • 似乎只需要显示最后 2 个案例,因为它们是一个公平的测试 - 相同的组件,只有 CuDNNLSTM 与 LSTM 不同。. 前几个示例只会让您的帖子感到困惑。 (3认同)

小智 7

TensorFlow 2.0 中,内置LSTMGRU层已更新,以在GPU可用时默认利用CuDNN 内核。通过此更改,先前的keras.layers.CuDNNLSTM/CuDNNGRU层已被弃用,您可以构建模型而无需担心它将运行的硬件。

由于CuDNN 内核是在某些假设下构建的,这意味着如果您更改内置LSTMGRU层的默认值,该层将无法使用CuDNN 内核

检查 tensorflow RNN 文档:https ://www.tensorflow.org/guide/keras/rnn