edo1z blog

プログラミングなどに関するブログです

tensorflow-gpuが遅いのは何故でしょうか?

cpuだと17秒のものが、gpuだと36秒かかります。gpuは速いのではなかったのでしょうか?原因は色々推測できますが、コードの書き方が悪いか、環境が悪いかをとりあえず切り分けたいと思います。切り分け方は、先人の実験&報告と全く同じコードを使って実験してみようと思ってます。

qiita.com

早速発見しました。こちらの方の実験を真似させていただきましょう。githubからコードを落として、cpuとgpuそれぞれで実行してみます。上記サイトのときからコードが変わってる可能性はありますが、確認してません。いずれにしてもGPUの方が総じていい成績がでれば、どちらかというと環境ではなく、コードが悪いことになるかなと思ってます。

コード1

https://github.com/syatyo/tensorflow-practice/blob/master/five_layer_nn_batch_norm.py

1000エポック

CPUの場合

f:id:edo1z:20190309130915p:plain

GPUの場合

f:id:edo1z:20190309130936p:plain

10000エポック

CPUの場合

f:id:edo1z:20190309131523p:plain

GPUの場合

f:id:edo1z:20190309131609p:plain

コード2

https://github.com/syatyo/tensorflow-practice/blob/master/cnn.py

1000エポック

CPUの場合

f:id:edo1z:20190309132637p:plain

GPUの場合

f:id:edo1z:20190309132610p:plain

warning ?

なんかでた。

2019-03-09 13:20:40.441684: W tensorflow/core/common_runtime/bfc_allocator.cc:211] Allocator (GPU_0_bfc) ran out of memory trying to allocate 2.42GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory were available.

結果

私のコードが悪い可能性大

次の実験

次の実験したいのは下記です。

  • Keras本家のサンプルで時間計測したい

gpuの方が遅かったコードというのは、ほぼkerasのサンプルコードといってもいいくらいのものです。ただ私がいじっているのは間違いないので、keras本家のコードで問題がなければ、私がいじった箇所に問題が限定されるかなと思ってます。

コード

下記でやってみます。dqn_cartpole.pyです。

github.com

50000エポック

CPUの場合

f:id:edo1z:20190309143505p:plain

GPUの場合

f:id:edo1z:20190309143145p:plain

むむむ。keras-rlのサンプルでもCPUの方が2倍くらい速いという結果になりました。まあ、kerasがとんでもないコードをexampleに置きっぱなしにするわけないですから、私のGPU設定が不十分な可能性はありますが、シンプル過ぎてGPUが力を発揮できてないのかもなーと思いました。そこで無駄に階層を深くしてみようと思います。

コード

上記コードの一部を下記のように修正しました。

 22 # Next, we build a very simple model.
 23 model = Sequential()
 24 model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
 25 model.add(Dense(64))
 26 model.add(Activation('relu'))
 27 model.add(Dense(64))
 28 model.add(Activation('relu'))
 29 model.add(Dense(64))
 30 model.add(Activation('relu'))
 31 model.add(Dense(64))
 32 model.add(Activation('relu'))
 33 model.add(Dense(64))
 34 model.add(Activation('relu'))
 35 model.add(Dense(64))
 36 model.add(Activation('relu'))
 37 model.add(Dense(nb_actions))
 38 model.add(Activation('linear'))
 39 print(model.summary())

階層を深めて16を64にしてみました。

CPUの場合

f:id:edo1z:20190309152103p:plain

GPUの場合

f:id:edo1z:20190309150155p:plain

変わらんなー。にしても、何かちょっといじるだけで全然学習しなくなるというのが恐ろしい。

nvidia-smi -lの結果

f:id:edo1z:20190309153329p:plain

GPUメモリ4GB中3.9GBくらい使っててほぼ最大限使ってるということのようです。

gamingpcs.jp

メインメモリだと4GBは少ないんだけど、GPUメモリは最大で11GBで、同じグラボならメモリの量が性能に影響を与える度合いは今の所あんまり多くないらしい。特に性能が低いボードならなおさららしい。

飽きてきたけど、DQN以外のコードも試してみよう。

コード

https://github.com/keras-rl/keras-rl/blob/master/examples/cem_cartpole.py

CPU

f:id:edo1z:20190309161053p:plain

こっちはめちゃくちゃ速いし、性能も完璧。なんだこりゃ。。cemってなんだろう?

GPU

f:id:edo1z:20190309160833p:plain

こっちはサンプルなのに、あんまり性能がよくなくてうける。でも性能に違いが出るのはおかしい気がする。 結構毎回差が出るよね?にしても、やっぱりcpuのが倍くらい速い。。

コード

https://github.com/keras-rl/keras-rl/blob/master/examples/dqn_atari.py

CPU

f:id:edo1z:20190309162811p:plain

GPU

f:id:edo1z:20190309162754p:plain

これはほぼ同じ時間。

参考

Deep Q-LearningでFXしてみた

f:id:edo1z:20190309164052p:plain

ここには6倍速って書いてあるなあ。 クラウドとかでgoogle MLみたいに特化したサーバを使うと全然違うかもしれん。 やっぱり素人のパソコンだとGPUも元気が出ないのかもしれん。 いや、でもこの前Google MLでやったら、わしのPCと全く同じ速度じゃったな。。 残念じゃ。わしは強化学習がしたいんじゃが。