cpuだと17秒のものが、gpuだと36秒かかります。gpuは速いのではなかったのでしょうか?原因は色々推測できますが、コードの書き方が悪いか、環境が悪いかをとりあえず切り分けたいと思います。切り分け方は、先人の実験&報告と全く同じコードを使って実験してみようと思ってます。
早速発見しました。こちらの方の実験を真似させていただきましょう。githubからコードを落として、cpuとgpuそれぞれで実行してみます。上記サイトのときからコードが変わってる可能性はありますが、確認してません。いずれにしてもGPUの方が総じていい成績がでれば、どちらかというと環境ではなく、コードが悪いことになるかなと思ってます。
コード1
https://github.com/syatyo/tensorflow-practice/blob/master/five_layer_nn_batch_norm.py
1000エポック
CPUの場合
GPUの場合
10000エポック
CPUの場合
GPUの場合
コード2
https://github.com/syatyo/tensorflow-practice/blob/master/cnn.py
1000エポック
CPUの場合
GPUの場合
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です。
50000エポック
CPUの場合
GPUの場合
むむむ。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の場合
GPUの場合
変わらんなー。にしても、何かちょっといじるだけで全然学習しなくなるというのが恐ろしい。
nvidia-smi -lの結果
GPUメモリ4GB中3.9GBくらい使っててほぼ最大限使ってるということのようです。
メインメモリだと4GBは少ないんだけど、GPUメモリは最大で11GBで、同じグラボならメモリの量が性能に影響を与える度合いは今の所あんまり多くないらしい。特に性能が低いボードならなおさららしい。
飽きてきたけど、DQN以外のコードも試してみよう。
コード
https://github.com/keras-rl/keras-rl/blob/master/examples/cem_cartpole.py
CPU
こっちはめちゃくちゃ速いし、性能も完璧。なんだこりゃ。。cemってなんだろう?
GPU
こっちはサンプルなのに、あんまり性能がよくなくてうける。でも性能に違いが出るのはおかしい気がする。 結構毎回差が出るよね?にしても、やっぱりcpuのが倍くらい速い。。
コード
https://github.com/keras-rl/keras-rl/blob/master/examples/dqn_atari.py
CPU
GPU
これはほぼ同じ時間。
参考
ここには6倍速って書いてあるなあ。 クラウドとかでgoogle MLみたいに特化したサーバを使うと全然違うかもしれん。 やっぱり素人のパソコンだとGPUも元気が出ないのかもしれん。 いや、でもこの前Google MLでやったら、わしのPCと全く同じ速度じゃったな。。 残念じゃ。わしは強化学習がしたいんじゃが。