gensim的LdaMulticore没有使用多进程技术吗?

9

当我在一台拥有12个核心的机器上运行gensim的LdaMulticore模型时,使用以下命令:

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

我收到了一个日志消息,内容是:

using serial LDA version on this node  

几行后,我看到另一条登录消息,内容为:
training LDA model using 10 processes

当我运行top命令时,我看到已经生成了11个Python进程,但有9个正在休眠,也就是说只有一个工作进程是活动的。这台机器有24个核心,并且绝对没有超负荷。为什么LdaMulticore算法没有以并行模式运行?

一个可能的原因是由于corpus加载缓慢。测试你的代码,看看需要多少时间。 - Jon
1个回答

15

首先,确保您已经安装了快速的BLAS库,因为大部分耗时的工作都是在线性代数的低级程序中完成的。

在我的机器上,gensim.models.ldamodel.LdaMulticore可以在训练过程中使用workers=4来占用所有20个CPU核心。将workers设置得比这更大并不会加快训练速度。其中一个原因可能是corpus迭代器太慢,无法有效地使用LdaMulticore。

你可以尝试使用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)

我的问题确实是由于在加载语料库时存在I/O瓶颈。我想使用ShardedCorpus可能会有所帮助 - 下次我会尝试一下。对我来说,只需先将整个语料库预加载到内存中(机器几乎有1T的RAM),问题就解决了。预加载比按需加载文档要快得多。下次我会尝试您的其他建议! - Edward Newell
“corpora.MmCorpus('some_corpus.mm')” 这个方法不是会预先将语料库加载到内存中吗?我也遇到了这个问题,日志显示“在此节点上使用串行LDA版本”,然后就没有任何动静了。 - Koustuv Sinha
1
遇到了类似的问题,LdaMulticore 在一个环境中可以工作而在另一个环境中不能工作。比较了不同的包后发现移除了 scikit-learn(使用 llvm-openmp,很可能是问题的源头)后问题得到解决。 - InterwebIsGreat
这个可能有点老了,但是我可以确认的是冲突也是我的问题。创建一个不包含scikit-learn的conda环境可以解决这个问题。 - Sean Norton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接