のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonで少なくメモリを使用する方法

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

今日はPythonにおけるメモリ少なく使う方法を紹介したいと思います。
なぜ、そんな方法を書くに至ったか。それは、こんなエラーをしょっちゅう見ているからですね。

Traceback (most recent call last):
  File "lasagne_wheal.py", line 48, in <module>
    prediction = model.predict_proba(np.array(X_test))
MemoryError

画像処理を行っている人間ならよくやりがちかもしれませんが、
要はint8で持っている情報をfloatに変換してデータが膨れ上がったことによってメモリが
不足していることから発生しています。

Convolutional Neural Networkを大きな画像で実施しようとするとよく発生するのではないでしょうか。
さて、今回はこれを避ける方法をご紹介したいと思います。

1.必要ないとき以外はデータをfloatで保持しない。
2.手動GCをする。
3.バッチサイズを下げる(CNN)
4.画像サイズ自体を落とす。

メモリリークを避ける方法

1.必要ないとき以外はデータをfloatで保持しない。

要は必要ない時以外はデータを保持しなければ良いのです。
例えば、バッチごとにfloatに変換するなどがあります。一部分ずつfloatにすることにより、
不要なデータをメモリで持つ必要がなくなります。

2.手動GC

Pythonでは、基本的にメモリ解放は自動的に行います。
しかし、メモリ解放は自動的に行われるので、メモリ管理を原則
気にせずに管理することができます。

ただ、手動でガーベジコレクション(GC)を行う方法があります。
因みにガーベジコレクションは、使っていないメモリを解放させる手法です。
GCの方法は色々ありますが、今回は考えないでおきます。

import gc
import numpy as np

a = np.zeros((100,100))
del a
gc.collect()

メモリを解放したい対象について delを実施し、その後にgc.collect()を呼び出すことにより
確保している使用しないメモリを再利用することができます。

バッチサイズを下げる。

GPUで、メモリが割り当てられないエラーが出てくる時の対策です。
Convolutional Neural Networkにおいて入力バッチが大きいとGPUで計算させる時にメモリーリークが
発生することがあります。
その時は入力するときのバッチを下げましょう。そうするとよくなります。

画像サイズを落とす。

バッチサイズを下げたくない時の対策です。
例えば、画像サイズを半分落とすことにより、画像データのサイズを1/4まで下げることができます。

まとめ

GPUやCPUのメモリが少ないと機械学習では苦労しますが、
工夫次第では、システムを動作させることができるので、メモリが足りない時は工夫してみましょう。