Google Compute Cloudでの探索実験

 8GPUインスタンスを使って探索速度を検証した。

 まず20CPU、8GPU(Tesla V100)のインスタンスを使って探索速度を検証した。

f:id:tokumini:20200330160250p:plain

 早い段階で頭打ちになっている。8GPU使うときのGPU利用率を見てもあまり高くなっていない(1GPUなら50%くらいは行く)。

f:id:tokumini:20200330160409p:plain

 1GPUでも探索中は20CPUを満遍なく使っている。

f:id:tokumini:20200330160612p:plain

 なんだかんだCPUがボトルネックになっていそうではあるので増やしてみた。(別に探索中に立てるスレッド数を増やすわけではないので意味はないと思ったが検証のため)。

f:id:tokumini:20200330165333p:plain

 20CPU→40CPUにしたときはそこそこ上がったのでお!と思ったが、60CPUにしたらまた下がったので、なにかマシンの影響だったのかもしれない。CPUの情報を見ておけばよかったか。

 最後に、探索中バックアップするときのmutexロックを外してみたところ、8GPUでNPSが46371まで上がった(約1.5倍程度)。やはり排他制御でかなり詰まっているようだ。

考察

 そもそも現状の並列化を振り返ると、次のような想定をしている。

f:id:tokumini:20200330172414p:plain

 こうやってGPUをフルに使うのが理想なのだが、現状はGPUの方が空いている時間が多く、おそらく次のようになっている。

f:id:tokumini:20200330172552p:plain

 CPUを増やす方法として、このキューを3つにするというのは実装しているのだが、3つのキューを順繰りに計算していくことになると最善読み筋を伸ばすのに時間がかかるのでかえって弱くなってしまいそうな気がしている。

 フラットに図を眺めてみれば、単純にキューを埋める部分を複数スレッド化すれば良いのではないかと思えた。むしろなんで今までそれを思いつかなかったのか。実装してみます。