2017-01-31 473 views
11

我的机器有如下规格:在训练LSTM/RNN模型时,为什么我的GPU比CPU慢?

CPU:至强E5-1620 V4

GPU:泰坦X(帕斯卡)

的Ubuntu 16.04

Nvidia驱动375.26

CUDA的无线工具包8.0

cuDNN 5.1

我已经基准与Tensorflow以下Keras例子作为后盾reference

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 

有没有其他人经历过这个?

回答

8

批量太小。尝试增加。

结果我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 
+0

我可以增加我的CPU和CPU的批量大小,他们都会执行类似的操作,我希望GPU能够更好地执行。即使我的图形卡比1050ti强大得多,我们似乎也得到了类似的时间。我的CPU在cnns上明显优于我的cpu,但不是,为什么? – agsolid

+1

@agsolid您的CPU速度非常快。我的Core i3-4330在每个时代以110s计算imdb_lstm.py(batch = 128),在GPU上计算25s。你的GPU也比我的要快。差异在于利用率(您的比例较低)。 –

+0

我怎样才能充分利用我的GPU? – agsolid

1

我有类似的问题在这里:

测试1

CPU:英特尔(R)至强(R)CPU E5-2697 V3 @ 2.60 GHz的

的Ubuntu 14.04

imdb_bidirectional_lstm.py155S

测试2

GPU:GTX860米

NVIDIA驱动:369.30

CUDA工具包:8.0

cuDNN:V6.0

imdb_bidirectional_lstm.py450s

分析

当我观察到GPU的负载曲线,我发现一个有趣的事:

  • 为LSTM,GPU负载〜80%〜10%之间快速跳转

GPU load

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

对于GPU内核来说这不是一个好主意,因为它们是很多喜欢并行计算的小内核,顺序计算不能充分利用它们的计算能力。这就是为什么我们大多数时候看到GPU负载在10%-20%左右的原因。但是在反向传播阶段,GPU可以并行运行微分计算,所以我们可以看到GPU负载峰值在80%左右。

+0

'GTX 860m'是一款移动GPU,因此具有非常有限的带宽和vram。我强烈建议不要分析移动gpus上的任何内容。 –

+0

我昨晚使用'GTX 860m''和''GTX 1060''测试了我自己的c-lstm模型(1 cnn层+ 1层)。事实证明,1060只比860米快1.28 **倍。所以我想断言1060对于''imdb_bidirectional_lstm''来说仍然比CPU慢。今晚会测试我的想法。 –

+0

'GTX 1060'':一个时代需要''320s'' –

相关问题