Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

VM再起動対応で入れたthread間同期は影響がありそう

前回記事で、自宅PCとGCPで学習曲線が極端に異なる事を書きました。その原因として、VM再起動対応で入れたthread間の同期の影響も考えられるので、確認しました。

結果、影響がありそうです。自宅PCは仮想コア8でthread数8に対し、GCPは仮想コア4でthread数4なので、thread間同期の影響が異なってくるのかもしれません。

学習データのsaveに際してのthread間の同期をOFFにして試したところ、下記のように学習が順調に進むようになりました。まだ1例しか試していませんが、これが原因の可能性が高いですね。

saveでのthread間同期なし(gcp)

f:id:Itsukara:20161019072627p:plain

saveでのthread間同期あり(gcp)

f:id:Itsukara:20161019072643p:plain

ただ、thread間同期なしだと、saveされるデータがsave中に変わる可能性があるのが気になりますが... これは、これまでと変わらないので良しとしましょう。

なお、thread0だけが処理が遅れ気味になる可能性はありますね。ただ、save処理は1回で数秒なので、それほど影響はないと思います。

githubには、thread間同期をOFFにしたものをアップロードしました。(オプション「--sync-thread」で切り替え可能であり、デフォルトはOFFにしました)

github.com

補足

書き忘れていましたが、上記DRLプログラムの実行に必要なメモリ量は、かなり前から3.6GBで十分になっています。以前にメモリ量が増えたのは、最高得点取得時や新しい部屋に入った時の動画作成用の画面データ保管用メモリが多かったためでした。しかし、これは、lzmaでの圧縮により1/40程度となりました。これにより実行時間が数%伸びますが、GCPVMコストが減るので、同じ予算以内で(2ヶ月で$300)、VM数を5から6に増やすことが出来ました。ちなみに、現状、2GBでも十分ですが、GCPVMは4CPU時の最小メモリ量が3.6GBなので、これで動かしています。