Machine learning 为什么在培训LSTM/RNN型号时,我的GPU比CPU慢?
我的机器具有以下规格: 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型号中的性能明显优于我的cpuMachine 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
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%之间快速跳跃
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