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

2024-10-01 07:46:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我开始训练神经网络,我发现它太慢了。它几乎比CPU训练慢三倍。在

  • CPU perfomance:每历元8分钟
  • GPU perfomance:每历元26分钟。在

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

因此,GPU性能变得每历元仅1min,模型精度下降3%。在

问题:

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

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

备注:

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

My GPU:英伟达GeForce GTX 1050 Ti(4 GB)


Tags: from模型gpuonmy神经网络cputhis
3条回答

今天我遇到了一个类似的问题,发现了两个可能对其他人有帮助的事情(这是一个回归问题,在一台有4个P100 gpu的机器上运行,行数约为2.1MM):

  1. 在GPU机器上使用cudnlstm层而不是LSTM层,将拟合时间从每历元13500秒减少到400秒。在
  2. 增加批处理大小(~500到~4700)将其减少到每epoch约130秒。在

减少批量大小会增加损失和val损失,因此您需要对您想要做出的权衡做出决定。在

猜测它只是一个不同的,更好的实现,如果实现不同,你不应该期望相同的结果。在

一般来说,在GPU上有效地实现一个算法是非常困难的,要获得最大的性能需要特定于体系结构的实现。因此,如果一个特定于Nvidia的gpu的实现比gpu的一般实现具有更高的性能也就不足为奇了。与致力于CNN一般实现的团队相比,Nvidia将投入更多的资源来加速gpu的代码,这也就不足为奇了。在

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

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

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

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

相关问题 更多 >