【问题标题】:How to perform doc2vec.infer_vector() on millions of documents?如何对数百万个文档执行 doc2vec.infer_vector()?
【发布时间】:2019-12-26 05:19:29
【问题描述】:

我使用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() 每次只接受一个文档,推断每个文档需要将近 0.1 秒。有没有API可以在每个推理步骤中处理一系列文档?

【问题讨论】:

    标签: gensim doc2vec


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多