Keras(TensorFlow)でResource exhausted
Posted Feb 12, 2018
Keras(バックエンドはTensorFlow)のシステムのバックテストをしていたらResource exhaustedというエラーに遭遇しました。おそらくGPUのメモリを使い切ってメモリが不足し、新たなメモリ領域を確保できない、というような内容のエラーです。回避方法をメモしておきます。
pythonのGCを試してみる
メモリの話であればやることは簡単です。明示的にメモリを開放してやれば良いんじゃないか、と。早速、バックテストのループの中でメモリを開放してやります。
import gc
# 中略
for date in backtest_dates:
# 中略
# modelはKerasのSequentialです。あとは訓練、バリデーション、予測データ。
del model, train_x, train_y, val_x, val_y, pred_x
gc.collect()
しかし、GCで開放されるのはPythonのインタプリタが管理しているメモリだけです。当然Resource exhaustedしました。
GPUのセッションを閉じる
「GPUのセッション」という表現が正しいかどうかはわかりません。ただファイルやDBとの接続も、明示的もしくは暗黙的に閉じてやる必要があります。xx.close()というようなやつです。もしかしたらGPUに対する接続を明示的に閉じてやる必要があるのかもしれません。
私の環境では、KerasのバックエンドはTensorFlowで動いています。つまりKerasの裏でGPUを制御しているTensorFlowでメモリ不足を解消してやる必要があるということです。Google先生で「keras tensorflow session close」と検索したところ、KerasのリポジトリでこのようなIssueを見つけました。
memory leak when using tensorflow #2102
2016年にclear_session()が実装されているみたいなのでこれを使います。バックテストのループの中でclear_session()してやります。
from tensorflow.python.keras import backend
# 中略
for date in backtest_dates:
# 中略
backend.clear_session()
これを実装してから、Resource exhaustedエラーは発生しなくなりました。
さいごに
それにしても、ハマるポイントのレベルが低すぎて自分でも笑っちゃいます。高望みはせず、同じようなレベルで困っている人の参考になれば嬉しいです。