2015-11-26 7 views
5

私は12個のコア、使用しているマシン上でgensimのLdaMulticoreモデルを実行する場合:gensim LdaMulticoreはマルチプロセッシングではありませんか?

lda = LdaMulticore(corpus, num_topics=64, workers=10) 

私は

using serial LDA version on this node 

数行後に、私が言う別のlogingメッセージを参照してくださいと言うのログメッセージが表示されます

training LDA model using 10 processes 

私がトップに走ったとき、私は11のpythonプロセスが生成されているのを見ましたが、9人はスリープ状態です1人の作業者だけがアクティブです。マシンは24のコアを持ち、どんな手段でも圧倒されません。 LdaMulticoreがパラレルモードで動作しないのはなぜですか?

+0

[corpusのロードが遅い](https://github.com/piskvorky/gensim/issues/288)の理由があります。あなたのコードをテストして、どれくらいの時間がかかるかを見てください。 – Jon

答えて

4

まず、have installed a fast BLAS libraryを確認してください。時間のかかる作業の多くは、線形代数の低レベルルーチン内で行われるためです。

私のマシンでは、は、トレーニング中にworkers=4のすべての20個のCPUコアを使い切ることができます。これよりも労働者を大きく設定しても、トレーニングのスピードは向上しませんでした。 One reason might be the corpus iterator is too slow to use LdaMulticore effectively

ShardedCorpusを使用して、corpusのシリアライズと置き換えを試みることができます。これは読み書きがはるかに高速でなければなりません。また、大容量の.mmファイルを単純に圧縮すると、スペースが少なくて済む(I/Oが少ない)ので、あまり役に立ちます。例えば、

mm = gensim.corpora.MmCorpus(bz2.BZ2File('enwiki-latest-pages-articles_tfidf.mm.bz2')) 
lda = gensim.models.ldamulticore.LdaMulticore(corpus=mm, id2word=id2word, num_topics=100, workers=4) 
+0

私の問題は、コーパスをロードする際のI/Oのボトルネックが原因でした。私はShardedCorpusを使うと助けになると思います。次回はそれを試してみます。私にとっては、コーパス全体をメモリにプリロードするだけです(マシンはほぼ1T RAMです)。この問題を解決しました。プリロードは、オンデマンドでドキュメントをロードするよりも速く*ウェイ*です。私はあなたの他の提案を次回お試しします! –

+0

'' corpora.MmCorpus( 'some_corpus.mm') 'はコーパスをメモリにあらかじめロードしていませんか?私はこの問題でも立ち往生しています。ここでは、ロガーが 'このノードでシリアルLDAバージョンを使用しています。 –

関連する問題