如何对数百万文档执行 doc2vec.infer_vector()?

How to perform doc2vec.infer_vector() on millions of documents?

我使用 python gensim 在包含 40,000,000 个文档的语料库上训练了一个 doc2vec 模型。该模型每天用于推断数百万文档的 docvec。为了确保稳定性,我将 alpha 设置为较小的值和较大的 steps 而不是设置恒定的随机种子:

from gensim.models.doc2vec import Doc2Vec
model = Doc2Vec.load('doc2vec_dm.model')
doc_demo = ['a','b']
# model.random.seed(0)
model.infer_vector(doc_demo, alpha=0.1, min_alpha=0.0001, steps=100)

doc2vec.infer_vector() 每次只接受一个文档,推断每个 docvec 大约需要 0.1 秒。是否有任何API可以在每个推理步骤中处理一系列文档?

目前,没有 gensim API 可以同时进行大量推理,这可以通过使用多线程来提供帮助。这是一个愿望清单项目,以及其他改进:https://github.com/RaRe-Technologies/gensim/issues/515

通过将您自己的推理作业分布在多个线程上,您可能会获得一些加速,最高可达 CPU 中的内核数量。

要消除由于 Python GIL 引起的所有多线程争用,您可以将您的推理分散到单独的 Python 进程中。如果每个进程使用 n 中描述的一些技巧加载模型(见下文),OS 将帮助他们共享大型模型支持数组(只需支付一次 RAM 成本),而由于一个畅通的推理线程,他们每个人都可以完全独立。

(具体来说,Doc2Vec.load() 也可以使用 mmap='r' 模式加载现有的磁盘模型,其中包含支持文件的内存映射。仅推理,没有 most_similar() -like 操作,只会读取共享的原始后备数组,因此如果您启动仅进行推理然后保存其结果并退出的单一用途进程,则无需对 _norm 变体大惊小怪。)