#はじめに
最近研究で使うDQNをそこそこ苦労しながら実装し、それの学習を回したところ異常な程Memoryを食っており、原因究明に1週間もかかってしまいました。
自分のような人が現れないように、簡単に記録を残していきたいと思います。
###環境
python==3.7
Tensorflow==2.0.0
Ubuntu 18.04
##実際に発生した現象
私が使っていたのは、研究室に設置されたDeepStationと呼ばれる学習用サーバです。
これは、GTX1080ti * 4と RAMが64GBあるので、少々無理やり動作させても変なことは起きたことがありませんでした。
実際に普通にEnd-to-Endの識別モデルの学習を行っている時には発生していませんでした。
しかし、DQNで学習を行っていた際に問題が発生しました。
今回のDQNの実装に参考にしたのは以下の記事になります。
このソースコードを実行して放置していると、三時間ぐらいで64GBのメモリをオーバーしてmemory-overでクラッシュしてしまいました。
最初は自分のソースコードに問題があると思い、一行ずつソースコードを確認していましたが特に問題が見つからず苦労していました。
もともと、Pythonはmemory-leakが起きにくいというのもあり、あまり意識したことがなかったためです。
このソースコードを見ればわかりますが、episodeが閾値を超えると毎回model.fit()を呼び出して少しずつ学習を行っています。
問題はここにありました。
以下をみてもらえれば、似たような症状が見つかります。
これをみてみると、数回model.fitやmodel.predictをしているのは大きな問題ではなく、コレを非常に多くの回数行うことでmemory-leakが発生したようです。
おそらくですが、model.fitやmodel.predictで呼び出されたmodelがreleaseされずに保持されていたんじゃないかなーと思います。
##解決方法
基本的には、tensorflowのversionをupdateすればOKです。
私は、tenosorflow==2.3.0をインストールすることで、解決しました。
このせいで、一週間も時間を取られるとは思いませんでした。
memory leakって本当に起きるんだーって感じです。
jupyter-labで実行していると、メモリをエラーですぐに開放してくれるわけではなかったためsshでサーバにもなかなか接続できずかなり焦りました。
大きくメモリを持っていても過信せずに、pythonのメモリ使用に制限しておくと安心ですね。今は私もそうしています。
以下の記事を参考すると良いでしょう。
##最後に
DQNで学習していても似たような情報があんまり出ていなかったので、よくわからず苦労しました。
これがみなさんの参考に慣れば幸いです。