発生した問題
ループやリスト内包表記で繰り返しpredictを行わせると、メモリ使用量が40% -> 100%になってしまう。
(注)PCに搭載しているメモリは32GBのため、メモリが貧弱というわけではない。
環境
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
を書くと勝手に出力してくれる。
蛇足
JupyterNotebookでは実行したセルの結果などが変数に格納され、後で使えるように設計されている(jupyterというよりはIPythonの仕様らしい)。
これは便利な半面、例えば非常に長いログを出力してしまうと、それによってメモリが圧迫されることも想定されるため、注意が必要である。