我使用Kaggle上的这个笔记本来运行LSTM神经网络。
我开始训练神经网络时发现速度非常慢,几乎是CPU训练速度的三倍慢。
CPU性能:
每轮8分钟;GPU性能:
每轮26分钟。
之后,我决定在Stackoverflow上的这个问题中寻找答案,并将LSTM
替换为CuDNNLSTM
(仅在GPU上运行)。
因此,GPU性能提升到每轮仅需1分钟,但模型的准确率下降了3%。
问题:
1) 有人知道为什么在经典的LSTM
层中,GPU的运行速度比CPU慢吗?我不明白为什么会这样。
2) 为什么当我使用CuDNNLSTM
替代LSTM
时,训练速度大大提高,而模型的准确率却下降了?
P.S.:
我的CPU:
Intel Core i7-7700处理器(8M缓存,最高4.20 GHz)
我的GPU:
nVidia GeForce GTX 1050 Ti(4 GB)
回答:
猜测这只是一个不同的、更好的实现方式,如果实现方式不同,你不应该期望得到相同的结果。
一般来说,在GPU上高效实现一个算法是困难的,要获得最大性能需要特定于架构的实现。因此,如果一个特定于Nvidia GPU的实现比通用的GPU实现性能更好,这并不令人惊讶。同样,Nvidia投入大量资源加速他们针对自己GPU的代码,而一个致力于通用CNN实现的团队投入的资源可能不如Nvidia多,这也不令人惊讶。
另一种可能性是后台使用的数据类型从双精度浮点数改为单精度或半精度浮点数。使用较小的数据类型意味着你可以更快地处理更多数据,但代价是准确率的下降。对于神经网络应用,这种做法通常是可以接受的,因为网络产生可接受结果并不需要每个单独的数字特别准确。