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

时间:2018-04-23 17:58:44

标签: tensorflow keras lstm

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

  

由CuDNN支持的快速LSTM实施。    只能使用TensorFlow后端在GPU上运行。

我相信Keras会尽可能自动使用GPU。根据{{​​3}},要有一个工作的TensorFlow GPU后端,你需要CuDNN:

  

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

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

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

4 个答案:

答案 0 :(得分:14)

你为什么不亲自尝试看看? 在我的例子中,使用LSTM训练模型需要10分30秒。 只需将呼叫从LSTM()切换到CuDNNLSTM()只需不到一分钟。

我还注意到,切换到CuDNNLSTM()的速度也会提升model.evaluate()model.predict()

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

TL; DR;区别在于模型训练时间提高了15倍!

Setup Steps

Dependencies

性能基准:标准测试机的比较。
对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倍!

答案 3 :(得分:1)

GPU非常适合大规模并行计算,大多数线性代数运算可以并行化以提高性能,诸如矩阵乘法和梯度下降之类的Vector操作可以应用于与GPU支持并行执行的大型矩阵。 CUDA -计算统一设备架构提供了一个接口,该接口允许矢量操作利用GPU并行性。 CuDNN使用CUDA在GPU上实现用于大型矩阵运算的内核。

在这里,CuDNNLSTM是为CUDA并行处理而设计的,如果没有GPU,它将无法运行。但是LSTM是为普通CPU设计的。由于并行性,执行时间更快。