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エラーは発生しなくなりました。

さいごに

それにしても、ハマるポイントのレベルが低すぎて自分でも笑っちゃいます。高望みはせず、同じようなレベルで困っている人の参考になれば嬉しいです。