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

ags*_*lid 22 nvidia machine-learning keras tensorflow

我的机器有以下规格:

CPU:Xeon E5-1620 v4

GPU:Titan X(Pascal)

Ubuntu 16.04

Nvidia车手375.26

CUDA取得8.0

cuDNN 5.1

我已经使用Tensorflow作为支持参考的以下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
Run Code Online (Sandbox Code Playgroud)

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

SCRIPT NAME                  GPU       CPU
cifar10_cnn.py               12sec     123sec
imdb_cnn.py                  5sec      119sec
mnist_cnn.py                 3sec      47sec 
Run Code Online (Sandbox Code Playgroud)

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

neu*_*ite 30

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

  • 我们都爱2 ^ n :) (6认同)
  • 但是 LSTM 和 CuDNNLSTM 有什么区别呢? (2认同)

Ale*_*hev 16

批量太小.试着增加.

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

  • @agsolid你的CPU非常快.My Core i3-4330计算每个时期110s的imdb_lstm.py(批量= 128)与GPU上的25s.你的GPU也比我快.差异在于利用率(您的利润率较低). (2认同)

Dan*_*Lee 12

这只是一个提示。

在以下情况下使用 GPU 是强大的

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

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


小智 5

我这里也有类似的问题:

测试1

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

乌班图14.04

imdb_bidirectional_lstm.py155秒

测试2

显卡:GTX 860M

英伟达驱动程序:369.30

CUDA 工具包:v8.0

cuDNN:v6.0

imdb_bidirectional_lstm.py450秒

分析

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

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

GPU负载

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

这对于 GPU 核心来说不是一个好主意,因为它们有很多小核心,喜欢并行计算,顺序计算无法充分利用它们的计算能力。这就是为什么我们大多数时候看到 GPU 负载在 10% - 20% 左右。

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

  • 这是唯一好的答案。除了并行化批处理之外,循环神经网络无法进行并行化,因此 GPU 相对于 CPU 来说性能并没有太大提高,这与 CNN 等其他模型不同,其中所有内容都可以并行化。 (2认同)