我已经训练了大约2300个段落(每个2000-12000个单词)的段落向量,每个段落矢量大小为300.现在,我需要推断大约100,000个句子的段落向量,我将其视为段落(每个句子都在每个10-30个单词,对应于已经训练过的早期2300段。
所以,我正在使用
model.infer_vector(sentence)
但是,问题是它花费的时间太长了,而且它没有采取任何论据,例如" workers
" 。!有没有办法通过线程或其他方式加快进程?我正在使用一台8gb ram的机器,当我使用
cores = multiprocessing.cpu_count()
它出来是8。
我需要这个来回答多项选择题。此外,还有其他任何库/模型,如doc2vec
可以帮助完成此任务吗?
提前感谢您的时间。
答案 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。因此,不会有超出推理消耗的额外内存消耗。