私のマシンには次の仕様があります:
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
他の誰かがこれを経験しましたか?
Kerasを使用する場合、 [〜#〜] lstm [〜#〜] の代わりに CuDNNLSTM を使用します。 CuDNNGRU の代わりに [〜#〜] gru [〜#〜] 。私の場合(2 Tesla M60)、パフォーマンスが10倍に向上しています。ちなみに、@ Alexey Golyshevが提案するバッチサイズ128を使用しています。
バッチサイズが小さすぎます。増やしてみてください。
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
私は同様の問題をここに持っています:
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の負荷曲線を観察すると、興味深いことが1つ見つかりました。
これは主に、LSTMレイヤーでの逐次計算によるものです。 LSTMでは、隠れ層の重みを繰り返し計算するために順次入力が必要であることに注意してください。言い換えると、t
で隠れ状態を計算するには、t-1
で隠れ状態を待つ必要があります。
GPUコアは並列計算を好む多くの小さなコアであるため、GPUコアにとっては良い考えではありません。逐次計算では計算能力を十分に活用できません。そのため、ほとんどの場合、GPUの負荷は約10%〜20%になります。
しかし、バックプロパゲーションの段階では、GPUは微分計算を並行して実行できるため、GPUの負荷ピークは約80%になります。
これは単なるヒントです。
GPUの使用は、次の場合に強力です
あなたのニューラルネットワークは大きいです。
batch_Sizeが大きい。
-それはグーグルで見つけたものです。