训练LSTM / RNN模型时,为什么我的GPU比CPU慢?
keras
machine-learning
tensorflow
5
0

我的机器具有以下规格:

CPU:至强E5-1620 v4

GPU:Titan X(帕斯卡)

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

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

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

其他人有没有经历过?

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

这只是一个提示。

在以下情况下使用GPU功能强大

  1. 您的神经网络很大。

  2. 您的Batch_Size大。

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

收藏
评论

我在这里有类似的问题:

测试1

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

Ubuntu 14.04

imdb_bidirectional_lstm.py

测试2

GPU:GTX 860m

Nvidia驱动程序:369.30

CUDA工具包:v8.0

cuDNN:v6.0

imdb_bidirectional_lstm.py :450S

分析

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

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

GPU负载

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

对于GPU内核来说,这不是一个好主意,因为它们是许多小的内核,它们喜欢并行进行计算,因此顺序计算无法充分利用其计算能力。这就是为什么我们通常会看到GPU负载在10%-20%左右的原因。

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

收藏
评论

如果使用Keras ,请使用CuDNNLSTM代替LSTM或用CuDNNGRU代替GRU 。以我的情况(2台Tesla M60)而言,我看到的性能提高了10倍。顺便说一句,我正在使用@Alexey Golyshev建议的批量大小128。

收藏
评论

批量太小。尝试增加。

我的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
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号