在训练LSTM / RNN模型时,为什么我的GPU比CPU慢?

时间:2017-01-31 01:37:54

标签: machine-learning tensorflow nvidia keras

我的机器有以下规格:

CPU:Xeon E5-1620 v4

GPU:Titan X(Pascal)

Ubuntu 16.04

Nvidia司机375.26

CUDA需要8.0

cuDNN 5.1

我已经使用Tensorflow作为支持的reference对以下Keras示例进行了基准测试:

SCRIPT NAME                  GPU       CPU
stated_lstm.py               5sec      5sec 
babi_rnn.py                  10sec     12sec
imdb_bidirectional_lstm.py   240sec    116sec
imbd_lstm.py                 113sec    106sec

我的gpu显然在非lstm模型中执行我的cpu。

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

还有其他人经历过这个吗?

4 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:13)

批量太小。试着增加。

我的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

答案 2 :(得分:3)

我在这里有类似的问题:

测试1

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

Ubuntu 14.04

imdb_bidirectional_lstm.py 155s

测试2

GPU:GTX 860m

Nvidia车手:369.30

CUDA工具包:v8.0

cuDNN:v6.0

imdb_bidirectional_lstm.py:的 450S

分析

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

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

GPU load

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

这对GPU核心来说不是一个好主意,因为它们是许多小核心,他们喜欢并行计算,顺序计算无法充分利用其计算能力。这就是我们在大多数情况下看到GPU负载大约10% - 20%的原因。

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

答案 3 :(得分:3)

这只是小费。

使用GPU功能强大

  1. 您的神经网络很大。

  2. 您的Batch_Size大。

-这是我通过谷歌搜索发现的。