doc2vec - 如何更快地推断文档向量?

时间:2016-09-19 18:57:37

标签: python gensim word2vec doc2vec

我已经训练了大约2300个段落(每个2000-12000个单词)的段落向量,每个段落矢量大小为300.现在,我需要推断大约100,000个句子的段落向量,我将其视为段落(每个句子都在每个10-30个单词,对应于已经训练过的早期2300段。

所以,我正在使用

model.infer_vector(sentence)

但是,问题是它花费的时间太长了,而且它没有采取任何论据,例如" workers" 。!有没有办法通过线程或其他方式加快进程?我正在使用一台8gb ram的机器,当我使用

检查可用的核心时
cores = multiprocessing.cpu_count()

它出来是8。

我需要这个来回答多项选择题。此外,还有其他任何库/模型,如doc2vec可以帮助完成此任务吗?

提前感谢您的时间。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

您可以使用多重处理:

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。因此,不会有超出推理消耗的额外内存消耗。