Machine learning 为什么在培训LSTM/RNN型号时,我的GPU比CPU慢?

Machine learning 为什么在培训LSTM/RNN型号时,我的GPU比CPU慢?,machine-learning,tensorflow,nvidia,keras,Machine Learning,Tensorflow,Nvidia,Keras,我的机器具有以下规格: CPU:Xeon E5-1620 v4 GPU:Titan X(帕斯卡) Ubuntu 16.04 Nvidia驱动程序375.26 CUDA tookit 8.0 cuDNN 5.1 我以Tensorflow为背景,对以下Keras示例进行了基准测试: 我的gpu在非lstm型号中的性能明显优于我的cpu SCRIPT NAME GPU CPU cifar10_cnn.py 12sec 1

我的机器具有以下规格:

CPU:Xeon E5-1620 v4

GPU:Titan X(帕斯卡)

Ubuntu 16.04

Nvidia驱动程序375.26

CUDA tookit 8.0

cuDNN 5.1

我以Tensorflow为背景,对以下Keras示例进行了基准测试:

我的gpu在非lstm型号中的性能明显优于我的cpu

SCRIPT NAME                  GPU       CPU
cifar10_cnn.py               12sec     123sec
imdb_cnn.py                  5sec      119sec
mnist_cnn.py                 3sec      47sec 

还有其他人经历过吗

批量太小。试着增加

我的GTX1050Ti的结果:

imdb_bidirectional_lstm.py batch_size time 32 (default) 252 64 131 96 87 128 66 imdb_lstm.py batch_size time 32 (default) 108 64 50 96 34 128 25 imdb_双向_lstm.py 批量大小时间 32(默认)252 64 131 96 87 128 66 imdb_lstm.py 批量大小时间 32(默认)108 64 50 96 34 128 25
我在这里遇到了类似的问题:

测试1 CPU:Intel(R)Xeon(R)CPU E5-2697 v3@2.60GHz

Ubuntu 14.04

imdb\u双向lstm.py
155s

测试2 GPU:GTX 860m

Nvidia驱动程序:369.30

CUDA工具包:v8.0

cuDNN:v6.0

imdb\u双向\lstm.py
450s

分析 当我观察GPU负载曲线时,我发现了一件有趣的事情:

  • 对于lstm,GPU负载在~80%和~10%之间快速跳跃

这主要是由于LSTM层中的顺序计算。请记住,LSTM需要顺序输入来迭代计算隐藏层权重,换句话说,您必须等待时间
t-1时的隐藏状态来计算时间
t时的隐藏状态

这对于GPU内核不是一个好主意,因为它们是许多喜欢并行计算的小型内核,顺序计算不能充分利用它们的计算能力。这就是为什么我们看到GPU的负载大部分时间在10%-20%左右

但是在反向传播阶段,GPU可以并行运行导数计算,因此我们可以看到GPU负载峰值在80%左右。

如果使用Keras,请使用代替或代替。在我的情况下(2特斯拉M60),我看到10倍的性能提升。顺便说一下,我正在使用@Alexey Golyshev建议的批量大小128。

这只是一个提示

在以下情况下使用GPU功能强大:

一,。你的神经网络模型很大
2.批量很大


这是我在谷歌搜索中发现的。

我可以增加我的gpu和cpu的批处理大小,它们的性能都会相似,我希望gpu的性能会更好。尽管我的显卡比1050ti强大得多,但我们似乎也在经历相似的时刻。我的gpu在CNN上明显优于我的cpu,但不是lstm,这是为什么?@agsolid您的cpu速度非常快。我的Core i3-4330以110秒/历元计算IMDBlstm.py(批处理=128),而GPU上为25秒。你的GPU也比我的快。不同之处在于利用率的百分比(您的更低)。如何充分利用我的GPU功率?@agsolid低利用率还不错。这些问题对于您的TitanX来说太小了。例如,在mnist_cnn.py中,我的结果是在您的GPU上12秒vs 3秒(您的速度是4倍)。在TitanX上,您可以解决更多更大的问题,这些问题甚至不适合我的GPU内存。对于IMDBlstm.py:
[GPU]GTX 760:150s/epoch(32批大小),37s/epoch(128批大小)。。。[CPU]2.5 GHz Intel Core i7-4870HQ:88s/epoch(32批处理大小),50s/epoch(128批处理大小)
因此,我的GPU只在大批处理大小时表现更好。问题:@AlexeyGolyshev拥有大批量的缺点是什么?它会降低预测精度吗?选择合适批量的最佳方法是什么?
GTX 860m
是一款移动GPU,因此带宽和vram非常有限。我强烈建议不要在移动GPU上分析任何东西。昨晚我用
GTX 860m
GTX 1060
测试了我自己的c-lstm模型(1个cnn层+1个lstm层)。结果表明,1060的速度仅为860米的1.28倍。所以我想断言,对于
imdb\u双向\lstm
,1060仍然比CPU慢。今晚将测试我的想法。
GTX 1060
:一个历元需要
320s
@ZekunZhang如何获得GPU负载图?我们都喜欢2^n:)但是LSTM和CuDNNLSTM之间有什么区别?我的64批次型号,通过在我的RTX 2070上将LSTM更改为CuDNNLSTM,性能从22分钟提高到1分钟!问题是“为什么Keras LSTM/GRU中的GPU比CPU慢”,而不是“什么时候应该使用GPU”。文件中规定: imdb_bidirectional_lstm.py batch_size time 32 (default) 252 64 131 96 87 128 66 imdb_lstm.py batch_size time 32 (default) 108 64 50 96 34 128 25