2017-10-23 6 views
0

word2vecモデルをサイズ400MBのトークン化ファイルに訓練したいと思います。私はこのPythonコードを実行しようとしている: Gensim Word2Vecが多すぎるメモリを使用しています

私は私のファイルにこの関数を呼び出すと、私はこれを取得:

2017-10-23 17:57:00,211 : INFO : collecting all words and their counts 
2017-10-23 17:57:04,071 : INFO : PROGRESS: at sentence #0, processed 0 words, keeping 0 word types 
2017-10-23 17:57:16,116 : INFO : collected 4735816 word types from a corpus of 47054017 raw words and 1 sentences 
2017-10-23 17:57:16,781 : INFO : Loading a fresh vocabulary 
2017-10-23 17:57:18,873 : INFO : min_count=5 retains 290537 unique words (6% of original 4735816, drops 4445279) 
2017-10-23 17:57:18,873 : INFO : min_count=5 leaves 42158450 word corpus (89% of original 47054017, drops 4895567) 
2017-10-23 17:57:19,563 : INFO : deleting the raw counts dictionary of 4735816 items 
2017-10-23 17:57:20,217 : INFO : sample=0.001 downsamples 34 most-common words 
2017-10-23 17:57:20,217 : INFO : downsampling leaves estimated 35587188 word corpus (84.4% of prior 42158450) 
2017-10-23 17:57:20,218 : INFO : estimated required memory for 290537 words and 200 dimensions: 610127700 bytes 
2017-10-23 17:57:21,182 : INFO : resetting layer weights 
2017-10-23 17:57:24,493 : INFO : training model with 3 workers on 290537 vocabulary and 200 features, using sg=0 hs=0 sample=0.001 negative=5 window=5 
2017-10-23 17:57:28,216 : INFO : PROGRESS: at 0.00% examples, 0 words/s, in_qsize 0, out_qsize 0 
2017-10-23 17:57:32,107 : INFO : PROGRESS: at 20.00% examples, 1314 words/s, in_qsize 0, out_qsize 0 
2017-10-23 17:57:36,071 : INFO : PROGRESS: at 40.00% examples, 1728 words/s, in_qsize 0, out_qsize 0 
2017-10-23 17:57:41,059 : INFO : PROGRESS: at 60.00% examples, 1811 words/s, in_qsize 0, out_qsize 0 
Killed 

私はword2vecはたくさんのを必要としていることを知っています私はまだそこに問題があると思っています。ご覧のとおり、このモデルの推定メモリは600MBで、コンピュータのRAMは16GBです。しかし、コード実行中にプロセスを監視すると、すべてのメモリを占有してから殺されます。

他の投稿が助言するように、私はmin_countを増やしてサイズを小さくしようとしました。しかし、ばかげた値(min_count = 50、size = 10)でも、プロセスは60%で停止します。

私はまた、プロセスが終了しないように、PythonをOOMの例外にしようとしました。私がそうするとき、私は殺害の代わりにMemoryErrorを持っています。

何が起こっていますか?

(私はUbuntuの17.04、16ギガバイトのRAMとNVIDIAのGTX 960Mとの最近のラップトップを使用しています。私はアナコンダからのpython 3.6を実行して、3.0をgensimが、それはgensim 2.3とのより良い行うdoes'nt)

答えて

0

あなたのファイルされますログ出力に示されるように1行になります。

2017-10-23 17:57:16,116 : INFO : collected 4735816 word types from a corpus of 47054017 raw words and 1 sentences 

これはあなたが望むものではないでしょうか。特にgensimのWord2Vecの最適化されたサイモンコードは、それらを切り捨てる前に10,000ワードの文章しか扱えません(そして残りを破棄します)。あなたのデータの大半はトレーニング中に考慮されていません(終了したとしても)。

しかし、より大きな問題は、4700万語の単一の行が1つの巨大な文字列としてメモリに格納され、その後、が4,700万エントリのlist-of-stringになるということです。ですから、メモリ効率の良いイテレータを使用しようとしても、1回の反復で2回以上メモリにファイル全体が持ち込まれることはありません。

まだ全16ギガバイトのRAMを使用しているとは思えませんが、それを修正することで問題を解決するか、残っている問題をもっと明白にすることができます。

トークン化されたデータが10,000トークンセンテンス長の前後に自然な改行を持たない場合、gensimに含まれているコーパスクラスLineSentenceの例を見てみると、

https://github.com/RaRe-Technologies/gensim/blob/58b30d71358964f1fc887477c5dc1881b634094a/gensim/models/word2vec.py#L1620

(それが要因ではないかもしれませんが、あなたはまた、あなたのopen() EDファイルがあることを確認するためにwithコンテキスト・マネージャを使用することもできます。)text8text9コーパスを、万個のトークンにそれぞれ得られた文を制限イテレータが使い尽くされた後すぐに閉じられる)

+1

これは間違いなく問題でした。私のトークン化スクリプトのバグは、私が望むところに改行を入れませんでした。どうもありがとう ! –

+0

'特にgensimのWord2Vecの最適化されたcythonコードは、それらを切り捨てる前に10,000ワードの文章しか扱えない(そして残りを破棄する)' - >これはdoc2vecでも当てはまりますか?そしてもしそうなら、dm = 0(単語algoのバッグ)とdm = 1(dist memory algo)の両方に対応していますか?それは、代表性の観点から、10000のマークでそれらを任意に切り捨てることを正確に感じるわけではありません。 – user1712447

+0

はい、それは 'Doc2Vec'にも当てはまります。あなたのドキュメントをそれぞれ<= 10000トークン以下のサイズのサブドキュメントに分割し、それぞれのサブドキュメントに同じ 'tags 'を使用すると、長いドキュメントで発生したと思われるトレーニングに非常に近似します。 – gojomo

関連する問題