我的机器有以下规格:
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
还有其他人经历过这个吗?
答案 0 :(得分:21)
如果您使用Keras,请使用CuDNNLSTM代替LSTM或CuDNNGRU代替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)
我在这里有类似的问题:
CPU:Intel(R)Xeon(R)CPU E5-2697 v3 @ 2.60GHz
Ubuntu 14.04
imdb_bidirectional_lstm.py
: 155s
GPU:GTX 860m
Nvidia车手:369.30
CUDA工具包:v8.0
cuDNN:v6.0
imdb_bidirectional_lstm.py
:的 450S 强>
当我观察GPU负载曲线时,我发现了一件有趣的事情:
这主要是由于LSTM层中的顺序计算。请记住,LSTM需要顺序输入来迭代计算隐藏层权重,换句话说,您必须在t-1
时等待隐藏状态以计算隐藏状态t
。
这对GPU核心来说不是一个好主意,因为它们是许多小核心,他们喜欢并行计算,顺序计算无法充分利用其计算能力。这就是我们在大多数情况下看到GPU负载大约10% - 20%的原因。
但是在反向传播阶段,GPU可以并行运行衍生计算,因此我们可以看到GPU负载峰值在80%左右。
答案 3 :(得分:3)
这只是小费。
使用GPU功能强大
您的神经网络很大。
您的Batch_Size大。
-这是我通过谷歌搜索发现的。