为什么Keras LSTM在CPU上的速度是GPU的三倍?

时间:2018-09-24 13:56:10

标签: python tensorflow machine-learning keras gpu

我使用this notebook from Kaggle运行LSTM神经网络。

我已经开始训练神经网络,但发现它太慢了。它比CPU培训慢了将近三倍。

  • CPU perfomance:每个纪元8分钟;
  • GPU perfomance:每个纪元26分钟。

此后,我决定在this question on Stackoverflow中找到答案,并应用了CuDNNLSTM (仅在GPU上运行)而不是LSTM

因此,GPU性能变为每个时期仅1分钟,并且模型的准确性降低了3%。

问题:

1)有人知道为什么在经典LSTM层中GPU的运行速度比CPU慢吗?我不明白为什么会这样。

2)为什么当我使用CuDNNLSTM而不是LSTM时,训练变得更快了,模型的准确性却降低了?

P.S。

My CPU:英特尔酷睿i7-7700处理器(8M高速缓存,高达4.20 GHz)

My GPU: nVidia GeForce GTX 1050 Ti(4 GB)

3 个答案:

答案 0 :(得分:6)

猜测这只是一个不同的,更好的实现,并且,如果实现不同,则不应期望获得相同的结果。

通常,在GPU上高效地实现算法是很困难的,要获得最佳性能,就需要特定于体系结构的实现。因此,与针对GPU的常规实现相比,特定于Nvidia GPU的实现具有增强的性能也就不足为奇了。与致力于通用CNN实施的团队相比,Nvidia花费大量资源来加速其GPU代码也不足为奇。

另一种可能性是,后端使用的数据类型已从双精度浮点数更改为单精度甚至半精度浮点数。较小的数据类型意味着您可以以准确性为代价更快地处理更多数字。对于NN应用而言,这通常是可以接受的,因为对于网络而言,不需要任何特别的数字就可以产生可接受的结果。

答案 1 :(得分:2)

我今天遇到了类似的问题,发现有两点可能对其他人有帮助(这是在具有4个P100 GPU的计算机上运行的具有〜2.1MM行的数据集的回归问题):

  1. 在GPU机器上使用CuDNNLSTM层而不是LSTM层将拟合时间从每个时期的〜13500秒减少到〜400秒。
  2. 增加批次大小(从500到4700)将其减少到每个时期约130秒。

减小批次大小会增加损失和val损失,因此您需要决定要进行的权衡。

答案 2 :(得分:0)

在Keras中,使用CuDNN的LSTM快速实现。

model.add(CuDNNLSTM(units, input_shape=(len(X_train), len(X_train[0])), return_sequences=True))

它只能在具有TensorFlow后端的GPU上运行。