2016-09-23 23 views
3

コードはPythonで書かれています。私はpythonのgensimにバイナリモデルをロードしました。&は "init_sims"オプションを使って実行を高速化しました。 OSはOS Xです。 ロードには約50〜60秒かかります。そして、 "most_similar"を見つけるための同等の時間。これは正常ですか? init_simsオプションを使用する前に、それはほぼ2倍の時間を要しました!私はそれがOSのRAM割り当ての問題かもしれないと感じている。Word2Vec:GensimとGoogleニュースのデータセットを使用 - 非常に遅い実行時間

model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True) 
model.init_sims(replace=True) 
model.save('SmallerFile') 
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT 
model=Word2Vec.load('SmallerFile',mmap='r') 
#GIVE RESULT SER! 
print model.most_similar(positive=['woman', 'king'], negative=['man']) 
+0

訓練の際に、cbowとngramを切り替えてみてください。 – AbtPst

答えて

4

常に保存する(単位正規化ベクトルを再計算することが可能な)「生の」ベクトルを保存するのでinit_sims(replace=True)のメモリ節約効果は、セーブ/ロードサイクル渡って持続しないことに注意してください。したがって、再ロードした後でも、最初にmost_similar()と呼ぶと、init_sims()がバックグラウンドで呼び出され、メモリ使用量が2倍になります。

GoogleNewsのデータセットは非常に大きく、ユニット正規化によってメモリ使用量が倍増する可能性があります。したがって、実行中のものとマシンのRAMに応じて、most_similar()の計算が実行されている時点でスワップメモリ​​を使用している可能性があります。これは、vector-and-sort-resultsの類似度訴訟(まだ、most_similar()のチェックで1を除いて単位正規化ベクトルキャッシュを再充填する必要はないので、1回目の呼び出しより高速に処理する必要があります)

init_sims(replace=True)の後にモデルを保存した場合、生ベクターは既にユニット正規化されている。だから、あなたは自分のload()後、再計算をスキップするモデルを手動でパッチを適用することができます

model.syn0norm = model.syn0 

その後も、あなたの最初の most_similar()だけ init_sims()を誘発することなく、ベクトルの(シングル、メモリマップド)のセットを、ご相談します。

まだ遅すぎる場合は、メモリを増やすか、ベクターを部分集合にトリミングする必要があります。 GoogleNewsのベクトルは最も頻度の高い単語を最も早く配置するようにソートされているようですので、最後の10%、50%、さらには90%を投げ捨てても、最も一般的な単語の有用なセットが残されます。

最後に、最近隣のインデックスを使用してより速い上位N個の一致を得ることができますが、余分なメモリを犠牲にして(モデルオブジェクトとソースコードを見て自分でトリミングする必要があります)おおよその結果(真のトップNマッチのいくつかを欠場する可能性があります)。最近のgensimバージョンには、annoytutorial.ipynbのデモ用IPythonノートPCのIPythonノートブック、docs/notebooksディレクトリにIPythonノートブックチュートリアルがあります。

関連する問題