20200916のTensorFlowに関する記事は2件です。

tensorflow==2.0.0でDQNを学習したらmemory-leakが発生した

はじめに

最近研究で使うDQNをそこそこ苦労しながら実装し、それの学習を回したところ異常な程Memoryを食っており、原因究明に1週間もかかってしまいました。
自分のような人が現れないように、簡単に記録を残していきたいと思います。

環境

python==3.7
Tensorflow==2.0.0
Ubuntu 18.04

実際に発生した現象

私が使っていたのは、研究室に設置されたDeepStationと呼ばれる学習用サーバです。
これは、GTX1080ti * 4と RAMが64GBあるので、少々無理やり動作させても変なことは起きたことがありませんでした。
しかし、環境を更新して普通にEnd-to-Endの識別モデルの学習を行っている時には発生していませんでした。

しかし、DQNで学習を行っていた際に問題が発生しました。
今回のDQNの実装に参考にしたのは以下の記事になります。

https://qiita.com/sugulu_Ogawa_ISID/items/bc7c70e6658f204f85f9

このソースコードを実行して放置していると、三時間ぐらいで64GBをオーバーしてmemory-overでクラッシュしてしまいました。
最初はソースコードに問題があると思い、一行ずつソースコードを確認していましたが特に問題が見つからず苦労していました。
もともと、Pythonはmemory-leakが起きにくいというのもあり、あまり意識したことがなかったためです。

このソースコードを見ればわかりますが、episideが閾値を超えると毎回model.fit()を呼び出して少しずつ学習を行っています。
問題はここにありました。
以下をみてもらえれば、似たような症状が見つかります。

https://github.com/tensorflow/tensorflow/issues/33030

これをみてみると、一回model.fitやmodel.predictをしているのは大きな問題ではなく、コレを複数回行うことでmemory-leakが発生したようです。
おそらくですが、model.fitやmodel.predictで呼び出されたmodelがreleaseされずに保持されていたんじゃないかなーと思います。

解決方法

基本的には、tensorflowのversionをupdateすればOKです。
私は、tenosorflow==2.3.0をインストールすることで、解決しました。

このせいで、一週間も時間を取られるとは思いませんでした。
memory leakって本当に起きるんだーって思いました。
jupyter-labで実行していると、メモリをエラーで開放してくれるわけではなかったためPCにもなかなかログインできずかなり焦りました。
大きくメモリを持っていても過信せずに、pythonのメモリ使用に制限しておくと安心ですね。今は私もそうしています。
以下の記事を参考すると良いでしょう。

https://blog.imind.jp/entry/2019/08/10/022501

最後に

DQNで学習していても似たような情報があんまり出ていなかったので、よくわからず苦労しました。
これがみんさんの参考に慣れば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

tensorflow==2.0.0でDQNを学習したらmemoryLeakが発生した

はじめに

最近研究で使うDQNをそこそこ苦労しながら実装し、それの学習を回したところ異常な程Memoryを食っており、原因究明に1週間もかかってしまいました。
自分のような人が現れないように、簡単に記録を残していきたいと思います。

環境

python==3.7
Tensorflow==2.0.0
Ubuntu 18.04

実際に発生した現象

私が使っていたのは、研究室に設置されたDeepStationと呼ばれる学習用サーバです。
これは、GTX1080ti * 4と RAMが64GBあるので、少々無理やり動作させても変なことは起きたことがありませんでした。
実際に普通にEnd-to-Endの識別モデルの学習を行っている時には発生していませんでした。

しかし、DQNで学習を行っていた際に問題が発生しました。
今回のDQNの実装に参考にしたのは以下の記事になります。

https://qiita.com/sugulu_Ogawa_ISID/items/bc7c70e6658f204f85f9

このソースコードを実行して放置していると、三時間ぐらいで64GBのメモリをオーバーしてmemory-overでクラッシュしてしまいました。
最初は自分のソースコードに問題があると思い、一行ずつソースコードを確認していましたが特に問題が見つからず苦労していました。
もともと、Pythonはmemory-leakが起きにくいというのもあり、あまり意識したことがなかったためです。

このソースコードを見ればわかりますが、episideが閾値を超えると毎回model.fit()を呼び出して少しずつ学習を行っています。
問題はここにありました。
以下をみてもらえれば、似たような症状が見つかります。

https://github.com/tensorflow/tensorflow/issues/33030

これをみてみると、数回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のメモリ使用に制限しておくと安心ですね。今は私もそうしています。
以下の記事を参考すると良いでしょう。

https://blog.imind.jp/entry/2019/08/10/022501

最後に

DQNで学習していても似たような情報があんまり出ていなかったので、よくわからず苦労しました。
これがみんさんの参考に慣れば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む