我使用 Kaggle 的这个笔记本来运行 LSTM 神经网络。
我已经开始训练神经网络,我发现它太慢了。它几乎比 CPU 训练慢三倍。
CPU perfomance:
每 epoch 8 分钟;GPU perfomance:
每个周期 26 分钟。此后,我决定在 Stackoverflow 上的 这个问题 中寻找答案,并应用了
CuDNNLSTM
(仅在 GPU 上运行) 而不是 LSTM
。
因此,GPU 性能变得每个 epoch 仅 1 分钟,并且模型的准确性下降了 3%。
问题:
1)有人知道为什么在经典的
LSTM
层中 GPU 的运行速度比 CPU 慢吗?我不明白为什么会发生这种情况。
2) 为什么当我使用
CuDNNLSTM
而不是 LSTM
时,训练变得更快,而模型的准确性却下降?
附注:
My CPU:
Intel Core i7-7700 处理器(8M 缓存,高达 4.20 GHz)
My GPU:
nVidia GeForce GTX 1050 Ti (4 GB)
猜测这只是一个不同的、更好的实现,如果实现不同,你不应该期望相同的结果。
一般来说,在 GPU 上高效实现算法是“困难”的,并且获得最大性能需要特定于架构的实现。因此,如果特定于 Nvidia GPU 的实现比 GPU 的通用实现具有更高的性能,也就不足为奇了。与致力于通用 CNN 实现的团队相比,Nvidia 投入更多资源来加速 GPU 代码也就不足为奇了。 另一种可能是后端使用的数据类型从双精度浮点变为单精度甚至半精度浮点。较小的数据类型意味着您可以更快地处理更多数字,但代价是准确性。对于神经网络应用程序来说,这通常是可以接受的,因为不需要特别准确的单个数字即可使网络产生可接受的结果。
在 GPU 机器上使用 CuDNNLSTM 层而不是 LSTM 层将拟合时间从每个周期约 13500 秒减少到约 400 秒。
model.add(CuDNNLSTM(units, input_shape=(len(X_train), len(X_train[0])), return_sequences=True))
它只能在带有 TensorFlow 后端的
GPU
上运行。