web-dev-qa-db-ja.com

MemoryError:Word2vecをpython

WikipediaのテキストデータからWord2vecモデルをトレーニングしようとしています。そのため、次のコードを使用しています。

import logging
import os.path
import sys
import multiprocessing

from gensim.corpora import  WikiCorpus
from gensim.models import Word2Vec
from gensim.models.Word2vec import LineSentence


if __name__ == '__main__':
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # check and process input arguments

    if len(sys.argv) < 3:
        print (globals()['__doc__'])
        sys.exit(1)
    inp, outp = sys.argv[1:3]

    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())

    # trim unneeded model memory = use (much) less RAM
    model.init_sims(replace=True)

    model.save(outp)

しかし、プログラムを20分間実行した後、次のエラーが発生します

エラーメッセージ

1
suraj

理想的には、スクリーンショットではなく、エラーのtextを質問に貼り付けます。ただし、次の2つの重要な行が表示されます。

<TIMESTAMP> : INFO : estimated required memory for 2372206 words and 400 dimensions: 8777162200 bytes
...
MemoryError: unable to allocate array with shape (2372206, 400) and data type float32

コーパスを1回通過した後、モデルは生き残る一意の単語の数を学習しました。これは、モデルのどれだけのサイズを割り当てる必要があるかを報告します。約8777162200 bytes(約8.8GB)しかし、必要なベクトル配列を割り当てようとすると、MemoryErrorが表示されます。これは、十分なコンピューターアドレス可能メモリ(RAM)が利用できないことを示しています。

次のいずれかを行うことができます。

  1. おそらくRAMを既存のシステムに追加することによって、より多くのメモリがある場所で実行します;または
  2. 必要なメモリの量を減らします。主に、トレーニングする一意のWordベクトルの数またはそれらの次元サイズを減らします。

デフォルトのmin_count=5パラメータをmin_count=10またはmin_count=20またはmin_count=50などに増やすことで、単語数を減らすことができます。 (おそらく200万を超えるWord-Vectorは必要ありません。数万語の語彙だけで多くの興味深い結果が可能です。)

max_final_vocab値を設定して、保持する一意の単語の正確な数を指定することもできます。たとえば、max_final_vocab=500000は、最も頻繁に使用される500000語のみを保持し、残りは無視します。

sizeを削減すると、メモリも節約されます。 Wordベクタではsize=300の設定が一般的であり、メモリ要件を4分の1に削減します。

一緒にsize=300, max_final_vocab=500000を使用すると、必要なメモリが2GB未満に削減されます。

3
gojomo