web-dev-qa-db-ja.com

LSTM / RNNモデルをトレーニングするときにGPUがCPUより遅いのはなぜですか?

私のマシンには次の仕様があります:

CPU:Xeon E5-1620 v4

GPU:Titan X(パスカル)

Ubuntu 16.04

Nvidiaドライバー375.26

CUDA Takeit 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 

他の誰かがこれを経験しましたか?

21
agsolid

Kerasを使用する場合、 [〜#〜] lstm [〜#〜] の代わりに CuDNNLSTM を使用します。 CuDNNGRU の代わりに [〜#〜] gru [〜#〜] 。私の場合(2 Tesla M60)、パフォーマンスが10倍に向上しています。ちなみに、@ Alexey Golyshevが提案するバッチサイズ128を使用しています。

26
neurite

バッチサイズが小さすぎます。増やしてみてください。

GTX1050Tiの結果:

 imdb_bidirectional_lstm.py 
 batch_size time 
 32(デフォルト)252 
 64 131 
 96 87 
 128 66 
 
 imdb_lstm.py 
 batch_size time 
 32(デフォルト)108 
 64 50 
 96 34 
 128 25 
16
Alexey Golyshev

私は同様の問題をここに持っています:

テスト1

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

Ubuntu 14.04

imdb_bidirectional_lstm.py155s

テスト2

GPU:GTX 860m

Nvidiaドライバー:369.30

CUDAツールキット:v8.0

cuDNN:v6.0

imdb_bidirectional_lstm.py450s

分析する

GPUの負荷曲線を観察すると、興味深いことが1つ見つかりました。

  • lstmの場合、GPUの負荷は80%から10%の間で急速にジャンプします

GPUロード

これは主に、LSTMレイヤーでの逐次計算によるものです。 LSTMでは、隠れ層の重みを繰り返し計算するために順次入力が必要であることに注意してください。言い換えると、tで隠れ状態を計算するには、t-1で隠れ状態を待つ必要があります。

GPUコアは並列計算を好む多くの小さなコアであるため、GPUコアにとっては良い考えではありません。逐次計算では計算能力を十分に活用できません。そのため、ほとんどの場合、GPUの負荷は約10%〜20%になります。

しかし、バックプロパゲーションの段階では、GPUは微分計算を並行して実行できるため、GPUの負荷ピークは約80%になります。

4
Zekun Zhang

これは単なるヒントです。

GPUの使用は、次の場合に強力です

  1. あなたのニューラルネットワークは大きいです。

  2. batch_Sizeが大きい。

-それはグーグルで見つけたものです。

3
Dane Lee