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分間実行した後、次のエラーが発生します
理想的には、スクリーンショットではなく、エラーの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)が利用できないことを示しています。
次のいずれかを行うことができます。
デフォルトの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未満に削減されます。