【问题标题】:doc2vec - How to infer vectors of documents faster?doc2vec - 如何更快地推断文档向量?
【发布时间】:2025-11-23 11:15:01
【问题描述】:

我已经训练了大约 2300 个段落的段落向量(每个段落在 2000-12000 个单词之间),每个段落的向量大小为 300。现在,我需要推断出我认为是段落的大约 100,000 个句子的段落向量(每个句子大约10-30 个单词,每个单词对应前面已经训练的 2300 段)。

所以,我正在使用

model.infer_vector(sentence)

但是,问题是它花费的时间太长,而且它没有任何参数,例如“workers”。!有没有办法可以通过线程或其他方式加快进程?我正在使用一台 8gb 内存的机器,当我检查可用内核时使用

cores = multiprocessing.cpu_count()

结果是 8。

我需要这个来回答多项选择题。另外,是否有任何其他库/模型(例如 doc2vec)可以帮助完成这项任务?

提前感谢您的宝贵时间。

【问题讨论】:

    标签: python gensim word2vec doc2vec


    【解决方案1】:

    在需要推断向量的新数据的不同子集上,从多个线程调用 infer_vector() 可能会稍微加快速度。由于 Python 全局解释器锁 ('GIL'),仍然会有相当多的线程争用,阻止充分利用所有内核。

    如果您的 RAM 足够大而无需交换,您可以将模型保存到磁盘,然后将其加载到 8 个单独的进程中,并让每个进程对 1/8 的新数据进行推理。这将是使所有 CPU 饱和的最佳方法。

    任何更快的加速都需要对 gensim 中的 infer_vector() 实现进行优化 - 这是项目中的 open issue,将接受贡献的改进。

    【讨论】:

      【解决方案2】:

      您可以使用多处理:

      from multiprocessing import Pool
      from gensim.models import Doc2Vec
      
      MODEL = Doc2Vec.load('my_doc2vec_model', mmap='r')
      MODEL.delete_temporary_training_data(keep_doctags_vectors=False, keep_inference=True)
      
      def infer_vector_worker(document):
          vector = MODEL.infer_vector(document)
          return vector
      
      documents = [
          ['now', 'is', 'the', 'time'],       # first document
          ['for', 'all', 'good', 'men'],      # second document
          ['to', 'come', 'to', 'the'],        # third document
          ['aid', 'of', 'their', 'country'],  # fourth document
      ]
      with Pool(processes=4) as pool:
          vectors = pool.map(infer_vector_worker, documents)
      

      由于MODEL是一个全局变量,它将在进程之间共享copy-on-write。因此,不会有超出推理消耗的额外内存消耗。

      【讨论】:

        最近更新 更多