日記

日本語の勉強のためのブログ

【JupyterNotebook】Kerasでpredictを繰り返すとメモリリーク

発生した問題

ループやリスト内包表記で繰り返しpredictを行わせると、メモリ使用量が40% -> 100%になってしまう。
(注)PCに搭載しているメモリは32GBのため、メモリが貧弱というわけではない。

環境

  • Windows 11 Pro
    • バージョン: 22H2
    • OSビルド: 22621.963
    • 機械学習GPUは使わない(非対応なので)
  • Python 3.10.5
  • Keras
  • Jupyter Notebook
    • jupyter --versionの実行結果は次の通り。
Selected Jupyter core packages...
IPython          : 8.5.0
ipykernel        : 6.16.0
ipywidgets       : 8.0.3
jupyter_client   : 7.4.2
jupyter_core     : 4.11.1
jupyter_server   : not installed
jupyterlab       : not installed
nbclient         : 0.7.0
nbconvert        : 7.2.1
nbformat         : 5.7.0
notebook         : 6.4.12
qtconsole        : not installed
traitlets        : 5.4.0

行った対処

【python】pythonでメモリ不足になったときにすること - 静かなる名辞 を見て変数を積極的にdel -> gc.collect()したが駄目。

解決

predict後にkeras.backend.clear_session()を実行したら解決した。
-ε-いつかのブログ-з- : [Python] Keras の fit や predict がループでメモリリークする
kerasで繰り返し学習するとメモリ使用量が増えちゃう問題を対策した - Qiita
tf.keras.backend.clear_session  |  TensorFlow v2.11.0

付録: pythonのメモリ使用状況を調べる

(前提として、pip install memory_profilerでmemory_profilerをインストールしておく)
%load_ext memory_profiler を実行しておき、 メモリ状況を知りたい場所で %memit を書くと勝手に出力してくれる。

参考: https://ja.stackoverflow.com/questions/49825/jupyter-notebook%E3%81%A7%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A8%E3%83%A9%E3%83%BC

蛇足

JupyterNotebookでは実行したセルの結果などが変数に格納され、後で使えるように設計されている(jupyterというよりはIPythonの仕様らしい)。
これは便利な半面、例えば非常に長いログを出力してしまうと、それによってメモリが圧迫されることも想定されるため、注意が必要である。