5

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

所以,我正在使用

model.infer_vector(sentence)

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

cores = multiprocessing.cpu_count()

结果是8。

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

在此先感谢您的时间。

4

2 回答 2

4

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

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

任何更快的加速都需要对infer_vector()gensim 中的实现进行优化——这是项目中的一个开放问题,可以接受贡献的改进。

于 2016-09-27T04:19:40.363 回答
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是一个全局变量,它将在进程之间共享写入时复制。因此,不会有超出推理消耗的额外内存消耗。

于 2020-05-31T17:48:15.590 回答