为什么Keras的LSTM在CPU上的运行速度比GPU快三倍?

我使用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多,这也不令人惊讶。

另一种可能性是后台使用的数据类型从双精度浮点数改为单精度或半精度浮点数。使用较小的数据类型意味着你可以更快地处理更多数据,但代价是准确率的下降。对于神经网络应用,这种做法通常是可以接受的,因为网络产生可接受结果并不需要每个单独的数字特别准确。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注